More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 156 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 18967094 | 265 days ago | IN | 0 ETH | 0.00117075 | ||||
Claim | 18919579 | 272 days ago | IN | 0 ETH | 0.00145333 | ||||
Claim | 18865290 | 279 days ago | IN | 0 ETH | 0.00128202 | ||||
Claim | 18853101 | 281 days ago | IN | 0 ETH | 0.00203959 | ||||
Claim | 18712599 | 301 days ago | IN | 0 ETH | 0.00403809 | ||||
Claim | 18529509 | 327 days ago | IN | 0 ETH | 0.00515912 | ||||
Claim | 18319223 | 356 days ago | IN | 0 ETH | 0.00048633 | ||||
Claim | 18211590 | 371 days ago | IN | 0 ETH | 0.00080796 | ||||
Claim | 18070158 | 391 days ago | IN | 0 ETH | 0.00147254 | ||||
Claim | 18019898 | 398 days ago | IN | 0 ETH | 0.00145481 | ||||
Claim | 18018546 | 398 days ago | IN | 0 ETH | 0.00140156 | ||||
Claim | 18004008 | 400 days ago | IN | 0 ETH | 0.00111335 | ||||
Claim | 17997956 | 401 days ago | IN | 0 ETH | 0.00126109 | ||||
Claim | 17606701 | 456 days ago | IN | 0 ETH | 0.00146169 | ||||
Claim | 17562410 | 462 days ago | IN | 0 ETH | 0.00107415 | ||||
Claim | 17520230 | 468 days ago | IN | 0 ETH | 0.00141691 | ||||
Claim | 17444463 | 479 days ago | IN | 0 ETH | 0.00169325 | ||||
Claim | 17054606 | 534 days ago | IN | 0 ETH | 0.0022551 | ||||
Claim | 16993443 | 542 days ago | IN | 0 ETH | 0.00213753 | ||||
Claim | 16942485 | 550 days ago | IN | 0 ETH | 0.00244559 | ||||
Claim | 16808633 | 568 days ago | IN | 0 ETH | 0.00187023 | ||||
Claim | 16792152 | 571 days ago | IN | 0 ETH | 0.00717428 | ||||
Claim | 16761062 | 575 days ago | IN | 0 ETH | 0.00163896 | ||||
Claim | 16738798 | 578 days ago | IN | 0 ETH | 0.0021356 | ||||
Claim | 16660563 | 589 days ago | IN | 0 ETH | 0.0018832 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Rewards
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-02 */ // SPDX-License-Identifier: AGPL V3.0 pragma solidity 0.6.12; // Part: OpenZeppelin/[email protected]/Initializable /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; // solhint-disable-next-line no-inline-assembly assembly { cs := extcodesize(self) } return cs == 0; } } // Part: OpenZeppelin/[email protected]/MerkleProofUpgradeable /** * @dev These functions deal with verification of Merkle trees (hash trees), */ library MerkleProofUpgradeable { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // Part: OpenZeppelin/[email protected]/SafeMathUpgradeable /** * @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 SafeMathUpgradeable { /** * @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; } } // Part: OpenZeppelin/[email protected]/Address /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Part: OpenZeppelin/[email protected]/IERC20 /** * @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); } // Part: OpenZeppelin/[email protected]/SafeMath /** * @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; } } // Part: OpenZeppelin/[email protected]/ContextUpgradeable /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // Part: OpenZeppelin/[email protected]/ReentrancyGuardUpgradeable /** * @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 ReentrancyGuardUpgradeable is Initializable { // 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; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _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; } uint256[49] private __gap; } // Part: OpenZeppelin/[email protected]/SafeERC20 /** * @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"); } } } // Part: OpenZeppelin/[email protected]/OwnableUpgradeable /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // Part: OpenZeppelin/[email protected]/PausableUpgradeable /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } // File: Rewards.sol contract Rewards is OwnableUpgradeable, ReentrancyGuardUpgradeable, PausableUpgradeable { using SafeERC20 for IERC20; using SafeMathUpgradeable for uint256; event Claimed(address indexed receiver, uint256 amount); uint256 public minAmountToClaim = 0; bytes32[] public merkleRoots; mapping (address => uint256) public claimed; IERC20 public token; modifier enough(uint256 _claimAmount) { require(_claimAmount > 0 && _claimAmount >= minAmountToClaim, "Insufficient token amount"); _; } function initialize(address _token) virtual public initializer { __Ownable_init(); __Pausable_init(); __ReentrancyGuard_init(); token = IERC20(_token); } /** * @notice Sets the minimum amount of which can be swapped. 0 by default * @param _minAmount Minimum amount in wei (the least decimals) */ function setMinClaimAmount(uint256 _minAmount) external onlyOwner { minAmountToClaim = _minAmount; } /** * @notice Sets the Merkle roots * @param _merkleRoots Array of hashes */ function setMerkleRoots(bytes32[] memory _merkleRoots) external onlyOwner { require(_merkleRoots.length > 0, "Incorrect data"); if (merkleRoots.length > 0) { delete merkleRoots; } merkleRoots = new bytes32[](_merkleRoots.length); merkleRoots = _merkleRoots; } /** * @notice Withdraws all tokens collected on a Rewards contract * @param _recipient Recepient of token. */ function withdrawToken(address _recipient) external onlyOwner { require(_recipient != address(0), "Zero address"); uint256 amount = IERC20(token).balanceOf(address(this)); IERC20(token).safeTransfer(_recipient, amount); } /** * @notice Allows to claim token from the wallet * @param _merkleRootIndex Index of a merkle root to be used for calculations * @param _amountAllowedToClaim Maximum token allowed for a user to swap * @param _merkleProofs Array of consiquent merkle hashes */ function claim( uint256 _merkleRootIndex, uint256 _amountAllowedToClaim, bytes32[] memory _merkleProofs ) external nonReentrant whenNotPaused enough(_amountAllowedToClaim) { require(verifyMerkleProofs(_msgSender(), _merkleRootIndex, _amountAllowedToClaim, _merkleProofs), "Merkle proofs not verified"); uint256 availableAmount = _amountAllowedToClaim.sub(claimed[_msgSender()]); require(availableAmount != 0 && availableAmount >= minAmountToClaim, "Not enough tokens"); claimed[_msgSender()] = claimed[_msgSender()].add(availableAmount); token.safeTransfer(_msgSender(), availableAmount); emit Claimed(_msgSender(), availableAmount); } /** * @notice Verifies merkle proofs of user to be elligible for swap * @param _account Address of a user * @param _merkleRootIndex Index of a merkle root to be used for calculations * @param _amountAllowedToClaim Maximum ADEL allowed for a user to swap * @param _merkleProofs Array of consiquent merkle hashes */ function verifyMerkleProofs( address _account, uint256 _merkleRootIndex, uint256 _amountAllowedToClaim, bytes32[] memory _merkleProofs) virtual public view returns(bool) { require(_merkleProofs.length > 0, "No Merkle proofs"); require(_merkleRootIndex < merkleRoots.length, "Merkle roots are not set"); bytes32 node = keccak256(abi.encodePacked(_account, _amountAllowedToClaim)); return MerkleProofUpgradeable.verify(_merkleProofs, merkleRoots[_merkleRootIndex], node); } /** * @notice Called by the owner to pause, deny claim reward */ function pause() onlyOwner whenNotPaused external { _pause(); } /** * @notice Called by the owner to unpause, allow claim reward */ function unpause() onlyOwner whenPaused external { _unpause(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"_merkleRootIndex","type":"uint256"},{"internalType":"uint256","name":"_amountAllowedToClaim","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProofs","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleRoots","type":"bytes32[]"}],"name":"setMerkleRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmount","type":"uint256"}],"name":"setMinClaimAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_merkleRootIndex","type":"uint256"},{"internalType":"uint256","name":"_amountAllowedToClaim","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProofs","type":"bytes32[]"}],"name":"verifyMerkleProofs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600060c95534801561001557600080fd5b50612501806100256000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063ae0b51df11610097578063efa1a7a611610066578063efa1a7a6146103a3578063f2fde38b1461046f578063f5d5e270146104a2578063fc0c546a146104aa57610100565b8063ae0b51df146101eb578063bc07aa641461029a578063c4d66de81461033d578063c884ef831461037057610100565b80638456cb59116100d35780638456cb5914610162578063894760691461016a5780638da5cb5b1461019d578063922fc248146101ce57610100565b80633f4ba83a146101055780635c975abb1461010f578063715018a61461012b57806371c5ecb114610133575b600080fd5b61010d6104b2565b005b6101176105be565b604080519115158252519081900360200190f35b61010d6105c7565b6101506004803603602081101561014957600080fd5b50356106c7565b60408051918252519081900360200190f35b61010d6106e5565b61010d6004803603602081101561018057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166107f0565b6101a56109cb565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61010d600480360360208110156101e457600080fd5b50356109e7565b61010d6004803603606081101561020157600080fd5b81359160208101359181019060608101604082013564010000000081111561022857600080fd5b82018360208201111561023a57600080fd5b8035906020019184602083028401116401000000008311171561025c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610a7d945050505050565b61010d600480360360208110156102b057600080fd5b8101906020810181356401000000008111156102cb57600080fd5b8201836020820111156102dd57600080fd5b803590602001918460208302840111640100000000831117156102ff57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610e1b945050505050565b61010d6004803603602081101561035357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610f9b565b6101506004803603602081101561038657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611107565b610117600480360360808110156103b957600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691602081013591604082013591908101906080810160608201356401000000008111156103fd57600080fd5b82018360208201111561040f57600080fd5b8035906020019184602083028401116401000000008311171561043157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611119945050505050565b61010d6004803603602081101561048557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611272565b6101506113fd565b6101a5611403565b6104ba61141f565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461054357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60975460ff166105b457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b6105bc611423565b565b60975460ff1690565b6105cf61141f565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461065857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60335460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60ca81815481106106d457fe5b600091825260209091200154905081565b6106ed61141f565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461077657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60975460ff16156107e857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b6105bc61150f565b6107f861141f565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461088157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661090357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a65726f20616464726573730000000000000000000000000000000000000000604482015290519081900360640190fd5b60cc54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561097457600080fd5b505afa158015610988573d6000803e3d6000fd5b505050506040513d602081101561099e57600080fd5b505160cc549091506109c79073ffffffffffffffffffffffffffffffffffffffff1683836115d5565b5050565b60335473ffffffffffffffffffffffffffffffffffffffff1690565b6109ef61141f565b60335473ffffffffffffffffffffffffffffffffffffffff908116911614610a7857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60c955565b60026065541415610aef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560975460ff1615610b6657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b81600081118015610b79575060c9548110155b610be457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e73756666696369656e7420746f6b656e20616d6f756e7400000000000000604482015290519081900360640190fd5b610bf7610bef61141f565b858585611119565b610c6257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d65726b6c652070726f6f6673206e6f74207665726966696564000000000000604482015290519081900360640190fd5b6000610ca160cb6000610c7361141f565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020548590611667565b90508015801590610cb4575060c9548110155b610d1f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e6f7420656e6f75676820746f6b656e73000000000000000000000000000000604482015290519081900360640190fd5b610d5c8160cb6000610d2f61141f565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054906116b0565b60cb6000610d6861141f565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002055610dba610d9a61141f565b60cc5473ffffffffffffffffffffffffffffffffffffffff1690836115d5565b610dc261141f565b73ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a826040518082815260200191505060405180910390a250506001606555505050565b610e2361141f565b60335473ffffffffffffffffffffffffffffffffffffffff908116911614610eac57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000815111610f1c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e636f72726563742064617461000000000000000000000000000000000000604482015290519081900360640190fd5b60ca5415610f3057610f3060ca60006123a9565b805167ffffffffffffffff81118015610f4857600080fd5b50604051908082528060200260200182016040528015610f72578160200160208202803683370190505b508051610f879160ca916020909101906123c7565b5080516109c79060ca9060208401906123c7565b600054610100900460ff1680610fb45750610fb4611724565b80610fc2575060005460ff16155b611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff1615801561107d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61108561172a565b61108d61184e565b611095611940565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905580156109c757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050565b60cb6020526000908152604090205481565b60008082511161118a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f204d65726b6c652070726f6f667300000000000000000000000000000000604482015290519081900360640190fd5b60ca5484106111fa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d65726b6c6520726f6f747320617265206e6f74207365740000000000000000604482015290519081900360640190fd5b60008584604051602001808373ffffffffffffffffffffffffffffffffffffffff1660601b8152601401828152602001925050506040516020818303038152906040528051906020012090506112688360ca878154811061125757fe5b906000526020600020015483611a2a565b9695505050505050565b61127a61141f565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461130357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661136f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806124286026913960400191505060405180910390fd5b60335460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60c95481565b60cc5473ffffffffffffffffffffffffffffffffffffffff1681565b3390565b60975460ff1661149457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6114e561141f565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190a1565b60975460ff161561158157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586114e561141f565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611662908490611ad3565b505050565b60006116a983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611bab565b9392505050565b6000828201838110156116a957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b303b1590565b600054610100900460ff16806117435750611743611724565b80611751575060005460ff16155b6117a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff1615801561180c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b611814611c5c565b61181c611d6e565b801561184b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50565b600054610100900460ff16806118675750611867611724565b80611875575060005460ff16155b6118ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff1615801561193057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b611938611c5c565b61181c611efe565b600054610100900460ff16806119595750611959611724565b80611967575060005460ff16155b6119bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff16158015611a2257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61181c612039565b600081815b8551811015611ac8576000868281518110611a4657fe5b60200260200101519050808311611a8d5782816040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209250611abf565b808360405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b50600101611a2f565b509092149392505050565b6060611b35826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121519092919063ffffffff16565b80519091501561166257808060200190516020811015611b5457600080fd5b5051611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806124a2602a913960400191505060405180910390fd5b60008184841115611c54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c19578181015183820152602001611c01565b50505050905090810190601f168015611c465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600054610100900460ff1680611c755750611c75611724565b80611c83575060005460ff16155b611cd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff1615801561181c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff90911661010017166001179055801561184b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680611d875750611d87611724565b80611d95575060005460ff16155b611dea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff16158015611e5057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6000611e5a61141f565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561184b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680611f175750611f17611724565b80611f25575060005460ff16155b611f7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff16158015611fe057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055801561184b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff16806120525750612052611724565b80612060575060005460ff16155b6120b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff1615801561211b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6001606555801561184b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b60606121608484600085612168565b949350505050565b6060824710156121c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061244e6026913960400191505060405180910390fd5b6121cc85612323565b61223757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106122a157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612264565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612303576040519150601f19603f3d011682016040523d82523d6000602084013e612308565b606091505b5091509150612318828286612329565b979650505050505050565b3b151590565b606083156123385750816116a9565b8251156123485782518084602001fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152845160248401528451859391928392604401919085019080838360008315611c19578181015183820152602001611c01565b508054600082559060005260206000209081019061184b9190612412565b828054828255906000526020600020908101928215612402579160200282015b828111156124025782518255916020019190600101906123e7565b5061240e929150612412565b5090565b5b8082111561240e576000815560010161241356fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212200fbbdeb6c5efba8ba66f9786104cf87c48798601af50ffcd9ce8adda004072b064736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c8063ae0b51df11610097578063efa1a7a611610066578063efa1a7a6146103a3578063f2fde38b1461046f578063f5d5e270146104a2578063fc0c546a146104aa57610100565b8063ae0b51df146101eb578063bc07aa641461029a578063c4d66de81461033d578063c884ef831461037057610100565b80638456cb59116100d35780638456cb5914610162578063894760691461016a5780638da5cb5b1461019d578063922fc248146101ce57610100565b80633f4ba83a146101055780635c975abb1461010f578063715018a61461012b57806371c5ecb114610133575b600080fd5b61010d6104b2565b005b6101176105be565b604080519115158252519081900360200190f35b61010d6105c7565b6101506004803603602081101561014957600080fd5b50356106c7565b60408051918252519081900360200190f35b61010d6106e5565b61010d6004803603602081101561018057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166107f0565b6101a56109cb565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61010d600480360360208110156101e457600080fd5b50356109e7565b61010d6004803603606081101561020157600080fd5b81359160208101359181019060608101604082013564010000000081111561022857600080fd5b82018360208201111561023a57600080fd5b8035906020019184602083028401116401000000008311171561025c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610a7d945050505050565b61010d600480360360208110156102b057600080fd5b8101906020810181356401000000008111156102cb57600080fd5b8201836020820111156102dd57600080fd5b803590602001918460208302840111640100000000831117156102ff57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610e1b945050505050565b61010d6004803603602081101561035357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610f9b565b6101506004803603602081101561038657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611107565b610117600480360360808110156103b957600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691602081013591604082013591908101906080810160608201356401000000008111156103fd57600080fd5b82018360208201111561040f57600080fd5b8035906020019184602083028401116401000000008311171561043157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611119945050505050565b61010d6004803603602081101561048557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611272565b6101506113fd565b6101a5611403565b6104ba61141f565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461054357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60975460ff166105b457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b6105bc611423565b565b60975460ff1690565b6105cf61141f565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461065857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60335460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60ca81815481106106d457fe5b600091825260209091200154905081565b6106ed61141f565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461077657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60975460ff16156107e857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b6105bc61150f565b6107f861141f565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461088157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661090357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a65726f20616464726573730000000000000000000000000000000000000000604482015290519081900360640190fd5b60cc54604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561097457600080fd5b505afa158015610988573d6000803e3d6000fd5b505050506040513d602081101561099e57600080fd5b505160cc549091506109c79073ffffffffffffffffffffffffffffffffffffffff1683836115d5565b5050565b60335473ffffffffffffffffffffffffffffffffffffffff1690565b6109ef61141f565b60335473ffffffffffffffffffffffffffffffffffffffff908116911614610a7857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60c955565b60026065541415610aef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560975460ff1615610b6657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b81600081118015610b79575060c9548110155b610be457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e73756666696369656e7420746f6b656e20616d6f756e7400000000000000604482015290519081900360640190fd5b610bf7610bef61141f565b858585611119565b610c6257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d65726b6c652070726f6f6673206e6f74207665726966696564000000000000604482015290519081900360640190fd5b6000610ca160cb6000610c7361141f565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020548590611667565b90508015801590610cb4575060c9548110155b610d1f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e6f7420656e6f75676820746f6b656e73000000000000000000000000000000604482015290519081900360640190fd5b610d5c8160cb6000610d2f61141f565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054906116b0565b60cb6000610d6861141f565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002055610dba610d9a61141f565b60cc5473ffffffffffffffffffffffffffffffffffffffff1690836115d5565b610dc261141f565b73ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a826040518082815260200191505060405180910390a250506001606555505050565b610e2361141f565b60335473ffffffffffffffffffffffffffffffffffffffff908116911614610eac57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000815111610f1c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f496e636f72726563742064617461000000000000000000000000000000000000604482015290519081900360640190fd5b60ca5415610f3057610f3060ca60006123a9565b805167ffffffffffffffff81118015610f4857600080fd5b50604051908082528060200260200182016040528015610f72578160200160208202803683370190505b508051610f879160ca916020909101906123c7565b5080516109c79060ca9060208401906123c7565b600054610100900460ff1680610fb45750610fb4611724565b80610fc2575060005460ff16155b611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff1615801561107d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61108561172a565b61108d61184e565b611095611940565b60cc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905580156109c757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050565b60cb6020526000908152604090205481565b60008082511161118a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f204d65726b6c652070726f6f667300000000000000000000000000000000604482015290519081900360640190fd5b60ca5484106111fa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d65726b6c6520726f6f747320617265206e6f74207365740000000000000000604482015290519081900360640190fd5b60008584604051602001808373ffffffffffffffffffffffffffffffffffffffff1660601b8152601401828152602001925050506040516020818303038152906040528051906020012090506112688360ca878154811061125757fe5b906000526020600020015483611a2a565b9695505050505050565b61127a61141f565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461130357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661136f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806124286026913960400191505060405180910390fd5b60335460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60c95481565b60cc5473ffffffffffffffffffffffffffffffffffffffff1681565b3390565b60975460ff1661149457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6114e561141f565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190a1565b60975460ff161561158157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586114e561141f565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611662908490611ad3565b505050565b60006116a983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611bab565b9392505050565b6000828201838110156116a957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b303b1590565b600054610100900460ff16806117435750611743611724565b80611751575060005460ff16155b6117a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff1615801561180c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b611814611c5c565b61181c611d6e565b801561184b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50565b600054610100900460ff16806118675750611867611724565b80611875575060005460ff16155b6118ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff1615801561193057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b611938611c5c565b61181c611efe565b600054610100900460ff16806119595750611959611724565b80611967575060005460ff16155b6119bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff16158015611a2257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b61181c612039565b600081815b8551811015611ac8576000868281518110611a4657fe5b60200260200101519050808311611a8d5782816040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209250611abf565b808360405160200180838152602001828152602001925050506040516020818303038152906040528051906020012092505b50600101611a2f565b509092149392505050565b6060611b35826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166121519092919063ffffffff16565b80519091501561166257808060200190516020811015611b5457600080fd5b5051611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806124a2602a913960400191505060405180910390fd5b60008184841115611c54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c19578181015183820152602001611c01565b50505050905090810190601f168015611c465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600054610100900460ff1680611c755750611c75611724565b80611c83575060005460ff16155b611cd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff1615801561181c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff90911661010017166001179055801561184b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680611d875750611d87611724565b80611d95575060005460ff16155b611dea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff16158015611e5057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6000611e5a61141f565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561184b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680611f175750611f17611724565b80611f25575060005460ff16155b611f7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff16158015611fe057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055801561184b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff16806120525750612052611724565b80612060575060005460ff16155b6120b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612474602e913960400191505060405180910390fd5b600054610100900460ff1615801561211b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6001606555801561184b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b60606121608484600085612168565b949350505050565b6060824710156121c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061244e6026913960400191505060405180910390fd5b6121cc85612323565b61223757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106122a157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612264565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612303576040519150601f19603f3d011682016040523d82523d6000602084013e612308565b606091505b5091509150612318828286612329565b979650505050505050565b3b151590565b606083156123385750816116a9565b8251156123485782518084602001fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152845160248401528451859391928392604401919085019080838360008315611c19578181015183820152602001611c01565b508054600082559060005260206000209081019061184b9190612412565b828054828255906000526020600020908101928215612402579160200282015b828111156124025782518255916020019190600101906123e7565b5061240e929150612412565b5090565b5b8082111561240e576000815560010161241356fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212200fbbdeb6c5efba8ba66f9786104cf87c48798601af50ffcd9ce8adda004072b064736f6c634300060c0033
Deployed Bytecode Sourcemap
37372:4171:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41462:78;;;:::i;:::-;;36140;;;:::i;:::-;;;;;;;;;;;;;;;;;;34265:148;;;:::i;37652:28::-;;;;;;;;;;;;;;;;-1:-1:-1;37652:28:0;;:::i;:::-;;;;;;;;;;;;;;;;41292:77;;;:::i;38987:253::-;;;;;;;;;;;;;;;;-1:-1:-1;38987:253:0;;;;:::i;33623:79::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38302:114;;;;;;;;;;;;;;;;-1:-1:-1;38302:114:0;;:::i;39544:740::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39544:740:0;;-1:-1:-1;39544:740:0;;-1:-1:-1;;;;;39544:740:0:i;38524:322::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38524:322:0;;-1:-1:-1;38524:322:0;;-1:-1:-1;;;;;38524:322:0:i;37932:196::-;;;;;;;;;;;;;;;;-1:-1:-1;37932:196:0;;;;:::i;37687:43::-;;;;;;;;;;;;;;;;-1:-1:-1;37687:43:0;;;;:::i;40647:555::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40647:555:0;;-1:-1:-1;40647:555:0;;-1:-1:-1;;;;;40647:555:0:i;34568:244::-;;;;;;;;;;;;;;;;-1:-1:-1;34568:244:0;;;;:::i;37610:35::-;;;:::i;37737:19::-;;;:::i;41462:78::-;33845:12;:10;:12::i;:::-;33835:6;;:22;:6;;;:22;;;33827:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36734:7:::1;::::0;::::1;;36726:40;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41522:10:::2;:8;:10::i;:::-;41462:78::o:0;36140:::-;36203:7;;;;36140:78;:::o;34265:148::-;33845:12;:10;:12::i;:::-;33835:6;;:22;:6;;;:22;;;33827:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34356:6:::1;::::0;34335:40:::1;::::0;34372:1:::1;::::0;34335:40:::1;34356:6;::::0;34335:40:::1;::::0;34372:1;;34335:40:::1;34386:6;:19:::0;;;::::1;::::0;;34265:148::o;37652:28::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37652:28:0;:::o;41292:77::-;33845:12;:10;:12::i;:::-;33835:6;;:22;:6;;;:22;;;33827:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36458:7:::1;::::0;::::1;;36457:8;36449:37;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41353:8:::2;:6;:8::i;38987:253::-:0;33845:12;:10;:12::i;:::-;33835:6;;:22;:6;;;:22;;;33827:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39068:24:::1;::::0;::::1;39060:49;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;39144:5;::::0;39137:38:::1;::::0;;;;;39169:4:::1;39137:38;::::0;::::1;::::0;;;39120:14:::1;::::0;39144:5:::1;;::::0;39137:23:::1;::::0;:38;;;;;::::1;::::0;;;;;;;;39144:5;39137:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;39137:38:0;39193:5:::1;::::0;39137:38;;-1:-1:-1;39186:46:0::1;::::0;39193:5:::1;;39213:10:::0;39137:38;39186:26:::1;:46::i;:::-;33905:1;38987:253:::0;:::o;33623:79::-;33688:6;;;;33623:79;:::o;38302:114::-;33845:12;:10;:12::i;:::-;33835:6;;:22;:6;;;:22;;;33827:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38379:16:::1;:29:::0;38302:114::o;39544:740::-;27474:1;28237:7;;:19;;28229:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27474:1;28370:7;:18;36458:7:::1;::::0;::::1;;36457:8;36449:37;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;39734:21:::2;37837:1;37822:12;:16;:52;;;;;37858:16;;37842:12;:32;;37822:52;37814:90;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;39781:88:::3;39800:12;:10;:12::i;:::-;39814:16;39832:21;39855:13;39781:18;:88::i;:::-;39773:127;;;::::0;;::::3;::::0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;;39911:23;39937:48;39963:7;:21;39971:12;:10;:12::i;:::-;39963:21;;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;39963:21:0;;39937;;:25:::3;:48::i;:::-;39911:74:::0;-1:-1:-1;40004:20:0;;;::::3;::::0;:59:::3;;;40047:16;;40028:15;:35;;40004:59;39996:89;;;::::0;;::::3;::::0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;;40120:42;40146:15;40120:7;:21;40128:12;:10;:12::i;:::-;40120:21;;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;40120:21:0;;;:25:::3;:42::i;:::-;40096:7;:21;40104:12;:10;:12::i;:::-;40096:21;;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;40096:21:0;:66;40173:49:::3;40192:12;:10;:12::i;:::-;40173:5;::::0;::::3;;::::0;40206:15;40173:18:::3;:49::i;:::-;40246:12;:10;:12::i;:::-;40238:38;;;40260:15;40238:38;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;27430:1:0;28549:7;:22;-1:-1:-1;;;39544:740:0:o;38524:322::-;33845:12;:10;:12::i;:::-;33835:6;;:22;:6;;;:22;;;33827:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38639:1:::1;38617:12;:19;:23;38609:50;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;38674:11;:18:::0;:22;38670:73:::1;;38713:18;38720:11;;38713:18;:::i;:::-;38781:12;:19;38767:34;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;38767:34:0::1;-1:-1:-1::0;38753:48:0;;::::1;::::0;:11:::1;::::0;:48:::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;38812:26:0;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;37932:196::-:0;1538:13;;;;;;;;:33;;;1555:16;:14;:16::i;:::-;1538:50;;;-1:-1:-1;1576:12:0;;;;1575:13;1538:50;1530:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1652:19;1675:13;;;;;;1674:14;1699:101;;;;1734:13;:20;;1769:19;1734:20;;;;;;1769:19;1750:4;1769:19;;;1699:101;38006:16:::1;:14;:16::i;:::-;38033:17;:15;:17::i;:::-;38061:24;:22;:24::i;:::-;38098:5;:22:::0;;;::::1;;::::0;::::1;;::::0;;1826:68;;;;1877:5;1861:21;;;;;;37932:196;;:::o;37687:43::-;;;;;;;;;;;;;:::o;40647:555::-;40847:4;40900:1;40877:13;:20;:24;40869:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40960:11;:18;40941:37;;40933:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41020:12;41062:8;41072:21;41045:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41035:60;;;;;;41020:75;;41113:81;41143:13;41158:11;41170:16;41158:29;;;;;;;;;;;;;;;;41189:4;41113:29;:81::i;:::-;41106:88;40647:555;-1:-1:-1;;;;;;40647:555:0:o;34568:244::-;33845:12;:10;:12::i;:::-;33835:6;;:22;:6;;;:22;;;33827:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34657:22:::1;::::0;::::1;34649:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34759:6;::::0;34738:38:::1;::::0;::::1;::::0;;::::1;::::0;34759:6:::1;::::0;34738:38:::1;::::0;34759:6:::1;::::0;34738:38:::1;34787:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;34568:244::o;37610:35::-;;;;:::o;37737:19::-;;;;;;:::o;25316:106::-;25404:10;25316:106;:::o;37189:120::-;36734:7;;;;36726:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37248:7:::1;:15:::0;;;::::1;::::0;;37279:22:::1;37288:12;:10;:12::i;:::-;37279:22;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;37189:120::o:0;36930:118::-;36458:7;;;;36457:8;36449:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36990:7:::1;:14:::0;;;::::1;37000:4;36990:14;::::0;;37020:20:::1;37027:12;:10;:12::i;29241:177::-:0;29351:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29374:23;29351:58;;;29324:86;;29344:5;;29324:19;:86::i;:::-;29241:177;;;:::o;5358:136::-;5416:7;5443:43;5447:1;5450;5443:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5436:50;5358:136;-1:-1:-1;;;5358:136:0:o;4894:181::-;4952:7;4984:5;;;5008:6;;;;5000:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1994:604;2436:4;2547:17;2583:7;1994:604;:::o;33209:129::-;1538:13;;;;;;;;:33;;;1555:16;:14;:16::i;:::-;1538:50;;;-1:-1:-1;1576:12:0;;;;1575:13;1538:50;1530:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1652:19;1675:13;;;;;;1674:14;1699:101;;;;1734:13;:20;;1769:19;1734:20;;;;;;1769:19;1750:4;1769:19;;;1699:101;33267:26:::1;:24;:26::i;:::-;33304;:24;:26::i;:::-;1830:14:::0;1826:68;;;1877:5;1861:21;;;;;;1826:68;33209:129;:::o;35809:131::-;1538:13;;;;;;;;:33;;;1555:16;:14;:16::i;:::-;1538:50;;;-1:-1:-1;1576:12:0;;;;1575:13;1538:50;1530:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1652:19;1675:13;;;;;;1674:14;1699:101;;;;1734:13;:20;;1769:19;1734:20;;;;;;1769:19;1750:4;1769:19;;;1699:101;35868:26:::1;:24;:26::i;:::-;35905:27;:25;:27::i;27516:108::-:0;1538:13;;;;;;;;:33;;;1555:16;:14;:16::i;:::-;1538:50;;;-1:-1:-1;1576:12:0;;;;1575:13;1538:50;1530:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1652:19;1675:13;;;;;;1674:14;1699:101;;;;1734:13;:20;;1769:19;1734:20;;;;;;1769:19;1750:4;1769:19;;;1699:101;27582:34:::1;:32;:34::i;3154:796::-:0;3245:4;3285;3245;3302:525;3326:5;:12;3322:1;:16;3302:525;;;3360:20;3383:5;3389:1;3383:8;;;;;;;;;;;;;;3360:31;;3428:12;3412;:28;3408:408;;3582:12;3596;3565:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3555:55;;;;;;3540:70;;3408:408;;;3772:12;3786;3755:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3745:55;;;;;;3730:70;;3408:408;-1:-1:-1;3340:3:0;;3302:525;;;-1:-1:-1;3922:20:0;;;;3154:796;-1:-1:-1;;;3154:796:0:o;31546:761::-;31970:23;31996:69;32024:4;31996:69;;;;;;;;;;;;;;;;;32004:5;31996:27;;;;:69;;;;;:::i;:::-;32080:17;;31970:95;;-1:-1:-1;32080:21:0;32076:224;;32222:10;32211:30;;;;;;;;;;;;;;;-1:-1:-1;32211:30:0;32203:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5797:192;5883:7;5919:12;5911:6;;;;5903:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5955:5:0;;;5797:192::o;25245:65::-;1538:13;;;;;;;;:33;;;1555:16;:14;:16::i;:::-;1538:50;;;-1:-1:-1;1576:12:0;;;;1575:13;1538:50;1530:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1652:19;1675:13;;;;;;1674:14;1699:101;;;;1734:13;:20;;1769:19;1734:20;;;;;;1769:19;1750:4;1769:19;;;1830:14;1826:68;;;1877:5;1861:21;;;;;;25245:65;:::o;33346:196::-;1538:13;;;;;;;;:33;;;1555:16;:14;:16::i;:::-;1538:50;;;-1:-1:-1;1576:12:0;;;;1575:13;1538:50;1530:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1652:19;1675:13;;;;;;1674:14;1699:101;;;;1734:13;:20;;1769:19;1734:20;;;;;;1769:19;1750:4;1769:19;;;1699:101;33414:17:::1;33434:12;:10;:12::i;:::-;33457:6;:18:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;33491:43:::1;::::0;33457:18;;-1:-1:-1;33457:18:0;-1:-1:-1;;33491:43:0::1;::::0;-1:-1:-1;;33491:43:0::1;1812:1;1830:14:::0;1826:68;;;1877:5;1861:21;;;;;;33346:196;:::o;35948:92::-;1538:13;;;;;;;;:33;;;1555:16;:14;:16::i;:::-;1538:50;;;-1:-1:-1;1576:12:0;;;;1575:13;1538:50;1530:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1652:19;1675:13;;;;;;1674:14;1699:101;;;;1734:13;:20;;1769:19;1734:20;;;;;;1769:19;1750:4;1769:19;;;1699:101;36017:7:::1;:15:::0;;;::::1;::::0;;1826:68;;;;1877:5;1861:21;;;;;;35948:92;:::o;27632:106::-;1538:13;;;;;;;;:33;;;1555:16;:14;:16::i;:::-;1538:50;;;-1:-1:-1;1576:12:0;;;;1575:13;1538:50;1530:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1652:19;1675:13;;;;;;1674:14;1699:101;;;;1734:13;:20;;1769:19;1734:20;;;;;;1769:19;1750:4;1769:19;;;1699:101;27430:1:::1;27708:7;:22:::0;1826:68;;;;1877:5;1861:21;;;;;;27632:106;:::o;13015:195::-;13118:12;13150:52;13172:6;13180:4;13186:1;13189:12;13150:21;:52::i;:::-;13143:59;13015:195;-1:-1:-1;;;;13015:195:0:o;14067:530::-;14194:12;14252:5;14227:21;:30;;14219:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14319:18;14330:6;14319:10;:18::i;:::-;14311:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14445:12;14459:23;14486:6;:11;;14506:5;14514:4;14486:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14444:75;;;;14537:52;14555:7;14564:10;14576:12;14537:17;:52::i;:::-;14530:59;14067:530;-1:-1:-1;;;;;;;14067:530:0:o;10097:422::-;10464:20;10503:8;;;10097:422::o;15603:742::-;15718:12;15747:7;15743:595;;;-1:-1:-1;15778:10:0;15771:17;;15743:595;15892:17;;:21;15888:439;;16155:10;16149:17;16216:15;16203:10;16199:2;16195:19;16188:44;16103:148;16291:20;;;;;;;;;;;;;;;;;;;;16298:12;;16291:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;
Swarm Source
ipfs://0fbbdeb6c5efba8ba66f9786104cf87c48798601af50ffcd9ce8adda004072b0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.003176 | 6,845,113.5429 | $21,742.96 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.