More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,333 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 21118302 | 45 hrs ago | IN | 0 ETH | 0.00082531 | ||||
Claim | 21113999 | 2 days ago | IN | 0 ETH | 0.00085463 | ||||
Deposit | 21103937 | 3 days ago | IN | 0 ETH | 0.00077873 | ||||
Withdraw All | 21103917 | 3 days ago | IN | 0 ETH | 0.00043155 | ||||
Withdraw All | 21103891 | 3 days ago | IN | 0 ETH | 0.0005251 | ||||
Deposit | 21101450 | 4 days ago | IN | 0 ETH | 0.00232378 | ||||
Claim | 21101421 | 4 days ago | IN | 0 ETH | 0.00117407 | ||||
Withdraw All | 21098132 | 4 days ago | IN | 0 ETH | 0.00063156 | ||||
Deposit | 21085323 | 6 days ago | IN | 0 ETH | 0.00140855 | ||||
Deposit | 21085322 | 6 days ago | IN | 0 ETH | 0.00151691 | ||||
Claim | 21085316 | 6 days ago | IN | 0 ETH | 0.001797 | ||||
Fee Distribution | 21085192 | 6 days ago | IN | 0 ETH | 0.0006022 | ||||
Deposit | 21084570 | 6 days ago | IN | 0 ETH | 0.00153401 | ||||
Withdraw All | 21084564 | 6 days ago | IN | 0 ETH | 0.00110133 | ||||
Deposit | 21052224 | 11 days ago | IN | 0 ETH | 0.0009029 | ||||
Claim | 21052222 | 11 days ago | IN | 0 ETH | 0.00049469 | ||||
Deposit | 21052201 | 11 days ago | IN | 0 ETH | 0.00110989 | ||||
Claim | 21052197 | 11 days ago | IN | 0 ETH | 0.00070109 | ||||
Deposit | 21052182 | 11 days ago | IN | 0 ETH | 0.00116615 | ||||
Claim | 21052176 | 11 days ago | IN | 0 ETH | 0.00089602 | ||||
Deposit | 21052165 | 11 days ago | IN | 0 ETH | 0.00126786 | ||||
Claim | 21052161 | 11 days ago | IN | 0 ETH | 0.00080584 | ||||
Deposit | 21036615 | 13 days ago | IN | 0 ETH | 0.00340547 | ||||
Withdraw All | 21036612 | 13 days ago | IN | 0 ETH | 0.00263619 | ||||
Fee Distribution | 21034737 | 13 days ago | IN | 0 ETH | 0.00048516 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Compound
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: Unlicense pragma solidity 0.8.9; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; // compound once a day contract Compound is Ownable { /* ========== STATE VARIABLES ========== */ struct UserInfo { uint256 shares; // number of shares for a user uint256 stakeTime; // time of user deposit uint256 fee; uint256 excess; } uint256 public constant MINIMUM_STAKE = 1000 ether; uint256 public constant LOCK_PERIOD = 30 days; uint256 public totalStaked; // total amount of tokens staked uint256 public totalShares; uint256 public rewardRate; // token rewards per second uint256 public beginDate; // start date of rewards uint256 public endDate; // end date of rewards uint256 public lastUpdateTime; uint256 public feePerShare; uint256 public shareWorth; IERC20 public stakedToken; // token allowed to be staked mapping(address => uint256) public fees; mapping(address => UserInfo[]) public userInfo; /* ========== EVENTS ========== */ event Deposit( address indexed sender, uint256 amount, uint256 shares, uint256 lastDepositedTime ); event Withdraw(address indexed sender, uint256 amount, uint256 shares); event Staked(address indexed user, uint256 amount); event Claimed(address indexed user, uint256 amount); event FeeDistributed( uint256 block, uint256 amount, uint256 totalSharesAtEvent ); event Unstaked(address indexed user, uint256 amount, uint256 index); event RewardAdded(uint256 amount, uint256 rewardRateIncrease); /* ========== CONSTRUCTOR ========== */ constructor( IERC20 _stakedToken, uint256 _beginDate, uint256 _endDate ) { stakedToken = _stakedToken; lastUpdateTime = _beginDate; beginDate = _beginDate; endDate = _endDate; shareWorth = 1 ether; } /* ========== MUTATIVE FUNCTIONS ========== */ function claim() external started updateShareWorth { uint256 reward; reward += calculateFees(msg.sender); reward += fees[msg.sender]; if (reward > 0) { fees[msg.sender] = 0; stakedToken.transfer(msg.sender, reward); emit Claimed(msg.sender, reward); } } function deposit(uint256 amount) external started updateShareWorth { require(amount >= MINIMUM_STAKE, "Stake too small"); require(amount >= shareWorth, "Stake smaller than share worth"); userInfo[msg.sender].push( UserInfo( amount / shareWorth, block.timestamp, feePerShare, amount - ((amount / shareWorth) * shareWorth) ) ); totalShares += (amount) / shareWorth; totalStaked += ((amount / shareWorth) * shareWorth); stakedToken.transferFrom(msg.sender, address(this), amount); emit Deposit(msg.sender, amount, amount / shareWorth, block.timestamp); } function withdrawAll() external started updateShareWorth { uint256 _totalShares; uint256 _excess; for (uint256 i = 0; i < userInfo[msg.sender].length; i++) { if ( userInfo[msg.sender][i].stakeTime + LOCK_PERIOD <= block.timestamp && userInfo[msg.sender][i].shares > 0 ) { uint256 _shares = userInfo[msg.sender][i].shares; _totalShares += _shares; _excess += userInfo[msg.sender][i].excess; userInfo[msg.sender][i].shares -= _shares; fees[msg.sender] += ((_shares * (feePerShare - userInfo[msg.sender][i].fee)) / 1 ether); } } uint256 feesReward = fees[msg.sender]; if (feesReward > 0 && _totalShares > 0) { fees[msg.sender] = 0; emit Claimed(msg.sender, feesReward); } if (_totalShares > 0) { totalShares -= _totalShares; totalStaked -= _totalShares * shareWorth; uint256 sendingAmount = _totalShares * shareWorth + _excess + feesReward; stakedToken.transfer(msg.sender, sendingAmount); emit Withdraw(msg.sender, sendingAmount, _totalShares); } } function withdraw(uint256 index) external started updateShareWorth { require( userInfo[msg.sender][index].stakeTime + LOCK_PERIOD <= block.timestamp ); require(userInfo[msg.sender][index].shares > 0); uint256 _shares = userInfo[msg.sender][index].shares; userInfo[msg.sender][index].shares -= _shares; fees[msg.sender] += ((_shares * (feePerShare - userInfo[msg.sender][index].fee)) / 1 ether); uint256 feesReward = fees[msg.sender]; if (feesReward > 0) { fees[msg.sender] = 0; emit Claimed(msg.sender, feesReward); } totalShares -= _shares; totalStaked -= _shares * shareWorth; uint256 sendingAmount = _shares * shareWorth + userInfo[msg.sender][index].excess + feesReward; stakedToken.transfer(msg.sender, sendingAmount); emit Withdraw(msg.sender, sendingAmount, _shares); } function calculateFees(address user) internal returns (uint256) { uint256 _fees; for (uint256 i = 0; i < userInfo[user].length; i++) { _fees += ((userInfo[user][i].shares * (feePerShare - userInfo[user][i].fee)) / 1 ether); userInfo[user][i].fee = feePerShare; } return _fees; } function addReward(uint256 amount) external updateShareWorth { require(amount > 0, "Cannot add 0 reward"); uint256 time = (endDate - firstTimeRewardApplicable()); rewardRate += (amount) / time; stakedToken.transferFrom( msg.sender, address(this), (amount / time) * time ); emit RewardAdded((amount / time) * time, (amount) / time); } function feeDistribution(uint256 amount) external { require(amount > 0, "Cannot distribute 0 fee"); require(totalStaked > 0, "Noone to distribute fee to"); feePerShare += (amount * 1 ether) / (totalShares); uint256 result = (((amount * 1 ether) / (totalShares)) * totalShares) / 1 ether; stakedToken.transferFrom(msg.sender, address(this), result); emit FeeDistributed(block.timestamp, result, totalShares); } /* ========== VIEWS ========== */ function currentFees(address user) public view returns (uint256) { uint256 _fees; for (uint256 i = 0; i < userInfo[user].length; i++) { _fees += ((userInfo[user][i].shares * (feePerShare - userInfo[user][i].fee)) / 1 ether); } return _fees; } function currentAmount(address user) public view returns (uint256) { uint256 amount; for (uint256 i = 0; i < userInfo[user].length; i++) { amount += userInfo[user][i].shares; } return amount; } function lastTimeRewardApplicable() public view returns (uint256) { return block.timestamp < endDate ? block.timestamp : endDate; } function firstTimeRewardApplicable() public view returns (uint256) { return block.timestamp < beginDate ? beginDate : block.timestamp; } function currentShareWorth() public view returns (uint256) { uint256 newShareWorth = shareWorth; uint256 newTotalStaked = totalStaked; if (newTotalStaked > 0) { for ( uint256 i = 0; i < (lastTimeRewardApplicable() - lastUpdateTime) / 1 days; i++ ) { uint256 placeHolder = newShareWorth; newShareWorth += (newShareWorth * 1 days * rewardRate) / newTotalStaked; newTotalStaked += totalShares * (newShareWorth - placeHolder); } } return newShareWorth; } function currentWithdrawalPossible(address user) public view returns (uint256) { uint256 _totalShares; uint256 _excess; uint256 _feePayout; for (uint256 i = 0; i < userInfo[user].length; i++) { if ( userInfo[user][i].stakeTime + LOCK_PERIOD <= block.timestamp && userInfo[user][i].shares > 0 ) { uint256 _shares = userInfo[user][i].shares; _totalShares += _shares; _excess += userInfo[user][i].excess; _feePayout += ((_shares * (feePerShare - userInfo[user][i].fee)) / 1 ether); } } if (_totalShares > 0) { return _totalShares * shareWorth + _excess + _feePayout; } else { return 0; } } /* ========== MODIFIERS ========== */ modifier updateShareWorth() { if (totalStaked > 0) { for ( uint256 i = 0; i < (lastTimeRewardApplicable() - lastUpdateTime) / 1 days; i++ ) { uint256 placeHolder = shareWorth; shareWorth += (shareWorth * 1 days * rewardRate) / totalStaked; totalStaked += totalShares * (shareWorth - placeHolder); } lastUpdateTime = (lastTimeRewardApplicable() / 1 days) * 1 days; } _; } modifier started() { require(block.timestamp >= beginDate, "Stake period hasn't started"); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^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 // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^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() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^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 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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_stakedToken","type":"address"},{"internalType":"uint256","name":"_beginDate","type":"uint256"},{"internalType":"uint256","name":"_endDate","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":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSharesAtEvent","type":"uint256"}],"name":"FeeDistributed","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":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardRateIncrease","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"LOCK_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_STAKE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"beginDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"currentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"currentFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentShareWorth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"currentWithdrawalPossible","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"feeDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feePerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shareWorth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"stakeTime","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"excess","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620035c1380380620035c183398181016040528101906200003791906200024a565b620000576200004b620000c560201b60201c565b620000cd60201b60201c565b82600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816006819055508160048190555080600581905550670de0b6b3a7640000600881905550505050620002a6565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001c38262000196565b9050919050565b6000620001d782620001b6565b9050919050565b620001e981620001ca565b8114620001f557600080fd5b50565b6000815190506200020981620001de565b92915050565b6000819050919050565b62000224816200020f565b81146200023057600080fd5b50565b600081519050620002448162000219565b92915050565b60008060006060848603121562000266576200026562000191565b5b60006200027686828701620001f8565b9350506020620002898682870162000233565b92505060406200029c8682870162000233565b9150509250925092565b61330b80620002b66000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806374de4ec4116100f9578063b6b55f2511610097578063cc7a262e11610071578063cc7a262e1461048e578063d01bddf4146104ac578063f2fde38b146104dc578063faaebd21146104f8576101c4565b8063b6b55f2514610436578063c24a0f8b14610452578063c8f33c9114610470576101c4565b8063817b1cd2116100d3578063817b1cd2146103d2578063853828b6146103f0578063897abdbb146103fa5780638da5cb5b14610418576101c4565b806374de4ec41461037a5780637b0a47ee1461039657806380faa57d146103b4576101c4565b80633a98ef3911610166578063670060d411610140578063670060d4146103045780636fc8552e14610334578063715018a61461035257806374d5ab131461035c576101c4565b80633a98ef39146102c0578063462c5313146102de5780634e71d92d146102fa576101c4565b806327d922d3116101a257806327d922d3146102385780632ce3f9a7146102685780632e1a7d4d146102865780633296607f146102a2576101c4565b806308dbbb03146101c95780631820cabb146101e757806321ce919d14610205575b600080fd5b6101d1610528565b6040516101de9190612a01565b60405180910390f35b6101ef610535565b6040516101fc9190612a01565b60405180910390f35b61021f600480360381019061021a9190612aab565b61053c565b60405161022f9493929190612aeb565b60405180910390f35b610252600480360381019061024d9190612b30565b610589565b60405161025f9190612a01565b60405180910390f35b610270610666565b60405161027d9190612a01565b60405180910390f35b6102a0600480360381019061029b9190612b5d565b610728565b005b6102aa610dbe565b6040516102b79190612a01565b60405180910390f35b6102c8610dc4565b6040516102d59190612a01565b60405180910390f35b6102f860048036038101906102f39190612b5d565b610dca565b005b610302610fc3565b005b61031e60048036038101906103199190612b30565b6112af565b60405161032b9190612a01565b60405180910390f35b61033c6115c3565b6040516103499190612a01565b60405180910390f35b61035a6115c9565b005b610364611651565b6040516103719190612a01565b60405180910390f35b610394600480360381019061038f9190612b5d565b61166b565b005b61039e611903565b6040516103ab9190612a01565b60405180910390f35b6103bc611909565b6040516103c99190612a01565b60405180910390f35b6103da611923565b6040516103e79190612a01565b60405180910390f35b6103f8611929565b005b610402612052565b60405161040f9190612a01565b60405180910390f35b610420612058565b60405161042d9190612b99565b60405180910390f35b610450600480360381019061044b9190612b5d565b612081565b005b61045a61249d565b6040516104679190612a01565b60405180910390f35b6104786124a3565b6040516104859190612a01565b60405180910390f35b6104966124a9565b6040516104a39190612c13565b60405180910390f35b6104c660048036038101906104c19190612b30565b6124cf565b6040516104d39190612a01565b60405180910390f35b6104f660048036038101906104f19190612b30565b612639565b005b610512600480360381019061050d9190612b30565b612731565b60405161051f9190612a01565b60405180910390f35b683635c9adc5dea0000081565b62278d0081565b600b602052816000526040600020818154811061055857600080fd5b9060005260206000209060040201600091509150508060000154908060010154908060020154908060030154905084565b60008060005b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561065c57600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061062a57610629612c2e565b5b906000526020600020906004020160000154826106479190612c8c565b9150808061065490612ce2565b91505061058f565b5080915050919050565b60008060085490506000600154905060008111156107205760005b62015180600654610690611909565b61069a9190612d2b565b6106a49190612d8e565b81101561071e5760008390508260035462015180866106c39190612dbf565b6106cd9190612dbf565b6106d79190612d8e565b846106e29190612c8c565b935080846106f09190612d2b565b6002546106fd9190612dbf565b836107089190612c8c565b925050808061071690612ce2565b915050610681565b505b819250505090565b60045442101561076d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076490612e76565b60405180910390fd5b6000600154111561085f5760005b6201518060065461078a611909565b6107949190612d2b565b61079e9190612d8e565b8110156108365760006008549050600154600354620151806008546107c39190612dbf565b6107cd9190612dbf565b6107d79190612d8e565b600860008282546107e89190612c8c565b92505081905550806008546107fd9190612d2b565b60025461080a9190612dbf565b6001600082825461081b9190612c8c565b9250508190555050808061082e90612ce2565b91505061077b565b506201518080610844611909565b61084e9190612d8e565b6108589190612dbf565b6006819055505b4262278d00600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106108b5576108b4612c2e565b5b9060005260206000209060040201600101546108d19190612c8c565b11156108dc57600080fd5b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061092f5761092e612c2e565b5b9060005260206000209060040201600001541161094b57600080fd5b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061099e5761099d612c2e565b5b906000526020600020906004020160000154905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110610a0457610a03612c2e565b5b90600052602060002090600402016000016000828254610a249190612d2b565b92505081905550670de0b6b3a7640000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110610a8557610a84612c2e565b5b906000526020600020906004020160020154600754610aa49190612d2b565b82610aaf9190612dbf565b610ab99190612d8e565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b079190612c8c565b925050819055506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115610bef576000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a82604051610be69190612a01565b60405180910390a25b8160026000828254610c019190612d2b565b9250508190555060085482610c169190612dbf565b60016000828254610c279190612d2b565b92505081905550600081600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110610c8257610c81612c2e565b5b90600052602060002090600402016003015460085485610ca29190612dbf565b610cac9190612c8c565b610cb69190612c8c565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610d15929190612e96565b602060405180830381600087803b158015610d2f57600080fd5b505af1158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d679190612ef7565b503373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688285604051610db0929190612f24565b60405180910390a250505050565b60045481565b60025481565b60008111610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490612f99565b60405180910390fd5b600060015411610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4990613005565b60405180910390fd5b600254670de0b6b3a764000082610e699190612dbf565b610e739190612d8e565b60076000828254610e849190612c8c565b925050819055506000670de0b6b3a7640000600254600254670de0b6b3a764000085610eb09190612dbf565b610eba9190612d8e565b610ec49190612dbf565b610ece9190612d8e565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610f2f93929190613025565b602060405180830381600087803b158015610f4957600080fd5b505af1158015610f5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f819190612ef7565b507fb7ba5f299d23ea3f21efcb2b2f5e209a9405c1ca1bb1c76dce1e0c39929c0fd94282600254604051610fb79392919061305c565b60405180910390a15050565b600454421015611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff90612e76565b60405180910390fd5b600060015411156110fa5760005b62015180600654611025611909565b61102f9190612d2b565b6110399190612d8e565b8110156110d157600060085490506001546003546201518060085461105e9190612dbf565b6110689190612dbf565b6110729190612d8e565b600860008282546110839190612c8c565b92505081905550806008546110989190612d2b565b6002546110a59190612dbf565b600160008282546110b69190612c8c565b925050819055505080806110c990612ce2565b915050611016565b5062015180806110df611909565b6110e99190612d8e565b6110f39190612dbf565b6006819055505b600061110533612749565b816111109190612c8c565b9050600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548161115d9190612c8c565b905060008111156112ac576000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161120a929190612e96565b602060405180830381600087803b15801561122457600080fd5b505af1158015611238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125c9190612ef7565b503373ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a826040516112a39190612a01565b60405180910390a25b50565b60008060008060005b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561157e574262278d00600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061135857611357612c2e565b5b9060005260206000209060040201600101546113749190612c8c565b111580156113e457506000600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106113d0576113cf612c2e565b5b906000526020600020906004020160000154115b1561156b576000600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061143c5761143b612c2e565b5b9060005260206000209060040201600001549050808561145c9190612c8c565b9450600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106114af576114ae612c2e565b5b906000526020600020906004020160030154846114cc9190612c8c565b9350670de0b6b3a7640000600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061152857611527612c2e565b5b9060005260206000209060040201600201546007546115479190612d2b565b826115529190612dbf565b61155c9190612d8e565b836115679190612c8c565b9250505b808061157690612ce2565b9150506112b8565b5060008311156115b6578082600854856115989190612dbf565b6115a29190612c8c565b6115ac9190612c8c565b93505050506115be565b600093505050505b919050565b60075481565b6115d161291c565b73ffffffffffffffffffffffffffffffffffffffff166115ef612058565b73ffffffffffffffffffffffffffffffffffffffff1614611645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163c906130df565b60405180910390fd5b61164f6000612924565b565b600060045442106116625742611666565b6004545b905090565b6000600154111561175d5760005b62015180600654611688611909565b6116929190612d2b565b61169c9190612d8e565b8110156117345760006008549050600154600354620151806008546116c19190612dbf565b6116cb9190612dbf565b6116d59190612d8e565b600860008282546116e69190612c8c565b92505081905550806008546116fb9190612d2b565b6002546117089190612dbf565b600160008282546117199190612c8c565b9250508190555050808061172c90612ce2565b915050611679565b506201518080611742611909565b61174c9190612d8e565b6117569190612dbf565b6006819055505b600081116117a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117979061314b565b60405180910390fd5b60006117aa611651565b6005546117b79190612d2b565b905080826117c59190612d8e565b600360008282546117d69190612c8c565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd333084858761182a9190612d8e565b6118349190612dbf565b6040518463ffffffff1660e01b815260040161185293929190613025565b602060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a49190612ef7565b507f6c07ee05dcf262f13abf9d87b846ee789d2f90fe991d495acd7d7fc109ee1f558182846118d39190612d8e565b6118dd9190612dbf565b82846118e99190612d8e565b6040516118f7929190612f24565b60405180910390a15050565b60035481565b6000600554421061191c5760055461191e565b425b905090565b60015481565b60045442101561196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590612e76565b60405180910390fd5b60006001541115611a605760005b6201518060065461198b611909565b6119959190612d2b565b61199f9190612d8e565b811015611a375760006008549050600154600354620151806008546119c49190612dbf565b6119ce9190612dbf565b6119d89190612d8e565b600860008282546119e99190612c8c565b92505081905550806008546119fe9190612d2b565b600254611a0b9190612dbf565b60016000828254611a1c9190612c8c565b92505081905550508080611a2f90612ce2565b91505061197c565b506201518080611a45611909565b611a4f9190612d8e565b611a599190612dbf565b6006819055505b60008060005b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015611ded574262278d00600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110611b0657611b05612c2e565b5b906000526020600020906004020160010154611b229190612c8c565b11158015611b9257506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611b7e57611b7d612c2e565b5b906000526020600020906004020160000154115b15611dda576000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611bea57611be9612c2e565b5b90600052602060002090600402016000015490508084611c0a9190612c8c565b9350600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611c5d57611c5c612c2e565b5b90600052602060002090600402016003015483611c7a9190612c8c565b925080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110611cce57611ccd612c2e565b5b90600052602060002090600402016000016000828254611cee9190612d2b565b92505081905550670de0b6b3a7640000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110611d4f57611d4e612c2e565b5b906000526020600020906004020160020154600754611d6e9190612d2b565b82611d799190612dbf565b611d839190612d8e565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dd19190612c8c565b92505081905550505b8080611de590612ce2565b915050611a66565b506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081118015611e425750600083115b15611edb576000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a82604051611ed29190612a01565b60405180910390a25b600083111561204d578260026000828254611ef69190612d2b565b9250508190555060085483611f0b9190612dbf565b60016000828254611f1c9190612d2b565b925050819055506000818360085486611f359190612dbf565b611f3f9190612c8c565b611f499190612c8c565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611fa8929190612e96565b602060405180830381600087803b158015611fc257600080fd5b505af1158015611fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffa9190612ef7565b503373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688286604051612043929190612f24565b60405180910390a2505b505050565b60085481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6004544210156120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd90612e76565b60405180910390fd5b600060015411156121b85760005b620151806006546120e3611909565b6120ed9190612d2b565b6120f79190612d8e565b81101561218f57600060085490506001546003546201518060085461211c9190612dbf565b6121269190612dbf565b6121309190612d8e565b600860008282546121419190612c8c565b92505081905550806008546121569190612d2b565b6002546121639190612dbf565b600160008282546121749190612c8c565b9250508190555050808061218790612ce2565b9150506120d4565b50620151808061219d611909565b6121a79190612d8e565b6121b19190612dbf565b6006819055505b683635c9adc5dea00000811015612204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fb906131b7565b60405180910390fd5b600854811015612249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224090613223565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405280600854846122a19190612d8e565b81526020014281526020016007548152602001600854600854856122c59190612d8e565b6122cf9190612dbf565b846122da9190612d2b565b81525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000015560208201518160010155604082015181600201556060820151816003015550506008548161233e9190612d8e565b6002600082825461234f9190612c8c565b92505081905550600854600854826123679190612d8e565b6123719190612dbf565b600160008282546123829190612c8c565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016123e893929190613025565b602060405180830381600087803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243a9190612ef7565b503373ffffffffffffffffffffffffffffffffffffffff167f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e82600854846124829190612d8e565b426040516124929392919061305c565b60405180910390a250565b60055481565b60065481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060005b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561262f57670de0b6b3a7640000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061257957612578612c2e565b5b9060005260206000209060040201600201546007546125989190612d2b565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106125e9576125e8612c2e565b5b9060005260206000209060040201600001546126059190612dbf565b61260f9190612d8e565b8261261a9190612c8c565b9150808061262790612ce2565b9150506124d5565b5080915050919050565b61264161291c565b73ffffffffffffffffffffffffffffffffffffffff1661265f612058565b73ffffffffffffffffffffffffffffffffffffffff16146126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac906130df565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271c906132b5565b60405180910390fd5b61272e81612924565b50565b600a6020528060005260406000206000915090505481565b60008060005b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561291257670de0b6b3a7640000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106127f3576127f2612c2e565b5b9060005260206000209060040201600201546007546128129190612d2b565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061286357612862612c2e565b5b90600052602060002090600402016000015461287f9190612dbf565b6128899190612d8e565b826128949190612c8c565b9150600754600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106128ea576128e9612c2e565b5b906000526020600020906004020160020181905550808061290a90612ce2565b91505061274f565b5080915050919050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000819050919050565b6129fb816129e8565b82525050565b6000602082019050612a1660008301846129f2565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a4c82612a21565b9050919050565b612a5c81612a41565b8114612a6757600080fd5b50565b600081359050612a7981612a53565b92915050565b612a88816129e8565b8114612a9357600080fd5b50565b600081359050612aa581612a7f565b92915050565b60008060408385031215612ac257612ac1612a1c565b5b6000612ad085828601612a6a565b9250506020612ae185828601612a96565b9150509250929050565b6000608082019050612b0060008301876129f2565b612b0d60208301866129f2565b612b1a60408301856129f2565b612b2760608301846129f2565b95945050505050565b600060208284031215612b4657612b45612a1c565b5b6000612b5484828501612a6a565b91505092915050565b600060208284031215612b7357612b72612a1c565b5b6000612b8184828501612a96565b91505092915050565b612b9381612a41565b82525050565b6000602082019050612bae6000830184612b8a565b92915050565b6000819050919050565b6000612bd9612bd4612bcf84612a21565b612bb4565b612a21565b9050919050565b6000612beb82612bbe565b9050919050565b6000612bfd82612be0565b9050919050565b612c0d81612bf2565b82525050565b6000602082019050612c286000830184612c04565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c97826129e8565b9150612ca2836129e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cd757612cd6612c5d565b5b828201905092915050565b6000612ced826129e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612d2057612d1f612c5d565b5b600182019050919050565b6000612d36826129e8565b9150612d41836129e8565b925082821015612d5457612d53612c5d565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612d99826129e8565b9150612da4836129e8565b925082612db457612db3612d5f565b5b828204905092915050565b6000612dca826129e8565b9150612dd5836129e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e0e57612e0d612c5d565b5b828202905092915050565b600082825260208201905092915050565b7f5374616b6520706572696f64206861736e277420737461727465640000000000600082015250565b6000612e60601b83612e19565b9150612e6b82612e2a565b602082019050919050565b60006020820190508181036000830152612e8f81612e53565b9050919050565b6000604082019050612eab6000830185612b8a565b612eb860208301846129f2565b9392505050565b60008115159050919050565b612ed481612ebf565b8114612edf57600080fd5b50565b600081519050612ef181612ecb565b92915050565b600060208284031215612f0d57612f0c612a1c565b5b6000612f1b84828501612ee2565b91505092915050565b6000604082019050612f3960008301856129f2565b612f4660208301846129f2565b9392505050565b7f43616e6e6f742064697374726962757465203020666565000000000000000000600082015250565b6000612f83601783612e19565b9150612f8e82612f4d565b602082019050919050565b60006020820190508181036000830152612fb281612f76565b9050919050565b7f4e6f6f6e6520746f20646973747269627574652066656520746f000000000000600082015250565b6000612fef601a83612e19565b9150612ffa82612fb9565b602082019050919050565b6000602082019050818103600083015261301e81612fe2565b9050919050565b600060608201905061303a6000830186612b8a565b6130476020830185612b8a565b61305460408301846129f2565b949350505050565b600060608201905061307160008301866129f2565b61307e60208301856129f2565b61308b60408301846129f2565b949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006130c9602083612e19565b91506130d482613093565b602082019050919050565b600060208201905081810360008301526130f8816130bc565b9050919050565b7f43616e6e6f742061646420302072657761726400000000000000000000000000600082015250565b6000613135601383612e19565b9150613140826130ff565b602082019050919050565b6000602082019050818103600083015261316481613128565b9050919050565b7f5374616b6520746f6f20736d616c6c0000000000000000000000000000000000600082015250565b60006131a1600f83612e19565b91506131ac8261316b565b602082019050919050565b600060208201905081810360008301526131d081613194565b9050919050565b7f5374616b6520736d616c6c6572207468616e20736861726520776f7274680000600082015250565b600061320d601e83612e19565b9150613218826131d7565b602082019050919050565b6000602082019050818103600083015261323c81613200565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061329f602683612e19565b91506132aa82613243565b604082019050919050565b600060208201905081810360008301526132ce81613292565b905091905056fea2646970667358221220e3e2895d7f05eab7fae9eaa3b9274f862757bf6e335c2b9e9a0b5c4102906b8064736f6c634300080900330000000000000000000000009d7630adf7ab0b0cb00af747db76864df0ec82e4000000000000000000000000000000000000000000000000000000006203f3100000000000000000000000000000000000000000000000000000000063e52690
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806374de4ec4116100f9578063b6b55f2511610097578063cc7a262e11610071578063cc7a262e1461048e578063d01bddf4146104ac578063f2fde38b146104dc578063faaebd21146104f8576101c4565b8063b6b55f2514610436578063c24a0f8b14610452578063c8f33c9114610470576101c4565b8063817b1cd2116100d3578063817b1cd2146103d2578063853828b6146103f0578063897abdbb146103fa5780638da5cb5b14610418576101c4565b806374de4ec41461037a5780637b0a47ee1461039657806380faa57d146103b4576101c4565b80633a98ef3911610166578063670060d411610140578063670060d4146103045780636fc8552e14610334578063715018a61461035257806374d5ab131461035c576101c4565b80633a98ef39146102c0578063462c5313146102de5780634e71d92d146102fa576101c4565b806327d922d3116101a257806327d922d3146102385780632ce3f9a7146102685780632e1a7d4d146102865780633296607f146102a2576101c4565b806308dbbb03146101c95780631820cabb146101e757806321ce919d14610205575b600080fd5b6101d1610528565b6040516101de9190612a01565b60405180910390f35b6101ef610535565b6040516101fc9190612a01565b60405180910390f35b61021f600480360381019061021a9190612aab565b61053c565b60405161022f9493929190612aeb565b60405180910390f35b610252600480360381019061024d9190612b30565b610589565b60405161025f9190612a01565b60405180910390f35b610270610666565b60405161027d9190612a01565b60405180910390f35b6102a0600480360381019061029b9190612b5d565b610728565b005b6102aa610dbe565b6040516102b79190612a01565b60405180910390f35b6102c8610dc4565b6040516102d59190612a01565b60405180910390f35b6102f860048036038101906102f39190612b5d565b610dca565b005b610302610fc3565b005b61031e60048036038101906103199190612b30565b6112af565b60405161032b9190612a01565b60405180910390f35b61033c6115c3565b6040516103499190612a01565b60405180910390f35b61035a6115c9565b005b610364611651565b6040516103719190612a01565b60405180910390f35b610394600480360381019061038f9190612b5d565b61166b565b005b61039e611903565b6040516103ab9190612a01565b60405180910390f35b6103bc611909565b6040516103c99190612a01565b60405180910390f35b6103da611923565b6040516103e79190612a01565b60405180910390f35b6103f8611929565b005b610402612052565b60405161040f9190612a01565b60405180910390f35b610420612058565b60405161042d9190612b99565b60405180910390f35b610450600480360381019061044b9190612b5d565b612081565b005b61045a61249d565b6040516104679190612a01565b60405180910390f35b6104786124a3565b6040516104859190612a01565b60405180910390f35b6104966124a9565b6040516104a39190612c13565b60405180910390f35b6104c660048036038101906104c19190612b30565b6124cf565b6040516104d39190612a01565b60405180910390f35b6104f660048036038101906104f19190612b30565b612639565b005b610512600480360381019061050d9190612b30565b612731565b60405161051f9190612a01565b60405180910390f35b683635c9adc5dea0000081565b62278d0081565b600b602052816000526040600020818154811061055857600080fd5b9060005260206000209060040201600091509150508060000154908060010154908060020154908060030154905084565b60008060005b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561065c57600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061062a57610629612c2e565b5b906000526020600020906004020160000154826106479190612c8c565b9150808061065490612ce2565b91505061058f565b5080915050919050565b60008060085490506000600154905060008111156107205760005b62015180600654610690611909565b61069a9190612d2b565b6106a49190612d8e565b81101561071e5760008390508260035462015180866106c39190612dbf565b6106cd9190612dbf565b6106d79190612d8e565b846106e29190612c8c565b935080846106f09190612d2b565b6002546106fd9190612dbf565b836107089190612c8c565b925050808061071690612ce2565b915050610681565b505b819250505090565b60045442101561076d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076490612e76565b60405180910390fd5b6000600154111561085f5760005b6201518060065461078a611909565b6107949190612d2b565b61079e9190612d8e565b8110156108365760006008549050600154600354620151806008546107c39190612dbf565b6107cd9190612dbf565b6107d79190612d8e565b600860008282546107e89190612c8c565b92505081905550806008546107fd9190612d2b565b60025461080a9190612dbf565b6001600082825461081b9190612c8c565b9250508190555050808061082e90612ce2565b91505061077b565b506201518080610844611909565b61084e9190612d8e565b6108589190612dbf565b6006819055505b4262278d00600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106108b5576108b4612c2e565b5b9060005260206000209060040201600101546108d19190612c8c565b11156108dc57600080fd5b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061092f5761092e612c2e565b5b9060005260206000209060040201600001541161094b57600080fd5b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061099e5761099d612c2e565b5b906000526020600020906004020160000154905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110610a0457610a03612c2e565b5b90600052602060002090600402016000016000828254610a249190612d2b565b92505081905550670de0b6b3a7640000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110610a8557610a84612c2e565b5b906000526020600020906004020160020154600754610aa49190612d2b565b82610aaf9190612dbf565b610ab99190612d8e565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b079190612c8c565b925050819055506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115610bef576000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a82604051610be69190612a01565b60405180910390a25b8160026000828254610c019190612d2b565b9250508190555060085482610c169190612dbf565b60016000828254610c279190612d2b565b92505081905550600081600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110610c8257610c81612c2e565b5b90600052602060002090600402016003015460085485610ca29190612dbf565b610cac9190612c8c565b610cb69190612c8c565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610d15929190612e96565b602060405180830381600087803b158015610d2f57600080fd5b505af1158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d679190612ef7565b503373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688285604051610db0929190612f24565b60405180910390a250505050565b60045481565b60025481565b60008111610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490612f99565b60405180910390fd5b600060015411610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4990613005565b60405180910390fd5b600254670de0b6b3a764000082610e699190612dbf565b610e739190612d8e565b60076000828254610e849190612c8c565b925050819055506000670de0b6b3a7640000600254600254670de0b6b3a764000085610eb09190612dbf565b610eba9190612d8e565b610ec49190612dbf565b610ece9190612d8e565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401610f2f93929190613025565b602060405180830381600087803b158015610f4957600080fd5b505af1158015610f5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f819190612ef7565b507fb7ba5f299d23ea3f21efcb2b2f5e209a9405c1ca1bb1c76dce1e0c39929c0fd94282600254604051610fb79392919061305c565b60405180910390a15050565b600454421015611008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fff90612e76565b60405180910390fd5b600060015411156110fa5760005b62015180600654611025611909565b61102f9190612d2b565b6110399190612d8e565b8110156110d157600060085490506001546003546201518060085461105e9190612dbf565b6110689190612dbf565b6110729190612d8e565b600860008282546110839190612c8c565b92505081905550806008546110989190612d2b565b6002546110a59190612dbf565b600160008282546110b69190612c8c565b925050819055505080806110c990612ce2565b915050611016565b5062015180806110df611909565b6110e99190612d8e565b6110f39190612dbf565b6006819055505b600061110533612749565b816111109190612c8c565b9050600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548161115d9190612c8c565b905060008111156112ac576000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161120a929190612e96565b602060405180830381600087803b15801561122457600080fd5b505af1158015611238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125c9190612ef7565b503373ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a826040516112a39190612a01565b60405180910390a25b50565b60008060008060005b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561157e574262278d00600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061135857611357612c2e565b5b9060005260206000209060040201600101546113749190612c8c565b111580156113e457506000600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106113d0576113cf612c2e565b5b906000526020600020906004020160000154115b1561156b576000600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061143c5761143b612c2e565b5b9060005260206000209060040201600001549050808561145c9190612c8c565b9450600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106114af576114ae612c2e565b5b906000526020600020906004020160030154846114cc9190612c8c565b9350670de0b6b3a7640000600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061152857611527612c2e565b5b9060005260206000209060040201600201546007546115479190612d2b565b826115529190612dbf565b61155c9190612d8e565b836115679190612c8c565b9250505b808061157690612ce2565b9150506112b8565b5060008311156115b6578082600854856115989190612dbf565b6115a29190612c8c565b6115ac9190612c8c565b93505050506115be565b600093505050505b919050565b60075481565b6115d161291c565b73ffffffffffffffffffffffffffffffffffffffff166115ef612058565b73ffffffffffffffffffffffffffffffffffffffff1614611645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163c906130df565b60405180910390fd5b61164f6000612924565b565b600060045442106116625742611666565b6004545b905090565b6000600154111561175d5760005b62015180600654611688611909565b6116929190612d2b565b61169c9190612d8e565b8110156117345760006008549050600154600354620151806008546116c19190612dbf565b6116cb9190612dbf565b6116d59190612d8e565b600860008282546116e69190612c8c565b92505081905550806008546116fb9190612d2b565b6002546117089190612dbf565b600160008282546117199190612c8c565b9250508190555050808061172c90612ce2565b915050611679565b506201518080611742611909565b61174c9190612d8e565b6117569190612dbf565b6006819055505b600081116117a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117979061314b565b60405180910390fd5b60006117aa611651565b6005546117b79190612d2b565b905080826117c59190612d8e565b600360008282546117d69190612c8c565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd333084858761182a9190612d8e565b6118349190612dbf565b6040518463ffffffff1660e01b815260040161185293929190613025565b602060405180830381600087803b15801561186c57600080fd5b505af1158015611880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a49190612ef7565b507f6c07ee05dcf262f13abf9d87b846ee789d2f90fe991d495acd7d7fc109ee1f558182846118d39190612d8e565b6118dd9190612dbf565b82846118e99190612d8e565b6040516118f7929190612f24565b60405180910390a15050565b60035481565b6000600554421061191c5760055461191e565b425b905090565b60015481565b60045442101561196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590612e76565b60405180910390fd5b60006001541115611a605760005b6201518060065461198b611909565b6119959190612d2b565b61199f9190612d8e565b811015611a375760006008549050600154600354620151806008546119c49190612dbf565b6119ce9190612dbf565b6119d89190612d8e565b600860008282546119e99190612c8c565b92505081905550806008546119fe9190612d2b565b600254611a0b9190612dbf565b60016000828254611a1c9190612c8c565b92505081905550508080611a2f90612ce2565b91505061197c565b506201518080611a45611909565b611a4f9190612d8e565b611a599190612dbf565b6006819055505b60008060005b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015611ded574262278d00600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110611b0657611b05612c2e565b5b906000526020600020906004020160010154611b229190612c8c565b11158015611b9257506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611b7e57611b7d612c2e565b5b906000526020600020906004020160000154115b15611dda576000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611bea57611be9612c2e565b5b90600052602060002090600402016000015490508084611c0a9190612c8c565b9350600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611c5d57611c5c612c2e565b5b90600052602060002090600402016003015483611c7a9190612c8c565b925080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110611cce57611ccd612c2e565b5b90600052602060002090600402016000016000828254611cee9190612d2b565b92505081905550670de0b6b3a7640000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110611d4f57611d4e612c2e565b5b906000526020600020906004020160020154600754611d6e9190612d2b565b82611d799190612dbf565b611d839190612d8e565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dd19190612c8c565b92505081905550505b8080611de590612ce2565b915050611a66565b506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081118015611e425750600083115b15611edb576000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a82604051611ed29190612a01565b60405180910390a25b600083111561204d578260026000828254611ef69190612d2b565b9250508190555060085483611f0b9190612dbf565b60016000828254611f1c9190612d2b565b925050819055506000818360085486611f359190612dbf565b611f3f9190612c8c565b611f499190612c8c565b9050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611fa8929190612e96565b602060405180830381600087803b158015611fc257600080fd5b505af1158015611fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffa9190612ef7565b503373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688286604051612043929190612f24565b60405180910390a2505b505050565b60085481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6004544210156120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd90612e76565b60405180910390fd5b600060015411156121b85760005b620151806006546120e3611909565b6120ed9190612d2b565b6120f79190612d8e565b81101561218f57600060085490506001546003546201518060085461211c9190612dbf565b6121269190612dbf565b6121309190612d8e565b600860008282546121419190612c8c565b92505081905550806008546121569190612d2b565b6002546121639190612dbf565b600160008282546121749190612c8c565b9250508190555050808061218790612ce2565b9150506120d4565b50620151808061219d611909565b6121a79190612d8e565b6121b19190612dbf565b6006819055505b683635c9adc5dea00000811015612204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fb906131b7565b60405180910390fd5b600854811015612249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224090613223565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405280600854846122a19190612d8e565b81526020014281526020016007548152602001600854600854856122c59190612d8e565b6122cf9190612dbf565b846122da9190612d2b565b81525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000015560208201518160010155604082015181600201556060820151816003015550506008548161233e9190612d8e565b6002600082825461234f9190612c8c565b92505081905550600854600854826123679190612d8e565b6123719190612dbf565b600160008282546123829190612c8c565b92505081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016123e893929190613025565b602060405180830381600087803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243a9190612ef7565b503373ffffffffffffffffffffffffffffffffffffffff167f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e82600854846124829190612d8e565b426040516124929392919061305c565b60405180910390a250565b60055481565b60065481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060005b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561262f57670de0b6b3a7640000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061257957612578612c2e565b5b9060005260206000209060040201600201546007546125989190612d2b565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106125e9576125e8612c2e565b5b9060005260206000209060040201600001546126059190612dbf565b61260f9190612d8e565b8261261a9190612c8c565b9150808061262790612ce2565b9150506124d5565b5080915050919050565b61264161291c565b73ffffffffffffffffffffffffffffffffffffffff1661265f612058565b73ffffffffffffffffffffffffffffffffffffffff16146126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac906130df565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271c906132b5565b60405180910390fd5b61272e81612924565b50565b600a6020528060005260406000206000915090505481565b60008060005b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561291257670de0b6b3a7640000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106127f3576127f2612c2e565b5b9060005260206000209060040201600201546007546128129190612d2b565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061286357612862612c2e565b5b90600052602060002090600402016000015461287f9190612dbf565b6128899190612d8e565b826128949190612c8c565b9150600754600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106128ea576128e9612c2e565b5b906000526020600020906004020160020181905550808061290a90612ce2565b91505061274f565b5080915050919050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000819050919050565b6129fb816129e8565b82525050565b6000602082019050612a1660008301846129f2565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a4c82612a21565b9050919050565b612a5c81612a41565b8114612a6757600080fd5b50565b600081359050612a7981612a53565b92915050565b612a88816129e8565b8114612a9357600080fd5b50565b600081359050612aa581612a7f565b92915050565b60008060408385031215612ac257612ac1612a1c565b5b6000612ad085828601612a6a565b9250506020612ae185828601612a96565b9150509250929050565b6000608082019050612b0060008301876129f2565b612b0d60208301866129f2565b612b1a60408301856129f2565b612b2760608301846129f2565b95945050505050565b600060208284031215612b4657612b45612a1c565b5b6000612b5484828501612a6a565b91505092915050565b600060208284031215612b7357612b72612a1c565b5b6000612b8184828501612a96565b91505092915050565b612b9381612a41565b82525050565b6000602082019050612bae6000830184612b8a565b92915050565b6000819050919050565b6000612bd9612bd4612bcf84612a21565b612bb4565b612a21565b9050919050565b6000612beb82612bbe565b9050919050565b6000612bfd82612be0565b9050919050565b612c0d81612bf2565b82525050565b6000602082019050612c286000830184612c04565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612c97826129e8565b9150612ca2836129e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612cd757612cd6612c5d565b5b828201905092915050565b6000612ced826129e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612d2057612d1f612c5d565b5b600182019050919050565b6000612d36826129e8565b9150612d41836129e8565b925082821015612d5457612d53612c5d565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612d99826129e8565b9150612da4836129e8565b925082612db457612db3612d5f565b5b828204905092915050565b6000612dca826129e8565b9150612dd5836129e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e0e57612e0d612c5d565b5b828202905092915050565b600082825260208201905092915050565b7f5374616b6520706572696f64206861736e277420737461727465640000000000600082015250565b6000612e60601b83612e19565b9150612e6b82612e2a565b602082019050919050565b60006020820190508181036000830152612e8f81612e53565b9050919050565b6000604082019050612eab6000830185612b8a565b612eb860208301846129f2565b9392505050565b60008115159050919050565b612ed481612ebf565b8114612edf57600080fd5b50565b600081519050612ef181612ecb565b92915050565b600060208284031215612f0d57612f0c612a1c565b5b6000612f1b84828501612ee2565b91505092915050565b6000604082019050612f3960008301856129f2565b612f4660208301846129f2565b9392505050565b7f43616e6e6f742064697374726962757465203020666565000000000000000000600082015250565b6000612f83601783612e19565b9150612f8e82612f4d565b602082019050919050565b60006020820190508181036000830152612fb281612f76565b9050919050565b7f4e6f6f6e6520746f20646973747269627574652066656520746f000000000000600082015250565b6000612fef601a83612e19565b9150612ffa82612fb9565b602082019050919050565b6000602082019050818103600083015261301e81612fe2565b9050919050565b600060608201905061303a6000830186612b8a565b6130476020830185612b8a565b61305460408301846129f2565b949350505050565b600060608201905061307160008301866129f2565b61307e60208301856129f2565b61308b60408301846129f2565b949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006130c9602083612e19565b91506130d482613093565b602082019050919050565b600060208201905081810360008301526130f8816130bc565b9050919050565b7f43616e6e6f742061646420302072657761726400000000000000000000000000600082015250565b6000613135601383612e19565b9150613140826130ff565b602082019050919050565b6000602082019050818103600083015261316481613128565b9050919050565b7f5374616b6520746f6f20736d616c6c0000000000000000000000000000000000600082015250565b60006131a1600f83612e19565b91506131ac8261316b565b602082019050919050565b600060208201905081810360008301526131d081613194565b9050919050565b7f5374616b6520736d616c6c6572207468616e20736861726520776f7274680000600082015250565b600061320d601e83612e19565b9150613218826131d7565b602082019050919050565b6000602082019050818103600083015261323c81613200565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061329f602683612e19565b91506132aa82613243565b604082019050919050565b600060208201905081810360008301526132ce81613292565b905091905056fea2646970667358221220e3e2895d7f05eab7fae9eaa3b9274f862757bf6e335c2b9e9a0b5c4102906b8064736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009d7630adf7ab0b0cb00af747db76864df0ec82e4000000000000000000000000000000000000000000000000000000006203f3100000000000000000000000000000000000000000000000000000000063e52690
-----Decoded View---------------
Arg [0] : _stakedToken (address): 0x9d7630aDF7ab0b0CB00Af747Db76864df0EC82E4
Arg [1] : _beginDate (uint256): 1644426000
Arg [2] : _endDate (uint256): 1675962000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000009d7630adf7ab0b0cb00af747db76864df0ec82e4
Arg [1] : 000000000000000000000000000000000000000000000000000000006203f310
Arg [2] : 0000000000000000000000000000000000000000000000000000000063e52690
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.005097 | 558,671,377.0016 | $2,847,369.23 |
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.