Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 25 from a total of 389 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Accept Ownership | 21577446 | 413 days ago | IN | 0 ETH | 0.00016963 | ||||
| Withdraw | 19404952 | 717 days ago | IN | 0 ETH | 0.00458208 | ||||
| Reward Claim | 19362671 | 723 days ago | IN | 0 ETH | 0.00660822 | ||||
| Withdraw | 19362668 | 723 days ago | IN | 0 ETH | 0.01040788 | ||||
| Withdraw | 19131467 | 755 days ago | IN | 0 ETH | 0.00128803 | ||||
| Reward Claim | 19131463 | 755 days ago | IN | 0 ETH | 0.00163594 | ||||
| Withdraw | 18080577 | 903 days ago | IN | 0 ETH | 0.00099492 | ||||
| Reward Claim | 17605966 | 969 days ago | IN | 0 ETH | 0.00073948 | ||||
| Reward Claim To | 17605955 | 969 days ago | IN | 0 ETH | 0.00079513 | ||||
| Withdraw | 17500130 | 984 days ago | IN | 0 ETH | 0.0013836 | ||||
| Reward Claim | 17500113 | 984 days ago | IN | 0 ETH | 0.00121815 | ||||
| Withdraw | 16904548 | 1068 days ago | IN | 0 ETH | 0.00182235 | ||||
| Reward Claim | 16774842 | 1086 days ago | IN | 0 ETH | 0.00168528 | ||||
| Withdraw | 16771433 | 1087 days ago | IN | 0 ETH | 0.0031035 | ||||
| Reward Claim | 16771425 | 1087 days ago | IN | 0 ETH | 0.0029647 | ||||
| Withdraw | 16482009 | 1127 days ago | IN | 0 ETH | 0.00139641 | ||||
| Deposit | 16473144 | 1128 days ago | IN | 0 ETH | 0.00171693 | ||||
| Withdraw | 16470287 | 1129 days ago | IN | 0 ETH | 0.00394761 | ||||
| Reward Claim | 16460435 | 1130 days ago | IN | 0 ETH | 0.00118498 | ||||
| Reward Claim | 16455955 | 1131 days ago | IN | 0 ETH | 0.00155237 | ||||
| Withdraw | 16388406 | 1140 days ago | IN | 0 ETH | 0.00152459 | ||||
| Reward Claim | 16152001 | 1173 days ago | IN | 0 ETH | 0.0012123 | ||||
| Reward Claim | 16132949 | 1176 days ago | IN | 0 ETH | 0.0009497 | ||||
| Withdraw | 16132946 | 1176 days ago | IN | 0 ETH | 0.00162766 | ||||
| Withdraw | 16109628 | 1179 days ago | IN | 0 ETH | 0.0010753 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BFCETHSushiSwapReward
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
Contract ABI
API[{"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
60806040523480156200001157600080fd5b5060405162002f3438038062002f34833981810160405260608110156200003757600080fd5b5080516020820151604090920151600080546001600160a01b031990811673359903041de93c69828f911aeb0be29cc9ccc58b1790915560078054821673281df7fc89294c84afa2a21ffee8f6807f9c922617905560088054909116732791bfd60d232150bff86b39b7146c0eaaa2ba8117905543600555909190620000bf838383620000da565b5050600180546001600160a01b0319163317905550620001fe565b620000e4620001dd565b60405180606001604052808581526020018481526020018381525090507f1fdf2820867a17742112aebea1dc9d50d73c902c1e5e2ac7f03b0b11e697adb384848460405180848152602001838152602001828152602001935050505060405180910390a1600b805460018101825560009190915281517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960039092029182015560208201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8201556040909101517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90910155505050565b60405180606001604052806000815260200160008152602001600081525090565b612d26806200020e6000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c80635e5c06e211610146578063b8b1bf99116100c3578063e04bfd8111610087578063e04bfd811461064d578063e30c397814610655578063f4bb1b211461065d578063f71a16131461067a578063ff50abdc14610699578063ffaad6a5146106a157610253565b8063b8b1bf99146105f2578063ca6702cc146105fa578063cabac91c14610602578063d3a417a21461061f578063d48ab3081461064557610253565b806379ba50971161010a57806379ba5097146105a05780638ae39cac146105a85780638da5cb5b146105b05780639091038a146105b8578063b6b55f25146105d557610253565b80635e5c06e2146104f85780635e615a6b1461051e5780636409f9211461054c57806369cddfe514610554578063744f31d71461057d57610253565b80633237a68e116101d45780634959e729116101985780634959e7291461047d5780634f7f399b14610485578063534caae5146104a257806359f2ea07146104aa5780635c388ca6146104dc57610253565b80633237a68e146103fe578063327bc7b11461042457806334a551911461042c578063368990421461045257806336f2fa681461045a57610253565b80631959a0021161021b5780631959a0021461033d5780631eb804db1461038157806323c6a5021461039e5780632e1a7d4d146103c25780633011113a146103df57610253565b8063046a360e1461025857806309ce91ad1461028d5780630e8f7f31146102b557806310dc7f471461031257806315d0c28414610335575b600080fd5b61027b6004803603604081101561026e57600080fd5b50803590602001356106cd565b60408051918252519081900360200190f35b6102b3600480360360208110156102a357600080fd5b50356001600160a01b03166106e4565b005b6102e7600480360360608110156102cb57600080fd5b506001600160a01b03813516906020810135906040013561074f565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102b36004803603604081101561032857600080fd5b5080359060200135610818565b61027b610878565b6103636004803603602081101561035357600080fd5b50356001600160a01b031661087e565b60408051938452602084019290925282820152519081900360600190f35b6102b36004803603602081101561039757600080fd5b50356108e7565b6103a661097d565b604080516001600160a01b039092168252519081900360200190f35b6102b3600480360360208110156103d857600080fd5b503561098c565b6102b3600480360360208110156103f557600080fd5b503515156109f8565b6102b36004803603602081101561041457600080fd5b50356001600160a01b0316610a4a565b61027b610ab1565b6102b36004803603602081101561044257600080fd5b50356001600160a01b0316610ab7565b61027b610b22565b6102b36004803603604081101561047057600080fd5b5080359060200135610b28565b6102e7610b7b565b6102b36004803603602081101561049b57600080fd5b5035610b91565b61027b610e0d565b61027b600480360360608110156104c057600080fd5b506001600160a01b038135169060208101359060400135610e13565b6104e4610e2a565b604080519115158252519081900360200190f35b6103636004803603602081101561050e57600080fd5b50356001600160a01b0316610e3a565b610526610e5b565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102b3610e6d565b6102b36004803603606081101561056a57600080fd5b5080359060208101359060400135610ecc565b6105266004803603604081101561059357600080fd5b5080359060200135610fcf565b6102b3611052565b61027b6110bc565b6103a66110c2565b6102b3600480360360208110156105ce57600080fd5b50356110d1565b6102b3600480360360208110156105eb57600080fd5b503561132b565b6104e461133f565b61027b61134f565b6103636004803603602081101561061857600080fd5b5035611355565b6102b36004803603602081101561063557600080fd5b50356001600160a01b0316611385565b6103636113d7565b6103a66113f8565b6103a6611407565b6103636004803603602081101561067357600080fd5b5035611416565b6102b36004803603602081101561069057600080fd5b50351515611477565b61027b6114c9565b6102b3600480360360408110156106b757600080fd5b506001600160a01b0381351690602001356114cf565b60006106db600084846114e2565b90505b92915050565b6000546001600160a01b0316331461072d5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600061075f612b2f565b506001600160a01b0388166000908152600960209081526040918290208251606081018452815480825260018301549382019390935260029182015493810193909352549096506107d157600b6000815481106107b857fe5b90600052602060002090600302016000015494506107f4565b600b6000815481106107df57fe5b90600052602060002090600302016000015494505b6107fd8961175c565b925061080a8989896114e2565b915050939792965093509350565b6000546001600160a01b031633146108615760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b610869611839565b506108748282611ad3565b5050565b60045481565b600080600061088b612b2f565b506001600160a01b03841660009081526009602090815260408083208151606081018352815481526001820154938101939093526002015490820152906108d18661175c565b8251602090930151929792965094509092505050565b6000546001600160a01b031633146109305760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600a548110156109715760405162461bcd60e51b8152600401808060200182810382526025815260200180612c776025913960400191505060405180910390fd5b61097a81611b19565b50565b6008546001600160a01b031681565b600154600160a81b900460ff16156109e4576040805162461bcd60e51b8152602060048201526016602482015275195c9c9bdc8e881dda5d1a191c985dc8131bd8dad95960521b604482015290519081900360640190fd5b336109ee81611ca8565b6108748183611d7d565b6000546001600160a01b03163314610a415760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a81611f7b565b600154600160a01b900460ff1615610a9f576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b610aa881611ca8565b61097a81611fce565b600a5481565b6000546001600160a01b03163314610b005760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60055481565b6000546001600160a01b03163314610b715760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b6108748282611ad3565b6002546003546004546005546006549091929394565b6000546001600160a01b03163314610bda5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b8015610cad57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b158015610c3d57600080fd5b505af1158015610c51573d6000803e3d6000fd5b505050506040513d6020811015610c6757600080fd5b5051610ca8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b610deb565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b158015610d0557600080fd5b505afa158015610d19573d6000803e3d6000fd5b505050506040513d6020811015610d2f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610d8057600080fd5b505af1158015610d94573d6000803e3d6000fd5b505050506040513d6020811015610daa57600080fd5b5051610deb576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b6000600681905560028190556003819055600481905561097a90600b90612b50565b60035481565b6000610e208484846114e2565b90505b9392505050565b600154600160a81b900460ff1681565b60096020526000908152604090208054600182015460029092015490919083565b60025460045460055460065490919293565b600154600160a01b900460ff1615610ec2576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b33610aa881611ca8565b6000546001600160a01b03163314610f155760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b438311610f535760405162461bcd60e51b8152600401808060200182810382526029815260200180612c076029913960400191505060405180910390fd5b600b541580610f845750600b80546000198101908110610f6f57fe5b90600052602060002090600302016000015483115b610fbf5760405162461bcd60e51b8152600401808060200182810382526029815260200180612c9c6029913960400191505060405180910390fd5b610fca838383612139565b505050565b6000806000806002546000141561100757600b600081548110610fee57fe5b906000526020600020906003020160000154935061102a565b600b60008154811061101557fe5b90600052602060002090600302016000015493505b611034600061175c565b92506006549150611047600087876114e2565b905092959194509250565b60015433906001600160a01b031681146110b3576040805162461bcd60e51b815260206004820152601a60248201527f6d73672e73656e64657220213d2070656e64696e674f776e6572000000000000604482015290519081900360640190fd5b61097a8161223a565b60025481565b6000546001600160a01b031681565b6000546001600160a01b0316331461111a5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b80156111ed57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b505050506040513d60208110156111a757600080fd5b50516111e8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b61097a565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b15801561124557600080fd5b505afa158015611259573d6000803e3d6000fd5b505050506040513d602081101561126f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b1580156112c057600080fd5b505af11580156112d4573d6000803e3d6000fd5b505050506040513d60208110156112ea57600080fd5b505161097a576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b3361133581611ca8565b61087481836122f4565b600154600160a01b900460ff1681565b600b5490565b600b818154811061136257fe5b600091825260209091206003909102018054600182015460029092015490925083565b6000546001600160a01b031633146113ce5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a8161242f565b6000806000806113e56124ac565b6002546003549095509350915050909192565b6007546001600160a01b031681565b6001546001600160a01b031681565b6000806000611423612b2f565b600b858154811061143057fe5b600091825260209182902060408051606081018252600393909302909101805480845260018201549484018590526002909101549290910182905297919650945092505050565b6000546001600160a01b031633146114c05760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a816124bd565b60065481565b6114d882611ca8565b61087482826122f4565b60006114ec612b71565b600b54815260065460e082015260a0810184905260c0810184905261151084612510565b6101808401819052610140840182905260408401839052606084018390526101608401919091526101a083015260808201849052600061010083018190526101208301525b815181101561164c57611566612b2f565b600b828154811061157357fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c001511080156115c857506080830151815111155b1561163d57600182016060840152805160c08401516115e79190612661565b6020840181905261012084015160e08501516101608601516101a087015161160e946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152611643565b5061164c565b50600101611555565b508060c00151816080015111156116ad5761166f81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516116a0946126be565b6101608301526101208201525b6116b5612b2f565b6001600160a01b0386161561170957506001600160a01b038516600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915261172d565b60405180606001604052808360e00151815260200160008152602001600081525090505b6117526117438260000151846101200151612759565b61174d8688612661565b612772565b9695505050505050565b6000611766612b2f565b60006001600160a01b038416156117d95760096000856001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505091506117d26005546127d9565b9050611807565b60405180606001604052806006548152602001600081526020016000815250915061180460006127d9565b90505b6000611817828460200151612661565b90506000611829846000015183612759565b9050611752846040015182612a0c565b6000611843612b71565b600b54815260065460e0820152600a54604082018190526060820181905243608083015260055460a0830181905260c08301526004546101008301819052610120830152600254610140830181905261016083015260035461018083018190526101a08301525b81518110156119e7576118bb612b2f565b600b82815481106118c857fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561191d57506080830151815111155b156119d857600182016060840152805160c084015161193c9190612661565b6020840181905261012084015160e08501516101608601516101a0870151611963946126be565b6101608501908152610120850191909152815160c085015260208083018051909252604083810180516101a088015284519351905182519485529284015282810191909152517fc2d5f9e666d2dd7e740ece9acaf1b93ce48894cbc0336d693410badb7c40aead9181900360600190a16119de565b506119e7565b506001016118aa565b5080608001518160c001511015611a4857611a0a81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a0850151611a3b946126be565b6101608301526101208201525b8060c001518160a0015114611a605760c08101516005555b8060600151816040015114611a78576060810151600a555b80610120015181610100015114611a93576101208101516004555b80610160015181610140015114611aae576101608101516002555b806101a0015181610180015114611ac9576101a08101516003555b6101200151905090565b604080518381526020810183905281517fbfc739097487a2d01d113d21aef3ef3d22331f56d3273bc4907d61407e5b0856929181900390910190a1600291909155600355565b600b548015801590611b2a57508082105b611b655760405162461bcd60e51b8152600401808060200182810382526026815260200180612c306026913960400191505060405180910390fd5b611b6d612b2f565b600b8381548110611b7a57fe5b6000918252602091829020604080516060808201835260039094029092018054808452600182015484870181905260029092015484840181905283518a81529687019190915285830191909152928401929092526000198501608084015290519092507f543ba8eaac0e28f58eb335897e63175861579bc16306e05ab5936084c1f074919181900360a00190a1825b60018303811015611c7257600b8160010181548110611c2457fe5b9060005260206000209060030201600b8281548110611c3f57fe5b60009182526020909120825460039092020190815560018083015481830155600292830154929091019190915501611c09565b50600b805480611c7e57fe5b60008281526020812060036000199093019283020181815560018101829055600201559055505050565b611cb0612b2f565b506001600160a01b0381166000908152600960209081526040808320815160608101835281548152600182015493810193909352600201549082015290611cf5611839565b90506000611d07828460200151612661565b90506000611d19846000015183612759565b905082846020015114611d45576001600160a01b03851660009081526009602052604090206001018390555b8015611d7657611d59846040015182612a0c565b6001600160a01b0386166000908152600960205260409020600201555b5050505050565b611d85612b2f565b506001600160a01b038216600090815260096020908152604091829020825160608101845281548082526001830154938201939093526002909101549281019290925260065490831115611e20576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f7567682075736572204465706f736974000000000000000000604482015290519081900360640190fd5b8151611e2c9084612661565b8083526001600160a01b038516600090815260096020526040902055600654611e559084612661565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca949181900360800190a16007546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611f0a57600080fd5b505af1158015611f1e573d6000803e3d6000fd5b505050506040513d6020811015611f3457600080fd5b5051611f75576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b50505050565b60408051821515815290517f24e8043bbab505bf23b3d9b569ad2dc34a6a563516daca26e3ad818b40c14f659181900360200190a160018054911515600160a81b0260ff60a81b19909216919091179055565b611fd6612b2f565b506001600160a01b038116600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181018290529015610874576040808201516001600160a01b0384166000818152600960209081528482206002019190915583519182528101829052825191927f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d492918290030190a16008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156120ce57600080fd5b505af11580156120e2573d6000803e3d6000fd5b505050506040513d60208110156120f857600080fd5b5051610fca576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b612141612b2f565b60405180606001604052808581526020018481526020018381525090507f1fdf2820867a17742112aebea1dc9d50d73c902c1e5e2ac7f03b0b11e697adb384848460405180848152602001838152602001828152602001935050505060405180910390a1600b805460018101825560009190915281517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960039092029182015560208201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8201556040909101517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90910155505050565b6001600160a01b03811661228a576040805162461bcd60e51b81526020600482015260126024820152716f776e6572207a65726f206164647265737360701b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6122fc612b2f565b506001600160a01b03821660009081526009602090815260409182902082516060810184528154808252600183015493820193909352600290910154928101929092526006549061234d9084612a0c565b8083526001600160a01b0385166000908152600960205260409020556006546123769084612a0c565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e9181900360800190a1600754604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611f0a57600080fd5b6001600160a01b03811661248a576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e67206f776e6572207a65726f2061646472657373000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006124b8600061175c565b905090565b60408051821515815290517f4d23c25ea752bd74a0dfa4a88c011a2c7bf8713a06a6b1028feb1fd277746c4f9181900360200190a160018054911515600160a01b0260ff60a01b19909216919091179055565b600b5460009081908190819081908190819080156125d157600092505b808310156125d15761253d612b2f565b600b848154811061254a57fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518a101580156125975750805115155b156125b25783925080602001519550806040015194506125c4565b80516125be57506125c6565b506125d1565b505b60019092019161252d565b6125d9612b2f565b600b83815481106125e657fe5b600091825260209182902060408051606081018252600390930290910180548084526001820154948401859052600290910154918301829052929850965091508a11156126505761264d86612648876126438e8660000151612661565b612a66565b612661565b95505b509198939750919550919350505050565b6000818310156126b8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808084156126e8576126d28686612772565b9050808411156126e4578093506126e8565b5060005b6000871561272d5761271e6126fe888789612abf565b612719612713670de0b6b3a76400008c612b02565b88612a66565b612759565b905061272a8982612a0c565b98505b811561273c576000965061274a565b612747878787612b1f565b96505b50969794965093945050505050565b60006106db6127688484612a66565b670de0b6b3a76400005b60008082116127c8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816127d157fe5b049392505050565b60006127e3612b71565b600b54815260065460e08201528261284c576000604082018190526060820181905243608083015260a0820181905260c08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a08201526128a3565b600a5460408201819052606082015243608082015260a0810183905260c081018390526004546101008201819052610120820152600254610140820181905261016082015260035461018082018190526101a08201525b60408101515b81518110156129a0576128ba612b2f565b600b82815481106128c757fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561291c57506080830151815111155b1561299157600182016060840152805160c084015161293b9190612661565b6020840181905261012084015160e08501516101608601516101a0870151612962946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152612997565b506129a0565b506001016128a9565b508060c0015181608001511115612a01576129c381608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516129f4946126be565b6101608301526101208201525b610120015192915050565b6000828201838110156106db576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a2061646474696f6e206f766572666c6f77000000000000604482015290519081900360640190fd5b600082612a75575060006106de565b82820282848281612a8257fe5b04146106db5760405162461bcd60e51b8152600401808060200182810382526021815260200180612c566021913960400191505060405180910390fd5b60008215612afa57612af3612aec612ad8600287612a66565b612648612ae6876001612661565b86612a66565b6002612772565b9050610e23565b506000610e23565b60006106db612b1984670de0b6b3a7640000612a66565b83612772565b6000610e20846126488585612a66565b60405180606001604052806000815260200160008152602001600081525090565b508054600082556003029060005260206000209081019061097a9190612be0565b604051806101c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115612c02576000808255600182018190556002820155600301612be1565b509056fe6e65772052657761726420706172616d732073686f756c64207265676973746572206561726c6965726572726f723a206e6f20656c656d656e747320696e2072656769737465726564506f696e7473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775265776172642076656c6f6369747920706f696e7420616c7265616479207061737365642e456172696c6965722076656c6f6369747920706f696e74732061726520616c7265616479207365742e6f6e6c794f776e65723a2065787465726e616c2066756e6374696f6e2061636365737320636f6e74726f6c21a2646970667358221220c2b32496faa8464174a0d689ba91471dadd9a72f3911c93918c971809b2949a264736f6c634300060c00330000000000000000000000000000000000000000000000000000000000c860a5000000000000000000000000000000000000000000000000c01b14f09ade25600000000000000000000000000000000000000000000000000000018ba6fb966b
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102535760003560e01c80635e5c06e211610146578063b8b1bf99116100c3578063e04bfd8111610087578063e04bfd811461064d578063e30c397814610655578063f4bb1b211461065d578063f71a16131461067a578063ff50abdc14610699578063ffaad6a5146106a157610253565b8063b8b1bf99146105f2578063ca6702cc146105fa578063cabac91c14610602578063d3a417a21461061f578063d48ab3081461064557610253565b806379ba50971161010a57806379ba5097146105a05780638ae39cac146105a85780638da5cb5b146105b05780639091038a146105b8578063b6b55f25146105d557610253565b80635e5c06e2146104f85780635e615a6b1461051e5780636409f9211461054c57806369cddfe514610554578063744f31d71461057d57610253565b80633237a68e116101d45780634959e729116101985780634959e7291461047d5780634f7f399b14610485578063534caae5146104a257806359f2ea07146104aa5780635c388ca6146104dc57610253565b80633237a68e146103fe578063327bc7b11461042457806334a551911461042c578063368990421461045257806336f2fa681461045a57610253565b80631959a0021161021b5780631959a0021461033d5780631eb804db1461038157806323c6a5021461039e5780632e1a7d4d146103c25780633011113a146103df57610253565b8063046a360e1461025857806309ce91ad1461028d5780630e8f7f31146102b557806310dc7f471461031257806315d0c28414610335575b600080fd5b61027b6004803603604081101561026e57600080fd5b50803590602001356106cd565b60408051918252519081900360200190f35b6102b3600480360360208110156102a357600080fd5b50356001600160a01b03166106e4565b005b6102e7600480360360608110156102cb57600080fd5b506001600160a01b03813516906020810135906040013561074f565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102b36004803603604081101561032857600080fd5b5080359060200135610818565b61027b610878565b6103636004803603602081101561035357600080fd5b50356001600160a01b031661087e565b60408051938452602084019290925282820152519081900360600190f35b6102b36004803603602081101561039757600080fd5b50356108e7565b6103a661097d565b604080516001600160a01b039092168252519081900360200190f35b6102b3600480360360208110156103d857600080fd5b503561098c565b6102b3600480360360208110156103f557600080fd5b503515156109f8565b6102b36004803603602081101561041457600080fd5b50356001600160a01b0316610a4a565b61027b610ab1565b6102b36004803603602081101561044257600080fd5b50356001600160a01b0316610ab7565b61027b610b22565b6102b36004803603604081101561047057600080fd5b5080359060200135610b28565b6102e7610b7b565b6102b36004803603602081101561049b57600080fd5b5035610b91565b61027b610e0d565b61027b600480360360608110156104c057600080fd5b506001600160a01b038135169060208101359060400135610e13565b6104e4610e2a565b604080519115158252519081900360200190f35b6103636004803603602081101561050e57600080fd5b50356001600160a01b0316610e3a565b610526610e5b565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102b3610e6d565b6102b36004803603606081101561056a57600080fd5b5080359060208101359060400135610ecc565b6105266004803603604081101561059357600080fd5b5080359060200135610fcf565b6102b3611052565b61027b6110bc565b6103a66110c2565b6102b3600480360360208110156105ce57600080fd5b50356110d1565b6102b3600480360360208110156105eb57600080fd5b503561132b565b6104e461133f565b61027b61134f565b6103636004803603602081101561061857600080fd5b5035611355565b6102b36004803603602081101561063557600080fd5b50356001600160a01b0316611385565b6103636113d7565b6103a66113f8565b6103a6611407565b6103636004803603602081101561067357600080fd5b5035611416565b6102b36004803603602081101561069057600080fd5b50351515611477565b61027b6114c9565b6102b3600480360360408110156106b757600080fd5b506001600160a01b0381351690602001356114cf565b60006106db600084846114e2565b90505b92915050565b6000546001600160a01b0316331461072d5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600061075f612b2f565b506001600160a01b0388166000908152600960209081526040918290208251606081018452815480825260018301549382019390935260029182015493810193909352549096506107d157600b6000815481106107b857fe5b90600052602060002090600302016000015494506107f4565b600b6000815481106107df57fe5b90600052602060002090600302016000015494505b6107fd8961175c565b925061080a8989896114e2565b915050939792965093509350565b6000546001600160a01b031633146108615760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b610869611839565b506108748282611ad3565b5050565b60045481565b600080600061088b612b2f565b506001600160a01b03841660009081526009602090815260408083208151606081018352815481526001820154938101939093526002015490820152906108d18661175c565b8251602090930151929792965094509092505050565b6000546001600160a01b031633146109305760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600a548110156109715760405162461bcd60e51b8152600401808060200182810382526025815260200180612c776025913960400191505060405180910390fd5b61097a81611b19565b50565b6008546001600160a01b031681565b600154600160a81b900460ff16156109e4576040805162461bcd60e51b8152602060048201526016602482015275195c9c9bdc8e881dda5d1a191c985dc8131bd8dad95960521b604482015290519081900360640190fd5b336109ee81611ca8565b6108748183611d7d565b6000546001600160a01b03163314610a415760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a81611f7b565b600154600160a01b900460ff1615610a9f576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b610aa881611ca8565b61097a81611fce565b600a5481565b6000546001600160a01b03163314610b005760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60055481565b6000546001600160a01b03163314610b715760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b6108748282611ad3565b6002546003546004546005546006549091929394565b6000546001600160a01b03163314610bda5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b8015610cad57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b158015610c3d57600080fd5b505af1158015610c51573d6000803e3d6000fd5b505050506040513d6020811015610c6757600080fd5b5051610ca8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b610deb565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b158015610d0557600080fd5b505afa158015610d19573d6000803e3d6000fd5b505050506040513d6020811015610d2f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610d8057600080fd5b505af1158015610d94573d6000803e3d6000fd5b505050506040513d6020811015610daa57600080fd5b5051610deb576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b6000600681905560028190556003819055600481905561097a90600b90612b50565b60035481565b6000610e208484846114e2565b90505b9392505050565b600154600160a81b900460ff1681565b60096020526000908152604090208054600182015460029092015490919083565b60025460045460055460065490919293565b600154600160a01b900460ff1615610ec2576040805162461bcd60e51b8152602060048201526013602482015272195c9c9bdc8e8818db185a5b48131bd8dad959606a1b604482015290519081900360640190fd5b33610aa881611ca8565b6000546001600160a01b03163314610f155760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b438311610f535760405162461bcd60e51b8152600401808060200182810382526029815260200180612c076029913960400191505060405180910390fd5b600b541580610f845750600b80546000198101908110610f6f57fe5b90600052602060002090600302016000015483115b610fbf5760405162461bcd60e51b8152600401808060200182810382526029815260200180612c9c6029913960400191505060405180910390fd5b610fca838383612139565b505050565b6000806000806002546000141561100757600b600081548110610fee57fe5b906000526020600020906003020160000154935061102a565b600b60008154811061101557fe5b90600052602060002090600302016000015493505b611034600061175c565b92506006549150611047600087876114e2565b905092959194509250565b60015433906001600160a01b031681146110b3576040805162461bcd60e51b815260206004820152601a60248201527f6d73672e73656e64657220213d2070656e64696e674f776e6572000000000000604482015290519081900360640190fd5b61097a8161223a565b60025481565b6000546001600160a01b031681565b6000546001600160a01b0316331461111a5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b80156111ed57600854600080546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919093169263a9059cbb9260448083019360209390929083900390910190829087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b505050506040513d60208110156111a757600080fd5b50516111e8576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b61097a565b600854600054604080516370a0823160e01b815230600482015290516001600160a01b039384169363a9059cbb93169184916370a0823191602480820192602092909190829003018186803b15801561124557600080fd5b505afa158015611259573d6000803e3d6000fd5b505050506040513d602081101561126f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b1580156112c057600080fd5b505af11580156112d4573d6000803e3d6000fd5b505050506040513d60208110156112ea57600080fd5b505161097a576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b3361133581611ca8565b61087481836122f4565b600154600160a01b900460ff1681565b600b5490565b600b818154811061136257fe5b600091825260209091206003909102018054600182015460029092015490925083565b6000546001600160a01b031633146113ce5760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a8161242f565b6000806000806113e56124ac565b6002546003549095509350915050909192565b6007546001600160a01b031681565b6001546001600160a01b031681565b6000806000611423612b2f565b600b858154811061143057fe5b600091825260209182902060408051606081018252600393909302909101805480845260018201549484018590526002909101549290910182905297919650945092505050565b6000546001600160a01b031633146114c05760405162461bcd60e51b815260040180806020018281038252602c815260200180612cc5602c913960400191505060405180910390fd5b61097a816124bd565b60065481565b6114d882611ca8565b61087482826122f4565b60006114ec612b71565b600b54815260065460e082015260a0810184905260c0810184905261151084612510565b6101808401819052610140840182905260408401839052606084018390526101608401919091526101a083015260808201849052600061010083018190526101208301525b815181101561164c57611566612b2f565b600b828154811061157357fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c001511080156115c857506080830151815111155b1561163d57600182016060840152805160c08401516115e79190612661565b6020840181905261012084015160e08501516101608601516101a087015161160e946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152611643565b5061164c565b50600101611555565b508060c00151816080015111156116ad5761166f81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516116a0946126be565b6101608301526101208201525b6116b5612b2f565b6001600160a01b0386161561170957506001600160a01b038516600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915261172d565b60405180606001604052808360e00151815260200160008152602001600081525090505b6117526117438260000151846101200151612759565b61174d8688612661565b612772565b9695505050505050565b6000611766612b2f565b60006001600160a01b038416156117d95760096000856001600160a01b03166001600160a01b03168152602001908152602001600020604051806060016040529081600082015481526020016001820154815260200160028201548152505091506117d26005546127d9565b9050611807565b60405180606001604052806006548152602001600081526020016000815250915061180460006127d9565b90505b6000611817828460200151612661565b90506000611829846000015183612759565b9050611752846040015182612a0c565b6000611843612b71565b600b54815260065460e0820152600a54604082018190526060820181905243608083015260055460a0830181905260c08301526004546101008301819052610120830152600254610140830181905261016083015260035461018083018190526101a08301525b81518110156119e7576118bb612b2f565b600b82815481106118c857fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561191d57506080830151815111155b156119d857600182016060840152805160c084015161193c9190612661565b6020840181905261012084015160e08501516101608601516101a0870151611963946126be565b6101608501908152610120850191909152815160c085015260208083018051909252604083810180516101a088015284519351905182519485529284015282810191909152517fc2d5f9e666d2dd7e740ece9acaf1b93ce48894cbc0336d693410badb7c40aead9181900360600190a16119de565b506119e7565b506001016118aa565b5080608001518160c001511015611a4857611a0a81608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a0850151611a3b946126be565b6101608301526101208201525b8060c001518160a0015114611a605760c08101516005555b8060600151816040015114611a78576060810151600a555b80610120015181610100015114611a93576101208101516004555b80610160015181610140015114611aae576101608101516002555b806101a0015181610180015114611ac9576101a08101516003555b6101200151905090565b604080518381526020810183905281517fbfc739097487a2d01d113d21aef3ef3d22331f56d3273bc4907d61407e5b0856929181900390910190a1600291909155600355565b600b548015801590611b2a57508082105b611b655760405162461bcd60e51b8152600401808060200182810382526026815260200180612c306026913960400191505060405180910390fd5b611b6d612b2f565b600b8381548110611b7a57fe5b6000918252602091829020604080516060808201835260039094029092018054808452600182015484870181905260029092015484840181905283518a81529687019190915285830191909152928401929092526000198501608084015290519092507f543ba8eaac0e28f58eb335897e63175861579bc16306e05ab5936084c1f074919181900360a00190a1825b60018303811015611c7257600b8160010181548110611c2457fe5b9060005260206000209060030201600b8281548110611c3f57fe5b60009182526020909120825460039092020190815560018083015481830155600292830154929091019190915501611c09565b50600b805480611c7e57fe5b60008281526020812060036000199093019283020181815560018101829055600201559055505050565b611cb0612b2f565b506001600160a01b0381166000908152600960209081526040808320815160608101835281548152600182015493810193909352600201549082015290611cf5611839565b90506000611d07828460200151612661565b90506000611d19846000015183612759565b905082846020015114611d45576001600160a01b03851660009081526009602052604090206001018390555b8015611d7657611d59846040015182612a0c565b6001600160a01b0386166000908152600960205260409020600201555b5050505050565b611d85612b2f565b506001600160a01b038216600090815260096020908152604091829020825160608101845281548082526001830154938201939093526002909101549281019290925260065490831115611e20576040805162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f7567682075736572204465706f736974000000000000000000604482015290519081900360640190fd5b8151611e2c9084612661565b8083526001600160a01b038516600090815260096020526040902055600654611e559084612661565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca949181900360800190a16007546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611f0a57600080fd5b505af1158015611f1e573d6000803e3d6000fd5b505050506040513d6020811015611f3457600080fd5b5051611f75576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b50505050565b60408051821515815290517f24e8043bbab505bf23b3d9b569ad2dc34a6a563516daca26e3ad818b40c14f659181900360200190a160018054911515600160a81b0260ff60a81b19909216919091179055565b611fd6612b2f565b506001600160a01b038116600090815260096020908152604091829020825160608101845281548152600182015492810192909252600201549181018290529015610874576040808201516001600160a01b0384166000818152600960209081528482206002019190915583519182528101829052825191927f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d492918290030190a16008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156120ce57600080fd5b505af11580156120e2573d6000803e3d6000fd5b505050506040513d60208110156120f857600080fd5b5051610fca576040805162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b604482015290519081900360640190fd5b612141612b2f565b60405180606001604052808581526020018481526020018381525090507f1fdf2820867a17742112aebea1dc9d50d73c902c1e5e2ac7f03b0b11e697adb384848460405180848152602001838152602001828152602001935050505060405180910390a1600b805460018101825560009190915281517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db960039092029182015560208201517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba8201556040909101517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dbb90910155505050565b6001600160a01b03811661228a576040805162461bcd60e51b81526020600482015260126024820152716f776e6572207a65726f206164647265737360701b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f22500af037c600dd7b720644ab6e358635085601d9ac508ad83eb2d6b2d729ca9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6122fc612b2f565b506001600160a01b03821660009081526009602090815260409182902082516060810184528154808252600183015493820193909352600290910154928101929092526006549061234d9084612a0c565b8083526001600160a01b0385166000908152600960205260409020556006546123769084612a0c565b600681905590508215611f75578151604080516001600160a01b0387168152602081018690528082019290925260608201839052517f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e9181900360800190a1600754604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611f0a57600080fd5b6001600160a01b03811661248a576040805162461bcd60e51b815260206004820152601a60248201527f70656e64696e67206f776e6572207a65726f2061646472657373000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006124b8600061175c565b905090565b60408051821515815290517f4d23c25ea752bd74a0dfa4a88c011a2c7bf8713a06a6b1028feb1fd277746c4f9181900360200190a160018054911515600160a01b0260ff60a01b19909216919091179055565b600b5460009081908190819081908190819080156125d157600092505b808310156125d15761253d612b2f565b600b848154811061254a57fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518a101580156125975750805115155b156125b25783925080602001519550806040015194506125c4565b80516125be57506125c6565b506125d1565b505b60019092019161252d565b6125d9612b2f565b600b83815481106125e657fe5b600091825260209182902060408051606081018252600390930290910180548084526001820154948401859052600290910154918301829052929850965091508a11156126505761264d86612648876126438e8660000151612661565b612a66565b612661565b95505b509198939750919550919350505050565b6000818310156126b8576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000808084156126e8576126d28686612772565b9050808411156126e4578093506126e8565b5060005b6000871561272d5761271e6126fe888789612abf565b612719612713670de0b6b3a76400008c612b02565b88612a66565b612759565b905061272a8982612a0c565b98505b811561273c576000965061274a565b612747878787612b1f565b96505b50969794965093945050505050565b60006106db6127688484612a66565b670de0b6b3a76400005b60008082116127c8576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816127d157fe5b049392505050565b60006127e3612b71565b600b54815260065460e08201528261284c576000604082018190526060820181905243608083015260a0820181905260c08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a08201526128a3565b600a5460408201819052606082015243608082015260a0810183905260c081018390526004546101008201819052610120820152600254610140820181905261016082015260035461018082018190526101a08201525b60408101515b81518110156129a0576128ba612b2f565b600b82815481106128c757fe5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905080600001518360c0015110801561291c57506080830151815111155b1561299157600182016060840152805160c084015161293b9190612661565b6020840181905261012084015160e08501516101608601516101a0870151612962946126be565b6101608501908152610120850191909152815160c08501526020820151905260408101516101a0840152612997565b506129a0565b506001016128a9565b508060c0015181608001511115612a01576129c381608001518260c00151612661565b60208201819052608082015160c083015261012082015160e08301516101608401516101a08501516129f4946126be565b6101608301526101208201525b610120015192915050565b6000828201838110156106db576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a2061646474696f6e206f766572666c6f77000000000000604482015290519081900360640190fd5b600082612a75575060006106de565b82820282848281612a8257fe5b04146106db5760405162461bcd60e51b8152600401808060200182810382526021815260200180612c566021913960400191505060405180910390fd5b60008215612afa57612af3612aec612ad8600287612a66565b612648612ae6876001612661565b86612a66565b6002612772565b9050610e23565b506000610e23565b60006106db612b1984670de0b6b3a7640000612a66565b83612772565b6000610e20846126488585612a66565b60405180606001604052806000815260200160008152602001600081525090565b508054600082556003029060005260206000209081019061097a9190612be0565b604051806101c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b80821115612c02576000808255600182018190556002820155600301612be1565b509056fe6e65772052657761726420706172616d732073686f756c64207265676973746572206561726c6965726572726f723a206e6f20656c656d656e747320696e2072656769737465726564506f696e7473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775265776172642076656c6f6369747920706f696e7420616c7265616479207061737365642e456172696c6965722076656c6f6369747920706f696e74732061726520616c7265616479207365742e6f6e6c794f776e65723a2065787465726e616c2066756e6374696f6e2061636365737320636f6e74726f6c21a2646970667358221220c2b32496faa8464174a0d689ba91471dadd9a72f3911c93918c971809b2949a264736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000c860a5000000000000000000000000000000000000000000000000c01b14f09ade25600000000000000000000000000000000000000000000000000000018ba6fb966b
-----Decoded View---------------
Arg [0] : start (uint256): 13131941
Arg [1] : reward_per_block (uint256): 13842680903276307808
Arg [2] : dec_per_block (uint256): 1699313587819
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000c860a5
Arg [1] : 000000000000000000000000000000000000000000000000c01b14f09ade2560
Arg [2] : 0000000000000000000000000000000000000000000000000000018ba6fb966b
Deployed Bytecode Sourcemap
39991:537: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://c2b32496faa8464174a0d689ba91471dadd9a72f3911c93918c971809b2949a2
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.