More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 434 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer All Tok... | 18741050 | 330 days ago | IN | 0 ETH | 0.0011476 | ||||
Receive Reward | 17052290 | 567 days ago | IN | 0 ETH | 0.00330357 | ||||
Receive Reward | 16888163 | 590 days ago | IN | 0 ETH | 0.00123185 | ||||
Receive Reward | 16515248 | 642 days ago | IN | 0 ETH | 0.00275437 | ||||
Receive Reward | 16513242 | 643 days ago | IN | 0 ETH | 0.00455186 | ||||
Receive Reward | 16335471 | 667 days ago | IN | 0 ETH | 0.00378036 | ||||
Receive Reward | 16335467 | 667 days ago | IN | 0 ETH | 0.00416674 | ||||
Receive Reward | 16335462 | 667 days ago | IN | 0 ETH | 0.00427641 | ||||
Receive Reward | 16335431 | 667 days ago | IN | 0 ETH | 0.00401967 | ||||
Receive Reward | 16335427 | 667 days ago | IN | 0 ETH | 0.00387262 | ||||
Receive Reward | 16335423 | 667 days ago | IN | 0 ETH | 0.00474097 | ||||
Receive Reward | 16331863 | 668 days ago | IN | 0 ETH | 0.00159987 | ||||
Receive Reward | 16234344 | 682 days ago | IN | 0 ETH | 0.0020395 | ||||
Receive Reward | 16138024 | 695 days ago | IN | 0 ETH | 0.00177103 | ||||
Receive Reward | 16110523 | 699 days ago | IN | 0 ETH | 0.00131032 | ||||
Receive Reward | 15946669 | 722 days ago | IN | 0 ETH | 0.00196329 | ||||
Receive Reward | 15924591 | 725 days ago | IN | 0 ETH | 0.00162932 | ||||
Receive Reward | 15880241 | 731 days ago | IN | 0 ETH | 0.00109068 | ||||
Receive Reward | 15758641 | 748 days ago | IN | 0 ETH | 0.00196121 | ||||
Receive Reward | 15758640 | 748 days ago | IN | 0 ETH | 0.00212073 | ||||
Receive Reward | 15711321 | 755 days ago | IN | 0 ETH | 0.00300719 | ||||
Receive Reward | 15692491 | 757 days ago | IN | 0 ETH | 0.00100708 | ||||
Receive Reward | 15541029 | 778 days ago | IN | 0 ETH | 0.00143394 | ||||
Receive Reward | 15541014 | 778 days ago | IN | 0 ETH | 0.00153372 | ||||
Receive Reward | 15540992 | 778 days ago | IN | 0 ETH | 0.00183449 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
RewardProgram
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
No with 200 runs
Other Settings:
constantinople EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; import "openzeppelin-solidity/contracts/access/Ownable.sol"; contract RewardProgram is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; bytes32 public merkleRoot; bool public cancelable; IERC20 public tokenContract; uint256 public fullRewardTimeoutPeriod = 180 days; uint256 public shortRewardTimeoutPeriod = 30 days; uint256 public shortRewardPercentage = 2; uint256 public merkleRootLastUpdateTime; uint256 public merkleRootLastUpdateBlock; struct User { string sidechainAddress; bytes signature; string message; } struct AmountWithTime { uint amount; uint timestamp; bool isWithdrowedByNominator; bool isFullWithdrawal; } mapping(address => uint256) public lastRewardRequestTime; mapping(address => AmountWithTime[]) public requestedRewards; mapping(address => AmountWithTime[]) public receivedRewards; mapping(address => mapping(string => User)) private ethereumAddressOnSidechainAddress; mapping(string => mapping(address => User)) private sidechainAddressOnEthereumAddress; modifier isCancelable() { require(!cancelable, "forbidden action"); _; } event AddLink (address indexed ethereumAddress, string target, bytes signature, string message); event RequestReward (address target, uint amount, bool isFullWithdrawal); event ReceiveReward (address target, uint amount, bool indexed isWithdrowedByNominator); event UpdateMerkleRoot (bytes32 merkleRoot); function sidechainUser(address ethereumAddress, string memory target) public view returns (User memory) { return ethereumAddressOnSidechainAddress[ethereumAddress][target]; } function ethereumUser(address ethereumAddress, string memory target) public view returns (User memory) { return sidechainAddressOnEthereumAddress[target][ethereumAddress]; } function contractTokenBalance() public view returns(uint) { return tokenContract.balanceOf(address(this)); } function getRequestedRewardArray(address target) public view returns(AmountWithTime[] memory) { return requestedRewards[target]; } function getReceivedRewardArray(address target) public view returns(AmountWithTime[] memory) { return receivedRewards[target]; } constructor(address _tokenContract, bool _cancelable) public { tokenContract = IERC20(_tokenContract); cancelable = _cancelable; } function setCancelable(bool _cancelable) public onlyOwner { cancelable = _cancelable; } function setFullRewardTimeoutPeriod(uint256 period) public onlyOwner { fullRewardTimeoutPeriod = period; } function setShortRewardTimeoutPeriod(uint256 period) public onlyOwner { shortRewardTimeoutPeriod = period; } function setShortRewardPercentage(uint256 percentage) public onlyOwner { shortRewardPercentage = percentage; } function linkAddresses(string memory target, bytes memory signature, string memory message) public { User memory user = User(target, signature, message); ethereumAddressOnSidechainAddress[msg.sender][target] = user; sidechainAddressOnEthereumAddress[target][msg.sender] = user; emit AddLink(msg.sender, target, signature, message); } function setRoot(bytes32 _merkleRoot, uint256 amount) public onlyOwner { address ownContractAddress = address(this); if (amount > 0) { require(tokenContract.allowance(owner(), ownContractAddress) >= amount, "approved balance not enough"); tokenContract.transferFrom(owner(), ownContractAddress, amount); } merkleRoot = _merkleRoot; merkleRootLastUpdateTime = block.timestamp; merkleRootLastUpdateBlock = block.number; cancelable = false; emit UpdateMerkleRoot(_merkleRoot); } function requestReward(uint256 amount, bool isFullWithdrawal) internal returns (bool) { uint timestamp = block.timestamp; lastRewardRequestTime[msg.sender] = timestamp; requestedRewards[msg.sender].push(AmountWithTime(amount, timestamp, false, isFullWithdrawal)); emit RequestReward(msg.sender, amount, isFullWithdrawal); return true; } function calculateShortAmount(uint amount) internal view returns(uint) { return amount.mul(shortRewardPercentage).div(10); } function getRequestAmountWithError(address target, uint item) internal view returns(uint amount, uint timestamp, bool isWithdrowedByNominator, bool isFullWithdrawal) { require(item < requestedRewards[target].length, "item is not exist"); AmountWithTime storage request = requestedRewards[target][item]; uint256 fullAmount = request.amount; uint256 fullTimestamp = request.timestamp; bool fullWithdrawal = request.isFullWithdrawal; uint256 timePeriod = fullWithdrawal ? fullRewardTimeoutPeriod : shortRewardTimeoutPeriod; require(fullAmount > 0, "item is empty"); require(block.timestamp >= fullTimestamp + timePeriod, "expiration period is not over"); amount = fullAmount; timestamp = request.timestamp; isWithdrowedByNominator = request.isWithdrowedByNominator; isFullWithdrawal = fullWithdrawal; } function transferOrApproveRewardToAddress(address target, uint amount, bool isWithdrowedByNominator, bool isApprove, bool isFullWithdrawal) internal { receivedRewards[target].push(AmountWithTime(amount, block.timestamp, isWithdrowedByNominator, isFullWithdrawal)); if (isApprove) { tokenContract.approve(target, amount); } else { tokenContract.transfer(target, amount); } emit ReceiveReward(target, amount, isWithdrowedByNominator); } function receiveResidue(address target, uint item, address receiver) public onlyOwner { (uint amount, uint timestamp, bool isWithdrowedByNominator, bool isFullWithdrawal) = getRequestAmountWithError(target, item); require(isWithdrowedByNominator, "reward is not received by user"); require(contractTokenBalance() >= amount, "not enough balance"); delete requestedRewards[target][item]; bool isApprove = true; transferOrApproveRewardToAddress(receiver, amount, false, isApprove, isFullWithdrawal); } function receiveReward(uint item) public { address target = msg.sender; (uint fullAmount, uint timestamp, bool isWithdrowedByNominator, bool isFullWithdrawal) = getRequestAmountWithError(target, item); require(!isWithdrowedByNominator, "reward already received"); uint amount = fullAmount; uint residue = 0; if (!isFullWithdrawal) { amount = calculateShortAmount(fullAmount); residue = fullAmount.sub(amount); } require(contractTokenBalance() >= amount, "not enough balance"); AmountWithTime storage request = requestedRewards[target][item]; if (!isFullWithdrawal) { request.isWithdrowedByNominator = true; request.amount = residue; request.isFullWithdrawal = true; request.timestamp = block.timestamp; } else { delete requestedRewards[target][item]; } bool isApprove = false; transferOrApproveRewardToAddress(target, amount, true, isApprove, isFullWithdrawal); } function transferAllTokensToOwner() public onlyOwner returns(bool) { tokenContract.transfer(owner(), contractTokenBalance()); return true; } function leafFromAddressAndAmount(address _a, uint256 _n) internal pure returns(bytes32) { return keccak256(abi.encodePacked(_a, _n)); } function checkProof(bytes32[] memory proof, bytes32 hash) internal view returns (bool) { bytes32 el; bytes32 h = hash; for (uint i = 0; i <= proof.length - 1; i += 1) { el = proof[i]; if (h <= el) { h = keccak256(abi.encodePacked(h, el)); } else { h = keccak256(abi.encodePacked(el, h)); } } return h == merkleRoot; } function requestTokensByMerkleProof(bytes32[] memory _proof, uint256 _amount, bool _isFullWithdrawal) public isCancelable returns(bool) { require(lastRewardRequestTime[msg.sender] < merkleRootLastUpdateTime, "already withdrawn in this period"); require(_amount > 0, "amount should be not zero"); if (!_isFullWithdrawal) { require(calculateShortAmount(_amount) > 0, "amount too low"); } require(checkProof(_proof, leafFromAddressAndAmount(msg.sender, _amount)), "proof is not correct"); return requestReward(_amount, _isFullWithdrawal); } }
// 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.0 <0.8.0; import "../GSN/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ 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 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, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// 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.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); } 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); } } } }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "constantinople", "libraries": { "": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"bool","name":"_cancelable","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"ethereumAddress","type":"address"},{"indexed":false,"internalType":"string","name":"target","type":"string"},{"indexed":false,"internalType":"bytes","name":"signature","type":"bytes"},{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"AddLink","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":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"isWithdrowedByNominator","type":"bool"}],"name":"ReceiveReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isFullWithdrawal","type":"bool"}],"name":"RequestReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"UpdateMerkleRoot","type":"event"},{"inputs":[],"name":"cancelable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ethereumAddress","type":"address"},{"internalType":"string","name":"target","type":"string"}],"name":"ethereumUser","outputs":[{"components":[{"internalType":"string","name":"sidechainAddress","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"message","type":"string"}],"internalType":"struct RewardProgram.User","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fullRewardTimeoutPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"getReceivedRewardArray","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"isWithdrowedByNominator","type":"bool"},{"internalType":"bool","name":"isFullWithdrawal","type":"bool"}],"internalType":"struct RewardProgram.AmountWithTime[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"getRequestedRewardArray","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"isWithdrowedByNominator","type":"bool"},{"internalType":"bool","name":"isFullWithdrawal","type":"bool"}],"internalType":"struct RewardProgram.AmountWithTime[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastRewardRequestTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"target","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"message","type":"string"}],"name":"linkAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootLastUpdateBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootLastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"item","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"receiveResidue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"item","type":"uint256"}],"name":"receiveReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"receivedRewards","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"isWithdrowedByNominator","type":"bool"},{"internalType":"bool","name":"isFullWithdrawal","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_isFullWithdrawal","type":"bool"}],"name":"requestTokensByMerkleProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"requestedRewards","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"isWithdrowedByNominator","type":"bool"},{"internalType":"bool","name":"isFullWithdrawal","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_cancelable","type":"bool"}],"name":"setCancelable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setFullRewardTimeoutPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"setShortRewardPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setShortRewardTimeoutPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shortRewardPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shortRewardTimeoutPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ethereumAddress","type":"address"},{"internalType":"string","name":"target","type":"string"}],"name":"sidechainUser","outputs":[{"components":[{"internalType":"string","name":"sidechainAddress","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"message","type":"string"}],"internalType":"struct RewardProgram.User","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenContract","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferAllTokensToOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405262ed4e0060035562278d0060045560026005553480156200002457600080fd5b5060405162003f6f38038062003f6f83398181016040528101906200004a919062000193565b60006200005c6200015d60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548160ff021916908315150217905550505062000248565b600033905090565b600081519050620001768162000214565b92915050565b6000815190506200018d816200022e565b92915050565b60008060408385031215620001a757600080fd5b6000620001b78582860162000165565b9250506020620001ca858286016200017c565b9150509250929050565b6000620001e182620001f4565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6200021f81620001d4565b81146200022b57600080fd5b50565b6200023981620001e8565b81146200024557600080fd5b50565b613d1780620002586000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80639ce94d3f11610104578063db8fdda0116100a2578063eee5656411610071578063eee5656414610524578063f2fde38b14610542578063f4660dd71461055e578063f5cc8e551461057a576101cf565b8063db8fdda0146104b0578063e4ebff00146104ce578063ebecfc0d146104ec578063edbe2a2114610508576101cf565b8063b44645b6116100de578063b44645b6146103ff578063bbcd5c401461041d578063cefd7de81461044d578063d0dd99791461047d576101cf565b80639ce94d3f146103a95780639e9aed62146103c5578063ae10d5ea146103e3576101cf565b8063602905e411610171578063715018a61161014b578063715018a614610345578063738bf6751461034f5780638bd8669e1461036d5780638da5cb5b1461038b576101cf565b8063602905e4146102db5780636d819b531461030b5780636d9edc7114610327576101cf565b8063384929a4116101ad578063384929a4146102415780633a813b681461027157806346bd2b3b1461028d57806355a373d6146102bd576101cf565b8063022e4d11146101d45780631d08e0b2146102075780632eb4a7ab14610223575b600080fd5b6101ee60048036038101906101e99190612bf9565b6105aa565b6040516101fe94939291906139b1565b60405180910390f35b610221600480360381019061021c9190612e10565b61060e565b005b61022b6106ad565b60405161023891906136f0565b60405180910390f35b61025b60048036038101906102569190612b7c565b6106b3565b60405161026891906136b3565b60405180910390f35b61028b60048036038101906102869190612e10565b61079b565b005b6102a760048036038101906102a29190612ba5565b61083a565b6040516102b49190613974565b60405180910390f35b6102c5610a96565b6040516102d2919061370b565b60405180910390f35b6102f560048036038101906102f09190612b7c565b610abc565b60405161030291906136b3565b60405180910390f35b61032560048036038101906103209190612c35565b610ba4565b005b61032f610d8c565b60405161033c9190613996565b60405180910390f35b61034d610d92565b005b610357610ee5565b6040516103649190613996565b60405180910390f35b610375610eeb565b60405161038291906136d5565b60405180910390f35b610393611047565b6040516103a091906135d8565b60405180910390f35b6103c360048036038101906103be9190612ceb565b611070565b005b6103cd611122565b6040516103da9190613996565b60405180910390f35b6103fd60048036038101906103f89190612e10565b6111d4565b005b61040761140b565b6040516104149190613996565b60405180910390f35b61043760048036038101906104329190612c84565b611411565b60405161044491906136d5565b60405180910390f35b61046760048036038101906104629190612b7c565b6115df565b6040516104749190613996565b60405180910390f35b61049760048036038101906104929190612bf9565b6115f7565b6040516104a794939291906139b1565b60405180910390f35b6104b861165b565b6040516104c59190613996565b60405180910390f35b6104d6611661565b6040516104e39190613996565b60405180910390f35b61050660048036038101906105019190612e10565b611667565b005b610522600480360381019061051d9190612d3d565b611706565b005b61052c6119c5565b60405161053991906136d5565b60405180910390f35b61055c60048036038101906105579190612b7c565b6119d8565b005b61057860048036038101906105739190612d79565b611b9a565b005b610594600480360381019061058f9190612ba5565b611d83565b6040516105a19190613974565b60405180910390f35b600960205281600052604060002081815481106105c357fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900460ff16908060020160019054906101000a900460ff16905084565b610616611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069a906138f4565b60405180910390fd5b8060038190555050565b60015481565b6060600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610790578382906000526020600020906003020160405180608001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff161515151581526020016002820160019054906101000a900460ff16151515158152505081526020019060010190610714565b505050509050919050565b6107a3611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610830576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610827906138f4565b60405180910390fd5b8060048190555050565b610842612895565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208260405161088f91906135c1565b9081526020016040518091039020604051806060016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109415780601f1061091657610100808354040283529160200191610941565b820191906000526020600020905b81548152906001019060200180831161092457829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109e35780601f106109b8576101008083540402835291602001916109e3565b820191906000526020600020905b8154815290600101906020018083116109c657829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a855780601f10610a5a57610100808354040283529160200191610a85565b820191906000526020600020905b815481529060010190602001808311610a6857829003601f168201915b505050505081525050905092915050565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610b99578382906000526020600020906003020160405180608001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff161515151581526020016002820160019054906101000a900460ff16151515158152505081526020019060010190610b1d565b505050509050919050565b610bac611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c30906138f4565b60405180910390fd5b600080600080610c498787611fe7565b935093509350935081610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906138b4565b60405180910390fd5b83610c9a611122565b1015610cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd290613834565b60405180910390fd5b600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208681548110610d2557fe5b906000526020600020906003020160008082016000905560018201600090556002820160006101000a81549060ff02191690556002820160016101000a81549060ff02191690555050600060019050610d828686600084866121c1565b5050505050505050565b60035481565b610d9a611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e906138f4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60075481565b6000610ef5611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f79906138f4565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610fc8611047565b610fd0611122565b6040518363ffffffff1660e01b8152600401610fed92919061368a565b602060405180830381600087803b15801561100757600080fd5b505af115801561101b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103f9190612d14565b506001905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611078611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc906138f4565b60405180910390fd5b80600260006101000a81548160ff02191690831515021790555050565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161117f91906135d8565b60206040518083038186803b15801561119757600080fd5b505afa1580156111ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cf9190612e39565b905090565b60003390506000806000806111e98587611fe7565b93509350935093508115611232576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611229906137b4565b60405180910390fd5b600084905060008261125f5761124786612453565b915061125c828761248490919063ffffffff16565b90505b81611268611122565b10156112a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a090613834565b60405180910390fd5b6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002089815481106112f557fe5b906000526020600020906003020190508361135b5760018160020160006101000a81548160ff02191690831515021790555081816000018190555060018160020160016101000a81548160ff0219169083151502179055504281600101819055506113ef565b600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002089815481106113a557fe5b906000526020600020906003020160008082016000905560018201600090556002820160006101000a81549060ff02191690556002820160016101000a81549060ff021916905550505b60006113ff8985600184896121c1565b50505050505050505050565b60045481565b6000600260009054906101000a900460ff1615611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90613954565b60405180910390fd5b600654600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd90613914565b60405180910390fd5b60008311611529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152090613854565b60405180910390fd5b8161157a57600061153984612453565b11611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090613814565b60405180910390fd5b5b61158d8461158833866124ce565b612501565b6115cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c3906137d4565b60405180910390fd5b6115d683836125ab565b90509392505050565b60086020528060005260406000206000915090505481565b600a602052816000526040600020818154811061161057fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900460ff16908060020160019054906101000a900460ff16905084565b60055481565b60065481565b61166f611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f3906138f4565b60405180910390fd5b8060058190555050565b61170e611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461179b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611792906138f4565b60405180910390fd5b600030905060008211156119595781600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6117f0611047565b846040518363ffffffff1660e01b815260040161180e92919061362a565b60206040518083038186803b15801561182657600080fd5b505afa15801561183a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185e9190612e39565b101561189f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189690613934565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6118e5611047565b83856040518463ffffffff1660e01b815260040161190593929190613653565b602060405180830381600087803b15801561191f57600080fd5b505af1158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190612d14565b505b8260018190555042600681905550436007819055506000600260006101000a81548160ff0219169083151502179055507fae8bdbc15b982b030d313524fca26f653a8826332c662cb93c670068172d217e836040516119b891906136f0565b60405180910390a1505050565b600260009054906101000a900460ff1681565b6119e0611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a64906138f4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad490613794565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611ba2612895565b604051806060016040528085815260200184815260200183815250905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085604051611c0d91906135c1565b90815260200160405180910390206000820151816000019080519060200190611c379291906128b6565b506020820151816001019080519060200190611c54929190612936565b506040820151816002019080519060200190611c719291906128b6565b5090505080600c85604051611c8691906135c1565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000019080519060200190611ced9291906128b6565b506020820151816001019080519060200190611d0a929190612936565b506040820151816002019080519060200190611d279291906128b6565b509050503373ffffffffffffffffffffffffffffffffffffffff167f2727aa097a70e69a14678f6713c7b94909e98116c7f21ac8a6b9f25836cc5986858585604051611d7593929190613748565b60405180910390a250505050565b611d8b612895565b600c82604051611d9b91906135c1565b908152602001604051809103902060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e8a5780601f10611e5f57610100808354040283529160200191611e8a565b820191906000526020600020905b815481529060010190602001808311611e6d57829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f2c5780601f10611f0157610100808354040283529160200191611f2c565b820191906000526020600020905b815481529060010190602001808311611f0f57829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fce5780601f10611fa357610100808354040283529160200191611fce565b820191906000526020600020905b815481529060010190602001808311611fb157829003601f168201915b505050505081525050905092915050565b600033905090565b600080600080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508510612071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206890613894565b60405180910390fd5b6000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002086815481106120bd57fe5b9060005260206000209060030201905060008160000154905060008260010154905060008360020160019054906101000a900460ff16905060008161210457600454612108565b6003545b90506000841161214d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214490613874565b60405180910390fd5b808301421015612192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612189906137f4565b60405180910390fd5b839850846001015497508460020160009054906101000a900460ff169650819550505050505092959194509250565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806080016040528086815260200142815260200185151581526020018315158152509080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff0219169083151502179055505050811561235f57600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b386866040518363ffffffff1660e01b815260040161230792919061368a565b602060405180830381600087803b15801561232157600080fd5b505af1158015612335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123599190612d14565b50612410565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86866040518363ffffffff1660e01b81526004016123bc92919061368a565b602060405180830381600087803b1580156123d657600080fd5b505af11580156123ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240e9190612d14565b505b8215157fd4b6fb77a6f17bb40dfa5726076ef7931d18f404053ec43e4521d67a1ec6ec89868660405161244492919061368a565b60405180910390a25050505050565b600061247d600a61246f6005548561271f90919063ffffffff16565b61278f90919063ffffffff16565b9050919050565b60006124c683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506127d9565b905092915050565b600082826040516020016124e3929190613569565b60405160208183030381529060405280519060200120905092915050565b600080600083905060005b6001865103811161259b5785818151811061252357fe5b60200260200101519250828211612564578183604051602001612547929190613595565b604051602081830303815290604052805190602001209150612590565b8282604051602001612577929190613595565b6040516020818303038152906040528051906020012091505b60018101905061250c565b5060015481149250505092915050565b60008042905080600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052808681526020018381526020016000151581526020018515158152509080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555050507fa1f1c6f1afad76383864b1cf7a5fd777e66603e34a7025a63a889a33719f69b333858560405161270c939291906135f3565b60405180910390a1600191505092915050565b6000808314156127325760009050612789565b600082840290508284828161274357fe5b0414612784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277b906138d4565b60405180910390fd5b809150505b92915050565b60006127d183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612834565b905092915050565b6000838311158290612821576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128189190613726565b60405180910390fd5b5060008385039050809150509392505050565b6000808311829061287b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128729190613726565b60405180910390fd5b50600083858161288757fe5b049050809150509392505050565b60405180606001604052806060815260200160608152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106128f757805160ff1916838001178555612925565b82800160010185558215612925579182015b82811115612924578251825591602001919060010190612909565b5b50905061293291906129b6565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061297757805160ff19168380011785556129a5565b828001600101855582156129a5579182015b828111156129a4578251825591602001919060010190612989565b5b5090506129b291906129b6565b5090565b5b808211156129cf5760008160009055506001016129b7565b5090565b6000813590506129e281613c85565b92915050565b600082601f8301126129f957600080fd5b8135612a0c612a0782613a23565b6139f6565b91508181835260208401935060208101905083856020840282011115612a3157600080fd5b60005b83811015612a615781612a478882612a95565b845260208401935060208301925050600181019050612a34565b5050505092915050565b600081359050612a7a81613c9c565b92915050565b600081519050612a8f81613c9c565b92915050565b600081359050612aa481613cb3565b92915050565b600082601f830112612abb57600080fd5b8135612ace612ac982613a4b565b6139f6565b91508082526020830160208301858383011115612aea57600080fd5b612af5838284613bed565b50505092915050565b600082601f830112612b0f57600080fd5b8135612b22612b1d82613a77565b6139f6565b91508082526020830160208301858383011115612b3e57600080fd5b612b49838284613bed565b50505092915050565b600081359050612b6181613cca565b92915050565b600081519050612b7681613cca565b92915050565b600060208284031215612b8e57600080fd5b6000612b9c848285016129d3565b91505092915050565b60008060408385031215612bb857600080fd5b6000612bc6858286016129d3565b925050602083013567ffffffffffffffff811115612be357600080fd5b612bef85828601612afe565b9150509250929050565b60008060408385031215612c0c57600080fd5b6000612c1a858286016129d3565b9250506020612c2b85828601612b52565b9150509250929050565b600080600060608486031215612c4a57600080fd5b6000612c58868287016129d3565b9350506020612c6986828701612b52565b9250506040612c7a868287016129d3565b9150509250925092565b600080600060608486031215612c9957600080fd5b600084013567ffffffffffffffff811115612cb357600080fd5b612cbf868287016129e8565b9350506020612cd086828701612b52565b9250506040612ce186828701612a6b565b9150509250925092565b600060208284031215612cfd57600080fd5b6000612d0b84828501612a6b565b91505092915050565b600060208284031215612d2657600080fd5b6000612d3484828501612a80565b91505092915050565b60008060408385031215612d5057600080fd5b6000612d5e85828601612a95565b9250506020612d6f85828601612b52565b9150509250929050565b600080600060608486031215612d8e57600080fd5b600084013567ffffffffffffffff811115612da857600080fd5b612db486828701612afe565b935050602084013567ffffffffffffffff811115612dd157600080fd5b612ddd86828701612aaa565b925050604084013567ffffffffffffffff811115612dfa57600080fd5b612e0686828701612afe565b9150509250925092565b600060208284031215612e2257600080fd5b6000612e3084828501612b52565b91505092915050565b600060208284031215612e4b57600080fd5b6000612e5984828501612b67565b91505092915050565b6000612e6e8383613481565b60808301905092915050565b612e8381613b93565b82525050565b612e9281613b41565b82525050565b612ea9612ea482613b41565b613c2f565b82525050565b6000612eba82613ab3565b612ec48185613ae1565b9350612ecf83613aa3565b8060005b83811015612f00578151612ee78882612e62565b9750612ef283613ad4565b925050600181019050612ed3565b5085935050505092915050565b612f1681613b53565b82525050565b612f2581613b53565b82525050565b612f3481613b5f565b82525050565b612f4b612f4682613b5f565b613c41565b82525050565b6000612f5c82613abe565b612f668185613af2565b9350612f76818560208601613bfc565b612f7f81613c67565b840191505092915050565b6000612f9582613abe565b612f9f8185613b03565b9350612faf818560208601613bfc565b612fb881613c67565b840191505092915050565b612fcc81613ba5565b82525050565b6000612fdd82613ac9565b612fe78185613b14565b9350612ff7818560208601613bfc565b61300081613c67565b840191505092915050565b600061301682613ac9565b6130208185613b25565b9350613030818560208601613bfc565b61303981613c67565b840191505092915050565b600061304f82613ac9565b6130598185613b36565b9350613069818560208601613bfc565b80840191505092915050565b6000613082602683613b25565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130e8601783613b25565b91507f72657761726420616c72656164792072656365697665640000000000000000006000830152602082019050919050565b6000613128601483613b25565b91507f70726f6f66206973206e6f7420636f72726563740000000000000000000000006000830152602082019050919050565b6000613168601d83613b25565b91507f65787069726174696f6e20706572696f64206973206e6f74206f7665720000006000830152602082019050919050565b60006131a8600e83613b25565b91507f616d6f756e7420746f6f206c6f770000000000000000000000000000000000006000830152602082019050919050565b60006131e8601283613b25565b91507f6e6f7420656e6f7567682062616c616e636500000000000000000000000000006000830152602082019050919050565b6000613228601983613b25565b91507f616d6f756e742073686f756c64206265206e6f74207a65726f000000000000006000830152602082019050919050565b6000613268600d83613b25565b91507f6974656d20697320656d707479000000000000000000000000000000000000006000830152602082019050919050565b60006132a8601183613b25565b91507f6974656d206973206e6f742065786973740000000000000000000000000000006000830152602082019050919050565b60006132e8601e83613b25565b91507f726577617264206973206e6f74207265636569766564206279207573657200006000830152602082019050919050565b6000613328602183613b25565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061338e602083613b25565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006133ce602083613b25565b91507f616c72656164792077697468647261776e20696e207468697320706572696f646000830152602082019050919050565b600061340e601b83613b25565b91507f617070726f7665642062616c616e6365206e6f7420656e6f75676800000000006000830152602082019050919050565b600061344e601083613b25565b91507f666f7262696464656e20616374696f6e000000000000000000000000000000006000830152602082019050919050565b6080820160008201516134976000850182613534565b5060208201516134aa6020850182613534565b5060408201516134bd6040850182612f0d565b5060608201516134d06060850182612f0d565b50505050565b600060608301600083015184820360008601526134f38282612fd2565b9150506020830151848203602086015261350d8282612f51565b915050604083015184820360408601526135278282612fd2565b9150508091505092915050565b61353d81613b89565b82525050565b61354c81613b89565b82525050565b61356361355e82613b89565b613c5d565b82525050565b60006135758285612e98565b6014820191506135858284613552565b6020820191508190509392505050565b60006135a18285612f3a565b6020820191506135b18284612f3a565b6020820191508190509392505050565b60006135cd8284613044565b915081905092915050565b60006020820190506135ed6000830184612e89565b92915050565b60006060820190506136086000830186612e7a565b6136156020830185613543565b6136226040830184612f1c565b949350505050565b600060408201905061363f6000830185612e89565b61364c6020830184612e89565b9392505050565b60006060820190506136686000830186612e89565b6136756020830185612e89565b6136826040830184613543565b949350505050565b600060408201905061369f6000830185612e89565b6136ac6020830184613543565b9392505050565b600060208201905081810360008301526136cd8184612eaf565b905092915050565b60006020820190506136ea6000830184612f1c565b92915050565b60006020820190506137056000830184612f2b565b92915050565b60006020820190506137206000830184612fc3565b92915050565b60006020820190508181036000830152613740818461300b565b905092915050565b60006060820190508181036000830152613762818661300b565b905081810360208301526137768185612f8a565b9050818103604083015261378a818461300b565b9050949350505050565b600060208201905081810360008301526137ad81613075565b9050919050565b600060208201905081810360008301526137cd816130db565b9050919050565b600060208201905081810360008301526137ed8161311b565b9050919050565b6000602082019050818103600083015261380d8161315b565b9050919050565b6000602082019050818103600083015261382d8161319b565b9050919050565b6000602082019050818103600083015261384d816131db565b9050919050565b6000602082019050818103600083015261386d8161321b565b9050919050565b6000602082019050818103600083015261388d8161325b565b9050919050565b600060208201905081810360008301526138ad8161329b565b9050919050565b600060208201905081810360008301526138cd816132db565b9050919050565b600060208201905081810360008301526138ed8161331b565b9050919050565b6000602082019050818103600083015261390d81613381565b9050919050565b6000602082019050818103600083015261392d816133c1565b9050919050565b6000602082019050818103600083015261394d81613401565b9050919050565b6000602082019050818103600083015261396d81613441565b9050919050565b6000602082019050818103600083015261398e81846134d6565b905092915050565b60006020820190506139ab6000830184613543565b92915050565b60006080820190506139c66000830187613543565b6139d36020830186613543565b6139e06040830185612f1c565b6139ed6060830184612f1c565b95945050505050565b6000604051905081810181811067ffffffffffffffff82111715613a1957600080fd5b8060405250919050565b600067ffffffffffffffff821115613a3a57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115613a6257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613a8e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b4c82613b69565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613b9e82613bc9565b9050919050565b6000613bb082613bb7565b9050919050565b6000613bc282613b69565b9050919050565b6000613bd482613bdb565b9050919050565b6000613be682613b69565b9050919050565b82818337600083830152505050565b60005b83811015613c1a578082015181840152602081019050613bff565b83811115613c29576000848401525b50505050565b6000613c3a82613c4b565b9050919050565b6000819050919050565b6000613c5682613c78565b9050919050565b6000819050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b613c8e81613b41565b8114613c9957600080fd5b50565b613ca581613b53565b8114613cb057600080fd5b50565b613cbc81613b5f565b8114613cc757600080fd5b50565b613cd381613b89565b8114613cde57600080fd5b5056fea26469706673582212201cc8db3c5ec0ba59abcced3bc235801518b93633d856596389fb6b2b699fe24d64736f6c634300060c00330000000000000000000000003593d125a4f7849a1b059e64f4517a86dd60c95d0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80639ce94d3f11610104578063db8fdda0116100a2578063eee5656411610071578063eee5656414610524578063f2fde38b14610542578063f4660dd71461055e578063f5cc8e551461057a576101cf565b8063db8fdda0146104b0578063e4ebff00146104ce578063ebecfc0d146104ec578063edbe2a2114610508576101cf565b8063b44645b6116100de578063b44645b6146103ff578063bbcd5c401461041d578063cefd7de81461044d578063d0dd99791461047d576101cf565b80639ce94d3f146103a95780639e9aed62146103c5578063ae10d5ea146103e3576101cf565b8063602905e411610171578063715018a61161014b578063715018a614610345578063738bf6751461034f5780638bd8669e1461036d5780638da5cb5b1461038b576101cf565b8063602905e4146102db5780636d819b531461030b5780636d9edc7114610327576101cf565b8063384929a4116101ad578063384929a4146102415780633a813b681461027157806346bd2b3b1461028d57806355a373d6146102bd576101cf565b8063022e4d11146101d45780631d08e0b2146102075780632eb4a7ab14610223575b600080fd5b6101ee60048036038101906101e99190612bf9565b6105aa565b6040516101fe94939291906139b1565b60405180910390f35b610221600480360381019061021c9190612e10565b61060e565b005b61022b6106ad565b60405161023891906136f0565b60405180910390f35b61025b60048036038101906102569190612b7c565b6106b3565b60405161026891906136b3565b60405180910390f35b61028b60048036038101906102869190612e10565b61079b565b005b6102a760048036038101906102a29190612ba5565b61083a565b6040516102b49190613974565b60405180910390f35b6102c5610a96565b6040516102d2919061370b565b60405180910390f35b6102f560048036038101906102f09190612b7c565b610abc565b60405161030291906136b3565b60405180910390f35b61032560048036038101906103209190612c35565b610ba4565b005b61032f610d8c565b60405161033c9190613996565b60405180910390f35b61034d610d92565b005b610357610ee5565b6040516103649190613996565b60405180910390f35b610375610eeb565b60405161038291906136d5565b60405180910390f35b610393611047565b6040516103a091906135d8565b60405180910390f35b6103c360048036038101906103be9190612ceb565b611070565b005b6103cd611122565b6040516103da9190613996565b60405180910390f35b6103fd60048036038101906103f89190612e10565b6111d4565b005b61040761140b565b6040516104149190613996565b60405180910390f35b61043760048036038101906104329190612c84565b611411565b60405161044491906136d5565b60405180910390f35b61046760048036038101906104629190612b7c565b6115df565b6040516104749190613996565b60405180910390f35b61049760048036038101906104929190612bf9565b6115f7565b6040516104a794939291906139b1565b60405180910390f35b6104b861165b565b6040516104c59190613996565b60405180910390f35b6104d6611661565b6040516104e39190613996565b60405180910390f35b61050660048036038101906105019190612e10565b611667565b005b610522600480360381019061051d9190612d3d565b611706565b005b61052c6119c5565b60405161053991906136d5565b60405180910390f35b61055c60048036038101906105579190612b7c565b6119d8565b005b61057860048036038101906105739190612d79565b611b9a565b005b610594600480360381019061058f9190612ba5565b611d83565b6040516105a19190613974565b60405180910390f35b600960205281600052604060002081815481106105c357fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900460ff16908060020160019054906101000a900460ff16905084565b610616611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069a906138f4565b60405180910390fd5b8060038190555050565b60015481565b6060600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610790578382906000526020600020906003020160405180608001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff161515151581526020016002820160019054906101000a900460ff16151515158152505081526020019060010190610714565b505050509050919050565b6107a3611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610830576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610827906138f4565b60405180910390fd5b8060048190555050565b610842612895565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208260405161088f91906135c1565b9081526020016040518091039020604051806060016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109415780601f1061091657610100808354040283529160200191610941565b820191906000526020600020905b81548152906001019060200180831161092457829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109e35780601f106109b8576101008083540402835291602001916109e3565b820191906000526020600020905b8154815290600101906020018083116109c657829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a855780601f10610a5a57610100808354040283529160200191610a85565b820191906000526020600020905b815481529060010190602001808311610a6857829003601f168201915b505050505081525050905092915050565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610b99578382906000526020600020906003020160405180608001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff161515151581526020016002820160019054906101000a900460ff16151515158152505081526020019060010190610b1d565b505050509050919050565b610bac611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c30906138f4565b60405180910390fd5b600080600080610c498787611fe7565b935093509350935081610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c88906138b4565b60405180910390fd5b83610c9a611122565b1015610cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd290613834565b60405180910390fd5b600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208681548110610d2557fe5b906000526020600020906003020160008082016000905560018201600090556002820160006101000a81549060ff02191690556002820160016101000a81549060ff02191690555050600060019050610d828686600084866121c1565b5050505050505050565b60035481565b610d9a611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e906138f4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60075481565b6000610ef5611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f79906138f4565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610fc8611047565b610fd0611122565b6040518363ffffffff1660e01b8152600401610fed92919061368a565b602060405180830381600087803b15801561100757600080fd5b505af115801561101b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103f9190612d14565b506001905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611078611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc906138f4565b60405180910390fd5b80600260006101000a81548160ff02191690831515021790555050565b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161117f91906135d8565b60206040518083038186803b15801561119757600080fd5b505afa1580156111ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111cf9190612e39565b905090565b60003390506000806000806111e98587611fe7565b93509350935093508115611232576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611229906137b4565b60405180910390fd5b600084905060008261125f5761124786612453565b915061125c828761248490919063ffffffff16565b90505b81611268611122565b10156112a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a090613834565b60405180910390fd5b6000600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002089815481106112f557fe5b906000526020600020906003020190508361135b5760018160020160006101000a81548160ff02191690831515021790555081816000018190555060018160020160016101000a81548160ff0219169083151502179055504281600101819055506113ef565b600960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002089815481106113a557fe5b906000526020600020906003020160008082016000905560018201600090556002820160006101000a81549060ff02191690556002820160016101000a81549060ff021916905550505b60006113ff8985600184896121c1565b50505050505050505050565b60045481565b6000600260009054906101000a900460ff1615611463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145a90613954565b60405180910390fd5b600654600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd90613914565b60405180910390fd5b60008311611529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152090613854565b60405180910390fd5b8161157a57600061153984612453565b11611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090613814565b60405180910390fd5b5b61158d8461158833866124ce565b612501565b6115cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c3906137d4565b60405180910390fd5b6115d683836125ab565b90509392505050565b60086020528060005260406000206000915090505481565b600a602052816000526040600020818154811061161057fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900460ff16908060020160019054906101000a900460ff16905084565b60055481565b60065481565b61166f611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f3906138f4565b60405180910390fd5b8060058190555050565b61170e611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461179b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611792906138f4565b60405180910390fd5b600030905060008211156119595781600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6117f0611047565b846040518363ffffffff1660e01b815260040161180e92919061362a565b60206040518083038186803b15801561182657600080fd5b505afa15801561183a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185e9190612e39565b101561189f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189690613934565b60405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6118e5611047565b83856040518463ffffffff1660e01b815260040161190593929190613653565b602060405180830381600087803b15801561191f57600080fd5b505af1158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190612d14565b505b8260018190555042600681905550436007819055506000600260006101000a81548160ff0219169083151502179055507fae8bdbc15b982b030d313524fca26f653a8826332c662cb93c670068172d217e836040516119b891906136f0565b60405180910390a1505050565b600260009054906101000a900460ff1681565b6119e0611fdf565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a64906138f4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad490613794565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611ba2612895565b604051806060016040528085815260200184815260200183815250905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085604051611c0d91906135c1565b90815260200160405180910390206000820151816000019080519060200190611c379291906128b6565b506020820151816001019080519060200190611c54929190612936565b506040820151816002019080519060200190611c719291906128b6565b5090505080600c85604051611c8691906135c1565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000019080519060200190611ced9291906128b6565b506020820151816001019080519060200190611d0a929190612936565b506040820151816002019080519060200190611d279291906128b6565b509050503373ffffffffffffffffffffffffffffffffffffffff167f2727aa097a70e69a14678f6713c7b94909e98116c7f21ac8a6b9f25836cc5986858585604051611d7593929190613748565b60405180910390a250505050565b611d8b612895565b600c82604051611d9b91906135c1565b908152602001604051809103902060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e8a5780601f10611e5f57610100808354040283529160200191611e8a565b820191906000526020600020905b815481529060010190602001808311611e6d57829003601f168201915b50505050508152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f2c5780601f10611f0157610100808354040283529160200191611f2c565b820191906000526020600020905b815481529060010190602001808311611f0f57829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fce5780601f10611fa357610100808354040283529160200191611fce565b820191906000526020600020905b815481529060010190602001808311611fb157829003601f168201915b505050505081525050905092915050565b600033905090565b600080600080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508510612071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206890613894565b60405180910390fd5b6000600960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002086815481106120bd57fe5b9060005260206000209060030201905060008160000154905060008260010154905060008360020160019054906101000a900460ff16905060008161210457600454612108565b6003545b90506000841161214d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214490613874565b60405180910390fd5b808301421015612192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612189906137f4565b60405180910390fd5b839850846001015497508460020160009054906101000a900460ff169650819550505050505092959194509250565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806080016040528086815260200142815260200185151581526020018315158152509080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff0219169083151502179055505050811561235f57600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b386866040518363ffffffff1660e01b815260040161230792919061368a565b602060405180830381600087803b15801561232157600080fd5b505af1158015612335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123599190612d14565b50612410565b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86866040518363ffffffff1660e01b81526004016123bc92919061368a565b602060405180830381600087803b1580156123d657600080fd5b505af11580156123ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240e9190612d14565b505b8215157fd4b6fb77a6f17bb40dfa5726076ef7931d18f404053ec43e4521d67a1ec6ec89868660405161244492919061368a565b60405180910390a25050505050565b600061247d600a61246f6005548561271f90919063ffffffff16565b61278f90919063ffffffff16565b9050919050565b60006124c683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506127d9565b905092915050565b600082826040516020016124e3929190613569565b60405160208183030381529060405280519060200120905092915050565b600080600083905060005b6001865103811161259b5785818151811061252357fe5b60200260200101519250828211612564578183604051602001612547929190613595565b604051602081830303815290604052805190602001209150612590565b8282604051602001612577929190613595565b6040516020818303038152906040528051906020012091505b60018101905061250c565b5060015481149250505092915050565b60008042905080600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052808681526020018381526020016000151581526020018515158152509080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160020160016101000a81548160ff02191690831515021790555050507fa1f1c6f1afad76383864b1cf7a5fd777e66603e34a7025a63a889a33719f69b333858560405161270c939291906135f3565b60405180910390a1600191505092915050565b6000808314156127325760009050612789565b600082840290508284828161274357fe5b0414612784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277b906138d4565b60405180910390fd5b809150505b92915050565b60006127d183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612834565b905092915050565b6000838311158290612821576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128189190613726565b60405180910390fd5b5060008385039050809150509392505050565b6000808311829061287b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128729190613726565b60405180910390fd5b50600083858161288757fe5b049050809150509392505050565b60405180606001604052806060815260200160608152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106128f757805160ff1916838001178555612925565b82800160010185558215612925579182015b82811115612924578251825591602001919060010190612909565b5b50905061293291906129b6565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061297757805160ff19168380011785556129a5565b828001600101855582156129a5579182015b828111156129a4578251825591602001919060010190612989565b5b5090506129b291906129b6565b5090565b5b808211156129cf5760008160009055506001016129b7565b5090565b6000813590506129e281613c85565b92915050565b600082601f8301126129f957600080fd5b8135612a0c612a0782613a23565b6139f6565b91508181835260208401935060208101905083856020840282011115612a3157600080fd5b60005b83811015612a615781612a478882612a95565b845260208401935060208301925050600181019050612a34565b5050505092915050565b600081359050612a7a81613c9c565b92915050565b600081519050612a8f81613c9c565b92915050565b600081359050612aa481613cb3565b92915050565b600082601f830112612abb57600080fd5b8135612ace612ac982613a4b565b6139f6565b91508082526020830160208301858383011115612aea57600080fd5b612af5838284613bed565b50505092915050565b600082601f830112612b0f57600080fd5b8135612b22612b1d82613a77565b6139f6565b91508082526020830160208301858383011115612b3e57600080fd5b612b49838284613bed565b50505092915050565b600081359050612b6181613cca565b92915050565b600081519050612b7681613cca565b92915050565b600060208284031215612b8e57600080fd5b6000612b9c848285016129d3565b91505092915050565b60008060408385031215612bb857600080fd5b6000612bc6858286016129d3565b925050602083013567ffffffffffffffff811115612be357600080fd5b612bef85828601612afe565b9150509250929050565b60008060408385031215612c0c57600080fd5b6000612c1a858286016129d3565b9250506020612c2b85828601612b52565b9150509250929050565b600080600060608486031215612c4a57600080fd5b6000612c58868287016129d3565b9350506020612c6986828701612b52565b9250506040612c7a868287016129d3565b9150509250925092565b600080600060608486031215612c9957600080fd5b600084013567ffffffffffffffff811115612cb357600080fd5b612cbf868287016129e8565b9350506020612cd086828701612b52565b9250506040612ce186828701612a6b565b9150509250925092565b600060208284031215612cfd57600080fd5b6000612d0b84828501612a6b565b91505092915050565b600060208284031215612d2657600080fd5b6000612d3484828501612a80565b91505092915050565b60008060408385031215612d5057600080fd5b6000612d5e85828601612a95565b9250506020612d6f85828601612b52565b9150509250929050565b600080600060608486031215612d8e57600080fd5b600084013567ffffffffffffffff811115612da857600080fd5b612db486828701612afe565b935050602084013567ffffffffffffffff811115612dd157600080fd5b612ddd86828701612aaa565b925050604084013567ffffffffffffffff811115612dfa57600080fd5b612e0686828701612afe565b9150509250925092565b600060208284031215612e2257600080fd5b6000612e3084828501612b52565b91505092915050565b600060208284031215612e4b57600080fd5b6000612e5984828501612b67565b91505092915050565b6000612e6e8383613481565b60808301905092915050565b612e8381613b93565b82525050565b612e9281613b41565b82525050565b612ea9612ea482613b41565b613c2f565b82525050565b6000612eba82613ab3565b612ec48185613ae1565b9350612ecf83613aa3565b8060005b83811015612f00578151612ee78882612e62565b9750612ef283613ad4565b925050600181019050612ed3565b5085935050505092915050565b612f1681613b53565b82525050565b612f2581613b53565b82525050565b612f3481613b5f565b82525050565b612f4b612f4682613b5f565b613c41565b82525050565b6000612f5c82613abe565b612f668185613af2565b9350612f76818560208601613bfc565b612f7f81613c67565b840191505092915050565b6000612f9582613abe565b612f9f8185613b03565b9350612faf818560208601613bfc565b612fb881613c67565b840191505092915050565b612fcc81613ba5565b82525050565b6000612fdd82613ac9565b612fe78185613b14565b9350612ff7818560208601613bfc565b61300081613c67565b840191505092915050565b600061301682613ac9565b6130208185613b25565b9350613030818560208601613bfc565b61303981613c67565b840191505092915050565b600061304f82613ac9565b6130598185613b36565b9350613069818560208601613bfc565b80840191505092915050565b6000613082602683613b25565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006130e8601783613b25565b91507f72657761726420616c72656164792072656365697665640000000000000000006000830152602082019050919050565b6000613128601483613b25565b91507f70726f6f66206973206e6f7420636f72726563740000000000000000000000006000830152602082019050919050565b6000613168601d83613b25565b91507f65787069726174696f6e20706572696f64206973206e6f74206f7665720000006000830152602082019050919050565b60006131a8600e83613b25565b91507f616d6f756e7420746f6f206c6f770000000000000000000000000000000000006000830152602082019050919050565b60006131e8601283613b25565b91507f6e6f7420656e6f7567682062616c616e636500000000000000000000000000006000830152602082019050919050565b6000613228601983613b25565b91507f616d6f756e742073686f756c64206265206e6f74207a65726f000000000000006000830152602082019050919050565b6000613268600d83613b25565b91507f6974656d20697320656d707479000000000000000000000000000000000000006000830152602082019050919050565b60006132a8601183613b25565b91507f6974656d206973206e6f742065786973740000000000000000000000000000006000830152602082019050919050565b60006132e8601e83613b25565b91507f726577617264206973206e6f74207265636569766564206279207573657200006000830152602082019050919050565b6000613328602183613b25565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061338e602083613b25565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006133ce602083613b25565b91507f616c72656164792077697468647261776e20696e207468697320706572696f646000830152602082019050919050565b600061340e601b83613b25565b91507f617070726f7665642062616c616e6365206e6f7420656e6f75676800000000006000830152602082019050919050565b600061344e601083613b25565b91507f666f7262696464656e20616374696f6e000000000000000000000000000000006000830152602082019050919050565b6080820160008201516134976000850182613534565b5060208201516134aa6020850182613534565b5060408201516134bd6040850182612f0d565b5060608201516134d06060850182612f0d565b50505050565b600060608301600083015184820360008601526134f38282612fd2565b9150506020830151848203602086015261350d8282612f51565b915050604083015184820360408601526135278282612fd2565b9150508091505092915050565b61353d81613b89565b82525050565b61354c81613b89565b82525050565b61356361355e82613b89565b613c5d565b82525050565b60006135758285612e98565b6014820191506135858284613552565b6020820191508190509392505050565b60006135a18285612f3a565b6020820191506135b18284612f3a565b6020820191508190509392505050565b60006135cd8284613044565b915081905092915050565b60006020820190506135ed6000830184612e89565b92915050565b60006060820190506136086000830186612e7a565b6136156020830185613543565b6136226040830184612f1c565b949350505050565b600060408201905061363f6000830185612e89565b61364c6020830184612e89565b9392505050565b60006060820190506136686000830186612e89565b6136756020830185612e89565b6136826040830184613543565b949350505050565b600060408201905061369f6000830185612e89565b6136ac6020830184613543565b9392505050565b600060208201905081810360008301526136cd8184612eaf565b905092915050565b60006020820190506136ea6000830184612f1c565b92915050565b60006020820190506137056000830184612f2b565b92915050565b60006020820190506137206000830184612fc3565b92915050565b60006020820190508181036000830152613740818461300b565b905092915050565b60006060820190508181036000830152613762818661300b565b905081810360208301526137768185612f8a565b9050818103604083015261378a818461300b565b9050949350505050565b600060208201905081810360008301526137ad81613075565b9050919050565b600060208201905081810360008301526137cd816130db565b9050919050565b600060208201905081810360008301526137ed8161311b565b9050919050565b6000602082019050818103600083015261380d8161315b565b9050919050565b6000602082019050818103600083015261382d8161319b565b9050919050565b6000602082019050818103600083015261384d816131db565b9050919050565b6000602082019050818103600083015261386d8161321b565b9050919050565b6000602082019050818103600083015261388d8161325b565b9050919050565b600060208201905081810360008301526138ad8161329b565b9050919050565b600060208201905081810360008301526138cd816132db565b9050919050565b600060208201905081810360008301526138ed8161331b565b9050919050565b6000602082019050818103600083015261390d81613381565b9050919050565b6000602082019050818103600083015261392d816133c1565b9050919050565b6000602082019050818103600083015261394d81613401565b9050919050565b6000602082019050818103600083015261396d81613441565b9050919050565b6000602082019050818103600083015261398e81846134d6565b905092915050565b60006020820190506139ab6000830184613543565b92915050565b60006080820190506139c66000830187613543565b6139d36020830186613543565b6139e06040830185612f1c565b6139ed6060830184612f1c565b95945050505050565b6000604051905081810181811067ffffffffffffffff82111715613a1957600080fd5b8060405250919050565b600067ffffffffffffffff821115613a3a57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115613a6257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613a8e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b4c82613b69565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613b9e82613bc9565b9050919050565b6000613bb082613bb7565b9050919050565b6000613bc282613b69565b9050919050565b6000613bd482613bdb565b9050919050565b6000613be682613b69565b9050919050565b82818337600083830152505050565b60005b83811015613c1a578082015181840152602081019050613bff565b83811115613c29576000848401525b50505050565b6000613c3a82613c4b565b9050919050565b6000819050919050565b6000613c5682613c78565b9050919050565b6000819050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b613c8e81613b41565b8114613c9957600080fd5b50565b613ca581613b53565b8114613cb057600080fd5b50565b613cbc81613b5f565b8114613cc757600080fd5b50565b613cd381613b89565b8114613cde57600080fd5b5056fea26469706673582212201cc8db3c5ec0ba59abcced3bc235801518b93633d856596389fb6b2b699fe24d64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003593d125a4f7849a1b059e64f4517a86dd60c95d0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenContract (address): 0x3593D125a4f7849a1B059E64F4517A86Dd60c95d
Arg [1] : _cancelable (bool): False
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000003593d125a4f7849a1b059e64f4517a86dd60c95d
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
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.