More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,396 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Receive Reward | 21586547 | 38 hrs ago | IN | 0 ETH | 0.00071736 | ||||
Receive Reward | 20066106 | 213 days ago | IN | 0 ETH | 0.00175657 | ||||
Receive Reward | 16353128 | 734 days ago | IN | 0 ETH | 0.00049349 | ||||
Stake | 16353118 | 734 days ago | IN | 0 ETH | 0.00271325 | ||||
Withdraw | 13347619 | 1195 days ago | IN | 0 ETH | 0.00909288 | ||||
Stake | 13342632 | 1196 days ago | IN | 0 ETH | 0.00917255 | ||||
Change Stake Tar... | 12753950 | 1287 days ago | IN | 0 ETH | 0.00130244 | ||||
Withdraw | 12753950 | 1287 days ago | IN | 0 ETH | 0.01158045 | ||||
Withdraw | 12577815 | 1315 days ago | IN | 0 ETH | 0.00065357 | ||||
Receive Reward | 12577793 | 1315 days ago | IN | 0 ETH | 0.01186204 | ||||
Receive Reward | 12529099 | 1322 days ago | IN | 0 ETH | 0.01621036 | ||||
Stake | 11850681 | 1427 days ago | IN | 0 ETH | 0.03678058 | ||||
Receive Reward | 11848906 | 1427 days ago | IN | 0 ETH | 0.03373821 | ||||
Receive Reward | 11690070 | 1451 days ago | IN | 0 ETH | 0.00565972 | ||||
Receive Reward | 11672392 | 1454 days ago | IN | 0 ETH | 0.00618845 | ||||
Receive Reward | 11670454 | 1454 days ago | IN | 0 ETH | 0.00782863 | ||||
Receive Reward | 11666088 | 1455 days ago | IN | 0 ETH | 0.00641987 | ||||
Receive Reward | 11665961 | 1455 days ago | IN | 0 ETH | 0.01102815 | ||||
Receive Reward | 11637421 | 1459 days ago | IN | 0 ETH | 0.00233994 | ||||
Withdraw | 11637421 | 1459 days ago | IN | 0 ETH | 0.01432158 | ||||
Receive Reward | 11593244 | 1466 days ago | IN | 0 ETH | 0.01269875 | ||||
Receive Reward | 11571194 | 1470 days ago | IN | 0 ETH | 0.00211041 | ||||
Receive Reward | 11568418 | 1470 days ago | IN | 0 ETH | 0.00398663 | ||||
Receive Reward | 11566050 | 1470 days ago | IN | 0 ETH | 0.00650196 | ||||
Withdraw | 11563903 | 1471 days ago | IN | 0 ETH | 0.00635973 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
20066106 | 213 days ago | 0.04359073 ETH | ||||
16387815 | 729 days ago | 0.005 ETH | ||||
16387795 | 729 days ago | 0.0005 ETH | ||||
16387161 | 730 days ago | 0.0005 ETH | ||||
12577793 | 1315 days ago | 0.03298562 ETH | ||||
12529099 | 1322 days ago | 0.37335051 ETH | ||||
11874811 | 1423 days ago | 0.004 ETH | ||||
11851920 | 1426 days ago | 0.005 ETH | ||||
11848906 | 1427 days ago | 0.1742931 ETH | ||||
11690070 | 1451 days ago | 0.00255177 ETH | ||||
11672392 | 1454 days ago | 0.03245618 ETH | ||||
11670454 | 1454 days ago | 0.42423235 ETH | ||||
11666088 | 1455 days ago | 0.13212104 ETH | ||||
11665961 | 1455 days ago | 0.07176027 ETH | ||||
11637421 | 1459 days ago | 0.08758652 ETH | ||||
11593244 | 1466 days ago | 3.40708382 ETH | ||||
11571194 | 1470 days ago | 1.92307249 ETH | ||||
11568418 | 1470 days ago | 0.02472568 ETH | ||||
11566050 | 1470 days ago | 3.13478443 ETH | ||||
11562703 | 1471 days ago | 0.16312112 ETH | ||||
11547006 | 1473 days ago | 0.04328232 ETH | ||||
11546232 | 1473 days ago | 0.03012238 ETH | ||||
11545159 | 1474 days ago | 0.02782688 ETH | ||||
11544580 | 1474 days ago | 0.03156358 ETH | ||||
11534432 | 1475 days ago | 0.001 ETH |
Loading...
Loading
Contract Name:
Staking
Compiler Version
v0.7.1+commit.f4a555be
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-07 */ // SPDX-License-Identifier: UNLICENSED pragma solidity 0.7.1; // File: contracts/staking/StakingInterface.sol interface StakingInterface { function stake(address token, uint128 amount) external; function withdraw(address token, uint128 amount) external; function receiveReward(address token) external returns (uint256 rewards); function changeStakeTarget( address oldTarget, address newTarget, uint128 amount ) external; function getStakingTokenAddress() external view returns (address); function getTokenInfo(address token) external view returns ( uint256 currentTerm, uint256 latestTerm, uint256 totalRemainingRewards, uint256 currentReward, uint256 nextTermRewards, uint128 currentStaking, uint128 nextTermStaking ); function getConfigs() external view returns (uint256 startTimestamp, uint256 termInterval); function getStakingDestinations(address account) external view returns (address[] memory); function getTermInfo(address token, uint256 term) external view returns ( uint128 stakeAdd, uint128 stakeSum, uint256 rewardSum ); function getAccountInfo(address token, address account) external view returns ( uint256 userTerm, uint256 stakeAmount, uint128 nextAddedStakeAmount, uint256 currentReward, uint256 nextLatestTermUserRewards, uint128 depositAmount, uint128 withdrawableStakingAmount ); } // File: @openzeppelin/contracts/math/SafeMath.sol /** * @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; } } // File: contracts/staking/StakingVote.sol contract StakingVote { using SafeMath for uint256; /* ========== STATE VARIABLES ========== */ address internal _governanceAddress; mapping(address => uint256) internal _voteNum; /* ========== EVENTS ========== */ event LogUpdateGovernanceAddress(address newAddress); /* ========== CONSTRUCTOR ========== */ constructor(address governanceAddress) { _governanceAddress = governanceAddress; } /* ========== MODIFIERS ========== */ modifier isGovernance(address account) { require(account == _governanceAddress, "sender must be governance address"); _; } /* ========== MUTATIVE FUNCTIONS ========== */ /** * @notice `_governanceAddress` can be updated by the current governance address. * @dev Executed only once when initially set the governance address * as the governance contract does not have the function to call this function. */ function updateGovernanceAddress(address newGovernanceAddress) external isGovernance(msg.sender) { _governanceAddress = newGovernanceAddress; emit LogUpdateGovernanceAddress(newGovernanceAddress); } function voteDeposit(address account, uint256 amount) external isGovernance(msg.sender) { _updVoteSub(account, amount); } function voteWithdraw(address account, uint256 amount) external isGovernance(msg.sender) { _updVoteAdd(account, amount); } /* ========== INTERNAL FUNCTIONS ========== */ function _updVoteAdd(address account, uint256 amount) internal { require(_voteNum[account] + amount >= amount, "overflow the amount of votes"); _voteNum[account] += amount; } function _updVoteSub(address account, uint256 amount) internal { require(_voteNum[account] >= amount, "underflow the amount of votes"); _voteNum[account] -= amount; } /* ========== CALL FUNCTIONS ========== */ function getGovernanceAddress() external view returns (address) { return _governanceAddress; } function getVoteNum(address account) external view returns (uint256) { return _voteNum[account]; } } // File: contracts/util/AddressList.sol library AddressList { /** * @dev Inserts token address in addressList except for zero address. */ function insert(address[] storage addressList, address token) internal { if (token == address(0)) { return; } for (uint256 i = 0; i < addressList.length; i++) { if (addressList[i] == address(0)) { addressList[i] = token; return; } } addressList.push(token); } /** * @dev Removes token address from addressList except for zero address. */ function remove(address[] storage addressList, address token) internal returns (bool success) { if (token == address(0)) { return true; } for (uint256 i = 0; i < addressList.length; i++) { if (addressList[i] == token) { delete addressList[i]; return true; } } } /** * @dev Returns the addresses included in addressList except for zero address. */ function get(address[] storage addressList) internal view returns (address[] memory denseAddressList) { uint256 numOfElements = 0; for (uint256 i = 0; i < addressList.length; i++) { if (addressList[i] != address(0)) { numOfElements++; } } denseAddressList = new address[](numOfElements); uint256 j = 0; for (uint256 i = 0; i < addressList.length; i++) { if (addressList[i] != address(0)) { denseAddressList[j] = addressList[i]; j++; } } } } // File: contracts/staking/StakingDestinations.sol contract StakingDestinations { using AddressList for address[]; /* ========== STATE VARIABLES ========== */ /** * @dev mapping from user address to staking token addresses */ mapping(address => address[]) internal _stakingDestinations; /* ========== INTERNAL FUNCTIONS ========== */ /** * @dev Inserts token address in _stakingDestinations[account] except for ETH (= address(0)). */ function _addDestinations(address account, address token) internal { return _stakingDestinations[account].insert(token); } /** * @dev Removes token address from _stakingDestinations[account] except for ETH (= address(0)). */ function _removeDestinations(address account, address token) internal returns (bool success) { return _stakingDestinations[account].remove(token); } /** * @dev Returns the addresses included in _stakingDestinations[account] except for zero address. */ function _getStakingDestinations(address account) internal view returns (address[] memory) { return _stakingDestinations[account].get(); } } // File: contracts/util/TransferETH.sol contract TransferETH { receive() external payable {} /** * @notice transfer `amount` ETH to the `recipient` account with emitting log */ function _transferETH( address payable recipient, uint256 amount, string memory errorMessage ) internal { (bool success, ) = recipient.call{value: amount}(""); require(success, errorMessage); } function _transferETH(address payable recipient, uint256 amount) internal { _transferETH(recipient, amount, "Transfer amount exceeds balance"); } } // File: @openzeppelin/contracts/utils/SafeCast.sol /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such 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. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits. */ function toUint8(uint256 value) internal pure returns (uint8) { require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128) { require(value >= -2**127 && value < 2**127, "SafeCast: value doesn\'t fit in 128 bits"); return int128(value); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64) { require(value >= -2**63 && value < 2**63, "SafeCast: value doesn\'t fit in 64 bits"); return int64(value); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32) { require(value >= -2**31 && value < 2**31, "SafeCast: value doesn\'t fit in 32 bits"); return int32(value); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16) { require(value >= -2**15 && value < 2**15, "SafeCast: value doesn\'t fit in 16 bits"); return int16(value); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits. * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8) { require(value >= -2**7 && value < 2**7, "SafeCast: value doesn\'t fit in 8 bits"); return int8(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { require(value < 2**255, "SafeCast: value doesn't fit in an int256"); return int256(value); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol /** * @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); } // File: @openzeppelin/contracts/utils/Address.sol /** * @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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); 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); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.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"); } } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts/staking/Staking.sol contract Staking is StakingInterface, ReentrancyGuard, StakingVote, StakingDestinations, TransferETH { using SafeMath for uint256; using SafeMath for uint128; using SafeCast for uint256; using SafeERC20 for IERC20; /* ========== CONSTANT VARIABLES ========== */ address internal constant ETH_ADDRESS = address(0); uint256 internal constant MAX_TERM = 1000; IERC20 internal immutable _stakingToken; uint256 internal immutable _startTimestamp; // timestamp of the term 0 uint256 internal immutable _termInterval; // time interval between terms in second /* ========== STATE VARIABLES ========== */ struct AccountInfo { uint128 stakeAmount; // active stake amount of the user at userTerm uint128 added; // the added amount of stake which will be merged to stakeAmount at the term+1. uint256 userTerm; // the term when the user executed any function last time (all the terms before the term has been already settled) uint256 rewards; // the total amount of rewards until userTerm } /** * @dev token => account => data */ mapping(address => mapping(address => AccountInfo)) internal _accountInfo; struct TermInfo { uint128 stakeAdd; // the total added amount of stake which will be merged to stakeSum at the term+1 uint128 stakeSum; // the total staking amount at the term uint256 rewardSum; // the total amount of rewards at the term } /** * @dev token => term => data */ mapping(address => mapping(uint256 => TermInfo)) internal _termInfo; mapping(address => uint256) internal _currentTerm; // (token => term); the current term (all the info prior to this term is fixed) mapping(address => uint256) internal _totalRemainingRewards; // (token => amount); total unsettled amount of rewards /* ========== EVENTS ========== */ event RewardAdded(address indexed token, uint256 reward); event Staked(address indexed token, address indexed account, uint128 amount); event Withdrawn(address indexed token, address indexed account, uint128 amount); event RewardPaid(address indexed token, address indexed account, uint256 reward); /* ========== CONSTRUCTOR ========== */ constructor( address stakingTokenAddress, address governance, uint256 startTimestamp, uint256 termInterval ) StakingVote(governance) { require(startTimestamp <= block.timestamp, "startTimestamp should be past time"); _stakingToken = IERC20(stakingTokenAddress); _startTimestamp = startTimestamp; _termInterval = termInterval; } /* ========== MODIFIERS ========== */ /** * @dev Calc total rewards of the account until the current term. */ modifier updateReward(address token, address account) { AccountInfo memory accountInfo = _accountInfo[token][account]; uint256 startTerm = accountInfo.userTerm; // When the loop count exceeds MAX_TERM, stop processing in order not to reach to the block gas limit for ( uint256 term = accountInfo.userTerm; term < _currentTerm[token] && term < startTerm + MAX_TERM; term++ ) { TermInfo memory termInfo = _termInfo[token][term]; if (termInfo.stakeSum != 0) { accountInfo.rewards = accountInfo.rewards.add( accountInfo.stakeAmount.mul(termInfo.rewardSum).div(termInfo.stakeSum) ); // `(your stake amount) / (total stake amount) * total rewards` in each term } accountInfo.stakeAmount = accountInfo.stakeAmount.add(accountInfo.added).toUint128(); accountInfo.added = 0; accountInfo.userTerm = term + 1; // calculated until this term if (accountInfo.stakeAmount == 0) { accountInfo.userTerm = _currentTerm[token]; break; // skip unnecessary term } } _accountInfo[token][account] = accountInfo; _; } /** * @dev Update the info up to the current term. */ modifier updateTerm(address token) { if (_currentTerm[token] < _getLatestTerm()) { uint256 currentBalance = (token == ETH_ADDRESS) ? address(this).balance : IERC20(token).balanceOf(address(this)); uint256 nextRewardSum = currentBalance.sub(_totalRemainingRewards[token]); TermInfo memory currentTermInfo = _termInfo[token][_currentTerm[token]]; uint128 nextStakeSum = currentTermInfo .stakeSum .add(currentTermInfo.stakeAdd) .toUint128(); uint256 carriedReward = currentTermInfo.stakeSum == 0 ? currentTermInfo.rewardSum : 0; // if stakeSum is 0, carried forward until someone stakes uint256 nextTerm = nextStakeSum == 0 ? _getLatestTerm() : _currentTerm[token] + 1; // if next stakeSum is 0, skip to latest term _termInfo[token][nextTerm] = TermInfo({ stakeAdd: 0, stakeSum: nextStakeSum, rewardSum: nextRewardSum.add(carriedReward) }); // write total stake amount since (nextTerm + 1) until _getLatestTerm() if (nextTerm < _getLatestTerm()) { // assert(_termInfo[token][nextTerm].stakeSum != 0 && _termInfo[token][nextTerm].stakeAdd == 0); _termInfo[token][_getLatestTerm()] = TermInfo({ stakeAdd: 0, stakeSum: nextStakeSum, rewardSum: 0 }); } _totalRemainingRewards[token] = currentBalance; // total amount of unpaid reward _currentTerm[token] = _getLatestTerm(); } _; } /* ========== MUTATIVE FUNCTIONS ========== */ /** * @notice Stake the staking token for the token to be paid as reward. */ function stake(address token, uint128 amount) external override nonReentrant updateTerm(token) updateReward(token, msg.sender) { if (_accountInfo[token][msg.sender].userTerm < _currentTerm[token]) { return; } require(amount != 0, "staking amount should be positive number"); _updVoteAdd(msg.sender, amount); _stake(msg.sender, token, amount); _stakingToken.safeTransferFrom(msg.sender, address(this), amount); } /** * @notice Withdraw the staking token for the token to be paid as reward. */ function withdraw(address token, uint128 amount) external override nonReentrant updateTerm(token) updateReward(token, msg.sender) { if (_accountInfo[token][msg.sender].userTerm < _currentTerm[token]) { return; } require(amount != 0, "withdrawing amount should be positive number"); _updVoteSub(msg.sender, amount); _withdraw(msg.sender, token, amount); _stakingToken.safeTransfer(msg.sender, amount); } /** * @notice Receive the reward for your staking in the token. */ function receiveReward(address token) external override nonReentrant updateTerm(token) updateReward(token, msg.sender) returns (uint256 rewards) { rewards = _accountInfo[token][msg.sender].rewards; if (rewards != 0) { _totalRemainingRewards[token] = _totalRemainingRewards[token].sub(rewards); // subtract the total unpaid reward _accountInfo[token][msg.sender].rewards = 0; if (token == ETH_ADDRESS) { _transferETH(msg.sender, rewards); } else { IERC20(token).safeTransfer(msg.sender, rewards); } emit RewardPaid(token, msg.sender, rewards); } } function changeStakeTarget( address oldTarget, address newTarget, uint128 amount ) external override nonReentrant updateTerm(oldTarget) updateReward(oldTarget, msg.sender) updateTerm(newTarget) updateReward(newTarget, msg.sender) { if ( _accountInfo[oldTarget][msg.sender].userTerm < _currentTerm[oldTarget] || _accountInfo[newTarget][msg.sender].userTerm < _currentTerm[newTarget] ) { return; } require(amount != 0, "transfering amount should be positive number"); _withdraw(msg.sender, oldTarget, amount); _stake(msg.sender, newTarget, amount); } /* ========== INTERNAL FUNCTIONS ========== */ function _stake( address account, address token, uint128 amount ) internal { AccountInfo memory accountInfo = _accountInfo[token][account]; if (accountInfo.stakeAmount == 0 && accountInfo.added == 0) { _addDestinations(account, token); } _accountInfo[token][account].added = accountInfo.added.add(amount).toUint128(); // added when the term is shifted (the user) uint256 term = _currentTerm[token]; _termInfo[token][term].stakeAdd = _termInfo[token][term].stakeAdd.add(amount).toUint128(); // added when the term is shifted (global) emit Staked(token, account, amount); } function _withdraw( address account, address token, uint128 amount ) internal { AccountInfo memory accountInfo = _accountInfo[token][account]; require( accountInfo.stakeAmount.add(accountInfo.added) >= amount, "exceed withdrawable amount" ); if (accountInfo.stakeAmount + accountInfo.added == amount) { _removeDestinations(account, token); } uint256 currentTerm = _currentTerm[token]; TermInfo memory termInfo = _termInfo[token][currentTerm]; if (accountInfo.added > amount) { accountInfo.added -= amount; termInfo.stakeAdd -= amount; } else { termInfo.stakeSum = termInfo.stakeSum.sub(amount - accountInfo.added).toUint128(); termInfo.stakeAdd = termInfo.stakeAdd.sub(accountInfo.added).toUint128(); accountInfo.stakeAmount = accountInfo .stakeAmount .sub(amount - accountInfo.added) .toUint128(); accountInfo.added = 0; } _accountInfo[token][account] = accountInfo; _termInfo[token][currentTerm] = termInfo; emit Withdrawn(token, account, amount); } function _getNextTermReward(address token) internal view returns (uint256 rewards) { // as the term at current+1 has not been settled uint256 currentBalance = (token == ETH_ADDRESS) ? address(this).balance : IERC20(token).balanceOf(address(this)); return (currentBalance > _totalRemainingRewards[token]) ? currentBalance - _totalRemainingRewards[token] : 0; } function _getLatestTerm() internal view returns (uint256) { return (block.timestamp - _startTimestamp) / _termInterval; } /* ========== CALL FUNCTIONS ========== */ /** * @return stakingTokenAddress is the token locked for staking */ function getStakingTokenAddress() external view override returns (address stakingTokenAddress) { return address(_stakingToken); } /** * @return startTimestamp is the time when this contract was deployed * @return termInterval is the duration of a term */ function getConfigs() external view override returns (uint256 startTimestamp, uint256 termInterval) { startTimestamp = _startTimestamp; termInterval = _termInterval; } /** * @return the ERC20 token addresses in staking */ function getStakingDestinations(address account) external view override returns (address[] memory) { return _getStakingDestinations(account); } /** * @param token is the token address to stake for * @return currentTerm is the current latest term * @return latestTerm is the potential latest term * @return totalRemainingRewards is the as-of remaining rewards * @return currentReward is the total rewards at the current term * @return nextTermRewards is the as-of total rewards to be paid at the next term * @return currentStaking is the total active staking amount * @return nextTermStaking is the total staking amount */ function getTokenInfo(address token) external view override returns ( uint256 currentTerm, uint256 latestTerm, uint256 totalRemainingRewards, uint256 currentReward, uint256 nextTermRewards, uint128 currentStaking, uint128 nextTermStaking ) { currentTerm = _currentTerm[token]; latestTerm = _getLatestTerm(); totalRemainingRewards = _totalRemainingRewards[token]; currentReward = _termInfo[token][currentTerm].rewardSum; nextTermRewards = _getNextTermReward(token); TermInfo memory termInfo = _termInfo[token][_currentTerm[token]]; currentStaking = termInfo.stakeSum; nextTermStaking = termInfo.stakeSum.add(termInfo.stakeAdd).toUint128(); } /** * @notice Returns _termInfo[token][term]. */ function getTermInfo(address token, uint256 term) external view override returns ( uint128 stakeAdd, uint128 stakeSum, uint256 rewardSum ) { TermInfo memory termInfo = _termInfo[token][term]; stakeAdd = termInfo.stakeAdd; stakeSum = termInfo.stakeSum; if (term == _currentTerm[token] + 1) { rewardSum = _getNextTermReward(token); } else { rewardSum = termInfo.rewardSum; } } /** * @return userTerm is the latest term the user has updated to * @return stakeAmount is the latest amount of staking from the user has updated to * @return nextAddedStakeAmount is the next amount of adding to stake from the user has updated to * @return currentReward is the latest reward getting by the user has updated to * @return nextLatestTermUserRewards is the as-of user rewards to be paid at the next term * @return depositAmount is the staking amount * @return withdrawableStakingAmount is the withdrawable staking amount */ function getAccountInfo(address token, address account) external view override returns ( uint256 userTerm, uint256 stakeAmount, uint128 nextAddedStakeAmount, uint256 currentReward, uint256 nextLatestTermUserRewards, uint128 depositAmount, uint128 withdrawableStakingAmount ) { AccountInfo memory accountInfo = _accountInfo[token][account]; userTerm = accountInfo.userTerm; stakeAmount = accountInfo.stakeAmount; nextAddedStakeAmount = accountInfo.added; currentReward = accountInfo.rewards; uint256 currentTerm = _currentTerm[token]; TermInfo memory termInfo = _termInfo[token][currentTerm]; uint256 nextLatestTermRewards = _getNextTermReward(token); nextLatestTermUserRewards = termInfo.stakeSum.add(termInfo.stakeAdd) == 0 ? 0 : nextLatestTermRewards.mul(accountInfo.stakeAmount.add(accountInfo.added)) / (termInfo.stakeSum + termInfo.stakeAdd); depositAmount = accountInfo.stakeAmount.add(accountInfo.added).toUint128(); uint128 availableForVoting = _voteNum[account].toUint128(); withdrawableStakingAmount = depositAmount < availableForVoting ? depositAmount : availableForVoting; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"stakingTokenAddress","type":"address"},{"internalType":"address","name":"governance","type":"address"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"termInterval","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"LogUpdateGovernanceAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint128","name":"amount","type":"uint128"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint128","name":"amount","type":"uint128"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"oldTarget","type":"address"},{"internalType":"address","name":"newTarget","type":"address"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"changeStakeTarget","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"uint256","name":"userTerm","type":"uint256"},{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint128","name":"nextAddedStakeAmount","type":"uint128"},{"internalType":"uint256","name":"currentReward","type":"uint256"},{"internalType":"uint256","name":"nextLatestTermUserRewards","type":"uint256"},{"internalType":"uint128","name":"depositAmount","type":"uint128"},{"internalType":"uint128","name":"withdrawableStakingAmount","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConfigs","outputs":[{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"termInterval","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGovernanceAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getStakingDestinations","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingTokenAddress","outputs":[{"internalType":"address","name":"stakingTokenAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"term","type":"uint256"}],"name":"getTermInfo","outputs":[{"internalType":"uint128","name":"stakeAdd","type":"uint128"},{"internalType":"uint128","name":"stakeSum","type":"uint128"},{"internalType":"uint256","name":"rewardSum","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenInfo","outputs":[{"internalType":"uint256","name":"currentTerm","type":"uint256"},{"internalType":"uint256","name":"latestTerm","type":"uint256"},{"internalType":"uint256","name":"totalRemainingRewards","type":"uint256"},{"internalType":"uint256","name":"currentReward","type":"uint256"},{"internalType":"uint256","name":"nextTermRewards","type":"uint256"},{"internalType":"uint128","name":"currentStaking","type":"uint128"},{"internalType":"uint128","name":"nextTermStaking","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVoteNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"receiveReward","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newGovernanceAddress","type":"address"}],"name":"updateGovernanceAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"voteDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"voteWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040523480156200001157600080fd5b50604051620049a1380380620049a1833981810160405260808110156200003757600080fd5b508051602082015160408301516060909301516001600081905580546001600160a01b0319166001600160a01b0384161790559192909142821115620000c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806200497f6022913960400191505060405180910390fd5b606084901b6001600160601b03191660805260a082905260c08190526001600160a01b03909316929091506148536200012c6000398061312252806132de52508061310052806132ff525080610d4152806115435280612dc952506148536000f3fe6080604052600436106100ec5760003560e01c8063629f40281161008a578063abdc303311610059578063abdc303314610420578063b90d89301461044e578063d0b589de14610481578063d74ed0fb14610504576100f3565b8063629f4028146103155780636332fef614610348578063684da514146103d2578063732524941461040b576100f3565b80632a7548e9116100c65780632a7548e91461021057806343b8d1111461025557806359af0e5d146102ab5780635e1e09a1146102e4576100f3565b806308fab167146100f857806319f8d5b4146101455780631f69565f14610190576100f3565b366100f357005b600080fd5b34801561010457600080fd5b506101436004803603604081101561011b57600080fd5b5080356001600160a01b031690602001356fffffffffffffffffffffffffffffffff16610570565b005b34801561015157600080fd5b506101436004803603604081101561016857600080fd5b5080356001600160a01b031690602001356fffffffffffffffffffffffffffffffff16610d88565b34801561019c57600080fd5b506101c3600480360360208110156101b357600080fd5b50356001600160a01b031661157d565b60408051978852602088019690965286860194909452606086019290925260808501526fffffffffffffffffffffffffffffffff90811660a08501521660c0830152519081900360e00190f35b34801561021c57600080fd5b506102436004803603602081101561023357600080fd5b50356001600160a01b0316611684565b60408051918252519081900360200190f35b34801561026157600080fd5b506101436004803603606081101561027857600080fd5b5080356001600160a01b0390811691602081013590911690604001356fffffffffffffffffffffffffffffffff16611e5f565b3480156102b757600080fd5b50610143600480360360408110156102ce57600080fd5b506001600160a01b038135169060200135612d53565b3480156102f057600080fd5b506102f9612dc7565b604080516001600160a01b039092168252519081900360200190f35b34801561032157600080fd5b506102436004803603602081101561033857600080fd5b50356001600160a01b0316612deb565b34801561035457600080fd5b506103836004803603604081101561036b57600080fd5b506001600160a01b0381358116916020013516612e06565b6040805197885260208801969096526fffffffffffffffffffffffffffffffff9485168787015260608701939093526080860191909152821660a08501521660c0830152519081900360e00190f35b3480156103de57600080fd5b50610143600480360360408110156103f557600080fd5b506001600160a01b038135169060200135613080565b34801561041757600080fd5b506102f96130ef565b34801561042c57600080fd5b506104356130fe565b6040805192835260208301919091528051918290030190f35b34801561045a57600080fd5b506101436004803603602081101561047157600080fd5b50356001600160a01b0316613144565b34801561048d57600080fd5b506104b4600480360360208110156104a457600080fd5b50356001600160a01b0316613216565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104f05781810151838201526020016104d8565b505050509050019250505060405180910390f35b34801561051057600080fd5b5061053d6004803603604081101561052757600080fd5b506001600160a01b038135169060200135613227565b604080516fffffffffffffffffffffffffffffffff94851681529290931660208301528183015290519081900360600190f35b600260005414156105e257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055816105f06132da565b6001600160a01b03821660009081526006602052604090205410156109c75760006001600160a01b038216156106b057604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561067f57600080fd5b505afa158015610693573d6000803e3d6000fd5b505050506040513d60208110156106a957600080fd5b50516106b3565b30315b6001600160a01b038316600090815260076020526040812054919250906106db90839061332d565b90506106e561469e565b506001600160a01b0383166000908152600560209081526040808320600683528184205484528252808320815160608101835281546fffffffffffffffffffffffffffffffff80821680845270010000000000000000000000000000000090920416948201859052600190920154928101929092529092916107709161076b9190613376565b6133ea565b9050600082602001516fffffffffffffffffffffffffffffffff1660001461079957600061079f565b82604001515b905060006fffffffffffffffffffffffffffffffff8316156107dc576001600160a01b0387166000908152600660205260409020546001016107e4565b6107e46132da565b60408051606081018252600081526fffffffffffffffffffffffffffffffff8616602082015291925081016108198785613376565b90526001600160a01b038816600090815260056020908152604080832085845282529182902083518154928501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff91821617811670010000000000000000000000000000000091909316029190911781559101516001909101556108b06132da565b811015610984576040805160608101825260008082526fffffffffffffffffffffffffffffffff86166020808401919091528284018290526001600160a01b038b1682526005905291822090916109056132da565b8152602080820192909252604090810160002083518154938501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009094166fffffffffffffffffffffffffffffffff918216178116700100000000000000000000000000000000919094160292909217825591909101516001909101555b6001600160a01b03871660009081526007602052604090208690556109a76132da565b6001600160a01b0388166000908152600660205260409020555050505050505b82336109d16146be565b506001600160a01b038083166000908152600460209081526040808320938516835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041692810192909252600181015492820183905260020154606082015290805b6001600160a01b03851660009081526006602052604090205481108015610a7857506103e8820181105b15610bda57610a8561469e565b506001600160a01b0385166000908152600560209081526040808320848452825291829020825160608101845281546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000909104169281018390526001909101549281019290925215610b5957610b53610b4882602001516fffffffffffffffffffffffffffffffff16610b42846040015188600001516fffffffffffffffffffffffffffffffff1661345990919063ffffffff16565b906134cc565b606086015190613376565b60608501525b60208401518451610b839161076b916fffffffffffffffffffffffffffffffff9081169116613376565b6fffffffffffffffffffffffffffffffff1680855260006020860152600183016040860152610bd157506001600160a01b038516600090815260066020526040908190205490840152610bda565b50600101610a4e565b506001600160a01b0380851660009081526004602081815260408084208886168552825280842087518154848a01516fffffffffffffffffffffffffffffffff908116700100000000000000000000000000000000029281167fffffffffffffffffffffffffffffffff000000000000000000000000000000009092169190911716178155818801516001808301919091556060890151600290920191909155948c1684526006825280842054928252808420338552909152909120909101541015610ca557610d7a565b6fffffffffffffffffffffffffffffffff8616610d0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806147a7602c913960400191505060405180910390fd5b610d2933876fffffffffffffffffffffffffffffffff1661350e565b610d343388886135b8565b610d7a6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016336fffffffffffffffffffffffffffffffff891661399c565b505060016000555050505050565b60026000541415610dfa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005581610e086132da565b6001600160a01b03821660009081526006602052604090205410156111da5760006001600160a01b03821615610ec857604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b158015610e9757600080fd5b505afa158015610eab573d6000803e3d6000fd5b505050506040513d6020811015610ec157600080fd5b5051610ecb565b30315b6001600160a01b03831660009081526007602052604081205491925090610ef390839061332d565b9050610efd61469e565b506001600160a01b0383166000908152600560209081526040808320600683528184205484528252808320815160608101835281546fffffffffffffffffffffffffffffffff8082168084527001000000000000000000000000000000009092041694820185905260019092015492810192909252909291610f839161076b9190613376565b9050600082602001516fffffffffffffffffffffffffffffffff16600014610fac576000610fb2565b82604001515b905060006fffffffffffffffffffffffffffffffff831615610fef576001600160a01b038716600090815260066020526040902054600101610ff7565b610ff76132da565b60408051606081018252600081526fffffffffffffffffffffffffffffffff86166020820152919250810161102c8785613376565b90526001600160a01b038816600090815260056020908152604080832085845282529182902083518154928501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff91821617811670010000000000000000000000000000000091909316029190911781559101516001909101556110c36132da565b811015611197576040805160608101825260008082526fffffffffffffffffffffffffffffffff86166020808401919091528284018290526001600160a01b038b1682526005905291822090916111186132da565b8152602080820192909252604090810160002083518154938501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009094166fffffffffffffffffffffffffffffffff918216178116700100000000000000000000000000000000919094160292909217825591909101516001909101555b6001600160a01b03871660009081526007602052604090208690556111ba6132da565b6001600160a01b0388166000908152600660205260409020555050505050505b82336111e46146be565b506001600160a01b038083166000908152600460209081526040808320938516835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041692810192909252600181015492820183905260020154606082015290805b6001600160a01b0385166000908152600660205260409020548110801561128b57506103e8820181105b156113dc5761129861469e565b506001600160a01b0385166000908152600560209081526040808320848452825291829020825160608101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416928101839052600190910154928101929092521561135b57611355610b4882602001516fffffffffffffffffffffffffffffffff16610b42846040015188600001516fffffffffffffffffffffffffffffffff1661345990919063ffffffff16565b60608501525b602084015184516113859161076b916fffffffffffffffffffffffffffffffff9081169116613376565b6fffffffffffffffffffffffffffffffff16808552600060208601526001830160408601526113d357506001600160a01b0385166000908152600660205260409081902054908401526113dc565b50600101611261565b506001600160a01b0380851660009081526004602081815260408084208886168552825280842087518154848a01516fffffffffffffffffffffffffffffffff908116700100000000000000000000000000000000029281167fffffffffffffffffffffffffffffffff000000000000000000000000000000009092169190911716178155818801516001808301919091556060890151600290920191909155948c16845260068252808420549282528084203385529091529091209091015410156114a757610d7a565b6fffffffffffffffffffffffffffffffff861661150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061477f6028913960400191505060405180910390fd5b61152b33876fffffffffffffffffffffffffffffffff16613a1c565b611536338888613ac7565b610d7a6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633306fffffffffffffffffffffffffffffffff8a16613ce1565b6001600160a01b0381166000908152600660205260408120549080808080806115a46132da565b6001600160a01b038916600090815260076020908152604080832054600583528184208c855290925290912060010154919750955093506115e488613d6f565b92506115ee61469e565b506001600160a01b038816600090815260056020908152604080832060068352818420548452825291829020825160608101845281546fffffffffffffffffffffffffffffffff80821680845270010000000000000000000000000000000090920416938201849052600190920154938101939093529093506116769061076b908590613376565b915050919395979092949650565b6000600260005414156116f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055816117066132da565b6001600160a01b0382166000908152600660205260409020541015611ad85760006001600160a01b038216156117c657604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561179557600080fd5b505afa1580156117a9573d6000803e3d6000fd5b505050506040513d60208110156117bf57600080fd5b50516117c9565b30315b6001600160a01b038316600090815260076020526040812054919250906117f190839061332d565b90506117fb61469e565b506001600160a01b0383166000908152600560209081526040808320600683528184205484528252808320815160608101835281546fffffffffffffffffffffffffffffffff80821680845270010000000000000000000000000000000090920416948201859052600190920154928101929092529092916118819161076b9190613376565b9050600082602001516fffffffffffffffffffffffffffffffff166000146118aa5760006118b0565b82604001515b905060006fffffffffffffffffffffffffffffffff8316156118ed576001600160a01b0387166000908152600660205260409020546001016118f5565b6118f56132da565b60408051606081018252600081526fffffffffffffffffffffffffffffffff86166020820152919250810161192a8785613376565b90526001600160a01b038816600090815260056020908152604080832085845282529182902083518154928501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff91821617811670010000000000000000000000000000000091909316029190911781559101516001909101556119c16132da565b811015611a95576040805160608101825260008082526fffffffffffffffffffffffffffffffff86166020808401919091528284018290526001600160a01b038b168252600590529182209091611a166132da565b8152602080820192909252604090810160002083518154938501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009094166fffffffffffffffffffffffffffffffff918216178116700100000000000000000000000000000000919094160292909217825591909101516001909101555b6001600160a01b0387166000908152600760205260409020869055611ab86132da565b6001600160a01b0388166000908152600660205260409020555050505050505b8233611ae26146be565b506001600160a01b038083166000908152600460209081526040808320938516835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041692810192909252600181015492820183905260020154606082015290805b6001600160a01b03851660009081526006602052604090205481108015611b8957506103e8820181105b15611cda57611b9661469e565b506001600160a01b0385166000908152600560209081526040808320848452825291829020825160608101845281546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000909104169281018390526001909101549281019290925215611c5957611c53610b4882602001516fffffffffffffffffffffffffffffffff16610b42846040015188600001516fffffffffffffffffffffffffffffffff1661345990919063ffffffff16565b60608501525b60208401518451611c839161076b916fffffffffffffffffffffffffffffffff9081169116613376565b6fffffffffffffffffffffffffffffffff1680855260006020860152600183016040860152611cd157506001600160a01b038516600090815260066020526040908190205490840152611cda565b50600101611b5f565b506001600160a01b0380851660009081526004602081815260408084208886168552825280842087518154848a01516fffffffffffffffffffffffffffffffff908116700100000000000000000000000000000000029281167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117161781558188015160018201556060880151600291820155948c16845291815281832033845290529020015495508515611e4f576001600160a01b038716600090815260076020526040902054611db2908761332d565b6001600160a01b03881660008181526007602090815260408083209490945560048152838220338352905291822060020191909155611dfa57611df53387613e5f565b611e0e565b611e0e6001600160a01b038816338861399c565b60408051878152905133916001600160a01b038a16917f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e9181900360200190a35b5050600160005550919392505050565b60026000541415611ed157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005582611edf6132da565b6001600160a01b03821660009081526006602052604090205410156122b15760006001600160a01b03821615611f9f57604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b5051611fa2565b30315b6001600160a01b03831660009081526007602052604081205491925090611fca90839061332d565b9050611fd461469e565b506001600160a01b0383166000908152600560209081526040808320600683528184205484528252808320815160608101835281546fffffffffffffffffffffffffffffffff808216808452700100000000000000000000000000000000909204169482018590526001909201549281019290925290929161205a9161076b9190613376565b9050600082602001516fffffffffffffffffffffffffffffffff16600014612083576000612089565b82604001515b905060006fffffffffffffffffffffffffffffffff8316156120c6576001600160a01b0387166000908152600660205260409020546001016120ce565b6120ce6132da565b60408051606081018252600081526fffffffffffffffffffffffffffffffff8616602082015291925081016121038785613376565b90526001600160a01b038816600090815260056020908152604080832085845282529182902083518154928501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff918216178116700100000000000000000000000000000000919093160291909117815591015160019091015561219a6132da565b81101561226e576040805160608101825260008082526fffffffffffffffffffffffffffffffff86166020808401919091528284018290526001600160a01b038b1682526005905291822090916121ef6132da565b8152602080820192909252604090810160002083518154938501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009094166fffffffffffffffffffffffffffffffff918216178116700100000000000000000000000000000000919094160292909217825591909101516001909101555b6001600160a01b03871660009081526007602052604090208690556122916132da565b6001600160a01b0388166000908152600660205260409020555050505050505b83336122bb6146be565b506001600160a01b038083166000908152600460209081526040808320938516835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041692810192909252600181015492820183905260020154606082015290805b6001600160a01b0385166000908152600660205260409020548110801561236257506103e8820181105b156124b35761236f61469e565b506001600160a01b0385166000908152600560209081526040808320848452825291829020825160608101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041692810183905260019091015492810192909252156124325761242c610b4882602001516fffffffffffffffffffffffffffffffff16610b42846040015188600001516fffffffffffffffffffffffffffffffff1661345990919063ffffffff16565b60608501525b6020840151845161245c9161076b916fffffffffffffffffffffffffffffffff9081169116613376565b6fffffffffffffffffffffffffffffffff16808552600060208601526001830160408601526124aa57506001600160a01b0385166000908152600660205260409081902054908401526124b3565b50600101612338565b506001600160a01b03848116600090815260046020908152604080832093871683529281529082902084518154928601517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff91821617811670010000000000000000000000000000000091909316029190911781559083015160018201556060830151600290910155866125596132da565b6001600160a01b038216600090815260066020526040902054101561292b5760006001600160a01b0382161561261957604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156125e857600080fd5b505afa1580156125fc573d6000803e3d6000fd5b505050506040513d602081101561261257600080fd5b505161261c565b30315b6001600160a01b0383166000908152600760205260408120549192509061264490839061332d565b905061264e61469e565b506001600160a01b0383166000908152600560209081526040808320600683528184205484528252808320815160608101835281546fffffffffffffffffffffffffffffffff80821680845270010000000000000000000000000000000090920416948201859052600190920154928101929092529092916126d49161076b9190613376565b9050600082602001516fffffffffffffffffffffffffffffffff166000146126fd576000612703565b82604001515b905060006fffffffffffffffffffffffffffffffff831615612740576001600160a01b038716600090815260066020526040902054600101612748565b6127486132da565b60408051606081018252600081526fffffffffffffffffffffffffffffffff86166020820152919250810161277d8785613376565b90526001600160a01b038816600090815260056020908152604080832085845282529182902083518154928501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff91821617811670010000000000000000000000000000000091909316029190911781559101516001909101556128146132da565b8110156128e8576040805160608101825260008082526fffffffffffffffffffffffffffffffff86166020808401919091528284018290526001600160a01b038b1682526005905291822090916128696132da565b8152602080820192909252604090810160002083518154938501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009094166fffffffffffffffffffffffffffffffff918216178116700100000000000000000000000000000000919094160292909217825591909101516001909101555b6001600160a01b038716600090815260076020526040902086905561290b6132da565b6001600160a01b0388166000908152600660205260409020555050505050505b87336129356146be565b506001600160a01b038083166000908152600460209081526040808320938516835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041692810192909252600181015492820183905260020154606082015290805b6001600160a01b038516600090815260066020526040902054811080156129dc57506103e8820181105b15612b2d576129e961469e565b506001600160a01b0385166000908152600560209081526040808320848452825291829020825160608101845281546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000909104169281018390526001909101549281019290925215612aac57612aa6610b4882602001516fffffffffffffffffffffffffffffffff16610b42846040015188600001516fffffffffffffffffffffffffffffffff1661345990919063ffffffff16565b60608501525b60208401518451612ad69161076b916fffffffffffffffffffffffffffffffff9081169116613376565b6fffffffffffffffffffffffffffffffff1680855260006020860152600183016040860152612b2457506001600160a01b038516600090815260066020526040908190205490840152612b2d565b506001016129b2565b508160046000866001600160a01b03166001600160a01b031681526020019081526020016000206000856001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506040820151816001015560608201518160020155905050600660008e6001600160a01b03166001600160a01b0316815260200190815260200160002054600460008f6001600160a01b03166001600160a01b031681526020019081526020016000206000336001600160a01b03166001600160a01b03168152602001908152602001600020600101541080612cb757506001600160a01b038c166000908152600660209081526040808320546004835281842033855290925290912060010154105b15612cc157612d3f565b6fffffffffffffffffffffffffffffffff8b16612d29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614732602c913960400191505060405180910390fd5b612d34338e8d6135b8565b612d3f338d8d613ac7565b505060016000555050505050505050505050565b60015433906001600160a01b03168114612db8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147fd6021913960400191505060405180910390fd5b612dc28383613a1c565b505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526002602052604090205490565b6000806000806000806000612e196146be565b506001600160a01b03808a166000818152600460209081526040808320948d168352938152838220845160808101865281546fffffffffffffffffffffffffffffffff8082168084527001000000000000000000000000000000009092041682850181905260018401548389018190526002909401546060840181905296865260069094529590932054909b50939950975090955090612eb761469e565b506001600160a01b038b1660009081526005602090815260408083208484528252808320815160608101835281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041693810193909352600101549082015290612f2a8d613d6f565b82516020840151919250612f53916fffffffffffffffffffffffffffffffff9081169116613376565b15612fcb5781600001518260200151016fffffffffffffffffffffffffffffffff16612fbe612fb786602001516fffffffffffffffffffffffffffffffff1687600001516fffffffffffffffffffffffffffffffff1661337690919063ffffffff16565b8390613459565b81612fc557fe5b04612fce565b60005b965061301261076b85602001516fffffffffffffffffffffffffffffffff1686600001516fffffffffffffffffffffffffffffffff1661337690919063ffffffff16565b6001600160a01b038d1660009081526002602052604081205491975090613038906133ea565b9050806fffffffffffffffffffffffffffffffff16876fffffffffffffffffffffffffffffffff161061306b578061306d565b865b9550505050505092959891949750929550565b60015433906001600160a01b031681146130e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147fd6021913960400191505060405180910390fd5b612dc2838361350e565b6001546001600160a01b031690565b7f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090565b60015433906001600160a01b031681146131a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147fd6021913960400191505060405180910390fd5b600180546001600160a01b0384167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517fffdebd7edaf6b4c7e00c6c944d9995f08ba8372a39db0695da3990924d29f2049181900360200190a15050565b606061322182613ea3565b92915050565b600080600061323461469e565b506001600160a01b03851660008181526005602090815260408083208884528252808320815160608101835281546fffffffffffffffffffffffffffffffff808216808452700100000000000000000000000000000000909204168286018190526001938401548386015296865260069094529190932054919650929450018514156132ca576132c386613d6f565b91506132d2565b806040015191505b509250925092565b60007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042038161332757fe5b04905090565b600061336f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ec7565b9392505050565b60008282018381101561336f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60007001000000000000000000000000000000008210613455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061470b6027913960400191505060405180910390fd5b5090565b60008261346857506000613221565b8282028284828161347557fe5b041461336f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061475e6021913960400191505060405180910390fd5b600061336f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613f78565b6001600160a01b03821660009081526002602052604090205481111561359557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e646572666c6f772074686520616d6f756e74206f6620766f746573000000604482015290519081900360640190fd5b6001600160a01b0390911660009081526002602052604090208054919091039055565b6135c06146be565b506001600160a01b038083166000908152600460209081526040808320938716835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff808216808452700100000000000000000000000000000000909204811694830185905260018401549583019590955260029092015460608201529284169161364c9190613376565b10156136b957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f65786365656420776974686472617761626c6520616d6f756e74000000000000604482015290519081900360640190fd5b816fffffffffffffffffffffffffffffffff1681602001518260000151016fffffffffffffffffffffffffffffffff1614156136fb576136f98484613ff7565b505b6001600160a01b03831660009081526006602052604090205461371c61469e565b506001600160a01b0384166000908152600560209081526040808320848452825291829020825160608101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091048116828501526001909201549381019390935290840151858216911611156137c5576020830180516fffffffffffffffffffffffffffffffff908690038116909152815185900316815261388a565b61380961076b846020015186036fffffffffffffffffffffffffffffffff1683602001516fffffffffffffffffffffffffffffffff1661332d90919063ffffffff16565b6fffffffffffffffffffffffffffffffff908116602080840191909152840151825161383d9261076b92918116911661332d565b6fffffffffffffffffffffffffffffffff90811682526020840151845161386e9261076b929181169188031661332d565b6fffffffffffffffffffffffffffffffff168352600060208401525b6001600160a01b038581166000818152600460209081526040808320948b16808452948252808320885181548a8501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009182166fffffffffffffffffffffffffffffffff93841617831670010000000000000000000000000000000091841682021784558b85015160018086019190915560608d0151600290950194909455878752600586528487208b8852865295849020895181548b880151931690841617831691831690960217855587830151949091019390935580519289168352517ff3534c5992c3931fc86fbca15a3e750e109223ef17b7347236ffc0b1e7bdab299281900390910190a3505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612dc2908490614019565b6001600160a01b0382166000908152600260205260409020548101811115613aa557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6f766572666c6f772074686520616d6f756e74206f6620766f74657300000000604482015290519081900360640190fd5b6001600160a01b03909116600090815260026020526040902080549091019055565b613acf6146be565b506001600160a01b038083166000908152600460209081526040808320938716835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff8082168084527001000000000000000000000000000000009092041693820193909352600182015493810193909352600201546060830152158015613b6c575060208101516fffffffffffffffffffffffffffffffff16155b15613b7b57613b7b84846140e4565b613bb961076b836fffffffffffffffffffffffffffffffff1683602001516fffffffffffffffffffffffffffffffff1661337690919063ffffffff16565b6001600160a01b038085166000818152600460209081526040808320948a16835293815283822080546fffffffffffffffffffffffffffffffff9687167001000000000000000000000000000000000290871617905591815260068252828120546005835283822081835290925291909120549091613c419161076b91908116908616613376565b6001600160a01b03858116600081815260056020908152604080832087845282529182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff9687161790558151948816855290519289169391927f58aa73a102e270a292b02e32b54a1d116added91ce95edccc20c1ebbab0deec39281900390910190a35050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052613d69908590614019565b50505050565b6000806001600160a01b03831615613e1157604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b158015613de057600080fd5b505afa158015613df4573d6000803e3d6000fd5b505050506040513d6020811015613e0a57600080fd5b5051613e14565b30315b6001600160a01b0384166000908152600760205260409020549091508111613e3d57600061336f565b6001600160a01b03831660009081526007602052604090205481039392505050565b613e9f82826040518060400160405280601f81526020017f5472616e7366657220616d6f756e7420657863656564732062616c616e636500815250614106565b5050565b6001600160a01b0381166000908152600360205260409020606090613221906141c9565b60008184841115613f70576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f35578181015183820152602001613f1d565b50505050905090810190601f168015613f625780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315613f35578181015183820152602001613f1d565b506000838581613fed57fe5b0495945050505050565b6001600160a01b038216600090815260036020526040812061336f9083614300565b606061406e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166143ab9092919063ffffffff16565b805190915015612dc25780806020019051602081101561408d57600080fd5b5051612dc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806147d3602a913960400191505060405180910390fd5b6001600160a01b0382166000908152600360205260409020613e9f90826143c2565b6040516000906001600160a01b0385169084908381818185875af1925050503d8060008114614151576040519150601f19603f3d011682016040523d82523d6000602084013e614156565b606091505b505090508082906141c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315613f35578181015183820152602001613f1d565b5050505050565b60606000805b83548110156142185760006001600160a01b03168482815481106141ef57fe5b6000918252602090912001546001600160a01b031614614210576001909101905b6001016141cf565b508067ffffffffffffffff8111801561423057600080fd5b5060405190808252806020026020018201604052801561425a578160200160208202803683370190505b5091506000805b84548110156142f85760006001600160a01b031685828154811061428157fe5b6000918252602090912001546001600160a01b0316146142f0578481815481106142a757fe5b9060005260206000200160009054906101000a90046001600160a01b03168483815181106142d157fe5b6001600160a01b03909216602092830291909101909101526001909101905b600101614261565b505050919050565b60006001600160a01b03821661431857506001613221565b60005b83548110156143a457826001600160a01b031684828154811061433a57fe5b6000918252602090912001546001600160a01b0316141561439c5783818154811061436157fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555060019050613221565b60010161431b565b5092915050565b60606143ba84846000856144a6565b949350505050565b6001600160a01b0381166143d557613e9f565b60005b825481101561445c5760006001600160a01b03168382815481106143f857fe5b6000918252602090912001546001600160a01b03161415614454578183828154811061442057fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050613e9f565b6001016143d8565b5081546001810183556000838152602090200180546001600160a01b0383167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790555050565b60606144b185614665565b61451c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061457957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161453c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146145db576040519150601f19603f3d011682016040523d82523d6000602084013e6145e0565b606091505b509150915081156145f45791506143ba9050565b8051156146045780518082602001fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152865160248401528651879391928392604401919085019080838360008315613f35578181015183820152602001613f1d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906143ba575050151592915050565b604080516060810182526000808252602082018190529181019190915290565b604051806080016040528060006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff1681526020016000815260200160008152509056fe53616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974737472616e73666572696e6720616d6f756e742073686f756c6420626520706f736974697665206e756d626572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777374616b696e6720616d6f756e742073686f756c6420626520706f736974697665206e756d6265727769746864726177696e6720616d6f756e742073686f756c6420626520706f736974697665206e756d6265725361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656473656e646572206d75737420626520676f7665726e616e63652061646472657373a264697066735822122081989c7b9e550ff25bb7eb7c089e2fb9da070aa6cd6b65281a7348dc1146025664736f6c63430007010033737461727454696d657374616d702073686f756c6420626520706173742074696d65000000000000000000000000b6a439237b6705df8f6cd8e285a41c1e9a8a6a95000000000000000000000000a5d3097a1e68defc72619e2e51f3b66236a71fd8000000000000000000000000000000000000000000000000000000005fcd70800000000000000000000000000000000000000000000000000000000000015180
Deployed Bytecode
0x6080604052600436106100ec5760003560e01c8063629f40281161008a578063abdc303311610059578063abdc303314610420578063b90d89301461044e578063d0b589de14610481578063d74ed0fb14610504576100f3565b8063629f4028146103155780636332fef614610348578063684da514146103d2578063732524941461040b576100f3565b80632a7548e9116100c65780632a7548e91461021057806343b8d1111461025557806359af0e5d146102ab5780635e1e09a1146102e4576100f3565b806308fab167146100f857806319f8d5b4146101455780631f69565f14610190576100f3565b366100f357005b600080fd5b34801561010457600080fd5b506101436004803603604081101561011b57600080fd5b5080356001600160a01b031690602001356fffffffffffffffffffffffffffffffff16610570565b005b34801561015157600080fd5b506101436004803603604081101561016857600080fd5b5080356001600160a01b031690602001356fffffffffffffffffffffffffffffffff16610d88565b34801561019c57600080fd5b506101c3600480360360208110156101b357600080fd5b50356001600160a01b031661157d565b60408051978852602088019690965286860194909452606086019290925260808501526fffffffffffffffffffffffffffffffff90811660a08501521660c0830152519081900360e00190f35b34801561021c57600080fd5b506102436004803603602081101561023357600080fd5b50356001600160a01b0316611684565b60408051918252519081900360200190f35b34801561026157600080fd5b506101436004803603606081101561027857600080fd5b5080356001600160a01b0390811691602081013590911690604001356fffffffffffffffffffffffffffffffff16611e5f565b3480156102b757600080fd5b50610143600480360360408110156102ce57600080fd5b506001600160a01b038135169060200135612d53565b3480156102f057600080fd5b506102f9612dc7565b604080516001600160a01b039092168252519081900360200190f35b34801561032157600080fd5b506102436004803603602081101561033857600080fd5b50356001600160a01b0316612deb565b34801561035457600080fd5b506103836004803603604081101561036b57600080fd5b506001600160a01b0381358116916020013516612e06565b6040805197885260208801969096526fffffffffffffffffffffffffffffffff9485168787015260608701939093526080860191909152821660a08501521660c0830152519081900360e00190f35b3480156103de57600080fd5b50610143600480360360408110156103f557600080fd5b506001600160a01b038135169060200135613080565b34801561041757600080fd5b506102f96130ef565b34801561042c57600080fd5b506104356130fe565b6040805192835260208301919091528051918290030190f35b34801561045a57600080fd5b506101436004803603602081101561047157600080fd5b50356001600160a01b0316613144565b34801561048d57600080fd5b506104b4600480360360208110156104a457600080fd5b50356001600160a01b0316613216565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104f05781810151838201526020016104d8565b505050509050019250505060405180910390f35b34801561051057600080fd5b5061053d6004803603604081101561052757600080fd5b506001600160a01b038135169060200135613227565b604080516fffffffffffffffffffffffffffffffff94851681529290931660208301528183015290519081900360600190f35b600260005414156105e257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055816105f06132da565b6001600160a01b03821660009081526006602052604090205410156109c75760006001600160a01b038216156106b057604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561067f57600080fd5b505afa158015610693573d6000803e3d6000fd5b505050506040513d60208110156106a957600080fd5b50516106b3565b30315b6001600160a01b038316600090815260076020526040812054919250906106db90839061332d565b90506106e561469e565b506001600160a01b0383166000908152600560209081526040808320600683528184205484528252808320815160608101835281546fffffffffffffffffffffffffffffffff80821680845270010000000000000000000000000000000090920416948201859052600190920154928101929092529092916107709161076b9190613376565b6133ea565b9050600082602001516fffffffffffffffffffffffffffffffff1660001461079957600061079f565b82604001515b905060006fffffffffffffffffffffffffffffffff8316156107dc576001600160a01b0387166000908152600660205260409020546001016107e4565b6107e46132da565b60408051606081018252600081526fffffffffffffffffffffffffffffffff8616602082015291925081016108198785613376565b90526001600160a01b038816600090815260056020908152604080832085845282529182902083518154928501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff91821617811670010000000000000000000000000000000091909316029190911781559101516001909101556108b06132da565b811015610984576040805160608101825260008082526fffffffffffffffffffffffffffffffff86166020808401919091528284018290526001600160a01b038b1682526005905291822090916109056132da565b8152602080820192909252604090810160002083518154938501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009094166fffffffffffffffffffffffffffffffff918216178116700100000000000000000000000000000000919094160292909217825591909101516001909101555b6001600160a01b03871660009081526007602052604090208690556109a76132da565b6001600160a01b0388166000908152600660205260409020555050505050505b82336109d16146be565b506001600160a01b038083166000908152600460209081526040808320938516835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041692810192909252600181015492820183905260020154606082015290805b6001600160a01b03851660009081526006602052604090205481108015610a7857506103e8820181105b15610bda57610a8561469e565b506001600160a01b0385166000908152600560209081526040808320848452825291829020825160608101845281546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000909104169281018390526001909101549281019290925215610b5957610b53610b4882602001516fffffffffffffffffffffffffffffffff16610b42846040015188600001516fffffffffffffffffffffffffffffffff1661345990919063ffffffff16565b906134cc565b606086015190613376565b60608501525b60208401518451610b839161076b916fffffffffffffffffffffffffffffffff9081169116613376565b6fffffffffffffffffffffffffffffffff1680855260006020860152600183016040860152610bd157506001600160a01b038516600090815260066020526040908190205490840152610bda565b50600101610a4e565b506001600160a01b0380851660009081526004602081815260408084208886168552825280842087518154848a01516fffffffffffffffffffffffffffffffff908116700100000000000000000000000000000000029281167fffffffffffffffffffffffffffffffff000000000000000000000000000000009092169190911716178155818801516001808301919091556060890151600290920191909155948c1684526006825280842054928252808420338552909152909120909101541015610ca557610d7a565b6fffffffffffffffffffffffffffffffff8616610d0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806147a7602c913960400191505060405180910390fd5b610d2933876fffffffffffffffffffffffffffffffff1661350e565b610d343388886135b8565b610d7a6001600160a01b037f000000000000000000000000b6a439237b6705df8f6cd8e285a41c1e9a8a6a9516336fffffffffffffffffffffffffffffffff891661399c565b505060016000555050505050565b60026000541415610dfa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005581610e086132da565b6001600160a01b03821660009081526006602052604090205410156111da5760006001600160a01b03821615610ec857604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b158015610e9757600080fd5b505afa158015610eab573d6000803e3d6000fd5b505050506040513d6020811015610ec157600080fd5b5051610ecb565b30315b6001600160a01b03831660009081526007602052604081205491925090610ef390839061332d565b9050610efd61469e565b506001600160a01b0383166000908152600560209081526040808320600683528184205484528252808320815160608101835281546fffffffffffffffffffffffffffffffff8082168084527001000000000000000000000000000000009092041694820185905260019092015492810192909252909291610f839161076b9190613376565b9050600082602001516fffffffffffffffffffffffffffffffff16600014610fac576000610fb2565b82604001515b905060006fffffffffffffffffffffffffffffffff831615610fef576001600160a01b038716600090815260066020526040902054600101610ff7565b610ff76132da565b60408051606081018252600081526fffffffffffffffffffffffffffffffff86166020820152919250810161102c8785613376565b90526001600160a01b038816600090815260056020908152604080832085845282529182902083518154928501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff91821617811670010000000000000000000000000000000091909316029190911781559101516001909101556110c36132da565b811015611197576040805160608101825260008082526fffffffffffffffffffffffffffffffff86166020808401919091528284018290526001600160a01b038b1682526005905291822090916111186132da565b8152602080820192909252604090810160002083518154938501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009094166fffffffffffffffffffffffffffffffff918216178116700100000000000000000000000000000000919094160292909217825591909101516001909101555b6001600160a01b03871660009081526007602052604090208690556111ba6132da565b6001600160a01b0388166000908152600660205260409020555050505050505b82336111e46146be565b506001600160a01b038083166000908152600460209081526040808320938516835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041692810192909252600181015492820183905260020154606082015290805b6001600160a01b0385166000908152600660205260409020548110801561128b57506103e8820181105b156113dc5761129861469e565b506001600160a01b0385166000908152600560209081526040808320848452825291829020825160608101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416928101839052600190910154928101929092521561135b57611355610b4882602001516fffffffffffffffffffffffffffffffff16610b42846040015188600001516fffffffffffffffffffffffffffffffff1661345990919063ffffffff16565b60608501525b602084015184516113859161076b916fffffffffffffffffffffffffffffffff9081169116613376565b6fffffffffffffffffffffffffffffffff16808552600060208601526001830160408601526113d357506001600160a01b0385166000908152600660205260409081902054908401526113dc565b50600101611261565b506001600160a01b0380851660009081526004602081815260408084208886168552825280842087518154848a01516fffffffffffffffffffffffffffffffff908116700100000000000000000000000000000000029281167fffffffffffffffffffffffffffffffff000000000000000000000000000000009092169190911716178155818801516001808301919091556060890151600290920191909155948c16845260068252808420549282528084203385529091529091209091015410156114a757610d7a565b6fffffffffffffffffffffffffffffffff861661150f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061477f6028913960400191505060405180910390fd5b61152b33876fffffffffffffffffffffffffffffffff16613a1c565b611536338888613ac7565b610d7a6001600160a01b037f000000000000000000000000b6a439237b6705df8f6cd8e285a41c1e9a8a6a951633306fffffffffffffffffffffffffffffffff8a16613ce1565b6001600160a01b0381166000908152600660205260408120549080808080806115a46132da565b6001600160a01b038916600090815260076020908152604080832054600583528184208c855290925290912060010154919750955093506115e488613d6f565b92506115ee61469e565b506001600160a01b038816600090815260056020908152604080832060068352818420548452825291829020825160608101845281546fffffffffffffffffffffffffffffffff80821680845270010000000000000000000000000000000090920416938201849052600190920154938101939093529093506116769061076b908590613376565b915050919395979092949650565b6000600260005414156116f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055816117066132da565b6001600160a01b0382166000908152600660205260409020541015611ad85760006001600160a01b038216156117c657604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561179557600080fd5b505afa1580156117a9573d6000803e3d6000fd5b505050506040513d60208110156117bf57600080fd5b50516117c9565b30315b6001600160a01b038316600090815260076020526040812054919250906117f190839061332d565b90506117fb61469e565b506001600160a01b0383166000908152600560209081526040808320600683528184205484528252808320815160608101835281546fffffffffffffffffffffffffffffffff80821680845270010000000000000000000000000000000090920416948201859052600190920154928101929092529092916118819161076b9190613376565b9050600082602001516fffffffffffffffffffffffffffffffff166000146118aa5760006118b0565b82604001515b905060006fffffffffffffffffffffffffffffffff8316156118ed576001600160a01b0387166000908152600660205260409020546001016118f5565b6118f56132da565b60408051606081018252600081526fffffffffffffffffffffffffffffffff86166020820152919250810161192a8785613376565b90526001600160a01b038816600090815260056020908152604080832085845282529182902083518154928501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff91821617811670010000000000000000000000000000000091909316029190911781559101516001909101556119c16132da565b811015611a95576040805160608101825260008082526fffffffffffffffffffffffffffffffff86166020808401919091528284018290526001600160a01b038b168252600590529182209091611a166132da565b8152602080820192909252604090810160002083518154938501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009094166fffffffffffffffffffffffffffffffff918216178116700100000000000000000000000000000000919094160292909217825591909101516001909101555b6001600160a01b0387166000908152600760205260409020869055611ab86132da565b6001600160a01b0388166000908152600660205260409020555050505050505b8233611ae26146be565b506001600160a01b038083166000908152600460209081526040808320938516835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041692810192909252600181015492820183905260020154606082015290805b6001600160a01b03851660009081526006602052604090205481108015611b8957506103e8820181105b15611cda57611b9661469e565b506001600160a01b0385166000908152600560209081526040808320848452825291829020825160608101845281546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000909104169281018390526001909101549281019290925215611c5957611c53610b4882602001516fffffffffffffffffffffffffffffffff16610b42846040015188600001516fffffffffffffffffffffffffffffffff1661345990919063ffffffff16565b60608501525b60208401518451611c839161076b916fffffffffffffffffffffffffffffffff9081169116613376565b6fffffffffffffffffffffffffffffffff1680855260006020860152600183016040860152611cd157506001600160a01b038516600090815260066020526040908190205490840152611cda565b50600101611b5f565b506001600160a01b0380851660009081526004602081815260408084208886168552825280842087518154848a01516fffffffffffffffffffffffffffffffff908116700100000000000000000000000000000000029281167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921691909117161781558188015160018201556060880151600291820155948c16845291815281832033845290529020015495508515611e4f576001600160a01b038716600090815260076020526040902054611db2908761332d565b6001600160a01b03881660008181526007602090815260408083209490945560048152838220338352905291822060020191909155611dfa57611df53387613e5f565b611e0e565b611e0e6001600160a01b038816338861399c565b60408051878152905133916001600160a01b038a16917f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e9181900360200190a35b5050600160005550919392505050565b60026000541415611ed157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005582611edf6132da565b6001600160a01b03821660009081526006602052604090205410156122b15760006001600160a01b03821615611f9f57604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b5051611fa2565b30315b6001600160a01b03831660009081526007602052604081205491925090611fca90839061332d565b9050611fd461469e565b506001600160a01b0383166000908152600560209081526040808320600683528184205484528252808320815160608101835281546fffffffffffffffffffffffffffffffff808216808452700100000000000000000000000000000000909204169482018590526001909201549281019290925290929161205a9161076b9190613376565b9050600082602001516fffffffffffffffffffffffffffffffff16600014612083576000612089565b82604001515b905060006fffffffffffffffffffffffffffffffff8316156120c6576001600160a01b0387166000908152600660205260409020546001016120ce565b6120ce6132da565b60408051606081018252600081526fffffffffffffffffffffffffffffffff8616602082015291925081016121038785613376565b90526001600160a01b038816600090815260056020908152604080832085845282529182902083518154928501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff918216178116700100000000000000000000000000000000919093160291909117815591015160019091015561219a6132da565b81101561226e576040805160608101825260008082526fffffffffffffffffffffffffffffffff86166020808401919091528284018290526001600160a01b038b1682526005905291822090916121ef6132da565b8152602080820192909252604090810160002083518154938501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009094166fffffffffffffffffffffffffffffffff918216178116700100000000000000000000000000000000919094160292909217825591909101516001909101555b6001600160a01b03871660009081526007602052604090208690556122916132da565b6001600160a01b0388166000908152600660205260409020555050505050505b83336122bb6146be565b506001600160a01b038083166000908152600460209081526040808320938516835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041692810192909252600181015492820183905260020154606082015290805b6001600160a01b0385166000908152600660205260409020548110801561236257506103e8820181105b156124b35761236f61469e565b506001600160a01b0385166000908152600560209081526040808320848452825291829020825160608101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041692810183905260019091015492810192909252156124325761242c610b4882602001516fffffffffffffffffffffffffffffffff16610b42846040015188600001516fffffffffffffffffffffffffffffffff1661345990919063ffffffff16565b60608501525b6020840151845161245c9161076b916fffffffffffffffffffffffffffffffff9081169116613376565b6fffffffffffffffffffffffffffffffff16808552600060208601526001830160408601526124aa57506001600160a01b0385166000908152600660205260409081902054908401526124b3565b50600101612338565b506001600160a01b03848116600090815260046020908152604080832093871683529281529082902084518154928601517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff91821617811670010000000000000000000000000000000091909316029190911781559083015160018201556060830151600290910155866125596132da565b6001600160a01b038216600090815260066020526040902054101561292b5760006001600160a01b0382161561261957604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156125e857600080fd5b505afa1580156125fc573d6000803e3d6000fd5b505050506040513d602081101561261257600080fd5b505161261c565b30315b6001600160a01b0383166000908152600760205260408120549192509061264490839061332d565b905061264e61469e565b506001600160a01b0383166000908152600560209081526040808320600683528184205484528252808320815160608101835281546fffffffffffffffffffffffffffffffff80821680845270010000000000000000000000000000000090920416948201859052600190920154928101929092529092916126d49161076b9190613376565b9050600082602001516fffffffffffffffffffffffffffffffff166000146126fd576000612703565b82604001515b905060006fffffffffffffffffffffffffffffffff831615612740576001600160a01b038716600090815260066020526040902054600101612748565b6127486132da565b60408051606081018252600081526fffffffffffffffffffffffffffffffff86166020820152919250810161277d8785613376565b90526001600160a01b038816600090815260056020908152604080832085845282529182902083518154928501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009093166fffffffffffffffffffffffffffffffff91821617811670010000000000000000000000000000000091909316029190911781559101516001909101556128146132da565b8110156128e8576040805160608101825260008082526fffffffffffffffffffffffffffffffff86166020808401919091528284018290526001600160a01b038b1682526005905291822090916128696132da565b8152602080820192909252604090810160002083518154938501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009094166fffffffffffffffffffffffffffffffff918216178116700100000000000000000000000000000000919094160292909217825591909101516001909101555b6001600160a01b038716600090815260076020526040902086905561290b6132da565b6001600160a01b0388166000908152600660205260409020555050505050505b87336129356146be565b506001600160a01b038083166000908152600460209081526040808320938516835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041692810192909252600181015492820183905260020154606082015290805b6001600160a01b038516600090815260066020526040902054811080156129dc57506103e8820181105b15612b2d576129e961469e565b506001600160a01b0385166000908152600560209081526040808320848452825291829020825160608101845281546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000909104169281018390526001909101549281019290925215612aac57612aa6610b4882602001516fffffffffffffffffffffffffffffffff16610b42846040015188600001516fffffffffffffffffffffffffffffffff1661345990919063ffffffff16565b60608501525b60208401518451612ad69161076b916fffffffffffffffffffffffffffffffff9081169116613376565b6fffffffffffffffffffffffffffffffff1680855260006020860152600183016040860152612b2457506001600160a01b038516600090815260066020526040908190205490840152612b2d565b506001016129b2565b508160046000866001600160a01b03166001600160a01b031681526020019081526020016000206000856001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506040820151816001015560608201518160020155905050600660008e6001600160a01b03166001600160a01b0316815260200190815260200160002054600460008f6001600160a01b03166001600160a01b031681526020019081526020016000206000336001600160a01b03166001600160a01b03168152602001908152602001600020600101541080612cb757506001600160a01b038c166000908152600660209081526040808320546004835281842033855290925290912060010154105b15612cc157612d3f565b6fffffffffffffffffffffffffffffffff8b16612d29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614732602c913960400191505060405180910390fd5b612d34338e8d6135b8565b612d3f338d8d613ac7565b505060016000555050505050505050505050565b60015433906001600160a01b03168114612db8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147fd6021913960400191505060405180910390fd5b612dc28383613a1c565b505050565b7f000000000000000000000000b6a439237b6705df8f6cd8e285a41c1e9a8a6a9590565b6001600160a01b031660009081526002602052604090205490565b6000806000806000806000612e196146be565b506001600160a01b03808a166000818152600460209081526040808320948d168352938152838220845160808101865281546fffffffffffffffffffffffffffffffff8082168084527001000000000000000000000000000000009092041682850181905260018401548389018190526002909401546060840181905296865260069094529590932054909b50939950975090955090612eb761469e565b506001600160a01b038b1660009081526005602090815260408083208484528252808320815160608101835281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041693810193909352600101549082015290612f2a8d613d6f565b82516020840151919250612f53916fffffffffffffffffffffffffffffffff9081169116613376565b15612fcb5781600001518260200151016fffffffffffffffffffffffffffffffff16612fbe612fb786602001516fffffffffffffffffffffffffffffffff1687600001516fffffffffffffffffffffffffffffffff1661337690919063ffffffff16565b8390613459565b81612fc557fe5b04612fce565b60005b965061301261076b85602001516fffffffffffffffffffffffffffffffff1686600001516fffffffffffffffffffffffffffffffff1661337690919063ffffffff16565b6001600160a01b038d1660009081526002602052604081205491975090613038906133ea565b9050806fffffffffffffffffffffffffffffffff16876fffffffffffffffffffffffffffffffff161061306b578061306d565b865b9550505050505092959891949750929550565b60015433906001600160a01b031681146130e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147fd6021913960400191505060405180910390fd5b612dc2838361350e565b6001546001600160a01b031690565b7f000000000000000000000000000000000000000000000000000000005fcd7080907f000000000000000000000000000000000000000000000000000000000001518090565b60015433906001600160a01b031681146131a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806147fd6021913960400191505060405180910390fd5b600180546001600160a01b0384167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517fffdebd7edaf6b4c7e00c6c944d9995f08ba8372a39db0695da3990924d29f2049181900360200190a15050565b606061322182613ea3565b92915050565b600080600061323461469e565b506001600160a01b03851660008181526005602090815260408083208884528252808320815160608101835281546fffffffffffffffffffffffffffffffff808216808452700100000000000000000000000000000000909204168286018190526001938401548386015296865260069094529190932054919650929450018514156132ca576132c386613d6f565b91506132d2565b806040015191505b509250925092565b60007f00000000000000000000000000000000000000000000000000000000000151807f000000000000000000000000000000000000000000000000000000005fcd708042038161332757fe5b04905090565b600061336f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ec7565b9392505050565b60008282018381101561336f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60007001000000000000000000000000000000008210613455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061470b6027913960400191505060405180910390fd5b5090565b60008261346857506000613221565b8282028284828161347557fe5b041461336f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061475e6021913960400191505060405180910390fd5b600061336f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613f78565b6001600160a01b03821660009081526002602052604090205481111561359557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e646572666c6f772074686520616d6f756e74206f6620766f746573000000604482015290519081900360640190fd5b6001600160a01b0390911660009081526002602052604090208054919091039055565b6135c06146be565b506001600160a01b038083166000908152600460209081526040808320938716835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff808216808452700100000000000000000000000000000000909204811694830185905260018401549583019590955260029092015460608201529284169161364c9190613376565b10156136b957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f65786365656420776974686472617761626c6520616d6f756e74000000000000604482015290519081900360640190fd5b816fffffffffffffffffffffffffffffffff1681602001518260000151016fffffffffffffffffffffffffffffffff1614156136fb576136f98484613ff7565b505b6001600160a01b03831660009081526006602052604090205461371c61469e565b506001600160a01b0384166000908152600560209081526040808320848452825291829020825160608101845281546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091048116828501526001909201549381019390935290840151858216911611156137c5576020830180516fffffffffffffffffffffffffffffffff908690038116909152815185900316815261388a565b61380961076b846020015186036fffffffffffffffffffffffffffffffff1683602001516fffffffffffffffffffffffffffffffff1661332d90919063ffffffff16565b6fffffffffffffffffffffffffffffffff908116602080840191909152840151825161383d9261076b92918116911661332d565b6fffffffffffffffffffffffffffffffff90811682526020840151845161386e9261076b929181169188031661332d565b6fffffffffffffffffffffffffffffffff168352600060208401525b6001600160a01b038581166000818152600460209081526040808320948b16808452948252808320885181548a8501517fffffffffffffffffffffffffffffffff000000000000000000000000000000009182166fffffffffffffffffffffffffffffffff93841617831670010000000000000000000000000000000091841682021784558b85015160018086019190915560608d0151600290950194909455878752600586528487208b8852865295849020895181548b880151931690841617831691831690960217855587830151949091019390935580519289168352517ff3534c5992c3931fc86fbca15a3e750e109223ef17b7347236ffc0b1e7bdab299281900390910190a3505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612dc2908490614019565b6001600160a01b0382166000908152600260205260409020548101811115613aa557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6f766572666c6f772074686520616d6f756e74206f6620766f74657300000000604482015290519081900360640190fd5b6001600160a01b03909116600090815260026020526040902080549091019055565b613acf6146be565b506001600160a01b038083166000908152600460209081526040808320938716835292815290829020825160808101845281546fffffffffffffffffffffffffffffffff8082168084527001000000000000000000000000000000009092041693820193909352600182015493810193909352600201546060830152158015613b6c575060208101516fffffffffffffffffffffffffffffffff16155b15613b7b57613b7b84846140e4565b613bb961076b836fffffffffffffffffffffffffffffffff1683602001516fffffffffffffffffffffffffffffffff1661337690919063ffffffff16565b6001600160a01b038085166000818152600460209081526040808320948a16835293815283822080546fffffffffffffffffffffffffffffffff9687167001000000000000000000000000000000000290871617905591815260068252828120546005835283822081835290925291909120549091613c419161076b91908116908616613376565b6001600160a01b03858116600081815260056020908152604080832087845282529182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff9687161790558151948816855290519289169391927f58aa73a102e270a292b02e32b54a1d116added91ce95edccc20c1ebbab0deec39281900390910190a35050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052613d69908590614019565b50505050565b6000806001600160a01b03831615613e1157604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b158015613de057600080fd5b505afa158015613df4573d6000803e3d6000fd5b505050506040513d6020811015613e0a57600080fd5b5051613e14565b30315b6001600160a01b0384166000908152600760205260409020549091508111613e3d57600061336f565b6001600160a01b03831660009081526007602052604090205481039392505050565b613e9f82826040518060400160405280601f81526020017f5472616e7366657220616d6f756e7420657863656564732062616c616e636500815250614106565b5050565b6001600160a01b0381166000908152600360205260409020606090613221906141c9565b60008184841115613f70576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613f35578181015183820152602001613f1d565b50505050905090810190601f168015613f625780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315613f35578181015183820152602001613f1d565b506000838581613fed57fe5b0495945050505050565b6001600160a01b038216600090815260036020526040812061336f9083614300565b606061406e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166143ab9092919063ffffffff16565b805190915015612dc25780806020019051602081101561408d57600080fd5b5051612dc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806147d3602a913960400191505060405180910390fd5b6001600160a01b0382166000908152600360205260409020613e9f90826143c2565b6040516000906001600160a01b0385169084908381818185875af1925050503d8060008114614151576040519150601f19603f3d011682016040523d82523d6000602084013e614156565b606091505b505090508082906141c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315613f35578181015183820152602001613f1d565b5050505050565b60606000805b83548110156142185760006001600160a01b03168482815481106141ef57fe5b6000918252602090912001546001600160a01b031614614210576001909101905b6001016141cf565b508067ffffffffffffffff8111801561423057600080fd5b5060405190808252806020026020018201604052801561425a578160200160208202803683370190505b5091506000805b84548110156142f85760006001600160a01b031685828154811061428157fe5b6000918252602090912001546001600160a01b0316146142f0578481815481106142a757fe5b9060005260206000200160009054906101000a90046001600160a01b03168483815181106142d157fe5b6001600160a01b03909216602092830291909101909101526001909101905b600101614261565b505050919050565b60006001600160a01b03821661431857506001613221565b60005b83548110156143a457826001600160a01b031684828154811061433a57fe5b6000918252602090912001546001600160a01b0316141561439c5783818154811061436157fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555060019050613221565b60010161431b565b5092915050565b60606143ba84846000856144a6565b949350505050565b6001600160a01b0381166143d557613e9f565b60005b825481101561445c5760006001600160a01b03168382815481106143f857fe5b6000918252602090912001546001600160a01b03161415614454578183828154811061442057fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050613e9f565b6001016143d8565b5081546001810183556000838152602090200180546001600160a01b0383167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790555050565b60606144b185614665565b61451c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061457957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161453c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146145db576040519150601f19603f3d011682016040523d82523d6000602084013e6145e0565b606091505b509150915081156145f45791506143ba9050565b8051156146045780518082602001fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152865160248401528651879391928392604401919085019080838360008315613f35578181015183820152602001613f1d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906143ba575050151592915050565b604080516060810182526000808252602082018190529181019190915290565b604051806080016040528060006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff1681526020016000815260200160008152509056fe53616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974737472616e73666572696e6720616d6f756e742073686f756c6420626520706f736974697665206e756d626572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777374616b696e6720616d6f756e742073686f756c6420626520706f736974697665206e756d6265727769746864726177696e6720616d6f756e742073686f756c6420626520706f736974697665206e756d6265725361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656473656e646572206d75737420626520676f7665726e616e63652061646472657373a264697066735822122081989c7b9e550ff25bb7eb7c089e2fb9da070aa6cd6b65281a7348dc1146025664736f6c63430007010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b6a439237b6705df8f6cd8e285a41c1e9a8a6a95000000000000000000000000a5d3097a1e68defc72619e2e51f3b66236a71fd8000000000000000000000000000000000000000000000000000000005fcd70800000000000000000000000000000000000000000000000000000000000015180
-----Decoded View---------------
Arg [0] : stakingTokenAddress (address): 0xB6A439237b6705DF8f6cD8e285A41c1e9a8a6A95
Arg [1] : governance (address): 0xa5D3097A1e68DefC72619E2E51f3B66236a71FD8
Arg [2] : startTimestamp (uint256): 1607299200
Arg [3] : termInterval (uint256): 86400
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000b6a439237b6705df8f6cd8e285a41c1e9a8a6a95
Arg [1] : 000000000000000000000000a5d3097a1e68defc72619e2e51f3b66236a71fd8
Arg [2] : 000000000000000000000000000000000000000000000000000000005fcd7080
Arg [3] : 0000000000000000000000000000000000000000000000000000000000015180
Deployed Bytecode Sourcemap
35188:16567:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41986:528;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41986:528:0;;-1:-1:-1;;;;;41986:528:0;;;;;;;;:::i;:::-;;41344:537;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41344:537:0;;-1:-1:-1;;;;;41344:537:0;;;;;;;;:::i;48265:858::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48265:858:0;-1:-1:-1;;;;;48265:858:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42606:749;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42606:749:0;-1:-1:-1;;;;;42606:749:0;;:::i;:::-;;;;;;;;;;;;;;;;43363:750;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43363:750:0;;-1:-1:-1;;;;;43363:750:0;;;;;;;;;;;;;;;;;;:::i;8522:136::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8522:136:0;;;;;;;;:::i;46913:143::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;46913:143:0;;;;;;;;;;;;;;9288:112;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9288:112:0;-1:-1:-1;;;;;9288:112:0;;:::i;50343:1409::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50343:1409:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8379:135;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8379:135:0;;;;;;;;:::i;9172:108::-;;;;;;;;;;;;;:::i;47212:231::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8125:246;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8125:246:0;-1:-1:-1;;;;;8125:246:0;;:::i;47522:198::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47522:198:0;-1:-1:-1;;;;;47522:198:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49197:548;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49197:548:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41986:528;34184:1;34781:7;;:19;;34773:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34184:1;34914:7;:18;42113:5;39530:16:::1;:14;:16::i;:::-;-1:-1:-1::0;;;;;39508:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;:38:::1;39504:1665;;;39563:22;-1:-1:-1::0;;;;;39589:20:0;::::1;::::0;39588:121:::1;;39671:38;::::0;;;;;39703:4:::1;39671:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;39671:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39671:38:0;39588:121:::1;;;39638:4;39630:21;39588:121;-1:-1:-1::0;;;;;39767:29:0;::::1;39724:21;39767:29:::0;;;:22:::1;:29;::::0;;;;;39563:146;;-1:-1:-1;39724:21:0;39748:49:::1;::::0;39563:146;;39748:18:::1;:49::i;:::-;39724:73;;39814:31;;:::i;:::-;-1:-1:-1::0;;;;;;39848:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;39865:12:::1;:19:::0;;;;;;39848:37;;;;;;;39814:71;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;39848:16;39923:120:::1;::::0;:90:::1;::::0;39814:71;39923:64:::1;:90::i;:::-;:118;:120::i;:::-;39900:143;;40058:21;40082:15;:24;;;:29;;40110:1;40082:29;:61;;40142:1;40082:61;;;40114:15;:25;;;40082:61;40058:85:::0;-1:-1:-1;40216:16:0::1;40235:17;::::0;::::1;::::0;:62:::1;;-1:-1:-1::0;;;;;40274:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;40296:1:::1;40274:23;40235:62;;;40255:16;:14;:16::i;:::-;40387:158;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;40387:158:0;;::::1;::::0;::::1;;::::0;::::1;::::0;40216:81;;-1:-1:-1;40387:158:0;;40497:32:::1;:13:::0;40515;40497:17:::1;:32::i;:::-;40387:158:::0;;-1:-1:-1;;;;;40358:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:26;;;;;;;;;:187;;;;;;::::1;::::0;;;;::::1;;::::0;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;40358:187:0;;::::1;::::0;40662:16:::1;:14;:16::i;:::-;40651:8;:27;40647:362;;;40850:143;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;40850:143:0;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;;;;;;;;-1:-1:-1;;;;;40813:16:0;::::1;::::0;;:9:::1;:16:::0;;;;;40850:143;;40830:16:::1;:14;:16::i;:::-;40813:34:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;40813:34:0;:180;;;;;;::::1;::::0;;;;::::1;;::::0;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;40813:180:0;;::::1;::::0;40647:362:::1;-1:-1:-1::0;;;;;41025:29:0;::::1;;::::0;;;:22:::1;:29;::::0;;;;:46;;;41141:16:::1;:14;:16::i;:::-;-1:-1:-1::0;;;;;41119:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;:38;-1:-1:-1;;;;;;39504:1665:0::1;42142:5:::2;42149:10;38142:30;;:::i;:::-;-1:-1:-1::0;;;;;;38175:19:0;;::::2;;::::0;;;:12:::2;:19;::::0;;;;;;;:28;;::::2;::::0;;;;;;;;;38142:61;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;;;;::::2;::::0;;;;;;;::::2;;::::0;;;;;;;38376:931:::2;-1:-1:-1::0;;;;;38452:19:0;::::2;;::::0;;;:12:::2;:19;::::0;;;;;38445:26;::::2;:57:::0;::::2;;;;35604:4;38482:9;:20;38475:4;:27;38445:57;38376:931;;;38550:24;;:::i;:::-;-1:-1:-1::0;;;;;;38577:16:0;::::2;;::::0;;;:9:::2;:16;::::0;;;;;;;:22;;;;;;;;;38550:49;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;38618:22;38614:297:::2;;38683:135;38729:70;38781:8;:17;;;38729:70;;:47;38757:8;:18;;;38729:11;:23;;;:27;;;;:47;;;;:::i;:::-;:51:::0;::::2;:70::i;:::-;38683:19;::::0;::::2;::::0;;:23:::2;:135::i;:::-;38661:19;::::0;::::2;:157:::0;38614:297:::2;38979:17;::::0;::::2;::::0;38951:23;;:58:::2;::::0;:46:::2;::::0;::::2;:27:::0;;::::2;::::0;:46:::2;:27;:46::i;:58::-;38925:84;;::::0;;;:23:::2;39024:17;::::0;::::2;:21:::0;39090:1:::2;39083:8:::0;::::2;39060:20;::::0;::::2;:31:::0;39136:160:::2;;-1:-1:-1::0;;;;;;39212:19:0;::::2;;::::0;;;:12:::2;:19;::::0;;;;;;;39189:20;;::::2;:42:::0;39250:5:::2;;39136:160;-1:-1:-1::0;38517:6:0::2;;38376:931;;;-1:-1:-1::0;;;;;;39317:19:0;;::::2;;::::0;;;:12:::2;:19;::::0;;;;;;;:28;;::::2;::::0;;;;;;;:42;;;;;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;::::2;;;::::0;;;;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;;;42224:19;;::::3;::::0;;:12:::3;:19:::0;;;;;;42181;;;;;;42201:10:::3;42181:31:::0;;;;;;;;:40;;::::3;::::0;:62:::3;42177:101;;;42260:7;;42177:101;42298:11;::::0;::::3;42290:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42371:31;42383:10;42395:6;42371:31;;:11;:31::i;:::-;42413:36;42423:10;42435:5;42442:6;42413:9;:36::i;:::-;42460:46;-1:-1:-1::0;;;;;42460:13:0::3;:26;42487:10;42460:46;::::0;::::3;:26;:46::i;:::-;-1:-1:-1::0;;34140:1:0;35093:7;:22;-1:-1:-1;;;;;41986:528:0:o;41344:537::-;34184:1;34781:7;;:19;;34773:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34184:1;34914:7;:18;41468:5;39530:16:::1;:14;:16::i;:::-;-1:-1:-1::0;;;;;39508:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;:38:::1;39504:1665;;;39563:22;-1:-1:-1::0;;;;;39589:20:0;::::1;::::0;39588:121:::1;;39671:38;::::0;;;;;39703:4:::1;39671:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;39671:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39671:38:0;39588:121:::1;;;39638:4;39630:21;39588:121;-1:-1:-1::0;;;;;39767:29:0;::::1;39724:21;39767:29:::0;;;:22:::1;:29;::::0;;;;;39563:146;;-1:-1:-1;39724:21:0;39748:49:::1;::::0;39563:146;;39748:18:::1;:49::i;:::-;39724:73;;39814:31;;:::i;:::-;-1:-1:-1::0;;;;;;39848:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;39865:12:::1;:19:::0;;;;;;39848:37;;;;;;;39814:71;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;39848:16;39923:120:::1;::::0;:90:::1;::::0;39814:71;39923:64:::1;:90::i;:120::-;39900:143;;40058:21;40082:15;:24;;;:29;;40110:1;40082:29;:61;;40142:1;40082:61;;;40114:15;:25;;;40082:61;40058:85:::0;-1:-1:-1;40216:16:0::1;40235:17;::::0;::::1;::::0;:62:::1;;-1:-1:-1::0;;;;;40274:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;40296:1:::1;40274:23;40235:62;;;40255:16;:14;:16::i;:::-;40387:158;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;40387:158:0;;::::1;::::0;::::1;;::::0;::::1;::::0;40216:81;;-1:-1:-1;40387:158:0;;40497:32:::1;:13:::0;40515;40497:17:::1;:32::i;:::-;40387:158:::0;;-1:-1:-1;;;;;40358:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:26;;;;;;;;;:187;;;;;;::::1;::::0;;;;::::1;;::::0;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;40358:187:0;;::::1;::::0;40662:16:::1;:14;:16::i;:::-;40651:8;:27;40647:362;;;40850:143;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;40850:143:0;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;;;;;;;;-1:-1:-1;;;;;40813:16:0;::::1;::::0;;:9:::1;:16:::0;;;;;40850:143;;40830:16:::1;:14;:16::i;:::-;40813:34:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;40813:34:0;:180;;;;;;::::1;::::0;;;;::::1;;::::0;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;40813:180:0;;::::1;::::0;40647:362:::1;-1:-1:-1::0;;;;;41025:29:0;::::1;;::::0;;;:22:::1;:29;::::0;;;;:46;;;41141:16:::1;:14;:16::i;:::-;-1:-1:-1::0;;;;;41119:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;:38;-1:-1:-1;;;;;;39504:1665:0::1;41497:5:::2;41504:10;38142:30;;:::i;:::-;-1:-1:-1::0;;;;;;38175:19:0;;::::2;;::::0;;;:12:::2;:19;::::0;;;;;;;:28;;::::2;::::0;;;;;;;;;38142:61;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;;;;::::2;::::0;;;;;;;::::2;;::::0;;;;;;;38376:931:::2;-1:-1:-1::0;;;;;38452:19:0;::::2;;::::0;;;:12:::2;:19;::::0;;;;;38445:26;::::2;:57:::0;::::2;;;;35604:4;38482:9;:20;38475:4;:27;38445:57;38376:931;;;38550:24;;:::i;:::-;-1:-1:-1::0;;;;;;38577:16:0;::::2;;::::0;;;:9:::2;:16;::::0;;;;;;;:22;;;;;;;;;38550:49;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;38618:22;38614:297:::2;;38683:135;38729:70;38781:8;:17;;;38729:70;;:47;38757:8;:18;;;38729:11;:23;;;:27;;;;:47;;;;:::i;38683:135::-;38661:19;::::0;::::2;:157:::0;38614:297:::2;38979:17;::::0;::::2;::::0;38951:23;;:58:::2;::::0;:46:::2;::::0;::::2;:27:::0;;::::2;::::0;:46:::2;:27;:46::i;:58::-;38925:84;;::::0;;;:23:::2;39024:17;::::0;::::2;:21:::0;39090:1:::2;39083:8:::0;::::2;39060:20;::::0;::::2;:31:::0;39136:160:::2;;-1:-1:-1::0;;;;;;39212:19:0;::::2;;::::0;;;:12:::2;:19;::::0;;;;;;;39189:20;;::::2;:42:::0;39250:5:::2;;39136:160;-1:-1:-1::0;38517:6:0::2;;38376:931;;;-1:-1:-1::0;;;;;;39317:19:0;;::::2;;::::0;;;:12:::2;:19;::::0;;;;;;;:28;;::::2;::::0;;;;;;;:42;;;;;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;::::2;;;::::0;;;;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;;;41579:19;;::::3;::::0;;:12:::3;:19:::0;;;;;;41536;;;;;;41556:10:::3;41536:31:::0;;;;;;;;:40;;::::3;::::0;:62:::3;41532:101;;;41615:7;;41532:101;41653:11;::::0;::::3;41645:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41722:31;41734:10;41746:6;41722:31;;:11;:31::i;:::-;41764:33;41771:10;41783:5;41790:6;41764;:33::i;:::-;41808:65;-1:-1:-1::0;;;;;41808:13:0::3;:30;41839:10;41859:4;41808:65;::::0;::::3;:30;:65::i;48265:858::-:0;-1:-1:-1;;;;;48671:19:0;;48384;48671;;;:12;:19;;;;;;;48384;;;;;48714:16;:14;:16::i;:::-;-1:-1:-1;;;;;48765:29:0;;;;;;:22;:29;;;;;;;;;48821:9;:16;;;;;:29;;;;;;;;;:39;;;48701:29;;-1:-1:-1;48765:29:0;-1:-1:-1;48821:39:0;-1:-1:-1;48889:25:0;48788:5;48889:18;:25::i;:::-;48871:43;;48925:24;;:::i;:::-;-1:-1:-1;;;;;;48952:16:0;;;;;;:9;:16;;;;;;;;48969:12;:19;;;;;;48952:37;;;;;;;;48925:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49063:52:0;;:40;;48925:64;;49063:21;:40::i;:52::-;49045:70;;48265:858;;;;;;;;;;:::o;42606:749::-;42788:15;34184:1;34781:7;;:19;;34773:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34184:1;34914:7;:18;42722:5;39530:16:::1;:14;:16::i;:::-;-1:-1:-1::0;;;;;39508:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;:38:::1;39504:1665;;;39563:22;-1:-1:-1::0;;;;;39589:20:0;::::1;::::0;39588:121:::1;;39671:38;::::0;;;;;39703:4:::1;39671:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;39671:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39671:38:0;39588:121:::1;;;39638:4;39630:21;39588:121;-1:-1:-1::0;;;;;39767:29:0;::::1;39724:21;39767:29:::0;;;:22:::1;:29;::::0;;;;;39563:146;;-1:-1:-1;39724:21:0;39748:49:::1;::::0;39563:146;;39748:18:::1;:49::i;:::-;39724:73;;39814:31;;:::i;:::-;-1:-1:-1::0;;;;;;39848:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;39865:12:::1;:19:::0;;;;;;39848:37;;;;;;;39814:71;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;39848:16;39923:120:::1;::::0;:90:::1;::::0;39814:71;39923:64:::1;:90::i;:120::-;39900:143;;40058:21;40082:15;:24;;;:29;;40110:1;40082:29;:61;;40142:1;40082:61;;;40114:15;:25;;;40082:61;40058:85:::0;-1:-1:-1;40216:16:0::1;40235:17;::::0;::::1;::::0;:62:::1;;-1:-1:-1::0;;;;;40274:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;40296:1:::1;40274:23;40235:62;;;40255:16;:14;:16::i;:::-;40387:158;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;40387:158:0;;::::1;::::0;::::1;;::::0;::::1;::::0;40216:81;;-1:-1:-1;40387:158:0;;40497:32:::1;:13:::0;40515;40497:17:::1;:32::i;:::-;40387:158:::0;;-1:-1:-1;;;;;40358:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:26;;;;;;;;;:187;;;;;;::::1;::::0;;;;::::1;;::::0;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;40358:187:0;;::::1;::::0;40662:16:::1;:14;:16::i;:::-;40651:8;:27;40647:362;;;40850:143;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;40850:143:0;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;;;;;;;;-1:-1:-1;;;;;40813:16:0;::::1;::::0;;:9:::1;:16:::0;;;;;40850:143;;40830:16:::1;:14;:16::i;:::-;40813:34:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;40813:34:0;:180;;;;;;::::1;::::0;;;;::::1;;::::0;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;40813:180:0;;::::1;::::0;40647:362:::1;-1:-1:-1::0;;;;;41025:29:0;::::1;;::::0;;;:22:::1;:29;::::0;;;;:46;;;41141:16:::1;:14;:16::i;:::-;-1:-1:-1::0;;;;;41119:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;:38;-1:-1:-1;;;;;;39504:1665:0::1;42751:5:::2;42758:10;38142:30;;:::i;:::-;-1:-1:-1::0;;;;;;38175:19:0;;::::2;;::::0;;;:12:::2;:19;::::0;;;;;;;:28;;::::2;::::0;;;;;;;;;38142:61;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;;;;::::2;::::0;;;;;;;::::2;;::::0;;;;;;;38376:931:::2;-1:-1:-1::0;;;;;38452:19:0;::::2;;::::0;;;:12:::2;:19;::::0;;;;;38445:26;::::2;:57:::0;::::2;;;;35604:4;38482:9;:20;38475:4;:27;38445:57;38376:931;;;38550:24;;:::i;:::-;-1:-1:-1::0;;;;;;38577:16:0;::::2;;::::0;;;:9:::2;:16;::::0;;;;;;;:22;;;;;;;;;38550:49;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;38618:22;38614:297:::2;;38683:135;38729:70;38781:8;:17;;;38729:70;;:47;38757:8;:18;;;38729:11;:23;;;:27;;;;:47;;;;:::i;38683:135::-;38661:19;::::0;::::2;:157:::0;38614:297:::2;38979:17;::::0;::::2;::::0;38951:23;;:58:::2;::::0;:46:::2;::::0;::::2;:27:::0;;::::2;::::0;:46:::2;:27;:46::i;:58::-;38925:84;;::::0;;;:23:::2;39024:17;::::0;::::2;:21:::0;39090:1:::2;39083:8:::0;::::2;39060:20;::::0;::::2;:31:::0;39136:160:::2;;-1:-1:-1::0;;;;;;39212:19:0;::::2;;::::0;;;:12:::2;:19;::::0;;;;;;;39189:20;;::::2;:42:::0;39250:5:::2;;39136:160;-1:-1:-1::0;38517:6:0::2;;38376:931;;;-1:-1:-1::0;;;;;;39317:19:0;;::::2;;::::0;;;:12:::2;:19;::::0;;;;;;;:28;;::::2;::::0;;;;;;;:42;;;;;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;::::2;;;::::0;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;42831:19;;::::3;::::0;;;;;;;;42851:10:::3;42831:31:::0;;;;;;:39:::3;::::0;;-1:-1:-1;42885:12:0;;42881:467:::3;;-1:-1:-1::0;;;;;42946:29:0;::::3;;::::0;;;:22:::3;:29;::::0;;;;;:42:::3;::::0;42980:7;42946:33:::3;:42::i;:::-;-1:-1:-1::0;;;;;42914:29:0;::::3;;::::0;;;:22:::3;:29;::::0;;;;;;;:74;;;;43039:12:::3;:19:::0;;;;;43059:10:::3;43039:31:::0;;;;;;;:39:::3;;:43:::0;;;;43097:182:::3;;43142:33;43155:10;43167:7;43142:12;:33::i;:::-;43097:182;;;43216:47;-1:-1:-1::0;;;;;43216:26:0;::::3;43243:10;43255:7:::0;43216:26:::3;:47::i;:::-;43298:38;::::0;;;;;;;43316:10:::3;::::0;-1:-1:-1;;;;;43298:38:0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;::::3;42881:467;-1:-1:-1::0;;34140:1:0;35093:7;:22;-1:-1:-1;42606:749:0;;;-1:-1:-1;;;42606:749:0:o;43363:750::-;34184:1;34781:7;;:19;;34773:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34184:1;34914:7;:18;43556:9;39530:16:::1;:14;:16::i;:::-;-1:-1:-1::0;;;;;39508:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;:38:::1;39504:1665;;;39563:22;-1:-1:-1::0;;;;;39589:20:0;::::1;::::0;39588:121:::1;;39671:38;::::0;;;;;39703:4:::1;39671:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;39671:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39671:38:0;39588:121:::1;;;39638:4;39630:21;39588:121;-1:-1:-1::0;;;;;39767:29:0;::::1;39724:21;39767:29:::0;;;:22:::1;:29;::::0;;;;;39563:146;;-1:-1:-1;39724:21:0;39748:49:::1;::::0;39563:146;;39748:18:::1;:49::i;:::-;39724:73;;39814:31;;:::i;:::-;-1:-1:-1::0;;;;;;39848:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;39865:12:::1;:19:::0;;;;;;39848:37;;;;;;;39814:71;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;39848:16;39923:120:::1;::::0;:90:::1;::::0;39814:71;39923:64:::1;:90::i;:120::-;39900:143;;40058:21;40082:15;:24;;;:29;;40110:1;40082:29;:61;;40142:1;40082:61;;;40114:15;:25;;;40082:61;40058:85:::0;-1:-1:-1;40216:16:0::1;40235:17;::::0;::::1;::::0;:62:::1;;-1:-1:-1::0;;;;;40274:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;40296:1:::1;40274:23;40235:62;;;40255:16;:14;:16::i;:::-;40387:158;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;40387:158:0;;::::1;::::0;::::1;;::::0;::::1;::::0;40216:81;;-1:-1:-1;40387:158:0;;40497:32:::1;:13:::0;40515;40497:17:::1;:32::i;:::-;40387:158:::0;;-1:-1:-1;;;;;40358:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;;;:26;;;;;;;;;:187;;;;;;::::1;::::0;;;;::::1;;::::0;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;40358:187:0;;::::1;::::0;40662:16:::1;:14;:16::i;:::-;40651:8;:27;40647:362;;;40850:143;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;40850:143:0;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;;;;;;;;-1:-1:-1;;;;;40813:16:0;::::1;::::0;;:9:::1;:16:::0;;;;;40850:143;;40830:16:::1;:14;:16::i;:::-;40813:34:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;40813:34:0;:180;;;;;;::::1;::::0;;;;::::1;;::::0;;::::1;;::::0;::::1;::::0;;;;::::1;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;40813:180:0;;::::1;::::0;40647:362:::1;-1:-1:-1::0;;;;;41025:29:0;::::1;;::::0;;;:22:::1;:29;::::0;;;;:46;;;41141:16:::1;:14;:16::i;:::-;-1:-1:-1::0;;;;;41119:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;:38;-1:-1:-1;;;;;;39504:1665:0::1;43589:9:::2;43600:10;38142:30;;:::i;:::-;-1:-1:-1::0;;;;;;38175:19:0;;::::2;;::::0;;;:12:::2;:19;::::0;;;;;;;:28;;::::2;::::0;;;;;;;;;38142:61;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;;;;::::2;::::0;;;;;;;::::2;;::::0;;;;;;;38376:931:::2;-1:-1:-1::0;;;;;38452:19:0;::::2;;::::0;;;:12:::2;:19;::::0;;;;;38445:26;::::2;:57:::0;::::2;;;;35604:4;38482:9;:20;38475:4;:27;38445:57;38376:931;;;38550:24;;:::i;:::-;-1:-1:-1::0;;;;;;38577:16:0;::::2;;::::0;;;:9:::2;:16;::::0;;;;;;;:22;;;;;;;;;38550:49;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;38618:22;38614:297:::2;;38683:135;38729:70;38781:8;:17;;;38729:70;;:47;38757:8;:18;;;38729:11;:23;;;:27;;;;:47;;;;:::i;38683:135::-;38661:19;::::0;::::2;:157:::0;38614:297:::2;38979:17;::::0;::::2;::::0;38951:23;;:58:::2;::::0;:46:::2;::::0;::::2;:27:::0;;::::2;::::0;:46:::2;:27;:46::i;:58::-;38925:84;;::::0;;;:23:::2;39024:17;::::0;::::2;:21:::0;39090:1:::2;39083:8:::0;::::2;39060:20;::::0;::::2;:31:::0;39136:160:::2;;-1:-1:-1::0;;;;;;39212:19:0;::::2;;::::0;;;:12:::2;:19;::::0;;;;;;;39189:20;;::::2;:42:::0;39250:5:::2;;39136:160;-1:-1:-1::0;38517:6:0::2;;38376:931;;;-1:-1:-1::0;;;;;;39317:19:0;;::::2;;::::0;;;:12:::2;:19;::::0;;;;;;;:28;;::::2;::::0;;;;;;;;;:42;;;;;;::::2;::::0;;;;::::2;;::::0;;::::2;;::::0;::::2;::::0;;;;::::2;;::::0;;;::::2;::::0;;;;::::2;::::0;-1:-1:-1;39317:42:0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;43632:9;39530:16:::3;:14;:16::i;:::-;-1:-1:-1::0;;;;;39508:19:0;::::3;;::::0;;;:12:::3;:19;::::0;;;;;:38:::3;39504:1665;;;39563:22;-1:-1:-1::0;;;;;39589:20:0;::::3;::::0;39588:121:::3;;39671:38;::::0;;;;;39703:4:::3;39671:38;::::0;::::3;::::0;;;-1:-1:-1;;;;;39671:23:0;::::3;::::0;::::3;::::0;:38;;;;;::::3;::::0;;;;;;;;:23;:38;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;::::0;::::3;;-1:-1:-1::0;39671:38:0;39588:121:::3;;;39638:4;39630:21;39588:121;-1:-1:-1::0;;;;;39767:29:0;::::3;39724:21;39767:29:::0;;;:22:::3;:29;::::0;;;;;39563:146;;-1:-1:-1;39724:21:0;39748:49:::3;::::0;39563:146;;39748:18:::3;:49::i;:::-;39724:73;;39814:31;;:::i;:::-;-1:-1:-1::0;;;;;;39848:16:0;::::3;;::::0;;;:9:::3;:16;::::0;;;;;;;39865:12:::3;:19:::0;;;;;;39848:37;;;;;;;39814:71;;::::3;::::0;::::3;::::0;;;;::::3;::::0;;::::3;::::0;;;;;;::::3;;::::0;;::::3;::::0;;;;;;::::3;::::0;;;;;;;;;;39848:16;39923:120:::3;::::0;:90:::3;::::0;39814:71;39923:64:::3;:90::i;:120::-;39900:143;;40058:21;40082:15;:24;;;:29;;40110:1;40082:29;:61;;40142:1;40082:61;;;40114:15;:25;;;40082:61;40058:85:::0;-1:-1:-1;40216:16:0::3;40235:17;::::0;::::3;::::0;:62:::3;;-1:-1:-1::0;;;;;40274:19:0;::::3;;::::0;;;:12:::3;:19;::::0;;;;;40296:1:::3;40274:23;40235:62;;;40255:16;:14;:16::i;:::-;40387:158;::::0;;::::3;::::0;::::3;::::0;;-1:-1:-1;40387:158:0;;::::3;::::0;::::3;;::::0;::::3;::::0;40216:81;;-1:-1:-1;40387:158:0;;40497:32:::3;:13:::0;40515;40497:17:::3;:32::i;:::-;40387:158:::0;;-1:-1:-1;;;;;40358:16:0;::::3;;::::0;;;:9:::3;:16;::::0;;;;;;;:26;;;;;;;;;:187;;;;;;::::3;::::0;;;;::::3;;::::0;;::::3;;::::0;::::3;::::0;;;;::::3;;::::0;;;::::3;::::0;;;::::3;::::0;-1:-1:-1;40358:187:0;;::::3;::::0;40662:16:::3;:14;:16::i;:::-;40651:8;:27;40647:362;;;40850:143;::::0;;::::3;::::0;::::3;::::0;;-1:-1:-1;40850:143:0;;;::::3;::::0;::::3;;::::0;;::::3;::::0;;;;;;;;;;-1:-1:-1;;;;;40813:16:0;::::3;::::0;;:9:::3;:16:::0;;;;;40850:143;;40830:16:::3;:14;:16::i;:::-;40813:34:::0;;::::3;::::0;;::::3;::::0;;;;;;;;-1:-1:-1;40813:34:0;:180;;;;;;::::3;::::0;;;;::::3;;::::0;;::::3;;::::0;::::3;::::0;;;;::::3;;::::0;;;::::3;::::0;;;;;::::3;::::0;-1:-1:-1;40813:180:0;;::::3;::::0;40647:362:::3;-1:-1:-1::0;;;;;41025:29:0;::::3;;::::0;;;:22:::3;:29;::::0;;;;:46;;;41141:16:::3;:14;:16::i;:::-;-1:-1:-1::0;;;;;41119:19:0;::::3;;::::0;;;:12:::3;:19;::::0;;;;:38;-1:-1:-1;;;;;;39504:1665:0::3;43665:9:::4;43676:10;38142:30;;:::i;:::-;-1:-1:-1::0;;;;;;38175:19:0;;::::4;;::::0;;;:12:::4;:19;::::0;;;;;;;:28;;::::4;::::0;;;;;;;;;38142:61;;::::4;::::0;::::4;::::0;;;;::::4;::::0;;::::4;::::0;;;;;::::4;;::::0;;::::4;::::0;;;;;;::::4;::::0;;;;;;;::::4;;::::0;;;;;;;38376:931:::4;-1:-1:-1::0;;;;;38452:19:0;::::4;;::::0;;;:12:::4;:19;::::0;;;;;38445:26;::::4;:57:::0;::::4;;;;35604:4;38482:9;:20;38475:4;:27;38445:57;38376:931;;;38550:24;;:::i;:::-;-1:-1:-1::0;;;;;;38577:16:0;::::4;;::::0;;;:9:::4;:16;::::0;;;;;;;:22;;;;;;;;;38550:49;;::::4;::::0;::::4;::::0;;;;::::4;::::0;;::::4;::::0;;;;;::::4;;::::0;;::::4;::::0;;;;;;::::4;::::0;;;;;;;;38618:22;38614:297:::4;;38683:135;38729:70;38781:8;:17;;;38729:70;;:47;38757:8;:18;;;38729:11;:23;;;:27;;;;:47;;;;:::i;38683:135::-;38661:19;::::0;::::4;:157:::0;38614:297:::4;38979:17;::::0;::::4;::::0;38951:23;;:58:::4;::::0;:46:::4;::::0;::::4;:27:::0;;::::4;::::0;:46:::4;:27;:46::i;:58::-;38925:84;;::::0;;;:23:::4;39024:17;::::0;::::4;:21:::0;39090:1:::4;39083:8:::0;::::4;39060:20;::::0;::::4;:31:::0;39136:160:::4;;-1:-1:-1::0;;;;;;39212:19:0;::::4;;::::0;;;:12:::4;:19;::::0;;;;;;;39189:20;;::::4;:42:::0;39250:5:::4;;39136:160;-1:-1:-1::0;38517:6:0::4;;38376:931;;;;39348:11;39317:12;:19;39330:5;-1:-1:-1::0;;;;;39317:19:0::4;-1:-1:-1::0;;;;;39317:19:0::4;;;;;;;;;;;;:28;39337:7;-1:-1:-1::0;;;;;39317:28:0::4;-1:-1:-1::0;;;;;39317:28:0::4;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43769:12:::5;:23;43782:9;-1:-1:-1::0;;;;;43769:23:0::5;-1:-1:-1::0;;;;;43769:23:0::5;;;;;;;;;;;;;43722:12;:23;43735:9;-1:-1:-1::0;;;;;43722:23:0::5;-1:-1:-1::0;;;;;43722:23:0::5;;;;;;;;;;;;:35;43746:10;-1:-1:-1::0;;;;;43722:35:0::5;-1:-1:-1::0;;;;;43722:35:0::5;;;;;;;;;;;;:44;;;:70;:157;;;-1:-1:-1::0;;;;;;43856:23:0;::::5;;::::0;;;:12:::5;:23;::::0;;;;;;;;43809:12:::5;:23:::0;;;;;43833:10:::5;43809:35:::0;;;;;;;;:44:::5;;::::0;:70:::5;43722:157;43704:220;;;43906:7;;43704:220;43944:11;::::0;::::5;43936:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44017:40;44027:10;44039:9;44050:6;44017:9;:40::i;:::-;44068:37;44075:10;44087:9;44098:6;44068;:37::i;:::-;-1:-1:-1::0;;34140:1:0;35093:7;:22;-1:-1:-1;;;;;;;;;;;43363:750:0:o;8522:136::-;7723:18;;8599:10;;-1:-1:-1;;;;;7723:18:0;7712:29;;7704:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8622:28:::1;8634:7;8643:6;8622:11;:28::i;:::-;8522:136:::0;;;:::o;46913:143::-;47034:13;46913:143;:::o;9288:112::-;-1:-1:-1;;;;;9375:17:0;9348:7;9375:17;;;:8;:17;;;;;;;9288:112::o;50343:1409::-;50481:16;50512:19;50546:28;50589:21;50625:33;50673:21;50709:33;50770:30;;:::i;:::-;-1:-1:-1;;;;;;50803:19:0;;;;;;;:12;:19;;;;;;;;:28;;;;;;;;;;;50770:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51051:19;;;:12;:19;;;;;;;;50770:61;;-1:-1:-1;50770:61:0;;-1:-1:-1;50770:61:0;-1:-1:-1;50770:61:0;;-1:-1:-1;50770:61:0;51081:24;;:::i;:::-;-1:-1:-1;;;;;;51108:16:0;;;;;;:9;:16;;;;;;;;:29;;;;;;;;51081:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51180:25;51118:5;51180:18;:25::i;:::-;51266:17;;51244;;;;51148:57;;-1:-1:-1;51244:40:0;;;:21;;;;:40;:21;:40::i;:::-;:45;:210;;51436:8;:17;;;51416:8;:17;;;:37;51322:132;;:73;51348:46;51376:11;:17;;;51348:46;;:11;:23;;;:27;;;;:46;;;;:::i;:::-;51322:21;;:25;:73::i;:::-;:132;;;;;;51244:210;;;51305:1;51244:210;51216:238;;51481:58;:46;51509:11;:17;;;51481:46;;:11;:23;;;:27;;;;:46;;;;:::i;:58::-;-1:-1:-1;;;;;51579:17:0;;51550:26;51579:17;;;:8;:17;;;;;;51465:74;;-1:-1:-1;51550:26:0;51579:29;;:27;:29::i;:::-;51550:58;;51663:18;51647:34;;:13;:34;;;:97;;51726:18;51647:97;;;51697:13;51647:97;51619:125;;50343:1409;;;;;;;;;;;;;;;:::o;8379:135::-;7723:18;;8455:10;;-1:-1:-1;;;;;7723:18:0;7712:29;;7704:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8478:28:::1;8490:7;8499:6;8478:11;:28::i;9172:108::-:0;9254:18;;-1:-1:-1;;;;;9254:18:0;9172:108;:::o;47212:231::-;47381:15;;47422:13;;47212:231::o;8125:246::-;7723:18;;8228:10;;-1:-1:-1;;;;;7723:18:0;7712:29;;7704:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8256:18:::1;:41:::0;;-1:-1:-1;;;;;8256:41:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;8315:48:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;8125:246:::0;;:::o;47522:198::-;47639:16;47680:32;47704:7;47680:23;:32::i;:::-;47673:39;47522:198;-1:-1:-1;;47522:198:0:o;49197:548::-;49329:16;49360;49391:17;49436:24;;:::i;:::-;-1:-1:-1;;;;;;49463:16:0;;;;;;:9;:16;;;;;;;;:22;;;;;;;;49436:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49586:19;;;:12;:19;;;;;;;;49436:49;;-1:-1:-1;49436:49:0;;-1:-1:-1;49586:23:0;49578:31;;49574:164;;;49638:25;49657:5;49638:18;:25::i;:::-;49626:37;;49574:164;;;49708:8;:18;;;49696:30;;49574:164;49197:548;;;;;;:::o;46634:135::-;46683:7;46748:13;46729:15;46711;:33;46710:51;;;;;;46703:58;;46634:135;:::o;3101:136::-;3159:7;3186:43;3190:1;3193;3186:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;3179:50;3101:136;-1:-1:-1;;;3101:136:0:o;2637:181::-;2695:7;2727:5;;;2751:6;;;;2743:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14148:184;14205:7;14241:6;14233:5;:14;14225:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14318:5:0;14148:184::o;3991:471::-;4049:7;4294:6;4290:47;;-1:-1:-1;4324:1:0;4317:8;;4290:47;4361:5;;;4365:1;4361;:5;:1;4385:5;;;;;:10;4377:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4938:132;4996:7;5023:39;5027:1;5030;5023:39;;;;;;;;;;;;;;;;;:3;:39::i;8925:189::-;-1:-1:-1;;;;;9007:17:0;;;;;;:8;:17;;;;;;:27;-1:-1:-1;9007:27:0;8999:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9079:17:0;;;;;;;:8;:17;;;;;:27;;;;;;;;8925:189::o;44873:1281::-;44994:30;;:::i;:::-;-1:-1:-1;;;;;;45027:19:0;;;;;;;:12;:19;;;;;;;;:28;;;;;;;;;;;;44994:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45088:56;;;:46;;44994:61;45088:27;:46::i;:::-;:56;;45066:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45262:6;45215:53;;45241:11;:17;;;45215:11;:23;;;:43;:53;;;45211:121;;;45285:35;45305:7;45314:5;45285:19;:35::i;:::-;;45211:121;-1:-1:-1;;;;;45366:19:0;;45344;45366;;;:12;:19;;;;;;45396:24;;:::i;:::-;-1:-1:-1;;;;;;45423:16:0;;;;;;:9;:16;;;;;;;;:29;;;;;;;;;45396:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45467:17;;;;:26;;;;;;45463:527;;;45510:17;;;:27;;;;;;;;;;;;45552;;;;;;;;45463:527;;;45632:61;:49;45663:11;:17;;;45654:6;:26;45632:49;;:8;:17;;;:21;;;;:49;;;;:::i;:61::-;45612:81;;;;:17;;;;:81;;;;45750:17;;;45728;;:52;;:40;;:21;;;;:40;:21;:40::i;:52::-;45708:72;;;;;;45894:17;;;;45821:41;;:121;;:91;;:63;;;;45885:26;;45821:91;:63;:91::i;:121::-;45795:147;;;;:23;45957:17;;;:21;45463:527;-1:-1:-1;;;;;46002:19:0;;;;;;;:12;:19;;;;;;;;:28;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46002:42:0;;;;;;;;;;;;;;;;;;;46055:16;;;:9;:16;;;;;:29;;;;;;;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46113:33;;;;;;;;;;;;;;;;;;44873:1281;;;;;;:::o;29398:177::-;29508:58;;;-1:-1:-1;;;;;29508:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29531:23;29508:58;;;29481:86;;29501:5;;29481:19;:86::i;8720:197::-;-1:-1:-1;;;;;8802:17:0;;;;;;:8;:17;;;;;;:26;;:36;-1:-1:-1;8802:36:0;8794:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8882:17:0;;;;;;;:8;:17;;;;;:27;;;;;;;8720:197::o;44175:690::-;44293:30;;:::i;:::-;-1:-1:-1;;;;;;44326:19:0;;;;;;;:12;:19;;;;;;;;:28;;;;;;;;;;;;44293:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44369:28;:54;;;;-1:-1:-1;44401:17:0;;;;:22;;;44369:54;44365:119;;;44440:32;44457:7;44466:5;44440:16;:32::i;:::-;44533:41;:29;44555:6;44533:29;;:11;:17;;;:21;;;;:29;;;;:::i;:41::-;-1:-1:-1;;;;;44496:19:0;;;;;;;:12;:19;;;;;;;;:28;;;;;;;;;;;:78;;;;;;;;;;;;;;44647:19;;;:12;:19;;;;;;44711:9;:16;;;;;:22;;;;;;;;;;:31;44647:19;;44711:55;;:43;;:31;;;;:43;;:35;:43::i;:55::-;-1:-1:-1;;;;;44677:16:0;;;;;;;:9;:16;;;;;;;;:22;;;;;;;;;:89;;;;;;;;;;;44827:30;;;;;;;;;;;;;44677:16;;44827:30;;;;;;;;;;44175:690;;;;;:::o;29583:205::-;29711:68;;;-1:-1:-1;;;;;29711:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29734:27;29711:68;;;29684:96;;29704:5;;29684:19;:96::i;:::-;29583:205;;;;:::o;46162:464::-;46228:15;;-1:-1:-1;;;;;46340:20:0;;;46339:113;;46414:38;;;;;;46446:4;46414:38;;;;;;-1:-1:-1;;;;;46414:23:0;;;;;:38;;;;;;;;;;;;;;:23;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46414:38:0;46339:113;;;46385:4;46377:21;46339:113;-1:-1:-1;;;;;46501:29:0;;;;;;:22;:29;;;;;;46314:138;;-1:-1:-1;46484:46:0;;46483:135;;46617:1;46483:135;;;-1:-1:-1;;;;;46568:29:0;;;;;;:22;:29;;;;;;46551:46;;46463:155;46162:464;-1:-1:-1;;;46162:464:0:o;12879:159::-;12964:66;12977:9;12988:6;12964:66;;;;;;;;;;;;;;;;;:12;:66::i;:::-;12879:159;;:::o;12255:152::-;-1:-1:-1;;;;;12364:29:0;;;;;;:20;:29;;;;;12328:16;;12364:35;;:33;:35::i;3540:192::-;3626:7;3662:12;3654:6;;;;3646:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3698:5:0;;;3540:192::o;5566:278::-;5652:7;5687:12;5680:5;5672:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5711:9;5727:1;5723;:5;;;;;;;5566:278;-1:-1:-1;;;;;5566:278:0:o;11965:162::-;-1:-1:-1;;;;;12076:29:0;;12044:12;12076:29;;;:20;:29;;;;;:43;;12113:5;12076:36;:43::i;31703:761::-;32127:23;32153:69;32181:4;32153:69;;;;;;;;;;;;;;;;;32161:5;-1:-1:-1;;;;;32153:27:0;;;:69;;;;;:::i;:::-;32237:17;;32127:95;;-1:-1:-1;32237:21:0;32233:224;;32379:10;32368:30;;;;;;;;;;;;;;;-1:-1:-1;32368:30:0;32360:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11702:136;-1:-1:-1;;;;;11787:29:0;;;;;;:20;:29;;;;;:43;;11824:5;11787:36;:43::i;12623:248::-;12789:33;;12771:12;;-1:-1:-1;;;;;12789:14:0;;;12811:6;;12771:12;12789:33;12771:12;12789:33;12811:6;12789:14;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12770:52;;;12841:7;12850:12;12833:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12623:248;;;;:::o;10546:643::-;10640:33;10691:21;10732:9;10727:159;10751:18;;10747:22;;10727:159;;;10821:1;-1:-1:-1;;;;;10795:28:0;:11;10807:1;10795:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10795:14:0;:28;10791:84;;10844:15;;;;;10791:84;10771:3;;10727:159;;;;10931:13;10917:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10917:28:0;;10898:47;;10956:9;10985;10980:202;11004:18;;11000:22;;10980:202;;;11074:1;-1:-1:-1;;;;;11048:28:0;:11;11060:1;11048:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11048:14:0;:28;11044:127;;11119:11;11131:1;11119:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11119:14:0;11097:16;11114:1;11097:19;;;;;;;;-1:-1:-1;;;;;11097:36:0;;;:19;;;;;;;;;;;:36;11152:3;;;;;11044:127;11024:3;;10980:202;;;;10546:643;;;;;:::o;10059:377::-;10139:12;-1:-1:-1;;;;;10168:19:0;;10164:63;;-1:-1:-1;10211:4:0;10204:11;;10164:63;10244:9;10239:190;10263:18;;10259:22;;10239:190;;;10325:5;-1:-1:-1;;;;;10307:23:0;:11;10319:1;10307:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10307:14:0;:23;10303:115;;;10358:11;10370:1;10358:14;;;;;;;;;;;;;;;;;10351:21;;;;;;-1:-1:-1;10351:21:0;;-1:-1:-1;10391:11:0;;10303:115;10283:3;;10239:190;;;;10059:377;;;;:::o;26408:196::-;26511:12;26543:53;26566:6;26574:4;26580:1;26583:12;26543:22;:53::i;:::-;26536:60;26408:196;-1:-1:-1;;;;26408:196:0:o;9570:386::-;-1:-1:-1;;;;;9656:19:0;;9652:58;;9692:7;;9652:58;9727:9;9722:191;9746:18;;9742:22;;9722:191;;;9816:1;-1:-1:-1;;;;;9790:28:0;:11;9802:1;9790:14;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9790:14:0;:28;9786:116;;;9856:5;9839:11;9851:1;9839:14;;;;;;;;;;;;;;;;:22;;;;;-1:-1:-1;;;;;9839:22:0;;;;;-1:-1:-1;;;;;9839:22:0;;;;;;9880:7;;;9786:116;9766:3;;9722:191;;;-1:-1:-1;9925:23:0;;;;;;;-1:-1:-1;9925:23:0;;;;;;;;;-1:-1:-1;;;;;9925:23:0;;;;;;;;;9570:386;;:::o;27785:979::-;27915:12;27948:18;27959:6;27948:10;:18::i;:::-;27940:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28074:12;28088:23;28115:6;-1:-1:-1;;;;;28115:11:0;28135:8;28146:4;28115:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28073:78;;;;28166:7;28162:595;;;28197:10;-1:-1:-1;28190:17:0;;-1:-1:-1;28190:17:0;28162:595;28311:17;;:21;28307:439;;28574:10;28568:17;28635:15;28622:10;28618:2;28614:19;28607:44;28522:148;28710:20;;;;;;;;;;;;;;;;;;;;28717:12;;28710:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23293:619;23353:4;23821:20;;23664:66;23861:23;;;;;;:42;;-1:-1:-1;;23888:15:0;;;23853:51;-1:-1:-1;;23293:619:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://81989c7b9e550ff25bb7eb7c089e2fb9da070aa6cd6b65281a7348dc11460256
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 99.86% | $3,259.68 | 59.6763 | $194,525.71 |
ETH | 0.10% | $94,444 | 0.00215942 | $203.94 | |
ETH | 0.02% | $0.518591 | 62.8597 | $32.6 | |
ETH | <0.01% | $13.86 | 1.2992 | $18.01 | |
ETH | <0.01% | $1.83 | 8.452 | $15.47 | |
ETH | <0.01% | $0.255648 | 13.1873 | $3.37 | |
ETH | <0.01% | $0.18958 | 16.1157 | $3.06 | |
ETH | <0.01% | $20.15 | 0.0545 | $1.1 | |
ETH | <0.01% | $78.84 | 0.00349745 | $0.2757 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.