Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
MasterApe
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.6.12; /* * ApeSwapFinance * App: https://apeswap.finance * Medium: https://medium.com/@ape_swap * Twitter: https://twitter.com/ape_swap * Telegram: https://t.me/ape_swap * Announcements: https://t.me/ape_swap_news * GitHub: https://github.com/ApeSwapFinance */ import '@pancakeswap/pancake-swap-lib/contracts/math/SafeMath.sol'; import '@pancakeswap/pancake-swap-lib/contracts/token/BEP20/IBEP20.sol'; import '@pancakeswap/pancake-swap-lib/contracts/token/BEP20/SafeBEP20.sol'; import '@pancakeswap/pancake-swap-lib/contracts/access/Ownable.sol'; import "./BananaToken.sol"; import "./BananaSplitBar.sol"; // import "@nomiclabs/buidler/console.sol"; // MasterApe is the master of BANANA AND BANANASPLIT. // He can make Banana and he is a fair guy. // // Note that it's ownable and the owner wields tremendous power. The ownership // will be transferred to a governance smart contract once BANANA is sufficiently // distributed and the community can show to govern itself. // // Have fun reading it. Hopefully it's bug-free. God bless. contract MasterApe is Ownable { using SafeMath for uint256; using SafeBEP20 for IBEP20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. // // We do some fancy math here. Basically, any point in time, the amount of BANANAs // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accBananaPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accCakePerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IBEP20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. BANANAs to distribute per block. uint256 lastRewardBlock; // Last block number that BANANAs distribution occurs. uint256 accCakePerShare; // Accumulated BANANAs per share, times 1e12. See below. } // The BANANA TOKEN! BananaToken public cake; // The BANANA SPLIT TOKEN! BananaSplitBar public syrup; // Dev address. address public devaddr; // BANANA tokens created per block. uint256 public cakePerBlock; // Bonus muliplier for early banana makers. uint256 public BONUS_MULTIPLIER; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping (uint256 => mapping (address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The block number when BANANA mining starts. uint256 public startBlock; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); constructor( BananaToken _banana, BananaSplitBar _bananaSplit, address _devaddr, uint256 _bananaPerBlock, uint256 _startBlock, uint256 _multiplier ) public { cake = _banana; syrup = _bananaSplit; devaddr = _devaddr; cakePerBlock = _bananaPerBlock; startBlock = _startBlock; BONUS_MULTIPLIER = _multiplier; // staking pool poolInfo.push(PoolInfo({ lpToken: _banana, allocPoint: 1000, lastRewardBlock: startBlock, accCakePerShare: 0 })); totalAllocPoint = 1000; } modifier validatePool(uint256 _pid) { require(_pid < poolInfo.length, "validatePool: pool exists?"); _; } function updateMultiplier(uint256 multiplierNumber) public onlyOwner { BONUS_MULTIPLIER = multiplierNumber; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Detects whether the given pool already exists function checkPoolDuplicate(IBEP20 _lpToken) public view { uint256 length = poolInfo.length; for (uint256 _pid = 0; _pid < length; _pid++) { require(poolInfo[_pid].lpToken != _lpToken, "add: existing pool"); } } // Add a new lp to the pool. Can only be called by the owner. // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do. function add(uint256 _allocPoint, IBEP20 _lpToken, bool _withUpdate) public onlyOwner { if (_withUpdate) { massUpdatePools(); } checkPoolDuplicate(_lpToken); uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push(PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accCakePerShare: 0 })); updateStakingPool(); } // Update the given pool's BANANA allocation point. Can only be called by the owner. function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner { if (_withUpdate) { massUpdatePools(); } uint256 prevAllocPoint = poolInfo[_pid].allocPoint; poolInfo[_pid].allocPoint = _allocPoint; if (prevAllocPoint != _allocPoint) { totalAllocPoint = totalAllocPoint.sub(prevAllocPoint).add(_allocPoint); updateStakingPool(); } } function updateStakingPool() internal { uint256 length = poolInfo.length; uint256 points = 0; for (uint256 pid = 1; pid < length; ++pid) { points = points.add(poolInfo[pid].allocPoint); } if (points != 0) { points = points.div(3); totalAllocPoint = totalAllocPoint.sub(poolInfo[0].allocPoint).add(points); poolInfo[0].allocPoint = points; } } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { return _to.sub(_from).mul(BONUS_MULTIPLIER); } // View function to see pending BANANAs on frontend. function pendingCake(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accCakePerShare = pool.accCakePerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 cakeReward = multiplier.mul(cakePerBlock).mul(pool.allocPoint).div(totalAllocPoint); accCakePerShare = accCakePerShare.add(cakeReward.mul(1e12).div(lpSupply)); } return user.amount.mul(accCakePerShare).div(1e12).sub(user.rewardDebt); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public validatePool(_pid) { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 cakeReward = multiplier.mul(cakePerBlock).mul(pool.allocPoint).div(totalAllocPoint); cake.mint(devaddr, cakeReward.div(10)); cake.mint(address(syrup), cakeReward); pool.accCakePerShare = pool.accCakePerShare.add(cakeReward.mul(1e12).div(lpSupply)); pool.lastRewardBlock = block.number; } // Deposit LP tokens to MasterApe for BANANA allocation. function deposit(uint256 _pid, uint256 _amount) public validatePool(_pid) { require (_pid != 0, 'deposit BANANA by staking'); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accCakePerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { safeCakeTransfer(msg.sender, pending); } } if (_amount > 0) { pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); } user.rewardDebt = user.amount.mul(pool.accCakePerShare).div(1e12); emit Deposit(msg.sender, _pid, _amount); } // Withdraw LP tokens from MasterApe. function withdraw(uint256 _pid, uint256 _amount) public validatePool(_pid) { require (_pid != 0, 'withdraw BANANA by unstaking'); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(_pid); uint256 pending = user.amount.mul(pool.accCakePerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { safeCakeTransfer(msg.sender, pending); } if(_amount > 0) { user.amount = user.amount.sub(_amount); pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accCakePerShare).div(1e12); emit Withdraw(msg.sender, _pid, _amount); } // Stake BANANA tokens to MasterApe function enterStaking(uint256 _amount) public { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[0][msg.sender]; updatePool(0); if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accCakePerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { safeCakeTransfer(msg.sender, pending); } } if(_amount > 0) { pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); } user.rewardDebt = user.amount.mul(pool.accCakePerShare).div(1e12); syrup.mint(msg.sender, _amount); emit Deposit(msg.sender, 0, _amount); } // Withdraw BANANA tokens from STAKING. function leaveStaking(uint256 _amount) public { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[0][msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(0); uint256 pending = user.amount.mul(pool.accCakePerShare).div(1e12).sub(user.rewardDebt); if(pending > 0) { safeCakeTransfer(msg.sender, pending); } if(_amount > 0) { user.amount = user.amount.sub(_amount); pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accCakePerShare).div(1e12); syrup.burn(msg.sender, _amount); emit Withdraw(msg.sender, 0, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; pool.lpToken.safeTransfer(address(msg.sender), user.amount); emit EmergencyWithdraw(msg.sender, _pid, user.amount); user.amount = 0; user.rewardDebt = 0; } function getPoolInfo(uint256 _pid) public view returns(address lpToken, uint256 allocPoint, uint256 lastRewardBlock, uint256 accCakePerShare) { return (address(poolInfo[_pid].lpToken), poolInfo[_pid].allocPoint, poolInfo[_pid].lastRewardBlock, poolInfo[_pid].accCakePerShare); } // Safe cake transfer function, just in case if rounding error causes pool to not have enough BANANAs. function safeCakeTransfer(address _to, uint256 _amount) internal { syrup.safeCakeTransfer(_to, _amount); } // Update dev address by the previous dev. function dev(address _devaddr) public { require(msg.sender == devaddr, "dev: wut?"); devaddr = _devaddr; } }
File 2 of 10 : BananaToken.sol
pragma solidity 0.6.12; /* * ApeSwapFinance * App: https://apeswap.finance * Medium: https://medium.com/@ape_swap * Twitter: https://twitter.com/ape_swap * Telegram: https://t.me/ape_swap * Announcements: https://t.me/ape_swap_news * GitHub: https://github.com/ApeSwapFinance */ import "@pancakeswap/pancake-swap-lib/contracts/token/BEP20/BEP20.sol"; // BananaToken with Governance. contract BananaToken is BEP20('ApeSwapFinance Banana', 'BANANA') { /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterApe). function mint(address _to, uint256 _amount) public onlyOwner { _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol /// @notice A record of each accounts delegate mapping (address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "BANANA::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "BANANA::delegateBySig: invalid nonce"); require(now <= expiry, "BANANA::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "BANANA::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying BANANAs (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "BANANA::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } }
File 3 of 10 : BananaSplitBar.sol
pragma solidity 0.6.12; /* * ApeSwapFinance * App: https://apeswap.finance * Medium: https://medium.com/@ape_swap * Twitter: https://twitter.com/ape_swap * Telegram: https://t.me/ape_swap * Announcements: https://t.me/ape_swap_news * GitHub: https://github.com/ApeSwapFinance */ import "@pancakeswap/pancake-swap-lib/contracts/token/BEP20/BEP20.sol"; import "./BananaToken.sol"; // BananaSplitBar with Governance. contract BananaSplitBar is BEP20('BananaSplitBar Token', 'BANANASPLIT') { /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterApe). function mint(address _to, uint256 _amount) public onlyOwner { _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); } function burn(address _from ,uint256 _amount) public onlyOwner { _burn(_from, _amount); _moveDelegates(_delegates[_from], address(0), _amount); } // The BANANA TOKEN! BananaToken public cake; constructor( BananaToken _cake ) public { cake = _cake; } // Safe cake transfer function, just in case if rounding error causes pool to not have enough BANANAs. function safeCakeTransfer(address _to, uint256 _amount) public onlyOwner { uint256 cakeBal = cake.balanceOf(address(this)); if (_amount > cakeBal) { cake.transfer(_to, cakeBal); } else { cake.transfer(_to, _amount); } } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol /// @notice A record of each accounts delegate mapping (address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "BANANA::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "BANANA::delegateBySig: invalid nonce"); require(now <= expiry, "BANANA::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "BANANA::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying BANANAs (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "BANANA::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } }
File 4 of 10 : SafeMath.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.4.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, 'SafeMath: addition overflow'); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, 'SafeMath: subtraction overflow'); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'SafeMath: multiplication overflow'); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, 'SafeMath: division by zero'); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, 'SafeMath: modulo by zero'); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } }
File 5 of 10 : IBEP20.sol
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.4.0; interface IBEP20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
File 6 of 10 : SafeBEP20.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import './IBEP20.sol'; import '../../math/SafeMath.sol'; import '../../utils/Address.sol'; /** * @title SafeBEP20 * @dev Wrappers around BEP20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeBEP20 for IBEP20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeBEP20 { using SafeMath for uint256; using Address for address; function safeTransfer( IBEP20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IBEP20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IBEP20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IBEP20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), 'SafeBEP20: approve from non-zero to non-zero allowance' ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IBEP20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IBEP20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, 'SafeBEP20: decreased allowance below zero' ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IBEP20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, 'SafeBEP20: low-level call failed'); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), 'SafeBEP20: BEP20 operation did not succeed'); } } }
File 7 of 10 : Address.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Address: insufficient balance'); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(''); require(success, 'Address: unable to send value, recipient may have reverted'); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, 'Address: low-level call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, 'Address: insufficient balance for call'); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), 'Address: call to non-contract'); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
File 8 of 10 : Ownable.sol
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.4.0; import '../GSN/Context.sol'; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), 'Ownable: caller is not the owner'); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), 'Ownable: new owner is the zero address'); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
File 9 of 10 : Context.sol
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.4.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() internal {} function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
File 10 of 10 : BEP20.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.4.0; import '../../access/Ownable.sol'; import '../../GSN/Context.sol'; import './IBEP20.sol'; import '../../math/SafeMath.sol'; import '../../utils/Address.sol'; /** * @dev Implementation of the {IBEP20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {BEP20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-BEP20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of BEP20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IBEP20-approve}. */ contract BEP20 is Context, IBEP20, Ownable { using SafeMath for uint256; using Address for address; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor(string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the bep token owner. */ function getOwner() external override view returns (address) { return owner(); } /** * @dev Returns the token name. */ function name() public override view returns (string memory) { return _name; } /** * @dev Returns the token decimals. */ function decimals() public override view returns (uint8) { return _decimals; } /** * @dev Returns the token symbol. */ function symbol() public override view returns (string memory) { return _symbol; } /** * @dev See {BEP20-totalSupply}. */ function totalSupply() public override view returns (uint256) { return _totalSupply; } /** * @dev See {BEP20-balanceOf}. */ function balanceOf(address account) public override view returns (uint256) { return _balances[account]; } /** * @dev See {BEP20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {BEP20-allowance}. */ function allowance(address owner, address spender) public override view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {BEP20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {BEP20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {BEP20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, 'BEP20: transfer amount exceeds allowance') ); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {BEP20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {BEP20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, 'BEP20: decreased allowance below zero') ); return true; } /** * @dev Creates `amount` tokens and assigns them to `msg.sender`, increasing * the total supply. * * Requirements * * - `msg.sender` must be the token owner */ function mint(uint256 amount) public onlyOwner returns (bool) { _mint(_msgSender(), amount); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal { require(sender != address(0), 'BEP20: transfer from the zero address'); require(recipient != address(0), 'BEP20: transfer to the zero address'); _balances[sender] = _balances[sender].sub(amount, 'BEP20: transfer amount exceeds balance'); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), 'BEP20: mint to the zero address'); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), 'BEP20: burn from the zero address'); _balances[account] = _balances[account].sub(amount, 'BEP20: burn amount exceeds balance'); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal { require(owner != address(0), 'BEP20: approve from the zero address'); require(spender != address(0), 'BEP20: approve to the zero address'); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve( account, _msgSender(), _allowances[account][_msgSender()].sub(amount, 'BEP20: burn amount exceeds allowance') ); } }
Settings
{ "metadata": { "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
[{"inputs":[{"internalType":"contract BananaToken","name":"_banana","type":"address"},{"internalType":"contract BananaSplitBar","name":"_bananaSplit","type":"address"},{"internalType":"address","name":"_devaddr","type":"address"},{"internalType":"uint256","name":"_bananaPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_multiplier","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IBEP20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cake","outputs":[{"internalType":"contract BananaToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cakePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IBEP20","name":"_lpToken","type":"address"}],"name":"checkPoolDuplicate","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"enterStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolInfo","outputs":[{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accCakePerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"leaveStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingCake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBEP20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accCakePerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"syrup","outputs":[{"internalType":"contract BananaSplitBar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"multiplierNumber","type":"uint256"}],"name":"updateMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600060085534801561001557600080fd5b506040516120f33803806120f3833981810160405260c081101561003857600080fd5b508051602082015160408301516060840151608085015160a090950151939492939192909160006100676101e7565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b03199081166001600160a01b039889169081178355600280548316988a16989098179097556003805482169689169690961790955560049384556009839055600591909155604080516080810182529586526103e86020870181815291870193845260006060880181815260068054958601815590915296517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f939095029283018054909616949097169390931790935590517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40830155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4182015590517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d42909101556008556101eb565b3390565b611ef9806101fa6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80635ffe6146116100f95780638da5cb5b11610097578063d49e77cd11610071578063d49e77cd1461049e578063dce17484146104a6578063e2bbb158146104ae578063f2fde38b146104d1576101c4565b80638da5cb5b1461042e5780638dbb1e3a1461043657806393f1a40b14610459576101c4565b8063715018a6116100d3578063715018a6146103d457806386a952c4146103dc5780638aa28550146104005780638d88a90e14610408576101c4565b80635ffe614614610384578063630b5ba1146103a157806364482f79146103a9576101c4565b80632f380b3511610166578063441a3e7011610140578063441a3e701461031f57806348cd4cb11461034257806351eb05a61461034a5780635312ea8e14610367576101c4565b80632f380b35146102bf578063322d0d4a146102dc57806341441d3b14610302576101c4565b80631175a1dd116101a25780631175a1dd1461020a5780631526fe271461023657806317caf6f1146102835780631eaaa0451461028b576101c4565b80630755e0b6146101c9578063081e3eda146101e35780631058d281146101eb575b600080fd5b6101d16104f7565b60408051918252519081900360200190f35b6101d16104fd565b6102086004803603602081101561020157600080fd5b5035610503565b005b6101d16004803603604081101561022057600080fd5b50803590602001356001600160a01b03166106e7565b6102536004803603602081101561024c57600080fd5b5035610851565b604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190f35b6101d1610892565b610208600480360360608110156102a157600080fd5b508035906001600160a01b0360208201351690604001351515610898565b610253600480360360208110156102d557600080fd5b5035610a27565b610208600480360360208110156102f257600080fd5b50356001600160a01b0316610ac4565b6102086004803603602081101561031857600080fd5b5035610b58565b6102086004803603604081101561033557600080fd5b5080359060200135610cec565b6101d1610ee7565b6102086004803603602081101561036057600080fd5b5035610eed565b6102086004803603602081101561037d57600080fd5b5035611169565b6102086004803603602081101561039a57600080fd5b5035611204565b610208611261565b610208600480360360608110156103bf57600080fd5b50803590602081013590604001351515611280565b61020861135d565b6103e46113ff565b604080516001600160a01b039092168252519081900360200190f35b6101d161140e565b6102086004803603602081101561041e57600080fd5b50356001600160a01b0316611414565b6103e4611481565b6101d16004803603604081101561044c57600080fd5b5080359060200135611490565b6104856004803603604081101561046f57600080fd5b50803590602001356001600160a01b03166114ab565b6040805192835260208301919091528051918290030190f35b6103e46114cf565b6103e46114de565b610208600480360360408110156104c457600080fd5b50803590602001356114ed565b610208600480360360208110156104e757600080fd5b50356001600160a01b03166116a7565b60045481565b60065490565b6000600660008154811061051357fe5b600091825260208083203384527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df909152604090922080546004909202909201925083111561059e576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b6105a86000610eed565b60006105e282600101546105dc64e8d4a510006105d68760030154876000015461170b90919063ffffffff16565b90611764565b906117a6565b905080156105f4576105f433826117e8565b831561061e57815461060690856117a6565b8255825461061e906001600160a01b03163386611859565b600383015482546106399164e8d4a51000916105d69161170b565b600183015560025460408051632770a7eb60e21b81523360048201526024810187905290516001600160a01b0390921691639dc29fac9160448082019260009290919082900301818387803b15801561069157600080fd5b505af11580156106a5573d6000803e3d6000fd5b5050604080518781529051600093503392507ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a350505050565b600080600684815481106106f757fe5b600091825260208083208784526007825260408085206001600160a01b03898116875290845281862060049586029093016003810154815484516370a0823160e01b81523098810198909852935191985093969395939492909116926370a08231926024808301939192829003018186803b15801561077557600080fd5b505afa158015610789573d6000803e3d6000fd5b505050506040513d602081101561079f57600080fd5b50516002850154909150431180156107b657508015155b1561081c5760006107cb856002015443611490565b905060006107f86008546105d688600101546107f26004548761170b90919063ffffffff16565b9061170b565b9050610817610810846105d68464e8d4a5100061170b565b85906118ab565b935050505b61084483600101546105dc64e8d4a510006105d686886000015461170b90919063ffffffff16565b9450505050505b92915050565b6006818154811061085e57fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b039092169350919084565b60085481565b6108a0611905565b6000546001600160a01b039081169116146108f0576040805162461bcd60e51b81526020600482018190526024820152600080516020611ea4833981519152604482015290519081900360640190fd5b80156108fe576108fe611261565b61090782610ac4565b6000600954431161091a5760095461091c565b435b60085490915061092c90856118ab565b600855604080516080810182526001600160a01b0385811682526020820187815292820184815260006060840181815260068054600181018255925293517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f600490920291820180546001600160a01b031916919094161790925592517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4082015591517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d41830155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4290910155610a21611909565b50505050565b60008060008060068581548110610a3a57fe5b6000918252602090912060049091020154600680546001600160a01b039092169187908110610a6557fe5b90600052602060002090600402016001015460068781548110610a8457fe5b90600052602060002090600402016002015460068881548110610aa357fe5b90600052602060002090600402016003015493509350935093509193509193565b60065460005b81811015610b5357826001600160a01b031660068281548110610ae957fe5b60009182526020909120600490910201546001600160a01b03161415610b4b576040805162461bcd60e51b81526020600482015260126024820152711859190e88195e1a5cdd1a5b99c81c1bdbdb60721b604482015290519081900360640190fd5b600101610aca565b505050565b60006006600081548110610b6857fe5b600091825260208083203384527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df90915260408320600490920201925090610baf90610eed565b805415610bf8576000610be482600101546105dc64e8d4a510006105d68760030154876000015461170b90919063ffffffff16565b90508015610bf657610bf633826117e8565b505b8215610c24578154610c15906001600160a01b03163330866119ce565b8054610c2190846118ab565b81555b60038201548154610c3f9164e8d4a51000916105d69161170b565b6001820155600254604080516340c10f1960e01b81523360048201526024810186905290516001600160a01b03909216916340c10f199160448082019260009290919082900301818387803b158015610c9757600080fd5b505af1158015610cab573d6000803e3d6000fd5b5050604080518681529051600093503392507f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a3505050565b60065482908110610d41576040805162461bcd60e51b815260206004820152601a60248201527976616c6964617465506f6f6c3a20706f6f6c206578697374733f60301b604482015290519081900360640190fd5b82610d93576040805162461bcd60e51b815260206004820152601c60248201527f77697468647261772042414e414e4120627920756e7374616b696e6700000000604482015290519081900360640190fd5b600060068481548110610da257fe5b600091825260208083208784526007825260408085203386529092529220805460049092029092019250841115610e15576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b610e1e85610eed565b6000610e4c82600101546105dc64e8d4a510006105d68760030154876000015461170b90919063ffffffff16565b90508015610e5e57610e5e33826117e8565b8415610e88578154610e7090866117a6565b82558254610e88906001600160a01b03163387611859565b60038301548254610ea39164e8d4a51000916105d69161170b565b6001830155604080518681529051879133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a3505050505050565b60095481565b60065481908110610f42576040805162461bcd60e51b815260206004820152601a60248201527976616c6964617465506f6f6c3a20706f6f6c206578697374733f60301b604482015290519081900360640190fd5b600060068381548110610f5157fe5b9060005260206000209060040201905080600201544311610f725750611165565b8054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610fbc57600080fd5b505afa158015610fd0573d6000803e3d6000fd5b505050506040513d6020811015610fe657600080fd5b5051905080610ffc575043600290910155611165565b600061100c836002015443611490565b905060006110336008546105d686600101546107f26004548761170b90919063ffffffff16565b6001546003549192506001600160a01b03908116916340c10f19911661105a84600a611764565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156110a057600080fd5b505af11580156110b4573d6000803e3d6000fd5b5050600154600254604080516340c10f1960e01b81526001600160a01b0392831660048201526024810187905290519190921693506340c10f199250604480830192600092919082900301818387803b15801561111057600080fd5b505af1158015611124573d6000803e3d6000fd5b50505050611152611147846105d664e8d4a510008561170b90919063ffffffff16565b6003860154906118ab565b6003850155505043600290920191909155505b5050565b60006006828154811061117857fe5b600091825260208083208584526007825260408085203380875293529093208054600490930290930180549094506111bd926001600160a01b03919091169190611859565b80546040805191825251849133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a360008082556001909101555050565b61120c611905565b6000546001600160a01b0390811691161461125c576040805162461bcd60e51b81526020600482018190526024820152600080516020611ea4833981519152604482015290519081900360640190fd5b600555565b60065460005b818110156111655761127881610eed565b600101611267565b611288611905565b6000546001600160a01b039081169116146112d8576040805162461bcd60e51b81526020600482018190526024820152600080516020611ea4833981519152604482015290519081900360640190fd5b80156112e6576112e6611261565b6000600684815481106112f557fe5b9060005260206000209060040201600101549050826006858154811061131757fe5b906000526020600020906004020160010181905550828114610a21576113528361134c836008546117a690919063ffffffff16565b906118ab565b600855610a21611909565b611365611905565b6000546001600160a01b039081169116146113b5576040805162461bcd60e51b81526020600482018190526024820152600080516020611ea4833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6002546001600160a01b031681565b60055481565b6003546001600160a01b0316331461145f576040805162461bcd60e51b81526020600482015260096024820152686465763a207775743f60b81b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b6005546000906114a4906107f284866117a6565b9392505050565b60076020908152600092835260408084209091529082529020805460019091015482565b6003546001600160a01b031681565b6001546001600160a01b031681565b60065482908110611542576040805162461bcd60e51b815260206004820152601a60248201527976616c6964617465506f6f6c3a20706f6f6c206578697374733f60301b604482015290519081900360640190fd5b82611594576040805162461bcd60e51b815260206004820152601960248201527f6465706f7369742042414e414e41206279207374616b696e6700000000000000604482015290519081900360640190fd5b6000600684815481106115a357fe5b600091825260208083208784526007825260408085203386529092529220600490910290910191506115d485610eed565b80541561161d57600061160982600101546105dc64e8d4a510006105d68760030154876000015461170b90919063ffffffff16565b9050801561161b5761161b33826117e8565b505b831561164957815461163a906001600160a01b03163330876119ce565b805461164690856118ab565b81555b600382015481546116649164e8d4a51000916105d69161170b565b6001820155604080518581529051869133917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050505050565b6116af611905565b6000546001600160a01b039081169116146116ff576040805162461bcd60e51b81526020600482018190526024820152600080516020611ea4833981519152604482015290519081900360640190fd5b61170881611a28565b50565b60008261171a5750600061084b565b8282028284828161172757fe5b04146114a45760405162461bcd60e51b8152600401808060200182810382526021815260200180611e836021913960400191505060405180910390fd5b60006114a483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611ac8565b60006114a483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b6a565b600254604080516328b9b77360e21b81526001600160a01b038581166004830152602482018590529151919092169163a2e6ddcc91604480830192600092919082900301818387803b15801561183d57600080fd5b505af1158015611851573d6000803e3d6000fd5b505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b53908490611bc4565b6000828201838110156114a4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b600654600060015b828110156119545761194a6006828154811061192957fe5b906000526020600020906004020160010154836118ab90919063ffffffff16565b9150600101611911565b50801561116557611966816003611764565b90506119a08161134c600660008154811061197d57fe5b9060005260206000209060040201600101546008546117a690919063ffffffff16565b6008819055508060066000815481106119b557fe5b9060005260206000209060040201600101819055505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610a21908590611bc4565b6001600160a01b038116611a6d5760405162461bcd60e51b8152600401808060200182810382526026815260200180611e5d6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008183611b545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611b19578181015183820152602001611b01565b50505050905090810190601f168015611b465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611b6057fe5b0495945050505050565b60008184841115611bbc5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611b19578181015183820152602001611b01565b505050900390565b6060611c19826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c759092919063ffffffff16565b805190915015610b5357808060200190516020811015611c3857600080fd5b5051610b535760405162461bcd60e51b815260040180806020018281038252602a815260200180611e33602a913960400191505060405180910390fd5b6060611c848484600085611c8c565b949350505050565b6060611c9785611df9565b611ce8576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611d275780518252601f199092019160209182019101611d08565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611d89576040519150601f19603f3d011682016040523d82523d6000602084013e611d8e565b606091505b50915091508115611da2579150611c849050565b805115611db25780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315611b19578181015183820152602001611b01565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611c8457505015159291505056fe5361666542455032303a204245503230206f7065726174696f6e20646964206e6f7420737563636565644f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212203ac7ca4d66b2b8e319c7593bad29f58bbdf704b2172f967f84c283c16278bd7064736f6c634300060c0033000000000000000000000000603c7f932ed1fc6575303d8fb018fdcbb0f39a9500000000000000000000000086ef5e73edb2fea111909fe35afcc564572acc06000000000000000000000000cef34e4db130c8a64493517985b23af5b13e8cc60000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000004a2bf20000000000000000000000000000000000000000000000000000000000000004
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000603c7f932ed1fc6575303d8fb018fdcbb0f39a9500000000000000000000000086ef5e73edb2fea111909fe35afcc564572acc06000000000000000000000000cef34e4db130c8a64493517985b23af5b13e8cc60000000000000000000000000000000000000000000000008ac7230489e8000000000000000000000000000000000000000000000000000000000000004a2bf20000000000000000000000000000000000000000000000000000000000000004
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000603c7f932ed1fc6575303d8fb018fdcbb0f39a95
Arg [1] : 00000000000000000000000086ef5e73edb2fea111909fe35afcc564572acc06
Arg [2] : 000000000000000000000000cef34e4db130c8a64493517985b23af5b13e8cc6
Arg [3] : 0000000000000000000000000000000000000000000000008ac7230489e80000
Arg [4] : 00000000000000000000000000000000000000000000000000000000004a2bf2
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Deployed ByteCode Sourcemap
1120:11968:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2665:27;;;:::i;:::-;;;;;;;;;;;;;;;;4331:93;;;:::i;11178:745::-;;;;;;;;;;;;;;;;-1:-1:-1;11178:745:2;;:::i;:::-;;6726:748;;;;;;;;;;;;;;;;-1:-1:-1;6726:748:2;;;;;;-1:-1:-1;;;;;6726:748:2;;:::i;2811:26::-;;;;;;;;;;;;;;;;-1:-1:-1;2811:26:2;;:::i;:::-;;;;-1:-1:-1;;;;;2811:26:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3050:34;;;:::i;4899:568::-;;;;;;;;;;;;;;;;-1:-1:-1;4899:568:2;;;-1:-1:-1;;;;;4899:568:2;;;;;;;;;;;;:::i;12346:330::-;;;;;;;;;;;;;;;;-1:-1:-1;12346:330:2;;:::i;4483:251::-;;;;;;;;;;;;;;;;-1:-1:-1;4483:251:2;-1:-1:-1;;;;;4483:251:2;;:::i;10371:757::-;;;;;;;;;;;;;;;;-1:-1:-1;10371:757:2;;:::i;9519:806::-;;;;;;;;;;;;;;;;-1:-1:-1;9519:806:2;;;;;;;:::i;3141:25::-;;;:::i;7803:785::-;;;;;;;;;;;;;;;;-1:-1:-1;7803:785:2;;:::i;11991:349::-;;;;;;;;;;;;;;;;-1:-1:-1;11991:349:2;;:::i;4204:121::-;;;;;;;;;;;;;;;;-1:-1:-1;4204:121:2;;:::i;7554:175::-;;;:::i;5562:439::-;;;;;;;;;;;;;;;;-1:-1:-1;5562:439:2;;;;;;;;;;;;;;:::i;1703:137:4:-;;;:::i;2544:27:2:-;;;:::i;:::-;;;;-1:-1:-1;;;;;2544:27:2;;;;;;;;;;;;;;2746:31;;;:::i;12960:126::-;;;;;;;;;;;;;;;;-1:-1:-1;12960:126:2;-1:-1:-1;;;;;12960:126:2;;:::i;1080:77:4:-;;;:::i;6522:141:2:-;;;;;;;;;;;;;;;;-1:-1:-1;6522:141:2;;;;;;;:::i;2891:66::-;;;;;;;;;;;;;;;;-1:-1:-1;2891:66:2;;;;;;-1:-1:-1;;;;;2891:66:2;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2597:22;;;:::i;2484:23::-;;;:::i;8655:816::-;;;;;;;;;;;;;;;;-1:-1:-1;8655:816:2;;;;;;;:::i;1989:107:4:-;;;;;;;;;;;;;;;;-1:-1:-1;1989:107:4;-1:-1:-1;;;;;1989:107:4;;:::i;2665:27:2:-;;;;:::o;4331:93::-;4402:8;:15;4331:93;:::o;11178:745::-;11234:21;11258:8;11267:1;11258:11;;;;;;;;;;;;;;;;11315:10;11303:23;;:11;:23;;;:11;:23;;;11344:11;;11258;;;;;;;;-1:-1:-1;11344:22:2;-1:-1:-1;11344:22:2;11336:53;;;;;-1:-1:-1;;;11336:53:2;;;;;;;;;;;;-1:-1:-1;;;11336:53:2;;;;;;;;;;;;;;;11399:13;11410:1;11399:10;:13::i;:::-;11422:15;11440:68;11492:4;:15;;;11440:47;11482:4;11440:37;11456:4;:20;;;11440:4;:11;;;:15;;:37;;;;:::i;:::-;:41;;:47::i;:::-;:51;;:68::i;:::-;11422:86;-1:-1:-1;11521:11:2;;11518:78;;11548:37;11565:10;11577:7;11548:16;:37::i;:::-;11608:11;;11605:148;;11649:11;;:24;;11665:7;11649:15;:24::i;:::-;11635:38;;11687:12;;:55;;-1:-1:-1;;;;;11687:12:2;11721:10;11734:7;11687:25;:55::i;:::-;11796:20;;;;11780:11;;:47;;11822:4;;11780:37;;:15;:37::i;:47::-;11762:15;;;:65;11838:5;;:31;;;-1:-1:-1;;;11838:31:2;;11849:10;11838:31;;;;;;;;;;;;-1:-1:-1;;;;;11838:5:2;;;;:10;;:31;;;;;:5;;:31;;;;;;;;:5;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11884:32:2;;;;;;;;11905:1;;-1:-1:-1;11893:10:2;;-1:-1:-1;11884:32:2;;;;;;;;;11178:745;;;;:::o;6726:748::-;6799:7;6818:21;6842:8;6851:4;6842:14;;;;;;;;;;;;;;;;6890;;;:8;:14;;;;;;-1:-1:-1;;;;;6890:21:2;;;;;;;;;;;6842:14;;;;;;;6947:20;;;;6996:12;;:37;;-1:-1:-1;;;6996:37:2;;7027:4;6996:37;;;;;;;;;6842:14;;-1:-1:-1;6890:21:2;;6947:20;;6842:14;;6996:12;;;;;:22;;:37;;;;;6842:14;;6996:37;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6996:37:2;7062:20;;;;6996:37;;-1:-1:-1;7047:12:2;:35;:52;;;;-1:-1:-1;7086:13:2;;;7047:52;7043:345;;;7115:18;7136:49;7150:4;:20;;;7172:12;7136:13;:49::i;:::-;7115:70;;7199:18;7220:70;7274:15;;7220:49;7253:4;:15;;;7220:28;7235:12;;7220:10;:14;;:28;;;;:::i;:::-;:32;;:49::i;:70::-;7199:91;-1:-1:-1;7322:55:2;7342:34;7367:8;7342:20;7199:91;7357:4;7342:14;:20::i;:34::-;7322:15;;:19;:55::i;:::-;7304:73;;7043:345;;;7404:63;7451:4;:15;;;7404:42;7441:4;7404:32;7420:15;7404:4;:11;;;:15;;:32;;;;:::i;:63::-;7397:70;;;;;;6726:748;;;;;:::o;2811:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2811:26:2;;;;-1:-1:-1;2811:26:2;;;:::o;3050:34::-;;;;:::o;4899:568::-;1294:12:4;:10;:12::i;:::-;1284:6;;-1:-1:-1;;;;;1284:6:4;;;:22;;;1276:67;;;;;-1:-1:-1;;;1276:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1276:67:4;;;;;;;;;;;;;;;4999:11:2::1;4995:59;;;5026:17;:15;:17::i;:::-;5063:28;5082:8;5063:18;:28::i;:::-;5101:23;5142:10;;5127:12;:25;:53;;5170:10;;5127:53;;;5155:12;5127:53;5208:15;::::0;5101:79;;-1:-1:-1;5208:32:2::1;::::0;5228:11;5208:19:::1;:32::i;:::-;5190:15;:50:::0;5264:166:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;5264:166:2;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;5264:166:2;;;;;;5250:8:::1;:181:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;5250:181:2::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;5441:19:::1;:17;:19::i;:::-;1353:1:4;4899:568:2::0;;;:::o;12346:330::-;12405:15;12422:18;12442:23;12467;12518:8;12527:4;12518:14;;;;;;;;;;;;;;;;;;;;;:22;12555:8;:14;;-1:-1:-1;;;;;12518:22:2;;;;12564:4;;12555:14;;;;;;;;;;;;;;;;:25;;;12594:8;12603:4;12594:14;;;;;;;;;;;;;;;;;;:30;;;12638:8;12647:4;12638:14;;;;;;;;;;;;;;;;;;:30;;;12502:167;;;;;;;;12346:330;;;;;:::o;4483:251::-;4567:8;:15;4550:14;4592:136;4622:6;4615:4;:13;4592:136;;;4686:8;-1:-1:-1;;;;;4660:34:2;:8;4669:4;4660:14;;;;;;;;;;;;;;;;;;;;;:22;-1:-1:-1;;;;;4660:22:2;:34;;4652:65;;;;;-1:-1:-1;;;4652:65:2;;;;;;;;;;;;-1:-1:-1;;;4652:65:2;;;;;;;;;;;;;;;4630:6;;4592:136;;;;4483:251;;:::o;10371:757::-;10427:21;10451:8;10460:1;10451:11;;;;;;;;;;;;;;;;10508:10;10496:23;;:11;:23;;;:11;:23;;10451:11;;;;;;-1:-1:-1;10496:23:2;10529:13;;:10;:13::i;:::-;10556:11;;:15;10552:231;;10587:15;10605:68;10657:4;:15;;;10605:47;10647:4;10605:37;10621:4;:20;;;10605:4;:11;;;:15;;:37;;;;:::i;:68::-;10587:86;-1:-1:-1;10690:11:2;;10687:86;;10721:37;10738:10;10750:7;10721:16;:37::i;:::-;10552:231;;10795:11;;10792:167;;10822:12;;:74;;-1:-1:-1;;;;;10822:12:2;10860:10;10881:4;10888:7;10822:29;:74::i;:::-;10924:11;;:24;;10940:7;10924:15;:24::i;:::-;10910:38;;10792:167;11002:20;;;;10986:11;;:47;;11028:4;;10986:37;;:15;:37::i;:47::-;10968:15;;;:65;11044:5;;:31;;;-1:-1:-1;;;11044:31:2;;11055:10;11044:31;;;;;;;;;;;;-1:-1:-1;;;;;11044:5:2;;;;:10;;:31;;;;;:5;;:31;;;;;;;;:5;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11090:31:2;;;;;;;;11110:1;;-1:-1:-1;11098:10:2;;-1:-1:-1;11090:31:2;;;;;;;;;10371:757;;;:::o;9519:806::-;4134:8;:15;9588:4;;4127:22;;4119:61;;;;;-1:-1:-1;;;4119:61:2;;;;;;;;;;;;-1:-1:-1;;;4119:61:2;;;;;;;;;;;;;;;9613:9;9604:51:::1;;;::::0;;-1:-1:-1;;;9604:51:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;9665:21;9689:8;9698:4;9689:14;;;;;;;;;::::0;;;::::1;::::0;;;9737;;;:8:::1;:14:::0;;;;;;9752:10:::1;9737:26:::0;;;;;;;9781:11;;9689:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;9781:22:2;-1:-1:-1;9781:22:2::1;9773:53;;;::::0;;-1:-1:-1;;;9773:53:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;9773:53:2;;;;;;;;;;;;;::::1;;9837:16;9848:4;9837:10;:16::i;:::-;9863:15;9881:68;9933:4;:15;;;9881:47;9923:4;9881:37;9897:4;:20;;;9881:4;:11;;;:15;;:37;;;;:::i;:68::-;9863:86:::0;-1:-1:-1;9962:11:2;;9959:78:::1;;9989:37;10006:10;10018:7;9989:16;:37::i;:::-;10049:11:::0;;10046:148:::1;;10090:11:::0;;:24:::1;::::0;10106:7;10090:15:::1;:24::i;:::-;10076:38:::0;;10128:12;;:55:::1;::::0;-1:-1:-1;;;;;10128:12:2::1;10162:10;10175:7:::0;10128:25:::1;:55::i;:::-;10237:20;::::0;::::1;::::0;10221:11;;:47:::1;::::0;10263:4:::1;::::0;10221:37:::1;::::0;:15:::1;:37::i;:47::-;10203:15;::::0;::::1;:65:::0;10283:35:::1;::::0;;;;;;;10304:4;;10292:10:::1;::::0;10283:35:::1;::::0;;;;::::1;::::0;;::::1;4190:1;;;9519:806:::0;;;:::o;3141:25::-;;;;:::o;7803:785::-;4134:8;:15;7857:4;;4127:22;;4119:61;;;;;-1:-1:-1;;;4119:61:2;;;;;;;;;;;;-1:-1:-1;;;4119:61:2;;;;;;;;;;;;;;;7873:21:::1;7897:8;7906:4;7897:14;;;;;;;;;;;;;;;;;;7873:38;;7941:4;:20;;;7925:12;:36;7921:73;;7977:7;;;7921:73;8022:12:::0;;:37:::1;::::0;;-1:-1:-1;;;8022:37:2;;8053:4:::1;8022:37;::::0;::::1;::::0;;;8003:16:::1;::::0;-1:-1:-1;;;;;8022:12:2::1;::::0;:22:::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:12;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;8022:37:2;;-1:-1:-1;8073:13:2;8069:99:::1;;-1:-1:-1::0;8125:12:2::1;8102:20;::::0;;::::1;:35:::0;8151:7:::1;;8069:99;8177:18;8198:49;8212:4;:20;;;8234:12;8198:13;:49::i;:::-;8177:70;;8257:18;8278:70;8332:15;;8278:49;8311:4;:15;;;8278:28;8293:12;;8278:10;:14;;:28;;;;:::i;:70::-;8358:4;::::0;8368:7:::1;::::0;8257:91;;-1:-1:-1;;;;;;8358:4:2;;::::1;::::0;:9:::1;::::0;8368:7:::1;8377:18;8257:91:::0;8392:2:::1;8377:14;:18::i;:::-;8358:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;8358:38:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;8406:4:2::1;::::0;8424:5:::1;::::0;8406:37:::1;::::0;;-1:-1:-1;;;8406:37:2;;-1:-1:-1;;;;;8424:5:2;;::::1;8406:37;::::0;::::1;::::0;;;;;;;;;:4;;;::::1;::::0;-1:-1:-1;8406:9:2::1;::::0;-1:-1:-1;8406:37:2;;;;;:4:::1;::::0;:37;;;;;;;:4;;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8476:60;8501:34;8526:8;8501:20;8516:4;8501:10;:14;;:20;;;;:::i;:34::-;8476:20;::::0;::::1;::::0;;:24:::1;:60::i;:::-;8453:20;::::0;::::1;:83:::0;-1:-1:-1;;8569:12:2::1;8546:20;::::0;;::::1;:35:::0;;;;-1:-1:-1;4190:1:2::1;7803:785:::0;;:::o;11991:349::-;12049:21;12073:8;12082:4;12073:14;;;;;;;;;;;;;;;;12121;;;:8;:14;;;;;;12136:10;12121:26;;;;;;;;12204:11;;12073:14;;;;;;;12157:12;;12073:14;;-1:-1:-1;12157:59:2;;-1:-1:-1;;;;;12157:12:2;;;;;12136:10;12157:25;:59::i;:::-;12267:11;;12231:48;;;;;;;12261:4;;12249:10;;12231:48;;;;;;;;;12303:1;12289:15;;;12314;;;;:19;-1:-1:-1;;11991:349:2:o;4204:121::-;1294:12:4;:10;:12::i;:::-;1284:6;;-1:-1:-1;;;;;1284:6:4;;;:22;;;1276:67;;;;;-1:-1:-1;;;1276:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1276:67:4;;;;;;;;;;;;;;;4283:16:2::1;:35:::0;4204:121::o;7554:175::-;7615:8;:15;7598:14;7640:83;7668:6;7662:3;:12;7640:83;;;7697:15;7708:3;7697:10;:15::i;:::-;7676:5;;7640:83;;5562:439;1294:12:4;:10;:12::i;:::-;1284:6;;-1:-1:-1;;;;;1284:6:4;;;:22;;;1276:67;;;;;-1:-1:-1;;;1276:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1276:67:4;;;;;;;;;;;;;;;5659:11:2::1;5655:59;;;5686:17;:15;:17::i;:::-;5723:22;5748:8;5757:4;5748:14;;;;;;;;;;;;;;;;;;:25;;;5723:50;;5811:11;5783:8;5792:4;5783:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;5854:11;5836:14;:29;5832:163;;5899:52;5939:11;5899:35;5919:14;5899:15;;:19;;:35;;;;:::i;:::-;:39:::0;::::1;:52::i;:::-;5881:15;:70:::0;5965:19:::1;:17;:19::i;1703:137:4:-:0;1294:12;:10;:12::i;:::-;1284:6;;-1:-1:-1;;;;;1284:6:4;;;:22;;;1276:67;;;;;-1:-1:-1;;;1276:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1276:67:4;;;;;;;;;;;;;;;1801:1:::1;1785:6:::0;;1764:40:::1;::::0;-1:-1:-1;;;;;1785:6:4;;::::1;::::0;1764:40:::1;::::0;1801:1;;1764:40:::1;1831:1;1814:19:::0;;-1:-1:-1;;;;;;1814:19:4::1;::::0;;1703:137::o;2544:27:2:-;;;-1:-1:-1;;;;;2544:27:2;;:::o;2746:31::-;;;;:::o;12960:126::-;13030:7;;-1:-1:-1;;;;;13030:7:2;13016:10;:21;13008:43;;;;;-1:-1:-1;;;13008:43:2;;;;;;;;;;;;-1:-1:-1;;;13008:43:2;;;;;;;;;;;;;;;13061:7;:18;;-1:-1:-1;;;;;;13061:18:2;-1:-1:-1;;;;;13061:18:2;;;;;;;;;;12960:126::o;1080:77:4:-;1118:7;1144:6;-1:-1:-1;;;;;1144:6:4;1080:77;:::o;6522:141:2:-;6639:16;;6594:7;;6620:36;;:14;:3;6628:5;6620:7;:14::i;:36::-;6613:43;6522:141;-1:-1:-1;;;6522:141:2:o;2891:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2597:22::-;;;-1:-1:-1;;;;;2597:22:2;;:::o;2484:23::-;;;-1:-1:-1;;;;;2484:23:2;;:::o;8655:816::-;4134:8;:15;8723:4;;4127:22;;4119:61;;;;;-1:-1:-1;;;4119:61:2;;;;;;;;;;;;-1:-1:-1;;;4119:61:2;;;;;;;;;;;;;;;8749:9;8740:48:::1;;;::::0;;-1:-1:-1;;;8740:48:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;8799:21;8823:8;8832:4;8823:14;;;;;;;;;::::0;;;::::1;::::0;;;8871;;;:8:::1;:14:::0;;;;;;8886:10:::1;8871:26:::0;;;;;;;8823:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;8907:16:2::1;8880:4:::0;8907:10:::1;:16::i;:::-;8937:11:::0;;:15;8933:231:::1;;8968:15;8986:68;9038:4;:15;;;8986:47;9028:4;8986:37;9002:4;:20;;;8986:4;:11;;;:15;;:37;;;;:::i;:68::-;8968:86:::0;-1:-1:-1;9071:11:2;;9068:86:::1;;9102:37;9119:10;9131:7;9102:16;:37::i;:::-;8933:231;;9177:11:::0;;9173:168:::1;;9204:12:::0;;:74:::1;::::0;-1:-1:-1;;;;;9204:12:2::1;9242:10;9263:4;9270:7:::0;9204:29:::1;:74::i;:::-;9306:11:::0;;:24:::1;::::0;9322:7;9306:15:::1;:24::i;:::-;9292:38:::0;;9173:168:::1;9384:20;::::0;::::1;::::0;9368:11;;:47:::1;::::0;9410:4:::1;::::0;9368:37:::1;::::0;:15:::1;:37::i;:47::-;9350:15;::::0;::::1;:65:::0;9430:34:::1;::::0;;;;;;;9450:4;;9438:10:::1;::::0;9430:34:::1;::::0;;;;::::1;::::0;;::::1;4190:1;;8655:816:::0;;;:::o;1989:107:4:-;1294:12;:10;:12::i;:::-;1284:6;;-1:-1:-1;;;;;1284:6:4;;;:22;;;1276:67;;;;;-1:-1:-1;;;1276:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1276:67:4;;;;;;;;;;;;;;;2061:28:::1;2080:8;2061:18;:28::i;:::-;1989:107:::0;:::o;2211:459:5:-;2269:7;2510:6;2506:45;;-1:-1:-1;2539:1:5;2532:8;;2506:45;2573:5;;;2577:1;2573;:5;:1;2596:5;;;;;:10;2588:56;;;;-1:-1:-1;;;2588:56:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3132:130;3190:7;3216:39;3220:1;3223;3216:39;;;;;;;;;;;;;;;;;:3;:39::i;1322:134::-;1380:7;1406:43;1410:1;1413;1406:43;;;;;;;;;;;;;;;;;:3;:43::i;12789:118:2:-;12864:5;;:36;;;-1:-1:-1;;;12864:36:2;;-1:-1:-1;;;;;12864:36:2;;;;;;;;;;;;;;;:5;;;;;:22;;:36;;;;;:5;;:36;;;;;;;:5;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12789:118;;:::o;696:205:8:-;835:58;;;-1:-1:-1;;;;;835:58:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;835:58:8;-1:-1:-1;;;835:58:8;;;808:86;;828:5;;808:19;:86::i;875:176:5:-;933:7;964:5;;;987:6;;;;979:46;;;;;-1:-1:-1;;;979:46:5;;;;;;;;;;;;;;;;;;;;;;;;;;;780:96:3;859:10;780:96;:::o;6007:442:2:-;6072:8;:15;6055:14;6144:1;6125:113;6153:6;6147:3;:12;6125:113;;;6191:36;6202:8;6211:3;6202:13;;;;;;;;;;;;;;;;;;:24;;;6191:6;:10;;:36;;;;:::i;:::-;6182:45;-1:-1:-1;6161:5:2;;6125:113;;;-1:-1:-1;6251:11:2;;6247:196;;6287:13;:6;6298:1;6287:10;:13::i;:::-;6278:22;;6332:55;6380:6;6332:43;6352:8;6361:1;6352:11;;;;;;;;;;;;;;;;;;:22;;;6332:15;;:19;;:43;;;;:::i;:55::-;6314:15;:73;;;;6426:6;6401:8;6410:1;6401:11;;;;;;;;;;;;;;;;;;:22;;:31;;;;6007:442;;:::o;907:241:8:-;1072:68;;;-1:-1:-1;;;;;1072:68:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1072:68:8;-1:-1:-1;;;1072:68:8;;;1045:96;;1065:5;;1045:19;:96::i;2197:225:4:-;-1:-1:-1;;;;;2270:22:4;;2262:73;;;;-1:-1:-1;;;2262:73:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2371:6;;;2350:38;;-1:-1:-1;;;;;2350:38:4;;;;2371:6;;;2350:38;;;2398:6;:17;;-1:-1:-1;;;;;;2398:17:4;-1:-1:-1;;;;;2398:17:4;;;;;;;;;;2197:225::o;3744:302:5:-;3860:7;3894:12;3887:5;3879:28;;;;-1:-1:-1;;;3879:28:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3917:9;3933:1;3929;:5;;;;;;;3744:302;-1:-1:-1;;;;;3744:302:5:o;1747:217::-;1863:7;1898:12;1890:6;;;;1882:29;;;;-1:-1:-1;;;1882:29:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1933:5:5;;;1747:217::o;3164:763:8:-;3583:23;3609:69;3637:4;3609:69;;;;;;;;;;;;;;;;;3617:5;-1:-1:-1;;;;;3609:27:8;;;:69;;;;;:::i;:::-;3692:17;;3583:95;;-1:-1:-1;3692:21:8;3688:233;;3844:10;3833:30;;;;;;;;;;;;;;;-1:-1:-1;3833:30:8;3825:85;;;;-1:-1:-1;;;3825:85:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3790:224:9;3923:12;3954:53;3977:6;3985:4;3991:1;3994:12;3954:22;:53::i;:::-;3947:60;3790:224;-1:-1:-1;;;;3790:224:9:o;5235:994::-;5403:12;5435:18;5446:6;5435:10;:18::i;:::-;5427:60;;;;;-1:-1:-1;;;5427:60:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;5558:12;5572:23;5599:6;-1:-1:-1;;;;;5599:11:9;5618:8;5628:4;5599:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5599:34:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5557:76;;;;5647:7;5643:580;;;5677:10;-1:-1:-1;5670:17:9;;-1:-1:-1;5670:17:9;5643:580;5788:17;;:21;5784:429;;6046:10;6040:17;6106:15;6093:10;6089:2;6085:19;6078:44;5995:145;6178:20;;-1:-1:-1;;;6178:20:9;;;;;;;;;;;;;;;;;6185:12;;6178:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;718:630;778:4;1251:20;;1084:66;1298:23;;;;;;:42;;-1:-1:-1;;1325:15:9;;;1290:51;-1:-1:-1;;718:630:9:o
Swarm Source
ipfs://3ac7ca4d66b2b8e319c7593bad29f58bbdf704b2172f967f84c283c16278bd70
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.