More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 893 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Reward Claim | 19568304 | 181 days ago | IN | 0 ETH | 0.00670023 | ||||
Withdraw | 19475633 | 194 days ago | IN | 0 ETH | 0.00324013 | ||||
Reward Claim | 19475627 | 194 days ago | IN | 0 ETH | 0.00201073 | ||||
Withdraw | 19325741 | 215 days ago | IN | 0 ETH | 0.00491774 | ||||
Withdraw | 19317388 | 216 days ago | IN | 0 ETH | 0.00354084 | ||||
Reward Claim | 19317298 | 216 days ago | IN | 0 ETH | 0.00389099 | ||||
Withdraw | 19272394 | 222 days ago | IN | 0 ETH | 0.00323976 | ||||
Reward Claim | 19248352 | 226 days ago | IN | 0 ETH | 0.00174252 | ||||
Withdraw | 18723406 | 299 days ago | IN | 0 ETH | 0.00475607 | ||||
Reward Claim | 18723291 | 299 days ago | IN | 0 ETH | 0.00418841 | ||||
Withdraw | 18637890 | 311 days ago | IN | 0 ETH | 0.00201036 | ||||
Withdraw | 18529356 | 326 days ago | IN | 0 ETH | 0.00408597 | ||||
Reward Claim | 18529353 | 326 days ago | IN | 0 ETH | 0.00365444 | ||||
Withdraw | 18408695 | 343 days ago | IN | 0 ETH | 0.00078433 | ||||
Reward Claim | 18408626 | 343 days ago | IN | 0 ETH | 0.00059238 | ||||
Withdraw | 18405862 | 344 days ago | IN | 0 ETH | 0.00067417 | ||||
Reward Claim | 18405836 | 344 days ago | IN | 0 ETH | 0.00051631 | ||||
Withdraw | 18325345 | 355 days ago | IN | 0 ETH | 0.00062499 | ||||
Reward Claim | 18325326 | 355 days ago | IN | 0 ETH | 0.00053564 | ||||
Withdraw | 18224711 | 369 days ago | IN | 0 ETH | 0.00063097 | ||||
Withdraw | 18188478 | 374 days ago | IN | 0 ETH | 0.00071631 | ||||
Reward Claim | 18080570 | 389 days ago | IN | 0 ETH | 0.00076845 | ||||
Withdraw | 18080568 | 389 days ago | IN | 0 ETH | 0.00123842 | ||||
Reward Claim | 18075487 | 390 days ago | IN | 0 ETH | 0.00104139 | ||||
Withdraw | 17999450 | 401 days ago | IN | 0 ETH | 0.00132646 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BiFiETHSushiSwapReward
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-06 */ // File: contracts/module/safeMath.sol // SPDX-License-Identifier: BSD-3-Clause pragma solidity 0.6.12; /** * @title BiFi's safe-math Contract * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ contract safeMathModule { uint256 constant one = 1 ether; function expDiv(uint256 a, uint256 b) internal pure returns (uint256) { return safeDiv( safeMul(a, one), b); } function expMul(uint256 a, uint256 b) internal pure returns (uint256) { return safeDiv( safeMul(a, b), one); } function safeAdd(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addtion overflow"); return c; } function safeSub(uint256 a, uint256 b) internal pure returns (uint256) { require(a >= b, "SafeMath: subtraction overflow"); return a - b; } function safeMul(uint256 a, uint256 b) internal pure returns (uint256) { if(a == 0) { return 0;} uint256 c = a * b; require( (c/a) == b, "SafeMath: multiplication overflow"); return c; } function safeDiv(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return (a/b); } } // File: contracts/ERC20.sol pragma solidity 0.6.12; /** * @title BiFi's ERC20 Mockup Contract * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ contract ERC20 { string symbol; string name; uint8 decimals = 18; uint256 public totalSupply = 1000 * 1e9 * 1e18; // token amount: 1000 Bilions // Owner of this contract address public owner; // Balances for each account mapping(address => uint256) balances; // Owner of account approves the transfer of an amount to another account mapping(address => mapping (address => uint256)) allowed; // Functions with this modifier can only be executed by the owner modifier onlyOwner() { require(msg.sender == owner, "only owner"); _; } event Transfer(address, address, uint256); event Approval(address, address, uint256); // Constructor constructor (string memory _name, string memory _symbol) public { owner = msg.sender; name = _name; symbol = _symbol; balances[msg.sender] = totalSupply; } // What is the balance of a particular account? function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; } // Transfer the balance from owner's account to another account function transfer(address _to, uint256 _amount) public returns (bool success) { require(balances[msg.sender] >= _amount, "insuficient sender's balance"); require(_amount > 0, "requested amount must be positive"); require(balances[_to] + _amount > balances[_to], "receiver's balance overflows"); balances[msg.sender] -= _amount; balances[_to] += _amount; emit Transfer(msg.sender, _to, _amount); return true; } // Send _value amount of tokens from address _from to address _to // The transferFrom method is used for a withdraw workflow, allowing contracts to send // tokens on your behalf, for example to "deposit" to a contract address and/or to charge // fees in sub-currencies; the command should fail unless the _from account has // deliberately authorized the sender of the message via some mechanism; we propose // these standardized APIs for approval: function transferFrom(address _from, address _to,uint256 _amount) public returns (bool success) { require(balances[_from] >= _amount, "insuficient sender's balance"); require(allowed[_from][msg.sender] >= _amount, "not allowed transfer"); require(_amount > 0, "requested amount must be positive"); require(balances[_to] + _amount > balances[_to], "receiver's balance overflows"); balances[_from] -= _amount; allowed[_from][msg.sender] -= _amount; balances[_to] += _amount; emit Transfer(_from, _to, _amount); return true; } // Allow _spender to withdraw from your account, multiple times, up to the _value amount. // If this function is called again it overwrites the current allowance with _value. function approve(address _spender, uint256 _amount) public returns (bool success) { allowed[msg.sender][_spender] = _amount; emit Approval(msg.sender, _spender, _amount); return true; } function allowance(address _owner, address _spender) public view returns (uint256 remaining) { return allowed[_owner][_spender]; } } contract BFCtoken is ERC20 { constructor() public ERC20 ("Bifrost", "BFC") {} } contract LPtoken is ERC20 { constructor() public ERC20 ("BFC-ETH", "LP") {} } contract BiFitoken is ERC20 { constructor() public ERC20 ("BiFi", "BiFi") {} } // File: contracts/module/storageModule.sol pragma solidity 0.6.12; /** * @title BiFi's Reward Distribution Storage Contract * @notice Define the basic Contract State * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ contract storageModule { address public owner; address public pendingOwner; bool public claimLock; bool public withdrawLock; uint256 public rewardPerBlock; uint256 public decrementUnitPerBlock; uint256 public rewardLane; uint256 public lastBlockNum; uint256 public totalDeposited; ERC20 public lpErc; ERC20 public rewardErc; mapping(address => Account) public accounts; uint256 public passedPoint; RewardVelocityPoint[] public registeredPoints; struct Account { uint256 deposited; uint256 pointOnLane; uint256 rewardAmount; } struct RewardVelocityPoint { uint256 blockNumber; uint256 rewardPerBlock; uint256 decrementUnitPerBlock; } struct UpdateRewardLaneModel { uint256 len; uint256 tmpBlockDelta; uint256 memPassedPoint; uint256 tmpPassedPoint; uint256 memThisBlockNum; uint256 memLastBlockNum; uint256 tmpLastBlockNum; uint256 memTotalDeposit; uint256 memRewardLane; uint256 tmpRewardLane; uint256 memRewardPerBlock; uint256 tmpRewardPerBlock; uint256 memDecrementUnitPerBlock; uint256 tmpDecrementUnitPerBlock; } } // File: contracts/module/eventModule.sol pragma solidity 0.6.12; /** * @title BiFi's Reward Distribution Event Contract * @notice Define the service Events * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ contract eventModule { /// @dev Events for user actions event Deposit(address userAddr, uint256 amount, uint256 userDeposit, uint256 totalDeposit); event Withdraw(address userAddr, uint256 amount, uint256 userDeposit, uint256 totalDeposit); event Claim(address userAddr, uint256 amount); event UpdateRewardParams(uint256 atBlockNumber, uint256 rewardPerBlock, uint256 decrementUnitPerBlock); /// @dev Events for admin actions below /// @dev Contracts Access Control event ClaimLock(bool lock); event WithdrawLock(bool lock); event OwnershipTransfer(address from, address to); /// @dev Distribution Model Parameter editer event SetRewardParams(uint256 rewardPerBlock, uint256 decrementUnitPerBlock); event RegisterRewardParams(uint256 atBlockNumber, uint256 rewardPerBlock, uint256 decrementUnitPerBlock); event DeleteRegisterRewardParams(uint256 index, uint256 atBlockNumber, uint256 rewardPerBlock, uint256 decrementUnitPerBlock, uint256 arrayLen); } // File: contracts/module/internalModule.sol pragma solidity 0.6.12; /** * @title BiFi's Reward Distribution Internal Contract * @notice Implement the basic functions for staking and reward distribution * @dev All functions are internal. * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ contract internalModule is storageModule, eventModule, safeMathModule { /** * @notice Deposit the Contribution Tokens * @param userAddr The user address of the Contribution Tokens * @param amount The amount of the Contribution Tokens */ function _deposit(address userAddr, uint256 amount) internal { Account memory user = accounts[userAddr]; uint256 totalDeposit = totalDeposited; user.deposited = safeAdd(user.deposited, amount); accounts[userAddr].deposited = user.deposited; totalDeposit = safeAdd(totalDeposited, amount); totalDeposited = totalDeposit; if(amount > 0) { /// @dev transfer the Contribution Toknes to this contract. emit Deposit(userAddr, amount, user.deposited, totalDeposit); require( lpErc.transferFrom(msg.sender, address(this), amount), "token error" ); } } /** * @notice Withdraw the Contribution Tokens * @param userAddr The user address of the Contribution Tokens * @param amount The amount of the Contribution Tokens */ function _withdraw(address userAddr, uint256 amount) internal { Account memory user = accounts[userAddr]; uint256 totalDeposit = totalDeposited; require(user.deposited >= amount, "not enough user Deposit"); user.deposited = safeSub(user.deposited, amount); accounts[userAddr].deposited = user.deposited; totalDeposit = safeSub(totalDeposited, amount); totalDeposited = totalDeposit; if(amount > 0) { /// @dev transfer the Contribution Tokens from this contact. emit Withdraw(userAddr, amount, user.deposited, totalDeposit); require( lpErc.transfer(userAddr, amount), "token error" ); } } /** * @notice Calculate current reward * @dev This function is called whenever the balance of the Contribution Tokens of the user. * @param userAddr The user address of the Contribution and Reward Tokens */ function _redeemAll(address userAddr) internal { Account memory user = accounts[userAddr]; uint256 newRewardLane = _updateRewardLane(); uint256 distance = safeSub(newRewardLane, user.pointOnLane); uint256 rewardAmount = expMul(user.deposited, distance); if(user.pointOnLane != newRewardLane) accounts[userAddr].pointOnLane = newRewardLane; if(rewardAmount != 0) accounts[userAddr].rewardAmount = safeAdd(user.rewardAmount, rewardAmount); } /** * @notice Claim the Reward Tokens * @dev Transfer all reward the user has earned at once. * @param userAddr The user address of the Reward Tokens */ function _rewardClaim(address userAddr) internal { Account memory user = accounts[userAddr]; if(user.rewardAmount != 0) { uint256 amount = user.rewardAmount; accounts[userAddr].rewardAmount = 0; /// @dev transfer the Reward Tokens from this contract. emit Claim(userAddr, amount); require(rewardErc.transfer(userAddr, amount), "token error" ); } } /** * @notice Update the reward lane value upto ths currnet moment (block) * @dev This function should care the "reward velocity points," at which the parameters of reward distribution are changed. * @return The current (calculated) reward lane value */ function _updateRewardLane() internal returns (uint256) { /// @dev Set up memory variables used for calculation temporarily. UpdateRewardLaneModel memory vars; vars.len = registeredPoints.length; vars.memTotalDeposit = totalDeposited; vars.tmpPassedPoint = vars.memPassedPoint = passedPoint; vars.memThisBlockNum = block.number; vars.tmpLastBlockNum = vars.memLastBlockNum = lastBlockNum; vars.tmpRewardLane = vars.memRewardLane = rewardLane; vars.tmpRewardPerBlock = vars.memRewardPerBlock = rewardPerBlock; vars.tmpDecrementUnitPerBlock = vars.memDecrementUnitPerBlock = decrementUnitPerBlock; for(uint256 i=vars.memPassedPoint; i<vars.len; i++) { RewardVelocityPoint memory point = registeredPoints[i]; /** * @dev Check whether this reward velocity point is valid and has not applied yet. */ if(vars.tmpLastBlockNum < point.blockNumber && point.blockNumber <= vars.memThisBlockNum) { vars.tmpPassedPoint = i+1; /// @dev Update the reward lane with the tmp variables vars.tmpBlockDelta = safeSub(point.blockNumber, vars.tmpLastBlockNum); (vars.tmpRewardLane, vars.tmpRewardPerBlock) = _calcNewRewardLane( vars.tmpRewardLane, vars.memTotalDeposit, vars.tmpRewardPerBlock, vars.tmpDecrementUnitPerBlock, vars.tmpBlockDelta); /// @dev Update the tmp variables with this reward velocity point. vars.tmpLastBlockNum = point.blockNumber; vars.tmpRewardPerBlock = point.rewardPerBlock; vars.tmpDecrementUnitPerBlock = point.decrementUnitPerBlock; /** * @dev Notify the update of the parameters (by passing the reward velocity points) */ emit UpdateRewardParams(point.blockNumber, point.rewardPerBlock, point.decrementUnitPerBlock); } else { /// @dev sorted array, exit eariler without accessing future points. break; } } /** * @dev Update the reward lane for the remained period between the latest velocity point and this moment (block) */ if( vars.tmpLastBlockNum < vars.memThisBlockNum ) { vars.tmpBlockDelta = safeSub(vars.memThisBlockNum, vars.tmpLastBlockNum); vars.tmpLastBlockNum = vars.memThisBlockNum; (vars.tmpRewardLane, vars.tmpRewardPerBlock) = _calcNewRewardLane( vars.tmpRewardLane, vars.memTotalDeposit, vars.tmpRewardPerBlock, vars.tmpDecrementUnitPerBlock, vars.tmpBlockDelta); } /** * @dev Update the reward lane parameters with the tmp variables. */ if(vars.memLastBlockNum != vars.tmpLastBlockNum) lastBlockNum = vars.tmpLastBlockNum; if(vars.memPassedPoint != vars.tmpPassedPoint) passedPoint = vars.tmpPassedPoint; if(vars.memRewardLane != vars.tmpRewardLane) rewardLane = vars.tmpRewardLane; if(vars.memRewardPerBlock != vars.tmpRewardPerBlock) rewardPerBlock = vars.tmpRewardPerBlock; if(vars.memDecrementUnitPerBlock != vars.tmpDecrementUnitPerBlock) decrementUnitPerBlock = vars.tmpDecrementUnitPerBlock; return vars.tmpRewardLane; } /** * @notice Calculate a new reward lane value with the given parameters * @param _rewardLane The previous reward lane value * @param _totalDeposit Thte total deposit amount of the Contribution Tokens * @param _rewardPerBlock The reward token amount per a block * @param _decrementUnitPerBlock The decerement amount of the reward token per a block */ function _calcNewRewardLane( uint256 _rewardLane, uint256 _totalDeposit, uint256 _rewardPerBlock, uint256 _decrementUnitPerBlock, uint256 delta) internal pure returns (uint256, uint256) { uint256 executableDelta; if(_decrementUnitPerBlock != 0) { executableDelta = safeDiv(_rewardPerBlock, _decrementUnitPerBlock); if(delta > executableDelta) delta = executableDelta; else executableDelta = 0; } uint256 distance; if(_totalDeposit != 0) { distance = expMul( _sequencePartialSumAverage(_rewardPerBlock, delta, _decrementUnitPerBlock), safeMul( expDiv(one, _totalDeposit), delta) ); _rewardLane = safeAdd(_rewardLane, distance); } if(executableDelta != 0) _rewardPerBlock = 0; else _rewardPerBlock = _getNewRewardPerBlock(_rewardPerBlock, _decrementUnitPerBlock, delta); return (_rewardLane, _rewardPerBlock); } /** * @notice Register a new reward velocity point * @dev We assume that reward velocity points are stored in order of block number. Namely, registerPoints is always a sorted array. * @param _blockNumber The block number for the point. * @param _rewardPerBlock The reward token amount per a block * @param _decrementUnitPerBlock The decerement amount of the reward token per a block */ function _registerRewardVelocity(uint256 _blockNumber, uint256 _rewardPerBlock, uint256 _decrementUnitPerBlock) internal { RewardVelocityPoint memory varPoint = RewardVelocityPoint(_blockNumber, _rewardPerBlock, _decrementUnitPerBlock); emit RegisterRewardParams(_blockNumber, _rewardPerBlock, _decrementUnitPerBlock); registeredPoints.push(varPoint); } /** * @notice Delete a existing reward velocity point * @dev We assume that reward velocity points are stored in order of block number. Namely, registerPoints is always a sorted array. * @param _index The index number of deleting point in state array. */ function _deleteRegisteredRewardVelocity(uint256 _index) internal { uint256 len = registeredPoints.length; require(len != 0 && _index < len, "error: no elements in registeredPoints"); RewardVelocityPoint memory point = registeredPoints[_index]; emit DeleteRegisterRewardParams(_index, point.blockNumber, point.rewardPerBlock, point.decrementUnitPerBlock, len-1); for(uint256 i=_index; i<len-1; i++) { registeredPoints[i] = registeredPoints[i+1]; } registeredPoints.pop(); } /** * @notice Set paramaters for the reward distribution * @param _rewardPerBlock The reward token amount per a block * @param _decrementUnitPerBlock The decerement amount of the reward token per a block */ function _setParams(uint256 _rewardPerBlock, uint256 _decrementUnitPerBlock) internal { emit SetRewardParams(_rewardPerBlock, _decrementUnitPerBlock); rewardPerBlock = _rewardPerBlock; decrementUnitPerBlock = _decrementUnitPerBlock; } /** * @return the avaerage of the RewardLance of the inactive (i.e., no-action) periods. */ function _sequencePartialSumAverage(uint256 a, uint256 n, uint256 d) internal pure returns (uint256) { /** @dev return Sn / n, where Sn = ( (n{2*a + (n-1)d}) / 2 ) == ( (2na + (n-1)d) / 2 ) / n caveat: use safeSub() to avoid the case that d is negative */ if (n > 0) return safeDiv(safeSub( safeMul(2,a), safeMul( safeSub(n,1), d) ), 2); else return 0; } function _getNewRewardPerBlock(uint256 before, uint256 dec, uint256 delta) internal pure returns (uint256) { return safeSub(before, safeMul(dec, delta)); } function _setClaimLock(bool lock) internal { emit ClaimLock(lock); claimLock = lock; } function _setWithdrawLock(bool lock) internal { emit WithdrawLock(lock); withdrawLock = lock; } function _setOwner(address newOwner) internal { require(newOwner != address(0), "owner zero address"); emit OwnershipTransfer(owner, newOwner); owner = newOwner; } function _setPendingOwner(address _pendingOwner) internal { require(_pendingOwner != address(0), "pending owner zero address"); pendingOwner = _pendingOwner; } } // File: contracts/module/viewModule.sol pragma solidity 0.6.12; /** * @title BiFi's Reward Distribution View Contract * @notice Implements the view functions for support front-end * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ contract viewModule is internalModule { function marketInformation(uint256 _fromBlockNumber, uint256 _toBlockNumber) external view returns ( uint256 rewardStartBlockNumber, uint256 distributedAmount, uint256 totalDeposit, uint256 poolRate ) { if(rewardPerBlock == 0) rewardStartBlockNumber = registeredPoints[0].blockNumber; else rewardStartBlockNumber = registeredPoints[0].blockNumber; distributedAmount = _redeemAllView(address(0)); totalDeposit = totalDeposited; poolRate = getPoolRate(address(0), _fromBlockNumber, _toBlockNumber); return ( rewardStartBlockNumber, distributedAmount, totalDeposit, poolRate ); } function userInformation(address userAddr, uint256 _fromBlockNumber, uint256 _toBlockNumber) external view returns ( uint256 stakedTokenAmount, uint256 rewardStartBlockNumber, uint256 claimStartBlockNumber, uint256 earnedTokenAmount, uint256 poolRate ) { Account memory user = accounts[userAddr]; stakedTokenAmount = user.deposited; if(rewardPerBlock == 0) rewardStartBlockNumber = registeredPoints[0].blockNumber; else rewardStartBlockNumber = registeredPoints[0].blockNumber; earnedTokenAmount = _redeemAllView(userAddr); poolRate = getPoolRate(userAddr, _fromBlockNumber, _toBlockNumber); return (stakedTokenAmount, rewardStartBlockNumber, claimStartBlockNumber, earnedTokenAmount, poolRate); } function modelInfo() external view returns (uint256, uint256, uint256, uint256, uint256) { return (rewardPerBlock, decrementUnitPerBlock, rewardLane, lastBlockNum, totalDeposited); } function getParams() external view returns (uint256, uint256, uint256, uint256) { return (rewardPerBlock, rewardLane, lastBlockNum, totalDeposited); } function getRegisteredPointLength() external view returns (uint256) { return registeredPoints.length; } function getRegisteredPoint(uint256 index) external view returns (uint256, uint256, uint256) { RewardVelocityPoint memory point = registeredPoints[index]; return (point.blockNumber, point.rewardPerBlock, point.decrementUnitPerBlock); } function userInfo(address userAddr) external view returns (uint256, uint256, uint256) { Account memory user = accounts[userAddr]; uint256 earnedRewardAmount = _redeemAllView(userAddr); return (user.deposited, user.pointOnLane, earnedRewardAmount); } function distributionInfo() external view returns (uint256, uint256, uint256) { uint256 totalDistributedRewardAmount_now = _distributedRewardAmountView(); return (rewardPerBlock, decrementUnitPerBlock, totalDistributedRewardAmount_now); } function _distributedRewardAmountView() internal view returns (uint256) { return _redeemAllView( address(0) ); } function _redeemAllView(address userAddr) internal view returns (uint256) { Account memory user; uint256 newRewardLane; if( userAddr != address(0) ) { user = accounts[userAddr]; newRewardLane = _updateRewardLaneView(lastBlockNum); } else { user = Account(totalDeposited, 0, 0); newRewardLane = _updateRewardLaneView(0); } uint256 distance = safeSub(newRewardLane, user.pointOnLane); uint256 rewardAmount = expMul(user.deposited, distance); return safeAdd(user.rewardAmount, rewardAmount); } function _updateRewardLaneView(uint256 fromBlockNumber) internal view returns (uint256) { /// @dev Set up memory variables used for calculation temporarily. UpdateRewardLaneModel memory vars; vars.len = registeredPoints.length; vars.memTotalDeposit = totalDeposited; if(fromBlockNumber == 0){ vars.tmpPassedPoint = vars.memPassedPoint = 0; vars.memThisBlockNum = block.number; vars.tmpLastBlockNum = vars.memLastBlockNum = 0; vars.tmpRewardLane = vars.memRewardLane = 0; vars.tmpRewardPerBlock = vars.memRewardPerBlock = 0; vars.tmpDecrementUnitPerBlock = vars.memDecrementUnitPerBlock = 0; } else { vars.tmpPassedPoint = vars.memPassedPoint = passedPoint; vars.memThisBlockNum = block.number; vars.tmpLastBlockNum = vars.memLastBlockNum = fromBlockNumber; vars.tmpRewardLane = vars.memRewardLane = rewardLane; vars.tmpRewardPerBlock = vars.memRewardPerBlock = rewardPerBlock; vars.tmpDecrementUnitPerBlock = vars.memDecrementUnitPerBlock = decrementUnitPerBlock; } for(uint256 i=vars.memPassedPoint; i<vars.len; i++) { RewardVelocityPoint memory point = registeredPoints[i]; /** * @dev Check whether this reward velocity point is valid and has not applied yet. */ if(vars.tmpLastBlockNum < point.blockNumber && point.blockNumber <= vars.memThisBlockNum) { vars.tmpPassedPoint = i+1; /// @dev Update the reward lane with the tmp variables vars.tmpBlockDelta = safeSub(point.blockNumber, vars.tmpLastBlockNum); (vars.tmpRewardLane, vars.tmpRewardPerBlock) = _calcNewRewardLane( vars.tmpRewardLane, vars.memTotalDeposit, vars.tmpRewardPerBlock, vars.tmpDecrementUnitPerBlock, vars.tmpBlockDelta); /// @dev Update the tmp variables with this reward velocity point. vars.tmpLastBlockNum = point.blockNumber; vars.tmpRewardPerBlock = point.rewardPerBlock; vars.tmpDecrementUnitPerBlock = point.decrementUnitPerBlock; /** * @dev Notify the update of the parameters (by passing the reward velocity points) */ } else { /// @dev sorted array, exit eariler without accessing future points. break; } } /** * @dev Update the reward lane for the remained period between the latest velocity point and this moment (block) */ if(vars.memThisBlockNum > vars.tmpLastBlockNum) { vars.tmpBlockDelta = safeSub(vars.memThisBlockNum, vars.tmpLastBlockNum); vars.tmpLastBlockNum = vars.memThisBlockNum; (vars.tmpRewardLane, vars.tmpRewardPerBlock) = _calcNewRewardLane( vars.tmpRewardLane, vars.memTotalDeposit, vars.tmpRewardPerBlock, vars.tmpDecrementUnitPerBlock, vars.tmpBlockDelta); } return vars.tmpRewardLane; } /** * @notice Get The rewardPerBlock of user in suggested period(see params) * @param userAddr The Address of user, 0 for total * @param fromBlockNumber calculation start block number * @param toBlockNumber calculation end block number * @notice this function calculate based on current contract state */ function getPoolRate(address userAddr, uint256 fromBlockNumber, uint256 toBlockNumber) internal view returns (uint256) { UpdateRewardLaneModel memory vars; vars.len = registeredPoints.length; vars.memTotalDeposit = totalDeposited; vars.tmpLastBlockNum = vars.memLastBlockNum = fromBlockNumber; (vars.memPassedPoint, vars.memRewardPerBlock, vars.memDecrementUnitPerBlock) = getParamsByBlockNumber(fromBlockNumber); vars.tmpPassedPoint = vars.memPassedPoint; vars.tmpRewardPerBlock = vars.memRewardPerBlock; vars.tmpDecrementUnitPerBlock = vars.memDecrementUnitPerBlock; vars.memThisBlockNum = toBlockNumber; vars.tmpRewardLane = vars.memRewardLane = 0; for(uint256 i=vars.memPassedPoint; i<vars.len; i++) { RewardVelocityPoint memory point = registeredPoints[i]; if(vars.tmpLastBlockNum < point.blockNumber && point.blockNumber <= vars.memThisBlockNum) { vars.tmpPassedPoint = i+1; vars.tmpBlockDelta = safeSub(point.blockNumber, vars.tmpLastBlockNum); (vars.tmpRewardLane, vars.tmpRewardPerBlock) = _calcNewRewardLane( vars.tmpRewardLane, vars.memTotalDeposit, vars.tmpRewardPerBlock, vars.tmpDecrementUnitPerBlock, vars.tmpBlockDelta); vars.tmpLastBlockNum = point.blockNumber; vars.tmpRewardPerBlock = point.rewardPerBlock; vars.tmpDecrementUnitPerBlock = point.decrementUnitPerBlock; } else { break; } } if(vars.memThisBlockNum > vars.tmpLastBlockNum) { vars.tmpBlockDelta = safeSub(vars.memThisBlockNum, vars.tmpLastBlockNum); vars.tmpLastBlockNum = vars.memThisBlockNum; (vars.tmpRewardLane, vars.tmpRewardPerBlock) = _calcNewRewardLane( vars.tmpRewardLane, vars.memTotalDeposit, vars.tmpRewardPerBlock, vars.tmpDecrementUnitPerBlock, vars.tmpBlockDelta); } Account memory user; if( userAddr != address(0) ) user = accounts[userAddr]; else user = Account(vars.memTotalDeposit, 0, 0); return safeDiv(expMul(user.deposited, vars.tmpRewardLane), safeSub(toBlockNumber, fromBlockNumber)); } function getParamsByBlockNumber(uint256 _blockNumber) internal view returns (uint256, uint256, uint256) { uint256 _rewardPerBlock; uint256 _decrement; uint256 i; uint256 tmpthisPoint; uint256 pointLength = registeredPoints.length; if( pointLength > 0 ) { for(i = 0; i < pointLength; i++) { RewardVelocityPoint memory point = registeredPoints[i]; if(_blockNumber >= point.blockNumber && 0 != point.blockNumber) { tmpthisPoint = i; _rewardPerBlock = point.rewardPerBlock; _decrement = point.decrementUnitPerBlock; } else if( 0 == point.blockNumber ) continue; else break; } } RewardVelocityPoint memory point = registeredPoints[tmpthisPoint]; _rewardPerBlock = point.rewardPerBlock; _decrement = point.decrementUnitPerBlock; if(_blockNumber > point.blockNumber) { _rewardPerBlock = safeSub(_rewardPerBlock, safeMul(_decrement, safeSub(_blockNumber, point.blockNumber) ) ); } return (i, _rewardPerBlock, _decrement); } function getUserPoolRate(address userAddr, uint256 fromBlockNumber, uint256 toBlockNumber) external view returns (uint256) { return getPoolRate(userAddr, fromBlockNumber, toBlockNumber); } function getModelPoolRate(uint256 fromBlockNumber, uint256 toBlockNumber) external view returns (uint256) { return getPoolRate(address(0), fromBlockNumber, toBlockNumber); } } // File: contracts/module/externalModule.sol pragma solidity 0.6.12; /** * @title BiFi's Reward Distribution External Contract * @notice Implements the service actions. * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ contract externalModule is viewModule { modifier onlyOwner() { require(msg.sender == owner, "onlyOwner: external function access control!"); _; } modifier checkClaimLocked() { require(!claimLock, "error: claim Locked"); _; } modifier checkWithdrawLocked() { require(!withdrawLock, "error: withdraw Locked"); _; } /** * @notice Set the Deposit-Token address * @param erc20Addr The address of Deposit Token */ function setERC(address erc20Addr) external onlyOwner { lpErc = ERC20(erc20Addr); } /** * @notice Set the Contribution-Token address * @param erc20Addr The address of Contribution Token */ function setRE(address erc20Addr) external onlyOwner { rewardErc = ERC20(erc20Addr); } /** * @notice Set the reward distribution parameters instantly */ function setParam(uint256 _rewardPerBlock, uint256 _decrementUnitPerBlock) onlyOwner external { _setParams(_rewardPerBlock, _decrementUnitPerBlock); } /** * @notice Terminate Contract Distribution */ function modelFinish(uint256 amount) external onlyOwner { if( amount != 0) { require( rewardErc.transfer(owner, amount), "token error" ); } else { require( rewardErc.transfer(owner, rewardErc.balanceOf(address(this))), "token error" ); } delete totalDeposited; delete rewardPerBlock; delete decrementUnitPerBlock; delete rewardLane; delete totalDeposited; delete registeredPoints; } /** * @notice Transfer the Remaining Contribution Tokens */ function retrieveRewardAmount(uint256 amount) external onlyOwner { if( amount != 0) { require( rewardErc.transfer(owner, amount), "token error"); } else { require( rewardErc.transfer(owner, rewardErc.balanceOf(address(this))), "token error"); } } /** * @notice Deposit the Contribution Tokens * @param amount The amount of the Contribution Tokens */ function deposit(uint256 amount) external { address userAddr = msg.sender; _redeemAll(userAddr); _deposit(userAddr, amount); } /** * @notice Deposit the Contribution Tokens to target user * @param userAddr The target user * @param amount The amount of the Contribution Tokens */ function depositTo(address userAddr, uint256 amount) external { _redeemAll(userAddr); _deposit(userAddr, amount); } /** * @notice Withdraw the Contribution Tokens * @param amount The amount of the Contribution Tokens */ function withdraw(uint256 amount) checkWithdrawLocked external { address userAddr = msg.sender; _redeemAll(userAddr); _withdraw(userAddr, amount); } /** * @notice Claim the Reward Tokens * @dev Transfer all reward the user has earned at once. */ function rewardClaim() checkClaimLocked external { address userAddr = msg.sender; _redeemAll(userAddr); _rewardClaim(userAddr); } /** * @notice Claim the Reward Tokens * @param userAddr The targetUser * @dev Transfer all reward the target user has earned at once. */ function rewardClaimTo(address userAddr) checkClaimLocked external { _redeemAll(userAddr); _rewardClaim(userAddr); } /// @dev Set locks & access control function setClaimLock(bool lock) onlyOwner external { _setClaimLock(lock); } function setWithdrawLock(bool lock) onlyOwner external { _setWithdrawLock(lock); } function ownershipTransfer(address newPendingOwner) onlyOwner external { _setPendingOwner(newPendingOwner); } function acceptOwnership() external { address sender = msg.sender; require(sender == pendingOwner, "msg.sender != pendingOwner"); _setOwner(sender); } /** * @notice Register a new future reward velocity point */ function registerRewardVelocity(uint256 _blockNumber, uint256 _rewardPerBlock, uint256 _decrementUnitPerBlock) onlyOwner public { require(_blockNumber > block.number, "new Reward params should register earlier"); require(registeredPoints.length == 0 || _blockNumber > registeredPoints[registeredPoints.length-1].blockNumber, "Earilier velocity points are already set."); _registerRewardVelocity(_blockNumber, _rewardPerBlock, _decrementUnitPerBlock); } function deleteRegisteredRewardVelocity(uint256 _index) onlyOwner external { require(_index >= passedPoint, "Reward velocity point already passed."); _deleteRegisteredRewardVelocity(_index); } /** * @notice Set the reward distribution parameters */ function setRewardVelocity(uint256 _rewardPerBlock, uint256 _decrementUnitPerBlock) onlyOwner external { _updateRewardLane(); _setParams(_rewardPerBlock, _decrementUnitPerBlock); } } // File: contracts/DistributionModelV3.sol pragma solidity 0.6.12; /** * @title BiFi's Reward Distribution Contract * @notice Implements voting process along with vote delegation * @author BiFi(seinmyung25, Miller-kk, tlatkdgus1, dongchangYoo) */ contract DistributionModelV3 is externalModule { constructor(address _owner, address _lpErc, address _rewardErc) public { owner = _owner; lpErc = ERC20(_lpErc); rewardErc = ERC20(_rewardErc); lastBlockNum = block.number; } } contract BFCModel is DistributionModelV3 { constructor(address _owner, address _lpErc, address _rewardErc, uint256 _start) DistributionModelV3(_owner, _lpErc, _rewardErc) public { /* _start: parameter start block nubmer 0x3935413a1cdd90ff: fixed point(1e18) reward per blocks 0x62e9bea75f: fixed point(1e18) decrement per blocks */ _registerRewardVelocity(_start, 0x3935413a1cdd90ff, 0x62e9bea75f); } } contract BFCETHModel is DistributionModelV3 { constructor(address _owner, address _lpErc, address _rewardErc, uint256 _start) DistributionModelV3(_owner, _lpErc, _rewardErc) public { /* _start: parameter start block nubmer 0xe4d505786b744b3f: fixed point(1e18) reward per blocks 0x18ba6fb966b: fixed point(1e18) decrement per blocks */ _registerRewardVelocity(_start, 0xe4d505786b744b3f, 0x18ba6fb966b); } } contract BiFiETHModel is DistributionModelV3 { constructor(address _owner, address _lpErc, address _rewardErc, uint256 _start) DistributionModelV3(_owner, _lpErc, _rewardErc) public { /* _start: parameter start block nubmer 0x11e0a46e285a68955: fixed point(1e18) reward per blocks 0x1ee90ba90c4: fixed point(1e18) decrement per blocks */ _registerRewardVelocity(_start, 0x11e0a46e285a68955, 0x1ee90ba90c4); } } // File: contracts/SRD_SushiSwap.sol pragma solidity 0.6.12; contract BFCETHSushiSwapReward is DistributionModelV3 { constructor(uint256 start, uint256 reward_per_block, uint256 dec_per_block) DistributionModelV3( 0x359903041dE93c69828F911aeB0BE29CC9ccc58b, //ower 0x281Df7fc89294C84AfA2A21FfEE8f6807F9C9226, //swap_pool_token(BFCETH_Sushi) 0x2791BfD60D232150Bff86b39B7146c0eaAA2BA81 //reward_token(bifi) ) public { _registerRewardVelocity(start, reward_per_block, dec_per_block); pendingOwner = msg.sender; } } contract BiFiETHSushiSwapReward is DistributionModelV3 { constructor(uint256 start, uint256 reward_per_block, uint256 dec_per_block) DistributionModelV3( 0x359903041dE93c69828F911aeB0BE29CC9ccc58b, //owner 0x0beC54c89a7d9F15C4e7fAA8d47ADEdF374462eD, //swap_pool_token(BiFiETH_Sushi) 0x2791BfD60D232150Bff86b39B7146c0eaAA2BA81 //reward_token(bifi) ) public { _registerRewardVelocity(start, reward_per_block, dec_per_block); pendingOwner = msg.sender; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"reward_per_block","type":"uint256"},{"internalType":"uint256","name":"dec_per_block","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"lock","type":"bool"}],"name":"ClaimLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"atBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decrementUnitPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"arrayLen","type":"uint256"}],"name":"DeleteRegisterRewardParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userDeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"atBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decrementUnitPerBlock","type":"uint256"}],"name":"RegisterRewardParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decrementUnitPerBlock","type":"uint256"}],"name":"SetRewardParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"atBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"decrementUnitPerBlock","type":"uint256"}],"name":"UpdateRewardParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userDeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalDeposit","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"lock","type":"bool"}],"name":"WithdrawLock","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accounts","outputs":[{"internalType":"uint256","name":"deposited","type":"uint256"},{"internalType":"uint256","name":"pointOnLane","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decrementUnitPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"deleteRegisteredRewardVelocity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributionInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fromBlockNumber","type":"uint256"},{"internalType":"uint256","name":"toBlockNumber","type":"uint256"}],"name":"getModelPoolRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getParams","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRegisteredPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegisteredPointLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"fromBlockNumber","type":"uint256"},{"internalType":"uint256","name":"toBlockNumber","type":"uint256"}],"name":"getUserPoolRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBlockNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpErc","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromBlockNumber","type":"uint256"},{"internalType":"uint256","name":"_toBlockNumber","type":"uint256"}],"name":"marketInformation","outputs":[{"internalType":"uint256","name":"rewardStartBlockNumber","type":"uint256"},{"internalType":"uint256","name":"distributedAmount","type":"uint256"},{"internalType":"uint256","name":"totalDeposit","type":"uint256"},{"internalType":"uint256","name":"poolRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"modelFinish","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"modelInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPendingOwner","type":"address"}],"name":"ownershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"passedPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_decrementUnitPerBlock","type":"uint256"}],"name":"registerRewardVelocity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"registeredPoints","outputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"decrementUnitPerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"retrieveRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"rewardClaimTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardErc","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardLane","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"lock","type":"bool"}],"name":"setClaimLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Addr","type":"address"}],"name":"setERC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_decrementUnitPerBlock","type":"uint256"}],"name":"setParam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Addr","type":"address"}],"name":"setRE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_decrementUnitPerBlock","type":"uint256"}],"name":"setRewardVelocity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"lock","type":"bool"}],"name":"setWithdrawLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"_fromBlockNumber","type":"uint256"},{"internalType":"uint256","name":"_toBlockNumber","type":"uint256"}],"name":"userInformation","outputs":[{"internalType":"uint256","name":"stakedTokenAmount","type":"uint256"},{"internalType":"uint256","name":"rewardStartBlockNumber","type":"uint256"},{"internalType":"uint256","name":"claimStartBlockNumber","type":"uint256"},{"internalType":"uint256","name":"earnedTokenAmount","type":"uint256"},{"internalType":"uint256","name":"poolRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002f3438038062002f34833981810160405260608110156200003757600080fd5b5080516020820151604090920151600080546001600160a01b031990811673359903041de93c69828f911aeb0be29cc9ccc58b17909155600780548216730bec54c89a7d9f15c4e7faa8d47adedf374462ed17905560088054909116732791bfd60d232150bff86b39b7146c0eaaa2ba8117905543600555909190620000bf838383620000da565b5050600180546001600160a01b0319163317905550620001fe565b620000e4620001dd565b60405180606001604052808581526020018481526020018381525090507f1fdf2820867a17742112aebea1dc9d50d73c902c1e5e2ac7f03b0b11e697adb384848460405180848152602001838152602001828152602001935050505060405180910390a1600b805460018101825560009190915281517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960039092029182015560208201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8201556040909101517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90910155505050565b60405180606001604052806000815260200160008152602001600081525090565b612d26806200020e6000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c80635e5c06e211610146578063b8b1bf99116100c3578063e04bfd8111610087578063e04bfd811461064d578063e30c397814610655578063f4bb1b211461065d578063f71a16131461067a578063ff50abdc14610699578063ffaad6a5146106a157610253565b8063b8b1bf99146105f2578063ca6702cc146105fa578063cabac91c14610602578063d3a417a21461061f578063d48ab3081461064557610253565b806379ba50971161010a57806379ba5097146105a05780638ae39cac146105a85780638da5cb5b146105b05780639091038a146105b8578063b6b55f25146105d557610253565b80635e5c06e2146104f85780635e615a6b1461051e5780636409f9211461054c57806369cddfe514610554578063744f31d71461057d57610253565b80633237a68e116101d45780634959e729116101985780634959e7291461047d5780634f7f399b14610485578063534caae5146104a257806359f2ea07146104aa5780635c388ca6146104dc57610253565b80633237a68e146103fe578063327bc7b11461042457806334a551911461042c578063368990421461045257806336f2fa681461045a57610253565b80631959a0021161021b5780631959a0021461033d5780631eb804db1461038157806323c6a5021461039e5780632e1a7d4d146103c25780633011113a146103df57610253565b8063046a360e1461025857806309ce91ad1461028d5780630e8f7f31146102b557806310dc7f471461031257806315d0c28414610335575b600080fd5b61027b6004803603604081101561026e57600080fd5b50803590602001356106cd565b60408051918252519081900360200190f35b6102b3600480360360208110156102a357600080fd5b50356001600160a01b03166106e4565b005b6102e7600480360360608110156102cb57600080fd5b506001600160a01b03813516906020810135906040013561074f565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102b36004803603604081101561032857600080fd5b5080359060200135610818565b61027b610878565b6103636004803603602081101561035357600080fd5b50356001600160a01b031661087e565b60408051938452602084019290925282820152519081900360600190f35b6102b36004803603602081101561039757600080fd5b50356108e7565b6103a661097d565b604080516001600160a01b039092168252519081900360200190f35b6102b3600480360360208110156103d857600080fd5b503561098c565b6102b3600480360360208110156103f557600080fd5b503515156109f8565b6102b36004803603602081101561041457600080fd5b50356001600160a01b0316610a4a565b61027b610ab1565b6102b36004803603602081101561044257600080fd5b50356001600160a01b0316610ab7565b61027b610b22565b6102b36004803603604081101561047057600080fd5b5080359060200135610b28565b6102e7610b7b565b6102b36004803603602081101561049b57600080fd5b5035610b91565b61027b610e0d565b61027b600480360360608110156104c057600080fd5b506001600160a01b038135169060208101359060400135610e13565b6104e4610e2a565b604080519115158252519081900360200190f35b6103636004803603602081101561050e57600080fd5b50356001600160a01b0316610e3a565b610526610e5b565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102b3610e6d565b6102b36004803603606081101561056a57600080fd5b5080359060208101359060400135610ecc565b6105266004803603604081101561059357600080fd5b5080359060200135610fcf565b6102b3611052565b61027b6110bc565b6103a66110c2565b6102b3600480360360208110156105ce57600080fd5b50356110d1565b6102b3600480360360208110156105eb57600080fd5b503561132b565b6104e461133f565b61027b61134f565b6103636004803603602081101561061857600080fd5b5035611355565b6102b36004803603602081101561063557600080fd5b50356001600160a01b0316611385565b6103636113d7565b6103a66113f8565b6103a6611407565b6103636004803603602081101561067357600080fd5b5035611416565b6102b36004803603602081101561069057600080fd5b50351515611477565b61027b6114c9565b6102b3600480360360408110156106b757600080fd5b506001600160a01b0381351690602001356114cf565b60006106db600084846114e2565b90505b92915050565b6000546001600160a01b0316331461072d5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600061075f612b2f565b506001600160a01b0388166000908152600960209081526040918290208251606081018452815480825260018301549382019390935260029182015493810193909352549096506107d157600b6000815481106107b857fe5b90600052602060002090600302016000015494506107f4565b600b6000815481106107df57fe5b90600052602060002090600302016000015494505b6107fd8961175c565b925061080a8989896114e2565b915050939792965093509350565b6000546001600160a01b031633146108615760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b610869611839565b506108748282611ad3565b5050565b60045481565b600080600061088b612b2f565b506001600160a01b03841660009081526009602090815260408083208151606081018352815481526001820154938101939093526002015490820152906108d18661175c565b8251602090930151929792965094509092505050565b6000546001600160a01b031633146109305760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600a548110156109715760405162461bcd60e51b8152600401808060200182810382526025815260200180612c776025913960400191505060405180910390fd5b61097a81611b19565b50565b6008546001600160a01b031681565b600154600160a81b900460ff16156109e4576040805162461bcd60e51b8152602060048201526016602482015275195c9c9bdc8e881dda5d1a191c985dc8131bd8dad95960521b604482015290519081900360640190fd5b336109ee81611ca8565b6108748183611d7d565b6000546001600160a01b03163314610a415760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a81611f7b565b600154600160a01b900460ff1615610a9f576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b610aa881611ca8565b61097a81611fce565b600a5481565b6000546001600160a01b03163314610b005760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60055481565b6000546001600160a01b03163314610b715760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b6108748282611ad3565b6002546003546004546005546006549091929394565b6000546001600160a01b03163314610bda5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b8015610cad57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b158015610c3d57600080fd5b505af1158015610c51573d6000803e3d6000fd5b505050506040513d6020811015610c6757600080fd5b5051610ca8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b610deb565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b158015610d0557600080fd5b505afa158015610d19573d6000803e3d6000fd5b505050506040513d6020811015610d2f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610d8057600080fd5b505af1158015610d94573d6000803e3d6000fd5b505050506040513d6020811015610daa57600080fd5b5051610deb576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b6000600681905560028190556003819055600481905561097a90600b90612b50565b60035481565b6000610e208484846114e2565b90505b9392505050565b600154600160a81b900460ff1681565b60096020526000908152604090208054600182015460029092015490919083565b60025460045460055460065490919293565b600154600160a01b900460ff1615610ec2576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b33610aa881611ca8565b6000546001600160a01b03163314610f155760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b438311610f535760405162461bcd60e51b8152600401808060200182810382526029815260200180612c076029913960400191505060405180910390fd5b600b541580610f845750600b80546000198101908110610f6f57fe5b90600052602060002090600302016000015483115b610fbf5760405162461bcd60e51b8152600401808060200182810382526029815260200180612c9c6029913960400191505060405180910390fd5b610fca838383612139565b505050565b6000806000806002546000141561100757600b600081548110610fee57fe5b906000526020600020906003020160000154935061102a565b600b60008154811061101557fe5b90600052602060002090600302016000015493505b611034600061175c565b92506006549150611047600087876114e2565b905092959194509250565b60015433906001600160a01b031681146110b3576040805162461bcd60e51b815260206004820152601a60248201527f6d73672e73656e64657220213d2070656e64696e674f776e6572000000000000604482015290519081900360640190fd5b61097a8161223a565b60025481565b6000546001600160a01b031681565b6000546001600160a01b0316331461111a5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b80156111ed57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b505050506040513d60208110156111a757600080fd5b50516111e8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b61097a565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b15801561124557600080fd5b505afa158015611259573d6000803e3d6000fd5b505050506040513d602081101561126f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b1580156112c057600080fd5b505af11580156112d4573d6000803e3d6000fd5b505050506040513d60208110156112ea57600080fd5b505161097a576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b3361133581611ca8565b61087481836122f4565b600154600160a01b900460ff1681565b600b5490565b600b818154811061136257fe5b600091825260209091206003909102018054600182015460029092015490925083565b6000546001600160a01b031633146113ce5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a8161242f565b6000806000806113e56124ac565b6002546003549095509350915050909192565b6007546001600160a01b031681565b6001546001600160a01b031681565b6000806000611423612b2f565b600b858154811061143057fe5b600091825260209182902060408051606081018252600393909302909101805480845260018201549484018590526002909101549290910182905297919650945092505050565b6000546001600160a01b031633146114c05760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a816124bd565b60065481565b6114d882611ca8565b61087482826122f4565b60006114ec612b71565b600b54815260065460e082015260a0810184905260c0810184905261151084612510565b6101808401819052610140840182905260408401839052606084018390526101608401919091526101a083015260808201849052600061010083018190526101208301525b815181101561164c57611566612b2f565b600b828154811061157357fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c001511080156115c857506080830151815111155b1561163d57600182016060840152805160c08401516115e79190612661565b6020840181905261012084015160e08501516101608601516101a087015161160e946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152611643565b5061164c565b50600101611555565b508060c00151816080015111156116ad5761166f81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516116a0946126be565b6101608301526101208201525b6116b5612b2f565b6001600160a01b0386161561170957506001600160a01b038516600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915261172d565b60405180606001604052808360e00151815260200160008152602001600081525090505b6117526117438260000151846101200151612759565b61174d8688612661565b612772565b9695505050505050565b6000611766612b2f565b60006001600160a01b038416156117d95760096000856001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505091506117d26005546127d9565b9050611807565b60405180606001604052806006548152602001600081526020016000815250915061180460006127d9565b90505b6000611817828460200151612661565b90506000611829846000015183612759565b9050611752846040015182612a0c565b6000611843612b71565b600b54815260065460e0820152600a54604082018190526060820181905243608083015260055460a0830181905260c08301526004546101008301819052610120830152600254610140830181905261016083015260035461018083018190526101a08301525b81518110156119e7576118bb612b2f565b600b82815481106118c857fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561191d57506080830151815111155b156119d857600182016060840152805160c084015161193c9190612661565b6020840181905261012084015160e08501516101608601516101a0870151611963946126be565b6101608501908152610120850191909152815160c085015260208083018051909252604083810180516101a088015284519351905182519485529284015282810191909152517fc2d5f9e666d2dd7e740ece9acaf1b93ce48894cbc0336d693410badb7c40aead9181900360600190a16119de565b506119e7565b506001016118aa565b5080608001518160c001511015611a4857611a0a81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a0850151611a3b946126be565b6101608301526101208201525b8060c001518160a0015114611a605760c08101516005555b8060600151816040015114611a78576060810151600a555b80610120015181610100015114611a93576101208101516004555b80610160015181610140015114611aae576101608101516002555b806101a0015181610180015114611ac9576101a08101516003555b6101200151905090565b604080518381526020810183905281517fbfc739097487a2d01d113d21aef3ef3d22331f56d3273bc4907d61407e5b0856929181900390910190a1600291909155600355565b600b548015801590611b2a57508082105b611b655760405162461bcd60e51b8152600401808060200182810382526026815260200180612c306026913960400191505060405180910390fd5b611b6d612b2f565b600b8381548110611b7a57fe5b6000918252602091829020604080516060808201835260039094029092018054808452600182015484870181905260029092015484840181905283518a81529687019190915285830191909152928401929092526000198501608084015290519092507f543ba8eaac0e28f58eb335897e63175861579bc16306e05ab5936084c1f074919181900360a00190a1825b60018303811015611c7257600b8160010181548110611c2457fe5b9060005260206000209060030201600b8281548110611c3f57fe5b60009182526020909120825460039092020190815560018083015481830155600292830154929091019190915501611c09565b50600b805480611c7e57fe5b60008281526020812060036000199093019283020181815560018101829055600201559055505050565b611cb0612b2f565b506001600160a01b0381166000908152600960209081526040808320815160608101835281548152600182015493810193909352600201549082015290611cf5611839565b90506000611d07828460200151612661565b90506000611d19846000015183612759565b905082846020015114611d45576001600160a01b03851660009081526009602052604090206001018390555b8015611d7657611d59846040015182612a0c565b6001600160a01b0386166000908152600960205260409020600201555b5050505050565b611d85612b2f565b506001600160a01b038216600090815260096020908152604091829020825160608101845281548082526001830154938201939093526002909101549281019290925260065490831115611e20576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f7567682075736572204465706f736974000000000000000000604482015290519081900360640190fd5b8151611e2c9084612661565b8083526001600160a01b038516600090815260096020526040902055600654611e559084612661565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca949181900360800190a16007546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611f0a57600080fd5b505af1158015611f1e573d6000803e3d6000fd5b505050506040513d6020811015611f3457600080fd5b5051611f75576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b50505050565b60408051821515815290517f24e8043bbab505bf23b3d9b569ad2dc34a6a563516daca26e3ad818b40c14f659181900360200190a160018054911515600160a81b0260ff60a81b19909216919091179055565b611fd6612b2f565b506001600160a01b038116600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181018290529015610874576040808201516001600160a01b0384166000818152600960209081528482206002019190915583519182528101829052825191927f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d492918290030190a16008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156120ce57600080fd5b505af11580156120e2573d6000803e3d6000fd5b505050506040513d60208110156120f857600080fd5b5051610fca576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b612141612b2f565b60405180606001604052808581526020018481526020018381525090507f1fdf2820867a17742112aebea1dc9d50d73c902c1e5e2ac7f03b0b11e697adb384848460405180848152602001838152602001828152602001935050505060405180910390a1600b805460018101825560009190915281517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960039092029182015560208201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8201556040909101517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90910155505050565b6001600160a01b03811661228a576040805162461bcd60e51b81526020600482015260126024820152716f776e6572207a65726f206164647265737360701b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6122fc612b2f565b506001600160a01b03821660009081526009602090815260409182902082516060810184528154808252600183015493820193909352600290910154928101929092526006549061234d9084612a0c565b8083526001600160a01b0385166000908152600960205260409020556006546123769084612a0c565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e9181900360800190a1600754604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611f0a57600080fd5b6001600160a01b03811661248a576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e67206f776e6572207a65726f2061646472657373000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006124b8600061175c565b905090565b60408051821515815290517f4d23c25ea752bd74a0dfa4a88c011a2c7bf8713a06a6b1028feb1fd277746c4f9181900360200190a160018054911515600160a01b0260ff60a01b19909216919091179055565b600b5460009081908190819081908190819080156125d157600092505b808310156125d15761253d612b2f565b600b848154811061254a57fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518a101580156125975750805115155b156125b25783925080602001519550806040015194506125c4565b80516125be57506125c6565b506125d1565b505b60019092019161252d565b6125d9612b2f565b600b83815481106125e657fe5b600091825260209182902060408051606081018252600390930290910180548084526001820154948401859052600290910154918301829052929850965091508a11156126505761264d86612648876126438e8660000151612661565b612a66565b612661565b95505b509198939750919550919350505050565b6000818310156126b8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808084156126e8576126d28686612772565b9050808411156126e4578093506126e8565b5060005b6000871561272d5761271e6126fe888789612abf565b612719612713670de0b6b3a76400008c612b02565b88612a66565b612759565b905061272a8982612a0c565b98505b811561273c576000965061274a565b612747878787612b1f565b96505b50969794965093945050505050565b60006106db6127688484612a66565b670de0b6b3a76400005b60008082116127c8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816127d157fe5b049392505050565b60006127e3612b71565b600b54815260065460e08201528261284c576000604082018190526060820181905243608083015260a0820181905260c08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a08201526128a3565b600a5460408201819052606082015243608082015260a0810183905260c081018390526004546101008201819052610120820152600254610140820181905261016082015260035461018082018190526101a08201525b60408101515b81518110156129a0576128ba612b2f565b600b82815481106128c757fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561291c57506080830151815111155b1561299157600182016060840152805160c084015161293b9190612661565b6020840181905261012084015160e08501516101608601516101a0870151612962946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152612997565b506129a0565b506001016128a9565b508060c0015181608001511115612a01576129c381608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516129f4946126be565b6101608301526101208201525b610120015192915050565b6000828201838110156106db576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a2061646474696f6e206f766572666c6f77000000000000604482015290519081900360640190fd5b600082612a75575060006106de565b82820282848281612a8257fe5b04146106db5760405162461bcd60e51b8152600401808060200182810382526021815260200180612c566021913960400191505060405180910390fd5b60008215612afa57612af3612aec612ad8600287612a66565b612648612ae6876001612661565b86612a66565b6002612772565b9050610e23565b506000610e23565b60006106db612b1984670de0b6b3a7640000612a66565b83612772565b6000610e20846126488585612a66565b60405180606001604052806000815260200160008152602001600081525090565b508054600082556003029060005260206000209081019061097a9190612be0565b604051806101c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115612c02576000808255600182018190556002820155600301612be1565b509056fe6e65772052657761726420706172616d732073686f756c64207265676973746572206561726c6965726572726f723a206e6f20656c656d656e747320696e2072656769737465726564506f696e7473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775265776172642076656c6f6369747920706f696e7420616c7265616479207061737365642e456172696c6965722076656c6f6369747920706f696e74732061726520616c7265616479207365742e6f6e6c794f776e65723a2065787465726e616c2066756e6374696f6e2061636365737320636f6e74726f6c21a264697066735822122021babed0a4f44fde9e273c13ec79dba290a3e3c1b22383ae6858613919fe0b4064736f6c634300060c00330000000000000000000000000000000000000000000000000000000000c860a6000000000000000000000000000000000000000000000000f266650863a748e5000000000000000000000000000000000000000000000000000001ee90ba90c4
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102535760003560e01c80635e5c06e211610146578063b8b1bf99116100c3578063e04bfd8111610087578063e04bfd811461064d578063e30c397814610655578063f4bb1b211461065d578063f71a16131461067a578063ff50abdc14610699578063ffaad6a5146106a157610253565b8063b8b1bf99146105f2578063ca6702cc146105fa578063cabac91c14610602578063d3a417a21461061f578063d48ab3081461064557610253565b806379ba50971161010a57806379ba5097146105a05780638ae39cac146105a85780638da5cb5b146105b05780639091038a146105b8578063b6b55f25146105d557610253565b80635e5c06e2146104f85780635e615a6b1461051e5780636409f9211461054c57806369cddfe514610554578063744f31d71461057d57610253565b80633237a68e116101d45780634959e729116101985780634959e7291461047d5780634f7f399b14610485578063534caae5146104a257806359f2ea07146104aa5780635c388ca6146104dc57610253565b80633237a68e146103fe578063327bc7b11461042457806334a551911461042c578063368990421461045257806336f2fa681461045a57610253565b80631959a0021161021b5780631959a0021461033d5780631eb804db1461038157806323c6a5021461039e5780632e1a7d4d146103c25780633011113a146103df57610253565b8063046a360e1461025857806309ce91ad1461028d5780630e8f7f31146102b557806310dc7f471461031257806315d0c28414610335575b600080fd5b61027b6004803603604081101561026e57600080fd5b50803590602001356106cd565b60408051918252519081900360200190f35b6102b3600480360360208110156102a357600080fd5b50356001600160a01b03166106e4565b005b6102e7600480360360608110156102cb57600080fd5b506001600160a01b03813516906020810135906040013561074f565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102b36004803603604081101561032857600080fd5b5080359060200135610818565b61027b610878565b6103636004803603602081101561035357600080fd5b50356001600160a01b031661087e565b60408051938452602084019290925282820152519081900360600190f35b6102b36004803603602081101561039757600080fd5b50356108e7565b6103a661097d565b604080516001600160a01b039092168252519081900360200190f35b6102b3600480360360208110156103d857600080fd5b503561098c565b6102b3600480360360208110156103f557600080fd5b503515156109f8565b6102b36004803603602081101561041457600080fd5b50356001600160a01b0316610a4a565b61027b610ab1565b6102b36004803603602081101561044257600080fd5b50356001600160a01b0316610ab7565b61027b610b22565b6102b36004803603604081101561047057600080fd5b5080359060200135610b28565b6102e7610b7b565b6102b36004803603602081101561049b57600080fd5b5035610b91565b61027b610e0d565b61027b600480360360608110156104c057600080fd5b506001600160a01b038135169060208101359060400135610e13565b6104e4610e2a565b604080519115158252519081900360200190f35b6103636004803603602081101561050e57600080fd5b50356001600160a01b0316610e3a565b610526610e5b565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102b3610e6d565b6102b36004803603606081101561056a57600080fd5b5080359060208101359060400135610ecc565b6105266004803603604081101561059357600080fd5b5080359060200135610fcf565b6102b3611052565b61027b6110bc565b6103a66110c2565b6102b3600480360360208110156105ce57600080fd5b50356110d1565b6102b3600480360360208110156105eb57600080fd5b503561132b565b6104e461133f565b61027b61134f565b6103636004803603602081101561061857600080fd5b5035611355565b6102b36004803603602081101561063557600080fd5b50356001600160a01b0316611385565b6103636113d7565b6103a66113f8565b6103a6611407565b6103636004803603602081101561067357600080fd5b5035611416565b6102b36004803603602081101561069057600080fd5b50351515611477565b61027b6114c9565b6102b3600480360360408110156106b757600080fd5b506001600160a01b0381351690602001356114cf565b60006106db600084846114e2565b90505b92915050565b6000546001600160a01b0316331461072d5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600061075f612b2f565b506001600160a01b0388166000908152600960209081526040918290208251606081018452815480825260018301549382019390935260029182015493810193909352549096506107d157600b6000815481106107b857fe5b90600052602060002090600302016000015494506107f4565b600b6000815481106107df57fe5b90600052602060002090600302016000015494505b6107fd8961175c565b925061080a8989896114e2565b915050939792965093509350565b6000546001600160a01b031633146108615760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b610869611839565b506108748282611ad3565b5050565b60045481565b600080600061088b612b2f565b506001600160a01b03841660009081526009602090815260408083208151606081018352815481526001820154938101939093526002015490820152906108d18661175c565b8251602090930151929792965094509092505050565b6000546001600160a01b031633146109305760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600a548110156109715760405162461bcd60e51b8152600401808060200182810382526025815260200180612c776025913960400191505060405180910390fd5b61097a81611b19565b50565b6008546001600160a01b031681565b600154600160a81b900460ff16156109e4576040805162461bcd60e51b8152602060048201526016602482015275195c9c9bdc8e881dda5d1a191c985dc8131bd8dad95960521b604482015290519081900360640190fd5b336109ee81611ca8565b6108748183611d7d565b6000546001600160a01b03163314610a415760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a81611f7b565b600154600160a01b900460ff1615610a9f576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b610aa881611ca8565b61097a81611fce565b600a5481565b6000546001600160a01b03163314610b005760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60055481565b6000546001600160a01b03163314610b715760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b6108748282611ad3565b6002546003546004546005546006549091929394565b6000546001600160a01b03163314610bda5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b8015610cad57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b158015610c3d57600080fd5b505af1158015610c51573d6000803e3d6000fd5b505050506040513d6020811015610c6757600080fd5b5051610ca8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b610deb565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b158015610d0557600080fd5b505afa158015610d19573d6000803e3d6000fd5b505050506040513d6020811015610d2f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610d8057600080fd5b505af1158015610d94573d6000803e3d6000fd5b505050506040513d6020811015610daa57600080fd5b5051610deb576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b6000600681905560028190556003819055600481905561097a90600b90612b50565b60035481565b6000610e208484846114e2565b90505b9392505050565b600154600160a81b900460ff1681565b60096020526000908152604090208054600182015460029092015490919083565b60025460045460055460065490919293565b600154600160a01b900460ff1615610ec2576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b33610aa881611ca8565b6000546001600160a01b03163314610f155760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b438311610f535760405162461bcd60e51b8152600401808060200182810382526029815260200180612c076029913960400191505060405180910390fd5b600b541580610f845750600b80546000198101908110610f6f57fe5b90600052602060002090600302016000015483115b610fbf5760405162461bcd60e51b8152600401808060200182810382526029815260200180612c9c6029913960400191505060405180910390fd5b610fca838383612139565b505050565b6000806000806002546000141561100757600b600081548110610fee57fe5b906000526020600020906003020160000154935061102a565b600b60008154811061101557fe5b90600052602060002090600302016000015493505b611034600061175c565b92506006549150611047600087876114e2565b905092959194509250565b60015433906001600160a01b031681146110b3576040805162461bcd60e51b815260206004820152601a60248201527f6d73672e73656e64657220213d2070656e64696e674f776e6572000000000000604482015290519081900360640190fd5b61097a8161223a565b60025481565b6000546001600160a01b031681565b6000546001600160a01b0316331461111a5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b80156111ed57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b505050506040513d60208110156111a757600080fd5b50516111e8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b61097a565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b15801561124557600080fd5b505afa158015611259573d6000803e3d6000fd5b505050506040513d602081101561126f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b1580156112c057600080fd5b505af11580156112d4573d6000803e3d6000fd5b505050506040513d60208110156112ea57600080fd5b505161097a576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b3361133581611ca8565b61087481836122f4565b600154600160a01b900460ff1681565b600b5490565b600b818154811061136257fe5b600091825260209091206003909102018054600182015460029092015490925083565b6000546001600160a01b031633146113ce5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a8161242f565b6000806000806113e56124ac565b6002546003549095509350915050909192565b6007546001600160a01b031681565b6001546001600160a01b031681565b6000806000611423612b2f565b600b858154811061143057fe5b600091825260209182902060408051606081018252600393909302909101805480845260018201549484018590526002909101549290910182905297919650945092505050565b6000546001600160a01b031633146114c05760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a816124bd565b60065481565b6114d882611ca8565b61087482826122f4565b60006114ec612b71565b600b54815260065460e082015260a0810184905260c0810184905261151084612510565b6101808401819052610140840182905260408401839052606084018390526101608401919091526101a083015260808201849052600061010083018190526101208301525b815181101561164c57611566612b2f565b600b828154811061157357fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c001511080156115c857506080830151815111155b1561163d57600182016060840152805160c08401516115e79190612661565b6020840181905261012084015160e08501516101608601516101a087015161160e946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152611643565b5061164c565b50600101611555565b508060c00151816080015111156116ad5761166f81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516116a0946126be565b6101608301526101208201525b6116b5612b2f565b6001600160a01b0386161561170957506001600160a01b038516600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915261172d565b60405180606001604052808360e00151815260200160008152602001600081525090505b6117526117438260000151846101200151612759565b61174d8688612661565b612772565b9695505050505050565b6000611766612b2f565b60006001600160a01b038416156117d95760096000856001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505091506117d26005546127d9565b9050611807565b60405180606001604052806006548152602001600081526020016000815250915061180460006127d9565b90505b6000611817828460200151612661565b90506000611829846000015183612759565b9050611752846040015182612a0c565b6000611843612b71565b600b54815260065460e0820152600a54604082018190526060820181905243608083015260055460a0830181905260c08301526004546101008301819052610120830152600254610140830181905261016083015260035461018083018190526101a08301525b81518110156119e7576118bb612b2f565b600b82815481106118c857fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561191d57506080830151815111155b156119d857600182016060840152805160c084015161193c9190612661565b6020840181905261012084015160e08501516101608601516101a0870151611963946126be565b6101608501908152610120850191909152815160c085015260208083018051909252604083810180516101a088015284519351905182519485529284015282810191909152517fc2d5f9e666d2dd7e740ece9acaf1b93ce48894cbc0336d693410badb7c40aead9181900360600190a16119de565b506119e7565b506001016118aa565b5080608001518160c001511015611a4857611a0a81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a0850151611a3b946126be565b6101608301526101208201525b8060c001518160a0015114611a605760c08101516005555b8060600151816040015114611a78576060810151600a555b80610120015181610100015114611a93576101208101516004555b80610160015181610140015114611aae576101608101516002555b806101a0015181610180015114611ac9576101a08101516003555b6101200151905090565b604080518381526020810183905281517fbfc739097487a2d01d113d21aef3ef3d22331f56d3273bc4907d61407e5b0856929181900390910190a1600291909155600355565b600b548015801590611b2a57508082105b611b655760405162461bcd60e51b8152600401808060200182810382526026815260200180612c306026913960400191505060405180910390fd5b611b6d612b2f565b600b8381548110611b7a57fe5b6000918252602091829020604080516060808201835260039094029092018054808452600182015484870181905260029092015484840181905283518a81529687019190915285830191909152928401929092526000198501608084015290519092507f543ba8eaac0e28f58eb335897e63175861579bc16306e05ab5936084c1f074919181900360a00190a1825b60018303811015611c7257600b8160010181548110611c2457fe5b9060005260206000209060030201600b8281548110611c3f57fe5b60009182526020909120825460039092020190815560018083015481830155600292830154929091019190915501611c09565b50600b805480611c7e57fe5b60008281526020812060036000199093019283020181815560018101829055600201559055505050565b611cb0612b2f565b506001600160a01b0381166000908152600960209081526040808320815160608101835281548152600182015493810193909352600201549082015290611cf5611839565b90506000611d07828460200151612661565b90506000611d19846000015183612759565b905082846020015114611d45576001600160a01b03851660009081526009602052604090206001018390555b8015611d7657611d59846040015182612a0c565b6001600160a01b0386166000908152600960205260409020600201555b5050505050565b611d85612b2f565b506001600160a01b038216600090815260096020908152604091829020825160608101845281548082526001830154938201939093526002909101549281019290925260065490831115611e20576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f7567682075736572204465706f736974000000000000000000604482015290519081900360640190fd5b8151611e2c9084612661565b8083526001600160a01b038516600090815260096020526040902055600654611e559084612661565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca949181900360800190a16007546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611f0a57600080fd5b505af1158015611f1e573d6000803e3d6000fd5b505050506040513d6020811015611f3457600080fd5b5051611f75576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b50505050565b60408051821515815290517f24e8043bbab505bf23b3d9b569ad2dc34a6a563516daca26e3ad818b40c14f659181900360200190a160018054911515600160a81b0260ff60a81b19909216919091179055565b611fd6612b2f565b506001600160a01b038116600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181018290529015610874576040808201516001600160a01b0384166000818152600960209081528482206002019190915583519182528101829052825191927f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d492918290030190a16008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156120ce57600080fd5b505af11580156120e2573d6000803e3d6000fd5b505050506040513d60208110156120f857600080fd5b5051610fca576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b612141612b2f565b60405180606001604052808581526020018481526020018381525090507f1fdf2820867a17742112aebea1dc9d50d73c902c1e5e2ac7f03b0b11e697adb384848460405180848152602001838152602001828152602001935050505060405180910390a1600b805460018101825560009190915281517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960039092029182015560208201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8201556040909101517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90910155505050565b6001600160a01b03811661228a576040805162461bcd60e51b81526020600482015260126024820152716f776e6572207a65726f206164647265737360701b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6122fc612b2f565b506001600160a01b03821660009081526009602090815260409182902082516060810184528154808252600183015493820193909352600290910154928101929092526006549061234d9084612a0c565b8083526001600160a01b0385166000908152600960205260409020556006546123769084612a0c565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e9181900360800190a1600754604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611f0a57600080fd5b6001600160a01b03811661248a576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e67206f776e6572207a65726f2061646472657373000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006124b8600061175c565b905090565b60408051821515815290517f4d23c25ea752bd74a0dfa4a88c011a2c7bf8713a06a6b1028feb1fd277746c4f9181900360200190a160018054911515600160a01b0260ff60a01b19909216919091179055565b600b5460009081908190819081908190819080156125d157600092505b808310156125d15761253d612b2f565b600b848154811061254a57fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518a101580156125975750805115155b156125b25783925080602001519550806040015194506125c4565b80516125be57506125c6565b506125d1565b505b60019092019161252d565b6125d9612b2f565b600b83815481106125e657fe5b600091825260209182902060408051606081018252600390930290910180548084526001820154948401859052600290910154918301829052929850965091508a11156126505761264d86612648876126438e8660000151612661565b612a66565b612661565b95505b509198939750919550919350505050565b6000818310156126b8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808084156126e8576126d28686612772565b9050808411156126e4578093506126e8565b5060005b6000871561272d5761271e6126fe888789612abf565b612719612713670de0b6b3a76400008c612b02565b88612a66565b612759565b905061272a8982612a0c565b98505b811561273c576000965061274a565b612747878787612b1f565b96505b50969794965093945050505050565b60006106db6127688484612a66565b670de0b6b3a76400005b60008082116127c8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816127d157fe5b049392505050565b60006127e3612b71565b600b54815260065460e08201528261284c576000604082018190526060820181905243608083015260a0820181905260c08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a08201526128a3565b600a5460408201819052606082015243608082015260a0810183905260c081018390526004546101008201819052610120820152600254610140820181905261016082015260035461018082018190526101a08201525b60408101515b81518110156129a0576128ba612b2f565b600b82815481106128c757fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561291c57506080830151815111155b1561299157600182016060840152805160c084015161293b9190612661565b6020840181905261012084015160e08501516101608601516101a0870151612962946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152612997565b506129a0565b506001016128a9565b508060c0015181608001511115612a01576129c381608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516129f4946126be565b6101608301526101208201525b610120015192915050565b6000828201838110156106db576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a2061646474696f6e206f766572666c6f77000000000000604482015290519081900360640190fd5b600082612a75575060006106de565b82820282848281612a8257fe5b04146106db5760405162461bcd60e51b8152600401808060200182810382526021815260200180612c566021913960400191505060405180910390fd5b60008215612afa57612af3612aec612ad8600287612a66565b612648612ae6876001612661565b86612a66565b6002612772565b9050610e23565b506000610e23565b60006106db612b1984670de0b6b3a7640000612a66565b83612772565b6000610e20846126488585612a66565b60405180606001604052806000815260200160008152602001600081525090565b508054600082556003029060005260206000209081019061097a9190612be0565b604051806101c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115612c02576000808255600182018190556002820155600301612be1565b509056fe6e65772052657761726420706172616d732073686f756c64207265676973746572206561726c6965726572726f723a206e6f20656c656d656e747320696e2072656769737465726564506f696e7473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775265776172642076656c6f6369747920706f696e7420616c7265616479207061737365642e456172696c6965722076656c6f6369747920706f696e74732061726520616c7265616479207365742e6f6e6c794f776e65723a2065787465726e616c2066756e6374696f6e2061636365737320636f6e74726f6c21a264697066735822122021babed0a4f44fde9e273c13ec79dba290a3e3c1b22383ae6858613919fe0b4064736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000c860a6000000000000000000000000000000000000000000000000f266650863a748e5000000000000000000000000000000000000000000000000000001ee90ba90c4
-----Decoded View---------------
Arg [0] : start (uint256): 13131942
Arg [1] : reward_per_block (uint256): 17466759291509098725
Arg [2] : dec_per_block (uint256): 2124141990084
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000c860a6
Arg [1] : 000000000000000000000000000000000000000000000000f266650863a748e5
Arg [2] : 000000000000000000000000000000000000000000000000000001ee90ba90c4
Deployed Bytecode Sourcemap
40532:520:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32231:187;;;;;;;;;;;;;;;;-1:-1:-1;32231:187:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33201:97;;;;;;;;;;;;;;;;-1:-1:-1;33201:97:0;-1:-1:-1;;;;;33201:97:0;;:::i;:::-;;21580:834;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21580:834:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37732:203;;;;;;;;;;;;;;;;-1:-1:-1;37732:203:0;;;;;;;:::i;5582:25::-;;;:::i;23189:283::-;;;;;;;;;;;;;;;;-1:-1:-1;23189:283:0;-1:-1:-1;;;;;23189:283:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;37436:215;;;;;;;;;;;;;;;;-1:-1:-1;37436:215:0;;:::i;5708:22::-;;;:::i;:::-;;;;-1:-1:-1;;;;;5708:22:0;;;;;;;;;;;;;;35518:180;;;;;;;;;;;;;;;;-1:-1:-1;35518:180:0;;:::i;36443:96::-;;;;;;;;;;;;;;;;-1:-1:-1;36443:96:0;;;;:::i;36159:139::-;;;;;;;;;;;;;;;;-1:-1:-1;36159:139:0;-1:-1:-1;;;;;36159:139:0;;:::i;5791:26::-;;;:::i;33434:100::-;;;;;;;;;;;;;;;;-1:-1:-1;33434:100:0;-1:-1:-1;;;;;33434:100:0;;:::i;5616:27::-;;;:::i;33625:164::-;;;;;;;;;;;;;;;;-1:-1:-1;33625:164:0;;;;;;;:::i;22422:196::-;;;:::i;33863:503::-;;;;;;;;;;;;;;;;-1:-1:-1;33863:503:0;;:::i;5539:36::-;;;:::i;32021:202::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32021:202:0;;;;;;;;;;;;;:::i;5470:24::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;5739:43;;;;;;;;;;;;;;;;-1:-1:-1;5739:43:0;-1:-1:-1;;;;;5739:43:0;;:::i;22626:164::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35826:161;;;:::i;36946:484::-;;;;;;;;;;;;;;;;-1:-1:-1;36946:484:0;;;;;;;;;;;;:::i;20818:754::-;;;;;;;;;;;;;;;;-1:-1:-1;20818:754:0;;;;;;;:::i;36678:182::-;;;:::i;5503:29::-;;;:::i;5379:20::-;;;:::i;34451:313::-;;;;;;;;;;;;;;;;-1:-1:-1;34451:313:0;;:::i;34898:158::-;;;;;;;;;;;;;;;;-1:-1:-1;34898:158:0;;:::i;5442:21::-;;;:::i;22798:117::-;;;:::i;5824:45::-;;;;;;;;;;;;;;;;-1:-1:-1;5824:45:0;;:::i;36547:123::-;;;;;;;;;;;;;;;;-1:-1:-1;36547:123:0;-1:-1:-1;;;;;36547:123:0;;:::i;23480:261::-;;;:::i;5688:18::-;;;:::i;5406:27::-;;;:::i;22923:258::-;;;;;;;;;;;;;;;;-1:-1:-1;22923:258:0;;:::i;36347:90::-;;;;;;;;;;;;;;;;-1:-1:-1;36347:90:0;;;;:::i;5650:29::-;;;:::i;35245:138::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35245:138:0;;;;;;;;:::i;32231:187::-;32328:7;32355:55;32375:1;32379:15;32396:13;32355:11;:55::i;:::-;32348:62;;32231:187;;;;;:::o;33201:97::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33266:5:::1;:24:::0;;-1:-1:-1;;;;;;33266:24:0::1;-1:-1:-1::0;;;;;33266:24:0;;;::::1;::::0;;;::::1;::::0;;33201:97::o;21580:834::-;21706:25;21742:30;21783:29;21823:25;21859:16;21903:19;;:::i;:::-;-1:-1:-1;;;;;;21925:18:0;;;;;;:8;:18;;;;;;;;;21903:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22006:14;21903:40;;-1:-1:-1;22003:152:0;;22052:16;22069:1;22052:19;;;;;;;;;;;;;;;;;;:31;;;22027:56;;22003:152;;;22124:16;22141:1;22124:19;;;;;;;;;;;;;;;;;;:31;;;22099:56;;22003:152;22188:24;22203:8;22188:14;:24::i;:::-;22168:44;;22236:55;22248:8;22258:16;22276:14;22236:11;:55::i;:::-;22225:66;;22304:102;21580:834;;;;;;;;;:::o;37732:203::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37846:19:::1;:17;:19::i;:::-;;37876:51;37887:15;37904:22;37876:10;:51::i;:::-;37732:203:::0;;:::o;5582:25::-;;;;:::o;23189:283::-;23248:7;23257;23266;23286:19;;:::i;:::-;-1:-1:-1;;;;;;23308:18:0;;;;;;:8;:18;;;;;;;;23286:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23366:24;23317:8;23366:14;:24::i;:::-;23411:14;;23427:16;;;;;23411:14;;23427:16;;-1:-1:-1;23427:16:0;-1:-1:-1;23189:283:0;;-1:-1:-1;;;23189:283:0:o;37436:215::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37540:11:::1;;37530:6;:21;;37522:71;;;;-1:-1:-1::0;;;37522:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37604:39;37636:6;37604:31;:39::i;:::-;37436:215:::0;:::o;5708:22::-;;;-1:-1:-1;;;;;5708:22:0;;:::o;35518:180::-;33016:12;;-1:-1:-1;;;33016:12:0;;;;33015:13;33007:48;;;;;-1:-1:-1;;;33007:48:0;;;;;;;;;;;;-1:-1:-1;;;33007:48:0;;;;;;;;;;;;;;;35611:10:::1;35632:20;35611:10:::0;35632::::1;:20::i;:::-;35663:27;35673:8;35683:6;35663:9;:27::i;36443:96::-:0;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36509:22:::1;36526:4;36509:16;:22::i;36159:139::-:0;32906:9;;-1:-1:-1;;;32906:9:0;;;;32905:10;32897:42;;;;;-1:-1:-1;;;32897:42:0;;;;;;;;;;;;-1:-1:-1;;;32897:42:0;;;;;;;;;;;;;;;36237:20:::1;36248:8;36237:10;:20::i;:::-;36268:22;36281:8;36268:12;:22::i;5791:26::-:0;;;;:::o;33434:100::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33498:9:::1;:28:::0;;-1:-1:-1;;;;;;33498:28:0::1;-1:-1:-1::0;;;;;33498:28:0;;;::::1;::::0;;;::::1;::::0;;33434:100::o;5616:27::-;;;;:::o;33625:164::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33730:51:::1;33741:15;33758:22;33730:10;:51::i;22422:196::-:0;22530:14;;22546:21;;22569:10;;22581:12;;22595:14;;22422:196;;;;;:::o;33863:503::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33934:11;;33930:232:::1;;33971:9;::::0;::::1;33990:5:::0;;33971:33:::1;::::0;;-1:-1:-1;;;33971:33:0;;-1:-1:-1;;;;;33990:5:0;;::::1;33971:33;::::0;::::1;::::0;;;;;;;;;:9;;;::::1;::::0;:18:::1;::::0;:33;;;;;::::1;::::0;;;;;;;;;;;;;:9;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33971:33:0;33962:59:::1;;;::::0;;-1:-1:-1;;;33962:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33962:59:0;;;;;;;;;;;;;::::1;;33930:232;;;34072:9;::::0;::::1;34091:5:::0;34098:34:::1;::::0;;-1:-1:-1;;;34098:34:0;;34126:4:::1;34098:34;::::0;::::1;::::0;;;-1:-1:-1;;;;;34072:9:0;;::::1;::::0;:18:::1;::::0;34091:5:::1;::::0;34072:9;;34098:19:::1;::::0;:34;;;;;::::1;::::0;;;;;;;;;34072:9;34098:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34098:34:0;34072:61:::1;::::0;;-1:-1:-1;;;;;;34072:61:0::1;::::0;;;;;;-1:-1:-1;;;;;34072:61:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;34098:34:::1;::::0;34072:61;;;;;;;-1:-1:-1;34072:61:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34072:61:0;34063:87:::1;;;::::0;;-1:-1:-1;;;34063:87:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34063:87:0;;;;;;;;;;;;;::::1;;34172:21;34179:14;34172:21:::0;;;34211:14:::1;34204:21:::0;;;34243::::1;34236:28:::0;;;-1:-1:-1;34275:17:0;;;34335:23:::1;::::0;34342:16:::1;::::0;34335:23:::1;:::i;5539:36::-:0;;;;:::o;32021:202::-;32135:7;32162:53;32174:8;32184:15;32201:13;32162:11;:53::i;:::-;32155:60;;32021:202;;;;;;:::o;5470:24::-;;;-1:-1:-1;;;5470:24:0;;;;;:::o;5739:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22626:164::-;22725:14;;22741:10;;22753:12;;22767:14;;22626:164;;;;:::o;35826:161::-;32906:9;;-1:-1:-1;;;32906:9:0;;;;32905:10;32897:42;;;;;-1:-1:-1;;;32897:42:0;;;;;;;;;;;;-1:-1:-1;;;32897:42:0;;;;;;;;;;;;;;;35905:10:::1;35926:20;35905:10:::0;35926::::1;:20::i;36946:484::-:0;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37108:12:::1;37093;:27;37085:81;;;;-1:-1:-1::0;;;37085:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37185:16;:23:::0;:28;;:102:::1;;-1:-1:-1::0;37232:16:0::1;37249:23:::0;;-1:-1:-1;;37249:25:0;;;37232:43;::::1;;;;;;;;;;;;;;;:55;;;37217:12;:70;37185:102;37177:156;;;;-1:-1:-1::0;;;37177:156:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37344:78;37368:12;37382:15;37399:22;37344:23;:78::i;:::-;36946:484:::0;;;:::o;20818:754::-;20928:30;20969:25;21005:20;21036:16;21083:14;;21101:1;21083:19;21080:152;;;21129:16;21146:1;21129:19;;;;;;;;;;;;;;;;;;:31;;;21104:56;;21080:152;;;21201:16;21218:1;21201:19;;;;;;;;;;;;;;;;;;:31;;;21176:56;;21080:152;21265:26;21288:1;21265:14;:26::i;:::-;21245:46;;21319:14;;21304:29;;21357:57;21377:1;21381:16;21399:14;21357:11;:57::i;:::-;21346:68;;20818:754;;;;;;;:::o;36678:182::-;36781:12;;36742:10;;-1:-1:-1;;;;;36781:12:0;36771:22;;36763:61;;;;;-1:-1:-1;;;36763:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36835:17;36845:6;36835:9;:17::i;5503:29::-;;;;:::o;5379:20::-;;;-1:-1:-1;;;;;5379:20:0;;:::o;34451:313::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34531:11;;34527:230:::1;;34568:9;::::0;::::1;34587:5:::0;;34568:33:::1;::::0;;-1:-1:-1;;;34568:33:0;;-1:-1:-1;;;;;34587:5:0;;::::1;34568:33;::::0;::::1;::::0;;;;;;;;;:9;;;::::1;::::0;:18:::1;::::0;:33;;;;;::::1;::::0;;;;;;;;;;;;;:9;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34568:33:0;34559:58:::1;;;::::0;;-1:-1:-1;;;34559:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34559:58:0;;;;;;;;;;;;;::::1;;34527:230;;;34668:9;::::0;::::1;34687:5:::0;34694:34:::1;::::0;;-1:-1:-1;;;34694:34:0;;34722:4:::1;34694:34;::::0;::::1;::::0;;;-1:-1:-1;;;;;34668:9:0;;::::1;::::0;:18:::1;::::0;34687:5:::1;::::0;34668:9;;34694:19:::1;::::0;:34;;;;;::::1;::::0;;;;;;;;;34668:9;34694:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34694:34:0;34668:61:::1;::::0;;-1:-1:-1;;;;;;34668:61:0::1;::::0;;;;;;-1:-1:-1;;;;;34668:61:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;34694:34:::1;::::0;34668:61;;;;;;;-1:-1:-1;34668:61:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34668:61:0;34659:86:::1;;;::::0;;-1:-1:-1;;;34659:86:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34659:86:0;;;;;;;;;;;;;::::1;34898:158:::0;34970:10;34991:20;34970:10;34991;:20::i;:::-;35022:26;35031:8;35041:6;35022:8;:26::i;5442:21::-;;;-1:-1:-1;;;5442:21:0;;;;;:::o;22798:117::-;22884:16;:23;22798:117;:::o;5824:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5824:45:0;:::o;36547:123::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36629:33:::1;36646:15;36629:16;:33::i;23480:261::-:0;23531:7;23540;23549;23569:40;23612:30;:28;:30::i;:::-;23661:14;;23677:21;;23661:14;;-1:-1:-1;23677:21:0;-1:-1:-1;23569:73:0;-1:-1:-1;;23480:261:0;;;:::o;5688:18::-;;;-1:-1:-1;;;;;5688:18:0;;:::o;5406:27::-;;;-1:-1:-1;;;;;5406:27:0;;:::o;22923:258::-;22989:7;22998;23007;23027:32;;:::i;:::-;23062:16;23079:5;23062:23;;;;;;;;;;;;;;;;;23027:58;;;;;;;;23062:23;;;;;;;;23027:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23027:58:0;-1:-1:-1;22923:258:0;-1:-1:-1;;;22923:258:0:o;36347:90::-;32778:5;;-1:-1:-1;;;;;32778:5:0;32764:10;:19;32756:76;;;;-1:-1:-1;;;32756:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36410:19:::1;36424:4;36410:13;:19::i;5650:29::-:0;;;;:::o;35245:138::-;35318:20;35329:8;35318:10;:20::i;:::-;35349:26;35358:8;35368:6;35349:8;:26::i;28295:2508::-;28405:7;28425:33;;:::i;:::-;28482:16;:23;28471:34;;28539:14;;28516:20;;;:37;28589:20;;;:38;;;28566:20;;;:61;;;28717:39;28612:15;28717:22;:39::i;:::-;28684:29;;;28638:118;;;28660:22;;;28638:118;;;28639:19;;;28638:118;;;28767:19;;;:41;;;28819:22;;;:47;;;;28877:29;;;:61;28951:20;;;:36;;;-1:-1:-1;;29019:18:0;;:22;;;-1:-1:-1;28998:18:0;;:43;29054:962;29091:8;;29089:10;;29054:962;;;29121:32;;:::i;:::-;29156:16;29173:1;29156:19;;;;;;;;;;;;;;;;;;29121:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29218:5;:17;;;29195:4;:20;;;:40;:85;;;;-1:-1:-1;29260:20:0;;;;29239:17;;:41;;29195:85;29192:813;;;29325:1;29323:3;;29301:19;;;:25;29374:17;;29393:20;;;;29366:48;;29374:17;29366:7;:48::i;:::-;29345:18;;;:69;;;29538:18;;;;29579:20;;;;29622:22;;;;29667:29;;;;29497:241;;:18;:241::i;:::-;29454:22;;;29433:305;;;29434:18;;;29433:305;;;;29782:17;;29759:20;;;:40;29843:20;;;;29818:45;;-1:-1:-1;29914:27:0;;;29882:29;;;:59;29192:813;;;29984:5;;;29192:813;-1:-1:-1;29101:3:0;;29054:962;;;;30054:4;:20;;;30031:4;:20;;;:43;30028:501;;;30112:51;30120:4;:20;;;30142:4;:20;;;30112:7;:51::i;:::-;30091:18;;;:72;;;30201:20;;;;30178;;;:43;30333:18;;;;30370:20;;;;30409:22;;;;30450:29;;;;30296:221;;:18;:221::i;:::-;30257:22;;;30236:281;30237:18;;;30236:281;30028:501;30541:19;;:::i;:::-;-1:-1:-1;;;;;30575:22:0;;;30571:112;;-1:-1:-1;;;;;;30607:18:0;;;;;;:8;:18;;;;;;;;;30600:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30571:112;;;30648:35;;;;;;;;30656:4;:20;;;30648:35;;;;30678:1;30648:35;;;;30681:1;30648:35;;;30641:42;;30571:112;30703:92;30711:42;30718:4;:14;;;30734:4;:18;;;30711:6;:42::i;:::-;30755:39;30763:13;30778:15;30755:7;:39::i;:::-;30703:7;:92::i;:::-;30696:99;28295:2508;-1:-1:-1;;;;;;28295:2508:0:o;23883:623::-;23948:7;23968:19;;:::i;:::-;23998:21;-1:-1:-1;;;;;24034:22:0;;;24030:271;;24081:8;:18;24090:8;-1:-1:-1;;;;;24081:18:0;-1:-1:-1;;;;;24081:18:0;;;;;;;;;;;;24074:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24130:35;24152:12;;24130:21;:35::i;:::-;24114:51;;24030:271;;;24205:29;;;;;;;;24213:14;;24205:29;;;;24229:1;24205:29;;;;24232:1;24205:29;;;24198:36;;24265:24;24287:1;24265:21;:24::i;:::-;24249:40;;24030:271;24313:16;24332:40;24340:13;24355:4;:16;;;24332:7;:40::i;:::-;24313:59;;24383:20;24406:32;24413:4;:14;;;24429:8;24406:6;:32::i;:::-;24383:55;;24458:40;24466:4;:17;;;24485:12;24458:7;:40::i;11769:3658::-;11816:7;11912:33;;:::i;:::-;11969:16;:23;11958:34;;12026:14;;12003:20;;;:37;12097:11;;12075:19;;;:33;;;12053:19;;;:55;;;12144:12;-1:-1:-1;12121:20:0;;:35;12213:12;;-1:-1:-1;12190:20:0;;:35;;;12167:20;;;:58;12280:10;;12259:18;;;:31;;;12238:18;;;:52;12351:14;;12326:22;;;:39;;;12301:22;;;:64;12440:21;;12408:29;;;:53;;;12376:29;;;:85;12474:1623;12511:8;;12509:10;;12474:1623;;;12541:32;;:::i;:::-;12576:16;12593:1;12576:19;;;;;;;;;;;;;;;;;;12541:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12784:5;:17;;;12761:4;:20;;;:40;:85;;;;-1:-1:-1;12826:20:0;;;;12805:17;;:41;;12761:85;12758:1328;;;12891:1;12889:3;;12867:19;;;:25;13012:17;;13031:20;;;;13004:48;;13012:17;13004:7;:48::i;:::-;12983:18;;;:69;;;13176:18;;;;13217:20;;;;13260:22;;;;13305:29;;;;13135:241;;:18;:241::i;:::-;13092:22;;;13071:305;;;13072:18;;;13071:305;;;;13504:17;;13481:20;;;:40;13565:20;;;;;;13540:45;;;-1:-1:-1;13636:27:0;;;;;13604:29;;;:59;13869:17;;13888:20;;13910:27;;13850:88;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13850:88:0;;;12758:1328;;;14065:5;;;12758:1328;-1:-1:-1;12521:3:0;;12474:1623;;;;14296:4;:20;;;14273:4;:20;;;:43;14269:503;;;14355:51;14363:4;:20;;;14385:4;:20;;;14355:7;:51::i;:::-;14334:18;;;:72;;;14444:20;;;;14421;;;:43;14576:18;;;;14613:20;;;;14652:22;;;;14693:29;;;;14539:221;;:18;:221::i;:::-;14500:22;;;14479:281;14480:18;;;14479:281;14269:503;14912:4;:20;;;14888:4;:20;;;:44;14885:84;;14949:20;;;;14934:12;:35;14885:84;15006:4;:19;;;14983:4;:19;;;:42;14980:80;;15041:19;;;;15027:11;:33;14980:80;15096:4;:18;;;15074:4;:18;;;:40;15071:76;;15129:18;;;;15116:10;:31;15071:76;15187:4;:22;;;15161:4;:22;;;:48;15158:92;;15228:22;;;;15211:14;:39;15158:92;15297:4;:29;;;15264:4;:29;;;:62;15261:120;;15352:29;;;;15328:21;:53;15261:120;15401:18;;;;-1:-1:-1;11769:3658:0;:::o;18824:266::-;18926:56;;;;;;;;;;;;;;;;;;;;;;;;;18993:14;:32;;;;19036:21;:46;18824:266::o;18023:557::-;18114:16;:23;18156:8;;;;;:24;;;18177:3;18168:6;:12;18156:24;18148:75;;;;-1:-1:-1;;;18148:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18236:32;;:::i;:::-;18271:16;18288:6;18271:24;;;;;;;;;;;;;;;;;18236:59;;;;;;;;;18271:24;;;;;;;18236:59;;;;;;;;;;;;;;;;;;;;;;;;;;18311:111;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18416:5:0;;18311:111;;;;;;18236:59;;-1:-1:-1;18311:111:0;;;;;;;;;18447:6;18433:106;18461:1;18457:3;:5;18455:1;:7;18433:106;;;18506:16;18523:1;18525;18523:3;18506:21;;;;;;;;;;;;;;;;;;18484:16;18501:1;18484:19;;;;;;;;;;;;;;;;:43;;:19;;;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;18464:3;18433:106;;;;18549:16;:22;;;;;;;;;;;;;;;-1:-1:-1;;18549:22:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18023:557:0:o;10328:504::-;10386:19;;:::i;:::-;-1:-1:-1;;;;;;10408:18:0;;;;;;:8;:18;;;;;;;;10386:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10463:19;:17;:19::i;:::-;10439:43;;10495:16;10514:40;10522:13;10537:4;:16;;;10514:7;:40::i;:::-;10495:59;;10565:20;10588:32;10595:4;:14;;;10611:8;10588:6;:32::i;:::-;10565:55;;10656:13;10636:4;:16;;;:33;10633:84;;-1:-1:-1;;;;;10671:18:0;;;;;;:8;:18;;;;;:30;;:46;;;10633:84;10731:17;;10728:96;;10784:40;10792:4;:17;;;10811:12;10784:7;:40::i;:::-;-1:-1:-1;;;;;10750:18:0;;;;;;:8;:18;;;;;:31;;:74;10728:96;10328:504;;;;;:::o;9360:716::-;9433:19;;:::i;:::-;-1:-1:-1;;;;;;9455:18:0;;;;;;:8;:18;;;;;;;;;9433:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9507:14;;;9540:24;-1:-1:-1;9540:24:0;9532:60;;;;;-1:-1:-1;;;9532:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9630:14;;9622:31;;9646:6;9622:7;:31::i;:::-;9605:48;;;-1:-1:-1;;;;;9664:18:0;;9605:14;9664:18;;;:8;:18;;;;;:45;9743:14;;9735:31;;9759:6;9735:7;:31::i;:::-;9777:14;:29;;;9720:46;-1:-1:-1;9822:10:0;;9819:250;;9955:14;;9928:56;;;-1:-1:-1;;;;;9928:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10008:5;;:32;;;-1:-1:-1;;;10008:32:0;;-1:-1:-1;;;;;10008:32:0;;;;;;;;;;;;;;;:5;;;;;:14;;:32;;;;;;;;;;;;;;:5;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10008:32:0;9999:58;;;;;-1:-1:-1;;;9999:58:0;;;;;;;;;;;;-1:-1:-1;;;9999:58:0;;;;;;;;;;;;;;;9360:716;;;;:::o;19989:118::-;20051:18;;;;;;;;;;;;;;;;;;;20080:12;:19;;;;;-1:-1:-1;;;20080:19:0;-1:-1:-1;;;;20080:19:0;;;;;;;;;19989:118::o;11022:448::-;11082:19;;:::i;:::-;-1:-1:-1;;;;;;11104:18:0;;;;;;:8;:18;;;;;;;;;11082:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11138:22;11135:328;;11194:17;;;;;-1:-1:-1;;;;;11226:18:0;;11177:14;11226:18;;;:8;:18;;;;;;;:31;;:35;;;;11352:23;;;;;;;;;;;;11194:17;;11352:23;;;;;;;;;11398:9;;:36;;;-1:-1:-1;;;11398:36:0;;-1:-1:-1;;;;;11398:36:0;;;;;;;;;;;;;;;:9;;;;;:18;;:36;;;;;;;;;;;;;;:9;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11398:36:0;11390:61;;;;;-1:-1:-1;;;11390:61:0;;;;;;;;;;;;-1:-1:-1;;;11390:61:0;;;;;;;;;;;;;;17338:385;17470:35;;:::i;:::-;17508:74;;;;;;;;17528:12;17508:74;;;;17542:15;17508:74;;;;17559:22;17508:74;;;17470:112;;17598:75;17619:12;17633:15;17650:22;17598:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17684:16;:31;;;;;;;-1:-1:-1;17684:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17338:385:0:o;20115:195::-;-1:-1:-1;;;;;20180:22:0;;20172:53;;;;;-1:-1:-1;;;20172:53:0;;;;;;;;;;;;-1:-1:-1;;;20172:53:0;;;;;;;;;;;;;;;20259:5;;20241:34;;;-1:-1:-1;;;;;20259:5:0;;;20241:34;;;;;;;;;;;;;;;;;;;;;20286:5;:16;;-1:-1:-1;;;;;;20286:16:0;-1:-1:-1;;;;;20286:16:0;;;;;;;;;;20115:195::o;8494:663::-;8566:19;;:::i;:::-;-1:-1:-1;;;;;;8588:18:0;;;;;;:8;:18;;;;;;;;;8566:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8640:14;;;8684:31;;8708:6;8684:7;:31::i;:::-;8667:48;;;-1:-1:-1;;;;;8726:18:0;;8667:14;8726:18;;;:8;:18;;;;;:45;8805:14;;8797:31;;8821:6;8797:7;:31::i;:::-;8839:14;:29;;;8782:46;-1:-1:-1;8884:10:0;;8881:269;;9015:14;;8989:55;;;-1:-1:-1;;;;;8989:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9068:5;;:53;;;-1:-1:-1;;;9068:53:0;;9087:10;9068:53;;;;9107:4;9068:53;;;;;;;;;;;;-1:-1:-1;;;;;9068:5:0;;;;:18;;:53;;;;;;;;;;;;;;;:5;;:53;;;;;;;;;;20318:182;-1:-1:-1;;;;;20395:27:0;;20387:66;;;;;-1:-1:-1;;;20387:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20464:12;:28;;-1:-1:-1;;;;;;20464:28:0;-1:-1:-1;;;;;20464:28:0;;;;;;;;;;20318:182::o;23749:126::-;23812:7;23839:28;23863:1;23839:14;:28::i;:::-;23832:35;;23749:126;:::o;19872:109::-;19931:15;;;;;;;;;;;;;;;;;;;19957:9;:16;;;;;-1:-1:-1;;;19957:16:0;-1:-1:-1;;;;19957:16:0;;;;;;;;;19872:109::o;30811:1202::-;31057:16;:23;30888:7;;;;;;;;;;;;;;31095:15;;31091:508;;31136:1;31132:5;;31128:460;31143:11;31139:1;:15;31128:460;;;31180:32;;:::i;:::-;31215:16;31232:1;31215:19;;;;;;;;;;;;;;;;;;31180:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31272:5;:17;;;31256:12;:33;;:59;;;;-1:-1:-1;31298:17:0;;31293:22;;31256:59;31253:319;;;31355:1;31340:16;;31397:5;:20;;;31379:38;;31453:5;:27;;;31440:40;;31253:319;;;31515:17;;31506:66;;31535:8;;;31506:66;31567:5;;;31506:66;31128:460;;31156:3;;;;;31128:460;;;31609:32;;:::i;:::-;31644:16;31661:12;31644:30;;;;;;;;;;;;;;;;;31609:65;;;;;;;;31644:30;;;;;;;31609:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31609:65:0;-1:-1:-1;31609:65:0;-1:-1:-1;31788:32:0;;31785:171;;;31855:89;31863:15;31880:62;31888:10;31900:40;31908:12;31922:5;:17;;;31900:7;:40::i;:::-;31880:7;:62::i;:::-;31855:7;:89::i;:::-;31837:107;;31785:171;-1:-1:-1;31974:1:0;;31977:15;;-1:-1:-1;31994:10:0;;-1:-1:-1;30811:1202:0;;-1:-1:-1;;;;30811:1202:0:o;743:162::-;805:7;838:1;833;:6;;825:49;;;;;-1:-1:-1;;;825:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;892:5:0;;;743:162::o;15828:1067::-;16041:7;;;16115:27;;16112:246;;16181:48;16189:15;16206:22;16181:7;:48::i;:::-;16163:66;;16259:15;16251:5;:23;16248:94;;;16284:15;16276:23;;16248:94;;;-1:-1:-1;16341:1:0;16248:94;16374:16;16408:18;;16405:261;;16458:129;16466:74;16493:15;16510:5;16517:22;16466:26;:74::i;:::-;16542:43;16551:26;279:7;16563:13;16551:6;:26::i;:::-;16579:5;16542:7;:43::i;:::-;16458:6;:129::i;:::-;16447:140;;16620:30;16628:11;16641:8;16620:7;:30::i;:::-;16606:44;;16405:261;16685:20;;16682:151;;16725:1;16707:19;;16682:151;;;16764:69;16786:15;16803:22;16827:5;16764:21;:69::i;:::-;16746:87;;16682:151;-1:-1:-1;16858:11:0;;16871:15;;-1:-1:-1;15828:1067:0;;-1:-1:-1;;;;;15828:1067:0:o;425:124::-;486:7;513:28;522:13;530:1;533;522:7;:13::i;:::-;279:7;1144:157;1206:7;1238:1;1234;:5;1226:44;;;;;-1:-1:-1;;;1226:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1291:1;1289;:3;;;;;;;1144:157;-1:-1:-1;;;1144:157:0:o;24514:3429::-;24593:7;24689:33;;:::i;:::-;24746:16;:23;24735:34;;24803:14;;24780:20;;;:37;24833:20;24830:876;;24913:1;24891:19;;;:23;;;24869:19;;;:45;;;24954:12;24931:20;;;:35;25004:20;;;:24;;;24981:20;;;:47;;;25064:18;;;:22;;;25043:18;;;:43;;;25126:22;;;:26;;;25101:22;;;:51;;;25199:29;;;:33;;;25167:29;;;:65;24830:876;;;25309:11;;25287:19;;;:33;;;25265:19;;;:55;25358:12;25335:20;;;:35;25408:20;;;:38;;;25385:20;;;:61;;;25505:10;;25484:18;;;:31;;;25463:18;;;:52;25580:14;;25555:22;;;:39;;;25530:22;;;:64;25673:21;;25641:29;;;:53;;;25609:29;;;:85;24830:876;25732:19;;;;25718:1509;25755:8;;25753:10;;25718:1509;;;25785:32;;:::i;:::-;25820:16;25837:1;25820:19;;;;;;;;;;;;;;;;;;25785:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26026:5;:17;;;26003:4;:20;;;:40;:85;;;;-1:-1:-1;26068:20:0;;;;26047:17;;:41;;26003:85;26000:1216;;;26133:1;26131:3;;26109:19;;;:25;26254:17;;26273:20;;;;26246:48;;26254:17;26246:7;:48::i;:::-;26225:18;;;:69;;;26418:18;;;;26459:20;;;;26502:22;;;;26547:29;;;;26377:241;;:18;:241::i;:::-;26334:22;;;26313:305;;;26314:18;;;26313:305;;;;26746:17;;26723:20;;;:40;26807:20;;;;26782:45;;-1:-1:-1;26878:27:0;;;26846:29;;;:59;26000:1216;;;27195:5;;;26000:1216;-1:-1:-1;25765:3:0;;25718:1509;;;;27425:4;:20;;;27402:4;:20;;;:43;27399:501;;;27483:51;27491:4;:20;;;27513:4;:20;;;27483:7;:51::i;:::-;27462:18;;;:72;;;27572:20;;;;27549;;;:43;27704:18;;;;27741:20;;;;27780:22;;;;27821:29;;;;27667:221;;:18;:221::i;:::-;27628:22;;;27607:281;27608:18;;;27607:281;27399:501;27917:18;;;;24514:3429;-1:-1:-1;;24514:3429:0:o;555:182::-;617:7;649:5;;;673:6;;;;665:45;;;;;-1:-1:-1;;;665:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;911:227;973:7;996:6;993:23;;-1:-1:-1;1013:1:0;1006:8;;993:23;1038:5;;;1042:1;1038;:5;:1;1064:3;;;;;1063:10;1054:57;;;;-1:-1:-1;;;1054:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19214:473;19306:7;19553:5;;19549:130;;19580:62;19588:50;19597:12;19605:1;19607;19597:7;:12::i;:::-;19611:25;19620:12;19628:1;19630;19620:7;:12::i;:::-;19634:1;19611:7;:25::i;19588:50::-;19640:1;19580:7;:62::i;:::-;19573:69;;;;19549:130;-1:-1:-1;19678:1:0;19671:8;;295:124;356:7;383:28;392:15;400:1;279:7;392;:15::i;:::-;409:1;383:7;:28::i;19695:169::-;19793:7;19820:36;19828:6;19836:19;19844:3;19849:5;19836:7;:19::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://21babed0a4f44fde9e273c13ec79dba290a3e3c1b22383ae6858613919fe0b40
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.