Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 29 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Migrate | 16547443 | 644 days ago | IN | 0 ETH | 0.018518 | ||||
Migrate | 16547439 | 644 days ago | IN | 0 ETH | 0.01838016 | ||||
Migrate | 16547438 | 644 days ago | IN | 0 ETH | 0.01854324 | ||||
Migrate | 16547434 | 644 days ago | IN | 0 ETH | 0.01765384 | ||||
Migrate | 16547427 | 644 days ago | IN | 0 ETH | 0.01788569 | ||||
Migrate | 16547425 | 644 days ago | IN | 0 ETH | 0.01762092 | ||||
Migrate | 16547422 | 644 days ago | IN | 0 ETH | 0.02027586 | ||||
Migrate | 16547421 | 644 days ago | IN | 0 ETH | 0.02012126 | ||||
Migrate | 16547418 | 644 days ago | IN | 0 ETH | 0.01846362 | ||||
Migrate | 16547409 | 644 days ago | IN | 0 ETH | 0.01949444 | ||||
Migrate | 16547397 | 644 days ago | IN | 0 ETH | 0.01835194 | ||||
Migrate | 16547371 | 644 days ago | IN | 0 ETH | 0.01971912 | ||||
Migrate | 16547325 | 644 days ago | IN | 0 ETH | 0.02108459 | ||||
Set Migrator | 16547305 | 644 days ago | IN | 0 ETH | 0.00095851 | ||||
Set Unlocks | 12367047 | 1284 days ago | IN | 0 ETH | 0.01228158 | ||||
Add | 12367044 | 1284 days ago | IN | 0 ETH | 0.00792624 | ||||
Add | 12367042 | 1284 days ago | IN | 0 ETH | 0.00792624 | ||||
Add | 12367040 | 1284 days ago | IN | 0 ETH | 0.00792624 | ||||
Add | 12367038 | 1284 days ago | IN | 0 ETH | 0.00792624 | ||||
Add | 12367036 | 1284 days ago | IN | 0 ETH | 0.00792624 | ||||
Add | 12367034 | 1284 days ago | IN | 0 ETH | 0.00792624 | ||||
Add | 12367033 | 1284 days ago | IN | 0 ETH | 0.00792624 | ||||
Add | 12367030 | 1284 days ago | IN | 0 ETH | 0.00792624 | ||||
Add | 12367027 | 1284 days ago | IN | 0 ETH | 0.00792624 | ||||
Add | 12367024 | 1284 days ago | IN | 0 ETH | 0.00792624 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LiquidityMining
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; import "./ILiquidityMining.sol"; import "./IMigrator.sol"; contract LiquidityMining is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user per pool. struct UserPoolInfo { uint256 amount; // How many tokens the user has provided. uint256 accruedReward; // Reward accrued. } // Info of each pool. struct PoolInfo { IERC20 token; // Address of token contract. uint256 accRewardPerShare; // Accumulated reward token per share, times 1e12. See below. uint256 allocPoint; // How many allocation points assigned to this pool. uint256 lastRewardBlock; // Last block number that reward token distribution occurs. } struct UnlockInfo { uint256 block; uint256 quota; } // The reward token token IERC20 public rewardToken; // Reservoir address. address public reservoir; // rewardToken tokens created per block. uint256 public rewardPerBlock; // The migrator contract. It has a lot of power. Can only be set through governance (owner). IMigrator public migrator; // Blocks and quotas of rewards unlocks UnlockInfo[] public unlocks; uint256 public unlocksTotalQuotation; // Accumulated rewards mapping(address => uint256) public rewards; // Claimed rewards mapping(address => uint256) public claimedRewards; // Info of each pool. PoolInfo[] public poolInfo; // Pid of each pool by its address mapping(address => uint256) public poolPidByAddress; // Info of each user that stakes tokens. mapping(uint256 => mapping(address => UserPoolInfo)) public userPoolInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The block number when rewardToken mining starts. uint256 public startBlock; // The block number when rewardToken mining end. uint256 public endBlock; event TokenAdded( address indexed token, uint256 indexed pid, uint256 allocPoint ); event Claimed(address indexed user, uint256 amount); event Deposited(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdrawn( address indexed user, uint256 indexed pid, uint256 amount ); event TokenMigrated( address indexed oldtoken, address indexed newToken, uint256 indexed pid ); event RewardPerBlockSet(uint256 rewardPerBlock); event TokenSet( address indexed token, uint256 indexed pid, uint256 allocPoint ); event MigratorSet(address indexed migrator); event Withdrawn(address indexed user, uint256 indexed pid, uint256 amount); constructor( IERC20 _rewardToken, address _reservoir, uint256 _rewardPerBlock, uint256 _startBlock, uint256 _endBlock ) { rewardToken = _rewardToken; reservoir = _reservoir; rewardPerBlock = _rewardPerBlock; startBlock = _startBlock; endBlock = _endBlock; emit RewardPerBlockSet(_rewardPerBlock); } // Add a new token to the pool. Can only be called by the owner. function add( uint256 _allocPoint, IERC20 _token, bool _withUpdate ) external onlyOwner { require(!isTokenAdded(_token), "add: token already added"); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); uint256 pid = poolInfo.length; poolInfo.push( PoolInfo({ token: _token, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accRewardPerShare: 0 }) ); poolPidByAddress[address(_token)] = pid; emit TokenAdded(address(_token), pid, _allocPoint); } function accrueReward(uint256 _pid) internal { UserPoolInfo memory userPool = userPoolInfo[_pid][msg.sender]; if (userPool.amount == 0) { return; } rewards[msg.sender] = rewards[msg.sender].add( calcReward(poolInfo[_pid], userPool).sub(userPool.accruedReward) ); } function calcReward(PoolInfo memory pool, UserPoolInfo memory userPool) internal returns(uint256){ return userPool.amount.mul(pool.accRewardPerShare).div(1e12); } function getPendingReward(uint256 _pid, address _user) external view returns(uint256 total, uint256 unlocked) { PoolInfo memory pool = poolInfo[_pid]; uint256 currentBlock = block.number; if (currentBlock < startBlock) { return (0, 0); } if (currentBlock > endBlock) { currentBlock = endBlock; } uint256 lpSupply = pool.token.balanceOf(address(this)); if (lpSupply == 0) { return (0, 0); } uint256 blockLasted = currentBlock.sub(pool.lastRewardBlock); uint256 reward = blockLasted.mul(rewardPerBlock).mul(pool.allocPoint).div(totalAllocPoint); uint256 accRewardPerShare = pool.accRewardPerShare.add( reward.mul(1e12).div(lpSupply) ); UserPoolInfo memory userPool = userPoolInfo[_pid][_user]; total = userPool.amount .mul(accRewardPerShare) .div(1e12) .sub(userPool.accruedReward); unlocked = calcUnlocked(total); } function calcUnlocked(uint256 reward) public view returns(uint256 claimable) { uint256 i; for (i = 0; i < unlocks.length; ++i) { if (block.number < unlocks[i].block) { continue; } claimable = claimable.add( reward.mul(unlocks[i].quota) .div(unlocksTotalQuotation) ); } } // claim rewards function claim() external{ uint256 i; for (i = 0; i < poolInfo.length; ++i) { updatePool(i); accrueReward(i); UserPoolInfo storage userPool = userPoolInfo[i][msg.sender]; userPool.accruedReward = calcReward(poolInfo[i], userPool); } uint256 unlocked = calcUnlocked(rewards[msg.sender]).sub(claimedRewards[msg.sender]); if (unlocked > 0) { _safeRewardTransfer(msg.sender, unlocked); } claimedRewards[msg.sender] = claimedRewards[msg.sender].add(unlocked); emit Claimed(msg.sender, unlocked); } // Deposit tokens to liquidity mining for reward token allocation. function deposit(uint256 _pid, uint256 _amount) external { require(block.number <= endBlock, "LP mining has ended."); updatePool(_pid); accrueReward(_pid); UserPoolInfo storage userPool = userPoolInfo[_pid][msg.sender]; if (_amount > 0) { poolInfo[_pid].token.safeTransferFrom( address(msg.sender), address(this), _amount ); userPool.amount = userPool.amount.add(_amount); } userPool.accruedReward = calcReward(poolInfo[_pid], userPoolInfo[_pid][msg.sender]); emit Deposited(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function withdrawEmergency(uint256 _pid) external { PoolInfo storage pool = poolInfo[_pid]; UserPoolInfo storage userPool = userPoolInfo[_pid][msg.sender]; pool.token.safeTransfer(address(msg.sender), userPool.amount); emit EmergencyWithdrawn(msg.sender, _pid, userPool.amount); userPool.amount = 0; userPool.accruedReward = 0; } // Update the given pool's reward token allocation point. Can only be called by the owner. function reallocatePool( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) external onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; emit TokenSet(address(poolInfo[_pid].token), _pid, _allocPoint); } // Set reward per block. Can only be called by the owner. function setRewardPerBlock(uint256 _rewardPerBlock) external onlyOwner { rewardPerBlock = _rewardPerBlock; emit RewardPerBlockSet(_rewardPerBlock); } // Set unlocks infos - block number and quota. function setUnlocks(uint256[] calldata _blocks, uint256[] calldata _quotas) external onlyOwner { require(_blocks.length == _quotas.length, "Should be same length"); for (uint256 i = 0; i < _blocks.length; ++i) { unlocks.push(UnlockInfo(_blocks[i], _quotas[i])); unlocksTotalQuotation = unlocksTotalQuotation.add(_quotas[i]); } } // Withdraw tokens from rewardToken liquidity mining. function withdraw(uint256 _pid, uint256 _amount) external { require(userPoolInfo[_pid][msg.sender].amount >= _amount, "withdraw: not enough amount"); updatePool(_pid); accrueReward(_pid); UserPoolInfo storage userPool = userPoolInfo[_pid][msg.sender]; if (_amount > 0) { userPool.amount = userPool.amount.sub(_amount); poolInfo[_pid].token.safeTransfer(address(msg.sender), _amount); } userPool.accruedReward = calcReward(poolInfo[_pid], userPoolInfo[_pid][msg.sender]); emit Withdrawn(msg.sender, _pid, _amount); } // Number of pools. function poolCount() external view returns (uint256) { return poolInfo.length; } function unlockCount() external view returns (uint256) { return unlocks.length; } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; uint256 currentBlock = block.number; if (currentBlock > endBlock) { currentBlock = endBlock; } if (currentBlock <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.token.balanceOf(address(this)); if (lpSupply == 0) { pool.lastRewardBlock = currentBlock; return; } uint256 blockLasted = currentBlock.sub(pool.lastRewardBlock); uint256 reward = blockLasted.mul(rewardPerBlock).mul(pool.allocPoint).div( totalAllocPoint ); rewardToken.transferFrom(reservoir, address(this), reward); pool.accRewardPerShare = pool.accRewardPerShare.add( reward.mul(1e12).div(lpSupply) ); pool.lastRewardBlock = currentBlock; } // Return bool - is token added or not function isTokenAdded(IERC20 _token) public view returns (bool) { uint256 pid = poolPidByAddress[address(_token)]; return poolInfo.length > pid && address(poolInfo[pid].token) == address(_token); } // Safe rewardToken transfer function. function _safeRewardTransfer(address _to, uint256 _amount) internal { uint256 balance = rewardToken.balanceOf(address(this)); if (_amount > balance) { rewardToken.transfer(_to, balance); } else { rewardToken.transfer(_to, _amount); } } // Set the migrator contract. Can only be called by the owner. function setMigrator(IMigrator _migrator) external onlyOwner { migrator = _migrator; emit MigratorSet(address(_migrator)); } // Migrate token to another lp contract. Can be called by anyone. function migrate(uint256 _pid) external { require(address(migrator) != address(0), "migrate: no migrator"); PoolInfo storage pool = poolInfo[_pid]; IERC20 token = pool.token; uint256 bal = token.balanceOf(address(this)); token.safeApprove(address(migrator), bal); IERC20 newToken = migrator.migrate(token); require(bal == newToken.balanceOf(address(this)), "migrate: bad"); pool.token = newToken; delete poolPidByAddress[address(token)]; poolPidByAddress[address(newToken)] = _pid; emit TokenMigrated(address(token), address(newToken), _pid); } function getAllPools() external view returns (PoolInfo[] memory) { return poolInfo; } function getAllUnlocks() external view returns (UnlockInfo[] memory) { return unlocks; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./IERC20.sol"; import "../../math/SafeMath.sol"; import "../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; pragma experimental ABIEncoderV2; interface ILiquidityMining { struct UnlockInfo { uint256 block; uint256 quota; } function getAllUnlocks() external view returns (UnlockInfo[] memory); function unlocksTotalQuotation() external view returns(uint256); struct PoolInfo { address token; uint256 accRewardPerShare; uint256 allocPoint; uint256 lastRewardBlock; } function getAllPools() external view returns (PoolInfo[] memory); function totalAllocPoint() external returns(uint256); function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; function claim() external; function getPendingReward(uint256 _pid, address _user) external view returns(uint256 total, uint256 available); function rewardToken() external view returns(address); function reservoir() external view returns(address); function rewardPerBlock() external view returns(uint256); function startBlock() external view returns(uint256); function endBlock() external view returns(uint256); function rewards(address) external view returns(uint256); function claimedRewards(address) external view returns(uint256); function poolPidByAddress(address) external view returns(uint256); function isTokenAdded(address _token) external view returns (bool); function calcUnlocked(uint256 reward) external view returns(uint256 claimable); struct UserPoolInfo { uint256 amount; uint256 accruedReward; } function userPoolInfo(uint256, address) external view returns(UserPoolInfo memory); }
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IMigrator { // Perform LP token migration from legacy LPMining CompliFi to newer version. // Take the current LP token address and return the new LP token address. // Migrator should have full access to the caller's LP token. // Return the new LP token address. // // XXX Migrator must have allowance access to CompliFi LP tokens. // CompliFi must mint EXACTLY the same amount of ComplFi LP tokens or // else something bad will happen. function migrate(IERC20 token) external returns (IERC20); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_reservoir","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_endBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"migrator","type":"address"}],"name":"MigratorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"RewardPerBlockSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"TokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldtoken","type":"address"},{"indexed":true,"internalType":"address","name":"newToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"TokenMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"TokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"calcUnlocked","outputs":[{"internalType":"uint256","name":"claimable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllPools","outputs":[{"components":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"}],"internalType":"struct LiquidityMining.PoolInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllUnlocks","outputs":[{"components":[{"internalType":"uint256","name":"block","type":"uint256"},{"internalType":"uint256","name":"quota","type":"uint256"}],"internalType":"struct LiquidityMining.UnlockInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getPendingReward","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"unlocked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"isTokenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigrator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolPidByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"reallocatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservoir","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IMigrator","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"setRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_blocks","type":"uint256[]"},{"internalType":"uint256[]","name":"_quotas","type":"uint256[]"}],"name":"setUnlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"unlocks","outputs":[{"internalType":"uint256","name":"block","type":"uint256"},{"internalType":"uint256","name":"quota","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlocksTotalQuotation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userPoolInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"accruedReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"withdrawEmergency","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600c553480156200001657600080fd5b506040516200320638038062003206833981016040819052620000399162000117565b60006200004562000113565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b038088166001600160a01b03199283161790925560028054928716929091169190911790556003839055600d829055600e8190556040517f5d7c78d0ee3ce6196f90e74ed58c0ada9ac7ccc47d3aca0547ac893776f0382690620001009085906200016e565b60405180910390a1505050505062000190565b3390565b600080600080600060a086880312156200012f578081fd5b85516200013c8162000177565b60208701519095506200014f8162000177565b6040870151606088015160809098015196999198509695945092505050565b90815260200190565b6001600160a01b03811681146200018d57600080fd5b50565b61306680620001a06000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c8063614678df11610145578063bd834345116100bd578063ecef9b081161008c578063f3f14ed011610071578063f3f14ed0146104a4578063f525cb68146104b7578063f7c618c1146104bf5761025c565b8063ecef9b0814610489578063f2fde38b146104915761025c565b8063bd8343451461043b578063c59b1f3c1461044e578063d88ff1f414610461578063e2bbb158146104765761025c565b80638ae39cac11610114578063a36532b2116100f9578063a36532b214610400578063b969c21214610420578063bb872b4a146104285761025c565b80638ae39cac146103f05780638da5cb5b146103f85761025c565b8063614678df146103c5578063630b5ba1146103d8578063715018a6146103e05780637cd07e47146103e85761025c565b8063454b0608116101d85780634b44c239116101a75780634e71d92d1161018c5780634e71d92d1461039557806351eb05a61461039d5780635630e903146103b05761025c565b80634b44c2391461036f5780634e27072a146103825761025c565b8063454b0608146103205780634573616d1461033357806348cd4cb11461035457806349ccd0d11461035c5761025c565b80631526fe271161022f5780631eaaa045116102145780631eaaa045146102e757806323cf3118146102fa578063441a3e701461030d5761025c565b80631526fe27146102bc57806317caf6f1146102df5761025c565b8063068019f8146102615780630700037d14610276578063083c63231461029f578063151e6aa5146102a7575b600080fd5b61027461026f366004612b72565b6104c7565b005b610289610284366004612ab5565b610573565b6040516102969190612f1c565b60405180910390f35b610289610585565b6102af61058b565b6040516102969190612c60565b6102cf6102ca366004612b72565b6105a7565b6040516102969493929190612d9f565b6102896105f8565b6102746102f5366004612bd1565b6105fe565b610274610308366004612ab5565b61088c565b61027461031b366004612c12565b6109a3565b61027461032e366004612b72565b610b52565b610346610341366004612b72565b610ea4565b604051610296929190612f25565b610289610ed2565b61027461036a366004612ad1565b610ed8565b61027461037d366004612c33565b611061565b610346610390366004612ba2565b6111e5565b610274611209565b6102746103ab366004612b72565b61137c565b6103b86115ac565b6040516102969190612d52565b6102896103d3366004612b72565b61161f565b6102746116aa565b6102746116cd565b6102af6117e4565b610289611800565b6102af611806565b61041361040e366004612ab5565b611822565b6040516102969190612d94565b6102896118a8565b610274610436366004612b72565b6118ae565b610289610449366004612ab5565b611996565b61034661045c366004612ba2565b6119a8565b610469611be2565b6040516102969190612cd8565b610274610484366004612c12565b611c70565b610289611d77565b61027461049f366004612ab5565b611d7d565b6102896104b2366004612ab5565b611f1e565b610289611f30565b6102af611f36565b6000600982815481106104d657fe5b60009182526020808320858452600b825260408085203380875293529093208054600490930290930180549094506105289273ffffffffffffffffffffffffffffffffffffffff919091169190611f52565b8054604051849133917fb47853100b79d8afa66237bdb4f7f09d96628ee23aa8aac8a8c21a901c67ddb29161055c91612f1c565b60405180910390a360008082556001909101555050565b60076020526000908152604090205481565b600e5481565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b600981815481106105b757600080fd5b6000918252602090912060049091020180546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff9092169350919084565b600c5481565b610606611fe4565b73ffffffffffffffffffffffffffffffffffffffff16610624611806565b73ffffffffffffffffffffffffffffffffffffffff16146106a657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6106af82611822565b156106ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612dd2565b60405180910390fd5b80156106fd576106fd6116aa565b6000600d54431161071057600d54610712565b435b600c549091506107229085611fe8565b600c55600980546040805160808101825273ffffffffffffffffffffffffffffffffffffffff878116808352600060208085018281528587018d8152606087018b815260018a018b5599845295517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af60048a0290810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169290971691909117909555517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b085015593517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b184015595517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b290920191909155808552600a9091529281902082905551909182917fa818a22273fc309f0a3682b642c74c5b5c25c0615ff378d07767cd231e19fffc9061087d908990612f1c565b60405180910390a35050505050565b610894611fe4565b73ffffffffffffffffffffffffffffffffffffffff166108b2611806565b73ffffffffffffffffffffffffffffffffffffffff161461093457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f3ba4758949febc607e14523620298f8b5995b1848492ad7aa083372ac886ae0790600090a250565b6000828152600b602090815260408083203384529091529020548111156109f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612e09565b6109ff8261137c565b610a0882612065565b6000828152600b6020908152604080832033845290915290208115610a7b578054610a339083612145565b8160000181905550610a7b338360098681548110610a4d57fe5b600091825260209091206004909102015473ffffffffffffffffffffffffffffffffffffffff169190611f52565b610b0c60098481548110610a8b57fe5b60009182526020808320604080516080810182526004909402909101805473ffffffffffffffffffffffffffffffffffffffff168452600180820154858501526002820154858401526003909101546060850152888552600b83528185203386528352938190208151808301909252805482529093015490830152906121bc565b6001820155604051839033907f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc690610b45908690612f1c565b60405180910390a3505050565b60045473ffffffffffffffffffffffffffffffffffffffff16610ba1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612ee5565b600060098281548110610bb057fe5b60009182526020822060049182020180546040517f70a0823100000000000000000000000000000000000000000000000000000000815291945073ffffffffffffffffffffffffffffffffffffffff16929183916370a0823191610c1691309101612c60565b60206040518083038186803b158015610c2e57600080fd5b505afa158015610c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c669190612b8a565b600454909150610c909073ffffffffffffffffffffffffffffffffffffffff8481169116836121e2565b600480546040517fce5494bb00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff9092169163ce5494bb91610ce891879101612c60565b602060405180830381600087803b158015610d0257600080fd5b505af1158015610d16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3a9190612b56565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190610d8f903090600401612c60565b60206040518083038186803b158015610da757600080fd5b505afa158015610dbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddf9190612b8a565b8214610e17576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612eae565b83547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff828116918217865584166000818152600a602052604080822082905583825280822089905551889392917f39a54d7a71ca31798e3d96be34be0322c214765144b2b52e142d763c6c7b86b491a45050505050565b60058181548110610eb457600080fd5b60009182526020909120600290910201805460019091015490915082565b600d5481565b610ee0611fe4565b73ffffffffffffffffffffffffffffffffffffffff16610efe611806565b73ffffffffffffffffffffffffffffffffffffffff1614610f8057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b828114610fb9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612e40565b60005b8381101561105a5760056040518060400160405280878785818110610fdd57fe5b905060200201358152602001858585818110610ff557fe5b60209081029290920135909252835460018181018655600095865294829020845160029092020190815592015191909201555061104f83838381811061103757fe5b90506020020135600654611fe890919063ffffffff16565b600655600101610fbc565b5050505050565b611069611fe4565b73ffffffffffffffffffffffffffffffffffffffff16611087611806565b73ffffffffffffffffffffffffffffffffffffffff161461110957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b8015611117576111176116aa565b6111548261114e6009868154811061112b57fe5b906000526020600020906004020160020154600c5461214590919063ffffffff16565b90611fe8565b600c81905550816009848154811061116857fe5b906000526020600020906004020160020181905550826009848154811061118b57fe5b600091825260209091206004909102015460405173ffffffffffffffffffffffffffffffffffffffff909116907fe32538ed313fbe58b972973266ab7dcc8ea474878de0deaeb3cf28d0a168a7e090610b45908690612f1c565b600b6020908152600092835260408084209091529082529020805460019091015482565b60005b6009548110156112d15761121f8161137c565b61122881612065565b6000818152600b602090815260408083203384529091529020600980546112c591908490811061125457fe5b6000918252602091829020604080516080810182526004909302909101805473ffffffffffffffffffffffffffffffffffffffff16835260018082015484860152600282015484840152600390910154606084015281518083019092528554825285015492810192909252906121bc565b6001918201550161120c565b33600090815260086020908152604080832054600790925282205461130091906112fa9061161f565b90612145565b90508015611312576113123382612370565b3360009081526008602052604090205461132c9082611fe8565b33600081815260086020526040908190209290925590517fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a90611370908490612f1c565b60405180910390a25050565b60006009828154811061138b57fe5b906000526020600020906004020190506000439050600e548111156113af5750600e545b816003015481116113c15750506115a9565b81546040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190611417903090600401612c60565b60206040518083038186803b15801561142f57600080fd5b505afa158015611443573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114679190612b8a565b90508061147a57506003909101556115a9565b600061149384600301548461214590919063ffffffff16565b905060006114c6600c546114c087600201546114ba6003548761258190919063ffffffff16565b90612581565b906125f4565b6001546002546040517f23b872dd00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff918216926323b872dd9261152692169030908690600401612c81565b602060405180830381600087803b15801561154057600080fd5b505af1158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190612b3a565b5061159a61158f846114c08464e8d4a51000612581565b600187015490611fe8565b60018601555050506003909101555b50565b60606005805480602002602001604051908101604052809291908181526020016000905b82821015611616578382906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050815260200190600101906115d0565b50505050905090565b6000805b6005548110156116a4576005818154811061163a57fe5b9060005260206000209060020201600001544310156116585761169c565b6116996116926006546114c06005858154811061167157fe5b9060005260206000209060020201600101548761258190919063ffffffff16565b8390611fe8565b91505b600101611623565b50919050565b60095460005b818110156116c9576116c18161137c565b6001016116b0565b5050565b6116d5611fe4565b73ffffffffffffffffffffffffffffffffffffffff166116f3611806565b73ffffffffffffffffffffffffffffffffffffffff161461177557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a6020526040812054600954811080156118a157508273ffffffffffffffffffffffffffffffffffffffff166009828154811061187857fe5b600091825260209091206004909102015473ffffffffffffffffffffffffffffffffffffffff16145b9392505050565b60065481565b6118b6611fe4565b73ffffffffffffffffffffffffffffffffffffffff166118d4611806565b73ffffffffffffffffffffffffffffffffffffffff161461195657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60038190556040517f5d7c78d0ee3ce6196f90e74ed58c0ada9ac7ccc47d3aca0547ac893776f038269061198b908390612f1c565b60405180910390a150565b60086020526000908152604090205481565b6000806000600985815481106119ba57fe5b6000918252602091829020604080516080810182526004909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002830154908201526003909101546060820152600d549091504390811015611a2e57600080935093505050611bdb565b600e54811115611a3d5750600e545b81516040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190611a93903090600401612c60565b60206040518083038186803b158015611aab57600080fd5b505afa158015611abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae39190612b8a565b905080611af95760008094509450505050611bdb565b6000611b1284606001518461214590919063ffffffff16565b90506000611b39600c546114c087604001516114ba6003548761258190919063ffffffff16565b90506000611b5e611b53856114c08564e8d4a51000612581565b602088015190611fe8565b60008b8152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e168452825291829020825180840190935280548084526001909101549183018290529293509091611bc691906112fa9064e8d4a51000906114c09087612581565b9850611bd18961161f565b9750505050505050505b9250929050565b60606009805480602002602001604051908101604052809291908181526020016000905b828210156116165760008481526020908190206040805160808101825260048602909201805473ffffffffffffffffffffffffffffffffffffffff168352600180820154848601526002820154928401929092526003015460608301529083529092019101611c06565b600e54431115611cac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612e77565b611cb58261137c565b611cbe82612065565b6000828152600b6020908152604080832033845290915290208115611d2e57611d1f33308460098781548110611cf057fe5b600091825260209091206004909102015473ffffffffffffffffffffffffffffffffffffffff16929190612675565b8054611d2b9083611fe8565b81555b611d3e60098481548110610a8b57fe5b6001820155604051839033907f73a19dd210f1a7f902193214c0ee91dd35ee5b4d920cba8d519eca65a7b488ca90610b45908690612f1c565b60055490565b611d85611fe4565b73ffffffffffffffffffffffffffffffffffffffff16611da3611806565b73ffffffffffffffffffffffffffffffffffffffff1614611e2557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612f646026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600a6020526000908152604090205481565b60095490565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611fdf908490612706565b505050565b3390565b60008282018381101561205c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000818152600b6020908152604080832033845282529182902082518084019093528054808452600190910154918301919091526120a357506115a9565b61213161211b82602001516112fa600986815481106120be57fe5b6000918252602091829020604080516080810182526004909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002830154908201526003909101546060820152856121bc565b3360009081526007602052604090205490611fe8565b336000908152600760205260409020555050565b6000828211156121b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600061205c64e8d4a510006114c08560200151856000015161258190919063ffffffff16565b80158061228e5750604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561226057600080fd5b505afa158015612274573d6000803e3d6000fd5b505050506040513d602081101561228a57600080fd5b5051155b6122e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180612ffb6036913960400191505060405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052611fdf908490612706565b6001546040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a08231906123c7903090600401612c60565b60206040518083038186803b1580156123df57600080fd5b505afa1580156123f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124179190612b8a565b9050808211156124d1576001546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a9059cbb906124799086908590600401612cb2565b602060405180830381600087803b15801561249357600080fd5b505af11580156124a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cb9190612b3a565b50611fdf565b6001546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a9059cbb906125299086908690600401612cb2565b602060405180830381600087803b15801561254357600080fd5b505af1158015612557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257b9190612b3a565b50505050565b6000826125905750600061205f565b8282028284828161259d57fe5b041461205c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612fb06021913960400191505060405180910390fd5b600080821161266457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161266d57fe5b049392505050565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261257b9085905b6000612768826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127de9092919063ffffffff16565b805190915015611fdf5780806020019051602081101561278757600080fd5b5051611fdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612fd1602a913960400191505060405180910390fd5b60606127ed84846000856127f5565b949350505050565b606082471015612850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612f8a6026913960400191505060405180910390fd5b612859856129af565b6128c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061292d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016128f0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461298f576040519150601f19603f3d011682016040523d82523d6000602084013e612994565b606091505b50915091506129a48282866129b5565b979650505050505050565b3b151590565b606083156129c45750816118a1565b8251156129d45782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a38578181015183820152602001612a20565b50505050905090810190601f168015612a655780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60008083601f840112612a84578182fd5b50813567ffffffffffffffff811115612a9b578182fd5b6020830191508360208083028501011115611bdb57600080fd5b600060208284031215612ac6578081fd5b813561205c81612f33565b60008060008060408587031215612ae6578283fd5b843567ffffffffffffffff80821115612afd578485fd5b612b0988838901612a73565b90965094506020870135915080821115612b21578384fd5b50612b2e87828801612a73565b95989497509550505050565b600060208284031215612b4b578081fd5b815161205c81612f55565b600060208284031215612b67578081fd5b815161205c81612f33565b600060208284031215612b83578081fd5b5035919050565b600060208284031215612b9b578081fd5b5051919050565b60008060408385031215612bb4578182fd5b823591506020830135612bc681612f33565b809150509250929050565b600080600060608486031215612be5578283fd5b833592506020840135612bf781612f33565b91506040840135612c0781612f55565b809150509250925092565b60008060408385031215612c24578182fd5b50508035926020909101359150565b600080600060608486031215612c47578283fd5b83359250602084013591506040840135612c0781612f55565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b82811015612d45578151805173ffffffffffffffffffffffffffffffffffffffff168552868101518786015285810151868601526060908101519085015260809093019290850190600101612cf5565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612d4557815180518552860151868501529284019290850190600101612d6f565b901515815260200190565b73ffffffffffffffffffffffffffffffffffffffff94909416845260208401929092526040830152606082015260800190565b60208082526018908201527f6164643a20746f6b656e20616c72656164792061646465640000000000000000604082015260600190565b6020808252601b908201527f77697468647261773a206e6f7420656e6f75676820616d6f756e740000000000604082015260600190565b60208082526015908201527f53686f756c642062652073616d65206c656e6774680000000000000000000000604082015260600190565b60208082526014908201527f4c50206d696e696e672068617320656e6465642e000000000000000000000000604082015260600190565b6020808252600c908201527f6d6967726174653a206261640000000000000000000000000000000000000000604082015260600190565b60208082526014908201527f6d6967726174653a206e6f206d69677261746f72000000000000000000000000604082015260600190565b90815260200190565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811681146115a957600080fd5b80151581146115a957600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220af232de599d56e5a7ca06eafd0ba41657cdd888f68fd504b82424eafd13623a264736f6c63430007060033000000000000000000000000752efadc0a7e05ad1bcccda22c141d01a75ef1e400000000000000000000000022e1fe5bbb98a0eda715b56a7bf04ed462bca8d20000000000000000000000000000000000000000000000005199f4d8af4c00000000000000000000000000000000000000000000000000000000000000bcd3d80000000000000000000000000000000000000000000000000000000000bf6be8
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025c5760003560e01c8063614678df11610145578063bd834345116100bd578063ecef9b081161008c578063f3f14ed011610071578063f3f14ed0146104a4578063f525cb68146104b7578063f7c618c1146104bf5761025c565b8063ecef9b0814610489578063f2fde38b146104915761025c565b8063bd8343451461043b578063c59b1f3c1461044e578063d88ff1f414610461578063e2bbb158146104765761025c565b80638ae39cac11610114578063a36532b2116100f9578063a36532b214610400578063b969c21214610420578063bb872b4a146104285761025c565b80638ae39cac146103f05780638da5cb5b146103f85761025c565b8063614678df146103c5578063630b5ba1146103d8578063715018a6146103e05780637cd07e47146103e85761025c565b8063454b0608116101d85780634b44c239116101a75780634e71d92d1161018c5780634e71d92d1461039557806351eb05a61461039d5780635630e903146103b05761025c565b80634b44c2391461036f5780634e27072a146103825761025c565b8063454b0608146103205780634573616d1461033357806348cd4cb11461035457806349ccd0d11461035c5761025c565b80631526fe271161022f5780631eaaa045116102145780631eaaa045146102e757806323cf3118146102fa578063441a3e701461030d5761025c565b80631526fe27146102bc57806317caf6f1146102df5761025c565b8063068019f8146102615780630700037d14610276578063083c63231461029f578063151e6aa5146102a7575b600080fd5b61027461026f366004612b72565b6104c7565b005b610289610284366004612ab5565b610573565b6040516102969190612f1c565b60405180910390f35b610289610585565b6102af61058b565b6040516102969190612c60565b6102cf6102ca366004612b72565b6105a7565b6040516102969493929190612d9f565b6102896105f8565b6102746102f5366004612bd1565b6105fe565b610274610308366004612ab5565b61088c565b61027461031b366004612c12565b6109a3565b61027461032e366004612b72565b610b52565b610346610341366004612b72565b610ea4565b604051610296929190612f25565b610289610ed2565b61027461036a366004612ad1565b610ed8565b61027461037d366004612c33565b611061565b610346610390366004612ba2565b6111e5565b610274611209565b6102746103ab366004612b72565b61137c565b6103b86115ac565b6040516102969190612d52565b6102896103d3366004612b72565b61161f565b6102746116aa565b6102746116cd565b6102af6117e4565b610289611800565b6102af611806565b61041361040e366004612ab5565b611822565b6040516102969190612d94565b6102896118a8565b610274610436366004612b72565b6118ae565b610289610449366004612ab5565b611996565b61034661045c366004612ba2565b6119a8565b610469611be2565b6040516102969190612cd8565b610274610484366004612c12565b611c70565b610289611d77565b61027461049f366004612ab5565b611d7d565b6102896104b2366004612ab5565b611f1e565b610289611f30565b6102af611f36565b6000600982815481106104d657fe5b60009182526020808320858452600b825260408085203380875293529093208054600490930290930180549094506105289273ffffffffffffffffffffffffffffffffffffffff919091169190611f52565b8054604051849133917fb47853100b79d8afa66237bdb4f7f09d96628ee23aa8aac8a8c21a901c67ddb29161055c91612f1c565b60405180910390a360008082556001909101555050565b60076020526000908152604090205481565b600e5481565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b600981815481106105b757600080fd5b6000918252602090912060049091020180546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff9092169350919084565b600c5481565b610606611fe4565b73ffffffffffffffffffffffffffffffffffffffff16610624611806565b73ffffffffffffffffffffffffffffffffffffffff16146106a657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6106af82611822565b156106ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612dd2565b60405180910390fd5b80156106fd576106fd6116aa565b6000600d54431161071057600d54610712565b435b600c549091506107229085611fe8565b600c55600980546040805160808101825273ffffffffffffffffffffffffffffffffffffffff878116808352600060208085018281528587018d8152606087018b815260018a018b5599845295517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af60048a0290810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169290971691909117909555517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b085015593517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b184015595517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b290920191909155808552600a9091529281902082905551909182917fa818a22273fc309f0a3682b642c74c5b5c25c0615ff378d07767cd231e19fffc9061087d908990612f1c565b60405180910390a35050505050565b610894611fe4565b73ffffffffffffffffffffffffffffffffffffffff166108b2611806565b73ffffffffffffffffffffffffffffffffffffffff161461093457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f3ba4758949febc607e14523620298f8b5995b1848492ad7aa083372ac886ae0790600090a250565b6000828152600b602090815260408083203384529091529020548111156109f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612e09565b6109ff8261137c565b610a0882612065565b6000828152600b6020908152604080832033845290915290208115610a7b578054610a339083612145565b8160000181905550610a7b338360098681548110610a4d57fe5b600091825260209091206004909102015473ffffffffffffffffffffffffffffffffffffffff169190611f52565b610b0c60098481548110610a8b57fe5b60009182526020808320604080516080810182526004909402909101805473ffffffffffffffffffffffffffffffffffffffff168452600180820154858501526002820154858401526003909101546060850152888552600b83528185203386528352938190208151808301909252805482529093015490830152906121bc565b6001820155604051839033907f92ccf450a286a957af52509bc1c9939d1a6a481783e142e41e2499f0bb66ebc690610b45908690612f1c565b60405180910390a3505050565b60045473ffffffffffffffffffffffffffffffffffffffff16610ba1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612ee5565b600060098281548110610bb057fe5b60009182526020822060049182020180546040517f70a0823100000000000000000000000000000000000000000000000000000000815291945073ffffffffffffffffffffffffffffffffffffffff16929183916370a0823191610c1691309101612c60565b60206040518083038186803b158015610c2e57600080fd5b505afa158015610c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c669190612b8a565b600454909150610c909073ffffffffffffffffffffffffffffffffffffffff8481169116836121e2565b600480546040517fce5494bb00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff9092169163ce5494bb91610ce891879101612c60565b602060405180830381600087803b158015610d0257600080fd5b505af1158015610d16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3a9190612b56565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190610d8f903090600401612c60565b60206040518083038186803b158015610da757600080fd5b505afa158015610dbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddf9190612b8a565b8214610e17576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612eae565b83547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff828116918217865584166000818152600a602052604080822082905583825280822089905551889392917f39a54d7a71ca31798e3d96be34be0322c214765144b2b52e142d763c6c7b86b491a45050505050565b60058181548110610eb457600080fd5b60009182526020909120600290910201805460019091015490915082565b600d5481565b610ee0611fe4565b73ffffffffffffffffffffffffffffffffffffffff16610efe611806565b73ffffffffffffffffffffffffffffffffffffffff1614610f8057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b828114610fb9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612e40565b60005b8381101561105a5760056040518060400160405280878785818110610fdd57fe5b905060200201358152602001858585818110610ff557fe5b60209081029290920135909252835460018181018655600095865294829020845160029092020190815592015191909201555061104f83838381811061103757fe5b90506020020135600654611fe890919063ffffffff16565b600655600101610fbc565b5050505050565b611069611fe4565b73ffffffffffffffffffffffffffffffffffffffff16611087611806565b73ffffffffffffffffffffffffffffffffffffffff161461110957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b8015611117576111176116aa565b6111548261114e6009868154811061112b57fe5b906000526020600020906004020160020154600c5461214590919063ffffffff16565b90611fe8565b600c81905550816009848154811061116857fe5b906000526020600020906004020160020181905550826009848154811061118b57fe5b600091825260209091206004909102015460405173ffffffffffffffffffffffffffffffffffffffff909116907fe32538ed313fbe58b972973266ab7dcc8ea474878de0deaeb3cf28d0a168a7e090610b45908690612f1c565b600b6020908152600092835260408084209091529082529020805460019091015482565b60005b6009548110156112d15761121f8161137c565b61122881612065565b6000818152600b602090815260408083203384529091529020600980546112c591908490811061125457fe5b6000918252602091829020604080516080810182526004909302909101805473ffffffffffffffffffffffffffffffffffffffff16835260018082015484860152600282015484840152600390910154606084015281518083019092528554825285015492810192909252906121bc565b6001918201550161120c565b33600090815260086020908152604080832054600790925282205461130091906112fa9061161f565b90612145565b90508015611312576113123382612370565b3360009081526008602052604090205461132c9082611fe8565b33600081815260086020526040908190209290925590517fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a90611370908490612f1c565b60405180910390a25050565b60006009828154811061138b57fe5b906000526020600020906004020190506000439050600e548111156113af5750600e545b816003015481116113c15750506115a9565b81546040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190611417903090600401612c60565b60206040518083038186803b15801561142f57600080fd5b505afa158015611443573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114679190612b8a565b90508061147a57506003909101556115a9565b600061149384600301548461214590919063ffffffff16565b905060006114c6600c546114c087600201546114ba6003548761258190919063ffffffff16565b90612581565b906125f4565b6001546002546040517f23b872dd00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff918216926323b872dd9261152692169030908690600401612c81565b602060405180830381600087803b15801561154057600080fd5b505af1158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190612b3a565b5061159a61158f846114c08464e8d4a51000612581565b600187015490611fe8565b60018601555050506003909101555b50565b60606005805480602002602001604051908101604052809291908181526020016000905b82821015611616578382906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050815260200190600101906115d0565b50505050905090565b6000805b6005548110156116a4576005818154811061163a57fe5b9060005260206000209060020201600001544310156116585761169c565b6116996116926006546114c06005858154811061167157fe5b9060005260206000209060020201600101548761258190919063ffffffff16565b8390611fe8565b91505b600101611623565b50919050565b60095460005b818110156116c9576116c18161137c565b6001016116b0565b5050565b6116d5611fe4565b73ffffffffffffffffffffffffffffffffffffffff166116f3611806565b73ffffffffffffffffffffffffffffffffffffffff161461177557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a6020526040812054600954811080156118a157508273ffffffffffffffffffffffffffffffffffffffff166009828154811061187857fe5b600091825260209091206004909102015473ffffffffffffffffffffffffffffffffffffffff16145b9392505050565b60065481565b6118b6611fe4565b73ffffffffffffffffffffffffffffffffffffffff166118d4611806565b73ffffffffffffffffffffffffffffffffffffffff161461195657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60038190556040517f5d7c78d0ee3ce6196f90e74ed58c0ada9ac7ccc47d3aca0547ac893776f038269061198b908390612f1c565b60405180910390a150565b60086020526000908152604090205481565b6000806000600985815481106119ba57fe5b6000918252602091829020604080516080810182526004909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002830154908201526003909101546060820152600d549091504390811015611a2e57600080935093505050611bdb565b600e54811115611a3d5750600e545b81516040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190611a93903090600401612c60565b60206040518083038186803b158015611aab57600080fd5b505afa158015611abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae39190612b8a565b905080611af95760008094509450505050611bdb565b6000611b1284606001518461214590919063ffffffff16565b90506000611b39600c546114c087604001516114ba6003548761258190919063ffffffff16565b90506000611b5e611b53856114c08564e8d4a51000612581565b602088015190611fe8565b60008b8152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e168452825291829020825180840190935280548084526001909101549183018290529293509091611bc691906112fa9064e8d4a51000906114c09087612581565b9850611bd18961161f565b9750505050505050505b9250929050565b60606009805480602002602001604051908101604052809291908181526020016000905b828210156116165760008481526020908190206040805160808101825260048602909201805473ffffffffffffffffffffffffffffffffffffffff168352600180820154848601526002820154928401929092526003015460608301529083529092019101611c06565b600e54431115611cac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690612e77565b611cb58261137c565b611cbe82612065565b6000828152600b6020908152604080832033845290915290208115611d2e57611d1f33308460098781548110611cf057fe5b600091825260209091206004909102015473ffffffffffffffffffffffffffffffffffffffff16929190612675565b8054611d2b9083611fe8565b81555b611d3e60098481548110610a8b57fe5b6001820155604051839033907f73a19dd210f1a7f902193214c0ee91dd35ee5b4d920cba8d519eca65a7b488ca90610b45908690612f1c565b60055490565b611d85611fe4565b73ffffffffffffffffffffffffffffffffffffffff16611da3611806565b73ffffffffffffffffffffffffffffffffffffffff1614611e2557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612f646026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600a6020526000908152604090205481565b60095490565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611fdf908490612706565b505050565b3390565b60008282018381101561205c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000818152600b6020908152604080832033845282529182902082518084019093528054808452600190910154918301919091526120a357506115a9565b61213161211b82602001516112fa600986815481106120be57fe5b6000918252602091829020604080516080810182526004909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002830154908201526003909101546060820152856121bc565b3360009081526007602052604090205490611fe8565b336000908152600760205260409020555050565b6000828211156121b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600061205c64e8d4a510006114c08560200151856000015161258190919063ffffffff16565b80158061228e5750604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561226057600080fd5b505afa158015612274573d6000803e3d6000fd5b505050506040513d602081101561228a57600080fd5b5051155b6122e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180612ffb6036913960400191505060405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052611fdf908490612706565b6001546040517f70a0823100000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906370a08231906123c7903090600401612c60565b60206040518083038186803b1580156123df57600080fd5b505afa1580156123f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124179190612b8a565b9050808211156124d1576001546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a9059cbb906124799086908590600401612cb2565b602060405180830381600087803b15801561249357600080fd5b505af11580156124a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cb9190612b3a565b50611fdf565b6001546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063a9059cbb906125299086908690600401612cb2565b602060405180830381600087803b15801561254357600080fd5b505af1158015612557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257b9190612b3a565b50505050565b6000826125905750600061205f565b8282028284828161259d57fe5b041461205c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612fb06021913960400191505060405180910390fd5b600080821161266457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161266d57fe5b049392505050565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261257b9085905b6000612768826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127de9092919063ffffffff16565b805190915015611fdf5780806020019051602081101561278757600080fd5b5051611fdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612fd1602a913960400191505060405180910390fd5b60606127ed84846000856127f5565b949350505050565b606082471015612850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612f8a6026913960400191505060405180910390fd5b612859856129af565b6128c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061292d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016128f0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461298f576040519150601f19603f3d011682016040523d82523d6000602084013e612994565b606091505b50915091506129a48282866129b5565b979650505050505050565b3b151590565b606083156129c45750816118a1565b8251156129d45782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a38578181015183820152602001612a20565b50505050905090810190601f168015612a655780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60008083601f840112612a84578182fd5b50813567ffffffffffffffff811115612a9b578182fd5b6020830191508360208083028501011115611bdb57600080fd5b600060208284031215612ac6578081fd5b813561205c81612f33565b60008060008060408587031215612ae6578283fd5b843567ffffffffffffffff80821115612afd578485fd5b612b0988838901612a73565b90965094506020870135915080821115612b21578384fd5b50612b2e87828801612a73565b95989497509550505050565b600060208284031215612b4b578081fd5b815161205c81612f55565b600060208284031215612b67578081fd5b815161205c81612f33565b600060208284031215612b83578081fd5b5035919050565b600060208284031215612b9b578081fd5b5051919050565b60008060408385031215612bb4578182fd5b823591506020830135612bc681612f33565b809150509250929050565b600080600060608486031215612be5578283fd5b833592506020840135612bf781612f33565b91506040840135612c0781612f55565b809150509250925092565b60008060408385031215612c24578182fd5b50508035926020909101359150565b600080600060608486031215612c47578283fd5b83359250602084013591506040840135612c0781612f55565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b82811015612d45578151805173ffffffffffffffffffffffffffffffffffffffff168552868101518786015285810151868601526060908101519085015260809093019290850190600101612cf5565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612d4557815180518552860151868501529284019290850190600101612d6f565b901515815260200190565b73ffffffffffffffffffffffffffffffffffffffff94909416845260208401929092526040830152606082015260800190565b60208082526018908201527f6164643a20746f6b656e20616c72656164792061646465640000000000000000604082015260600190565b6020808252601b908201527f77697468647261773a206e6f7420656e6f75676820616d6f756e740000000000604082015260600190565b60208082526015908201527f53686f756c642062652073616d65206c656e6774680000000000000000000000604082015260600190565b60208082526014908201527f4c50206d696e696e672068617320656e6465642e000000000000000000000000604082015260600190565b6020808252600c908201527f6d6967726174653a206261640000000000000000000000000000000000000000604082015260600190565b60208082526014908201527f6d6967726174653a206e6f206d69677261746f72000000000000000000000000604082015260600190565b90815260200190565b918252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff811681146115a957600080fd5b80151581146115a957600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220af232de599d56e5a7ca06eafd0ba41657cdd888f68fd504b82424eafd13623a264736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000752efadc0a7e05ad1bcccda22c141d01a75ef1e400000000000000000000000022e1fe5bbb98a0eda715b56a7bf04ed462bca8d20000000000000000000000000000000000000000000000005199f4d8af4c00000000000000000000000000000000000000000000000000000000000000bcd3d80000000000000000000000000000000000000000000000000000000000bf6be8
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0x752Efadc0a7E05ad1BCCcDA22c141D01a75EF1e4
Arg [1] : _reservoir (address): 0x22e1fe5bBB98a0eDA715B56a7bf04ed462BcA8d2
Arg [2] : _rewardPerBlock (uint256): 5880000000000000000
Arg [3] : _startBlock (uint256): 12375000
Arg [4] : _endBlock (uint256): 12545000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000752efadc0a7e05ad1bcccda22c141d01a75ef1e4
Arg [1] : 00000000000000000000000022e1fe5bbb98a0eda715b56a7bf04ed462bca8d2
Arg [2] : 0000000000000000000000000000000000000000000000005199f4d8af4c0000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000bcd3d8
Arg [4] : 0000000000000000000000000000000000000000000000000000000000bf6be8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.