Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
RelicsActionV2
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import "./lib/Admin.sol"; import "./lib/Verify.sol"; interface MintNfter { function adminMintTo(address to, uint256 tokenId) external; } contract RelicsActionV2 is Admin, Verify { address public receiver; MintNfter public nftContract; struct Config { uint64 start; // which tokenId to start mint uint64 end; // which tokenId to end mint uint64 count; // mint count } Config public cfg; mapping(bytes32 => bool) public claimed; event SetConfig(Config config); event Paid( address indexed sender, address indexed token, uint256 indexed amount ); event Claimed( address to, uint256 serverId, uint256 payerId, uint256 relicsId, uint256 tokenId ); function initialize( MintNfter _impl, address _receiver, Config memory _cfg ) public initializer { nftContract = _impl; receiver = _receiver; __Ownable_init(); _setConfig(_cfg); } /// @dev TokenId for mint nft /// @dev Each mint nft, count will add 1 /// @dev mint nft is mint start+count /// @dev start+count <= end /// @dev price: 1000 = 1 ether, 1 = 0.001 ether function setConfig(Config memory _cfg) public onlyAdmin { _setConfig(_cfg); } function _setConfig(Config memory _cfg) internal { cfg.start = _cfg.start; cfg.count = _cfg.count; cfg.end = _cfg.end; emit SetConfig(cfg); } /// @notice Set the interval that can mint function setMintInterval(uint64 _start, uint64 _end) external onlyAdmin { require(_end > _start, "end must be greater than start"); require( _end < cfg.start || _start >= cfg.start + cfg.count, "invalid interval" ); cfg.start = _start; cfg.end = _end; cfg.count = 0; emit SetConfig(cfg); } function setReceiver(address _receiver) external onlyOwner { receiver = _receiver; } /// @notice Entrance of user mint art nft /// @param _token erc20 token or native token(0x0000000000000000000000000000000000000000) /// @param _payment payment amount /// @param _deadline period of validity function claim( address _token, uint256 _payment, uint256 _serverId, uint256 _payerId, uint256 _relicsId, uint256 _deadline, bytes memory _data ) external payable { require(cfg.start + cfg.count <= cfg.end, "exceeded limit"); require(_deadline >= block.timestamp, "time out"); address sender = _msgSender(); bytes32 _hash = keccak256( abi.encode( sender, _token, _payment, _serverId, _payerId, _relicsId, block.chainid, _deadline ) ); require(verify(_hash, _data), "authentication failed"); bytes32 hash_ = keccak256(abi.encode(_serverId, _payerId, _relicsId)); require(!claimed[hash_], "already minted"); claimed[hash_] = true; if (_token == address(0)) { require(_payment == msg.value, "incorrect payment amount"); (bool _success, ) = receiver.call{value: _payment}(""); require(_success, "transfer failed with native token"); } else { require(msg.value == 0, "value error"); bool _success = IERC20Upgradeable(_token).transferFrom( sender, receiver, _payment ); require(_success, "transfer failed with erc20 token"); } emit Paid(sender, _token, _payment); uint256 tokenId_ = cfg.start + cfg.count; nftContract.adminMintTo(sender, tokenId_); emit Claimed(sender, _serverId, _payerId, _relicsId, tokenId_); cfg.count++; } /// @notice Withdraw the balance of the contract /// @param _to Withdraw the balance of the contract to `_to` function withdraw(address _to) external onlyOwner { (bool _success, ) = _to.call{value: address(this).balance}(""); require(_success, "withdraw failed"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract 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 onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @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 proxied contracts do not make use of 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. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * 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 {ERC1967Proxy-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. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = _setInitializedVersion(1); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { bool isTopLevelCall = _setInitializedVersion(version); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(version); } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { _setInitializedVersion(type(uint8).max); } function _setInitializedVersion(uint8 version) private returns (bool) { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level // of initializers, because in other contexts the contract may have been reentered. if (_initializing) { require( version == 1 && !AddressUpgradeable.isContract(address(this)), "Initializable: contract is already initialized" ); return false; } else { require(_initialized < version, "Initializable: contract is already initialized"); _initialized = version; return true; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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"); (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"); (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"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @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 a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; abstract contract Admin is OwnableUpgradeable{ mapping (address => bool) public admins; event SetAdmin(address admin, bool auth); modifier onlyAdmin() { require( admins[msg.sender] || owner() == msg.sender, "Admin: caller is not the admin" ); _; } function setAdmin(address _user, bool _auth) external onlyOwner { admins[_user] = _auth; emit SetAdmin(_user, _auth); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol"; contract Verify is OwnableUpgradeable { using SafeMathUpgradeable for uint256; address private publicKey; function verify(bytes32 hashMessage, bytes memory _data)internal view returns (bool) { bool auth; bytes32 _r = bytes2bytes32(slice(_data, 0, 32)); bytes32 _s = bytes2bytes32(slice(_data, 32, 32)); bytes1 v = slice(_data, 64, 1)[0]; uint8 _v = uint8(v) + 27; address addr = ecrecover(hashMessage, _v, _r, _s); if (publicKey == addr) { auth = true; } return auth; } function slice(bytes memory data, uint256 start, uint256 len) internal pure returns (bytes memory) { bytes memory b = new bytes(len); for (uint256 i = 0; i < len; i++) { b[i] = data[i + start]; } return b; } function bytes2bytes32(bytes memory _source) internal pure returns (bytes32 result){ assembly { result := mload(add(_source, 32)) } } function setPublicKey(address _key) external onlyOwner { publicKey = _key; } function getPublicKey() external view onlyOwner returns (address){ return publicKey; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"serverId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"relicsId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Paid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"bool","name":"auth","type":"bool"}],"name":"SetAdmin","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"uint64","name":"count","type":"uint64"}],"indexed":false,"internalType":"struct RelicsActionV2.Config","name":"config","type":"tuple"}],"name":"SetConfig","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cfg","outputs":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"uint64","name":"count","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_payment","type":"uint256"},{"internalType":"uint256","name":"_serverId","type":"uint256"},{"internalType":"uint256","name":"_payerId","type":"uint256"},{"internalType":"uint256","name":"_relicsId","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicKey","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract MintNfter","name":"_impl","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"components":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"uint64","name":"count","type":"uint64"}],"internalType":"struct RelicsActionV2.Config","name":"_cfg","type":"tuple"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftContract","outputs":[{"internalType":"contract MintNfter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_auth","type":"bool"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"uint64","name":"count","type":"uint64"}],"internalType":"struct RelicsActionV2.Config","name":"_cfg","type":"tuple"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_start","type":"uint64"},{"internalType":"uint64","name":"_end","type":"uint64"}],"name":"setMintInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_key","type":"address"}],"name":"setPublicKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"setReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612f03806100206000396000f3fe6080604052600436106100fe5760003560e01c8063715018a611610095578063bd19079111610064578063bd190791146102f9578063cc3c0f0614610315578063d56d229d14610352578063f2fde38b1461037d578063f7260d3e146103a6576100fe565b8063715018a614610265578063718da7ee1461027c5780638da5cb5b146102a5578063b92a9664146102d0576100fe565b8063429b62e5116100d1578063429b62e5146101ad5780634b0bddd2146101ea57806351cff8d914610213578063671dc3371461023c576100fe565b80630457dad21461010357806304fee76614610130578063097eb759146101595780632e33445214610182575b600080fd5b34801561010f57600080fd5b506101186103d1565b60405161012793929190612737565b60405180910390f35b34801561013c57600080fd5b5061015760048036038101906101529190611ee0565b610425565b005b34801561016557600080fd5b50610180600480360381019061017b9190611d73565b610547565b005b34801561018e57600080fd5b50610197610607565b6040516101a491906122da565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf9190611d73565b6106ad565b6040516101e1919061244f565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c9190611d9c565b6106cd565b005b34801561021f57600080fd5b5061023a60048036038101906102359190611d73565b6107dd565b005b34801561024857600080fd5b50610263600480360381019061025e9190611f2f565b610909565b005b34801561027157600080fd5b5061027a6109de565b005b34801561028857600080fd5b506102a3600480360381019061029e9190611d73565b610a66565b005b3480156102b157600080fd5b506102ba610b26565b6040516102c791906122da565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f29190611f58565b610b50565b005b610313600480360381019061030e9190611dd8565b610dfb565b005b34801561032157600080fd5b5061033c60048036038101906103379190611eb7565b61148c565b604051610349919061244f565b60405180910390f35b34801561035e57600080fd5b506103676114ac565b60405161037491906124af565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190611d73565b6114d2565b005b3480156103b257600080fd5b506103bb6115ca565b6040516103c891906122da565b60405180910390f35b60698060000160009054906101000a900467ffffffffffffffff16908060000160089054906101000a900467ffffffffffffffff16908060000160109054906101000a900467ffffffffffffffff16905083565b600061043160016115f0565b90508015610455576001600060016101000a81548160ff0219169083151502179055505b83606860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082606760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506104df6116e0565b6104e882611739565b80156105415760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161053891906124ca565b60405180910390a15b50505050565b61054f611804565b73ffffffffffffffffffffffffffffffffffffffff1661056d610b26565b73ffffffffffffffffffffffffffffffffffffffff16146105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ba906125e5565b60405180910390fd5b80606660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610611611804565b73ffffffffffffffffffffffffffffffffffffffff1661062f610b26565b73ffffffffffffffffffffffffffffffffffffffff1614610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c906125e5565b60405180910390fd5b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60656020528060005260406000206000915054906101000a900460ff1681565b6106d5611804565b73ffffffffffffffffffffffffffffffffffffffff166106f3610b26565b73ffffffffffffffffffffffffffffffffffffffff1614610749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610740906125e5565b60405180910390fd5b80606560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f55a5194bc0174fcaf12b2978bef43911466bf63b34db8d1dd1a0d5dcd5c41bea82826040516107d19291906123aa565b60405180910390a15050565b6107e5611804565b73ffffffffffffffffffffffffffffffffffffffff16610803610b26565b73ffffffffffffffffffffffffffffffffffffffff1614610859576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610850906125e5565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff164760405161087f906122c5565b60006040518083038185875af1925050503d80600081146108bc576040519150601f19603f3d011682016040523d82523d6000602084013e6108c1565b606091505b5050905080610905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fc90612685565b60405180910390fd5b5050565b606560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061099357503373ffffffffffffffffffffffffffffffffffffffff1661097b610b26565b73ffffffffffffffffffffffffffffffffffffffff16145b6109d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c990612605565b60405180910390fd5b6109db81611739565b50565b6109e6611804565b73ffffffffffffffffffffffffffffffffffffffff16610a04610b26565b73ffffffffffffffffffffffffffffffffffffffff1614610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a51906125e5565b60405180910390fd5b610a64600061180c565b565b610a6e611804565b73ffffffffffffffffffffffffffffffffffffffff16610a8c610b26565b73ffffffffffffffffffffffffffffffffffffffff1614610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad9906125e5565b60405180910390fd5b80606760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610bda57503373ffffffffffffffffffffffffffffffffffffffff16610bc2610b26565b73ffffffffffffffffffffffffffffffffffffffff16145b610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1090612605565b60405180910390fd5b8167ffffffffffffffff168167ffffffffffffffff1611610c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6690612585565b60405180910390fd5b606960000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168167ffffffffffffffff161080610cfb5750606960000160109054906101000a900467ffffffffffffffff16606960000160009054906101000a900467ffffffffffffffff16610ce39190612836565b67ffffffffffffffff168267ffffffffffffffff1610155b610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d31906124e5565b60405180910390fd5b81606960000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080606960000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000606960000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f3e105c1666f6f2774bcef9c6615d7f79a55bc33034ec60dd4b6b9c4b8b5d4a286069604051610def91906126e5565b60405180910390a15050565b606960000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16606960000160109054906101000a900467ffffffffffffffff16606960000160009054906101000a900467ffffffffffffffff16610e5d9190612836565b67ffffffffffffffff161115610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90612625565b60405180910390fd5b42821015610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290612665565b60405180910390fd5b6000610ef5611804565b90506000818989898989468a604051602001610f1898979695949392919061232c565b604051602081830303815290604052805190602001209050610f3a81846118d2565b610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7090612505565b60405180910390fd5b6000878787604051602001610f9093929190612700565b604051602081830303815290604052805190602001209050606a600082815260200190815260200160002060009054906101000a900460ff1615611009576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611000906126a5565b60405180910390fd5b6001606a600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161415611180573489146110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a3906125c5565b60405180910390fd5b6000606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a6040516110f4906122c5565b60006040518083038185875af1925050503d8060008114611131576040519150601f19603f3d011682016040523d82523d6000602084013e611136565b606091505b505090508061117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117190612565565b60405180910390fd5b506112ba565b600034146111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba906126c5565b60405180910390fd5b60008a73ffffffffffffffffffffffffffffffffffffffff166323b872dd85606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168d6040518463ffffffff1660e01b8152600401611224939291906122f5565b602060405180830381600087803b15801561123e57600080fd5b505af1158015611252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112769190611e8e565b9050806112b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112af90612545565b60405180910390fd5b505b888a73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f9def4e2802183d68ce90a6a226a2962b59298616c27165f12c4fbc5c84cdd77860405160405180910390a46000606960000160109054906101000a900467ffffffffffffffff16606960000160009054906101000a900467ffffffffffffffff166113559190612836565b67ffffffffffffffff169050606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633d6a574585836040518363ffffffff1660e01b81526004016113be9291906123d3565b600060405180830381600087803b1580156113d857600080fd5b505af11580156113ec573d6000803e3d6000fd5b505050507f7708755c9b641bf197be5047b04002d2e88fa658c173a351067747eb5dfc568a848a8a8a856040516114279594939291906123fc565b60405180910390a16069600001601081819054906101000a900467ffffffffffffffff168092919061145890612a51565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050505050505050505050565b606a6020528060005260406000206000915054906101000a900460ff1681565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114da611804565b73ffffffffffffffffffffffffffffffffffffffff166114f8610b26565b73ffffffffffffffffffffffffffffffffffffffff161461154e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611545906125e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b590612525565b60405180910390fd5b6115c78161180c565b50565b606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060019054906101000a900460ff16156116675760018260ff1614801561161f575061161d30611a2c565b155b61165e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611655906125a5565b60405180910390fd5b600090506116db565b8160ff1660008054906101000a900460ff1660ff16106116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b3906125a5565b60405180910390fd5b816000806101000a81548160ff021916908360ff160217905550600190505b919050565b600060019054906101000a900460ff1661172f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172690612645565b60405180910390fd5b611737611a4f565b565b8060000151606960000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508060400151606960000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508060200151606960000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f3e105c1666f6f2774bcef9c6615d7f79a55bc33034ec60dd4b6b9c4b8b5d4a2860696040516117f991906126e5565b60405180910390a150565b600033905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060006118ec6118e78560006020611ab0565b611c0a565b905060006119046118ff86602080611ab0565b611c0a565b905060006119158660406001611ab0565b60008151811061194e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b90506000601b8260f81c61196d9190612874565b9050600060018983878760405160008152602001604052604051611994949392919061246a565b6020604051602081039080840390855afa1580156119b6573d6000803e3d6000fd5b5050506020604051035190508073ffffffffffffffffffffffffffffffffffffffff16606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a1d57600195505b85965050505050505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9590612645565b60405180910390fd5b611aae611aa9611804565b61180c565b565b606060008267ffffffffffffffff811115611af4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b265781602001600182028036833780820191505090505b50905060005b83811015611bfe57858582611b4191906127e0565b81518110611b78577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b828281518110611bbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bf690612a08565b915050611b2c565b50809150509392505050565b600060208201519050919050565b6000611c2b611c2684612793565b61276e565b905082815260208101848484011115611c4357600080fd5b611c4e84828561297a565b509392505050565b600081359050611c6581612e43565b92915050565b600081359050611c7a81612e5a565b92915050565b600081519050611c8f81612e5a565b92915050565b600081359050611ca481612e71565b92915050565b600082601f830112611cbb57600080fd5b8135611ccb848260208601611c18565b91505092915050565b600081359050611ce381612e88565b92915050565b600060608284031215611cfb57600080fd5b611d05606061276e565b90506000611d1584828501611d5e565b6000830152506020611d2984828501611d5e565b6020830152506040611d3d84828501611d5e565b60408301525092915050565b600081359050611d5881612e9f565b92915050565b600081359050611d6d81612eb6565b92915050565b600060208284031215611d8557600080fd5b6000611d9384828501611c56565b91505092915050565b60008060408385031215611daf57600080fd5b6000611dbd85828601611c56565b9250506020611dce85828601611c6b565b9150509250929050565b600080600080600080600060e0888a031215611df357600080fd5b6000611e018a828b01611c56565b9750506020611e128a828b01611d49565b9650506040611e238a828b01611d49565b9550506060611e348a828b01611d49565b9450506080611e458a828b01611d49565b93505060a0611e568a828b01611d49565b92505060c088013567ffffffffffffffff811115611e7357600080fd5b611e7f8a828b01611caa565b91505092959891949750929550565b600060208284031215611ea057600080fd5b6000611eae84828501611c80565b91505092915050565b600060208284031215611ec957600080fd5b6000611ed784828501611c95565b91505092915050565b600080600060a08486031215611ef557600080fd5b6000611f0386828701611cd4565b9350506020611f1486828701611c56565b9250506040611f2586828701611ce9565b9150509250925092565b600060608284031215611f4157600080fd5b6000611f4f84828501611ce9565b91505092915050565b60008060408385031215611f6b57600080fd5b6000611f7985828601611d5e565b9250506020611f8a85828601611d5e565b9150509250929050565b611f9d816128bf565b82525050565b611fac816128d1565b82525050565b611fbb816128dd565b82525050565b611fca81612944565b82525050565b611fd981612968565b82525050565b6000611fec6010836127cf565b9150611ff782612b18565b602082019050919050565b600061200f6015836127cf565b915061201a82612b41565b602082019050919050565b60006120326026836127cf565b915061203d82612b6a565b604082019050919050565b60006120556020836127cf565b915061206082612bb9565b602082019050919050565b60006120786021836127cf565b915061208382612be2565b604082019050919050565b600061209b601e836127cf565b91506120a682612c31565b602082019050919050565b60006120be602e836127cf565b91506120c982612c5a565b604082019050919050565b60006120e16018836127cf565b91506120ec82612ca9565b602082019050919050565b60006121046020836127cf565b915061210f82612cd2565b602082019050919050565b6000612127601e836127cf565b915061213282612cfb565b602082019050919050565b600061214a600e836127cf565b915061215582612d24565b602082019050919050565b600061216d6000836127c4565b915061217882612d4d565b600082019050919050565b6000612190602b836127cf565b915061219b82612d50565b604082019050919050565b60006121b36008836127cf565b91506121be82612d9f565b602082019050919050565b60006121d6600f836127cf565b91506121e182612dc8565b602082019050919050565b60006121f9600e836127cf565b915061220482612df1565b602082019050919050565b600061221c600b836127cf565b915061222782612e1a565b602082019050919050565b60608201600080830154905061224781612989565b6122546000860182612298565b5061225e816129bd565b61226b6020860182612298565b50612275816129a3565b6122826040860182612298565b5050505050565b61229281612919565b82525050565b6122a181612923565b82525050565b6122b081612923565b82525050565b6122bf81612937565b82525050565b60006122d082612160565b9150819050919050565b60006020820190506122ef6000830184611f94565b92915050565b600060608201905061230a6000830186611f94565b6123176020830185611f94565b6123246040830184612289565b949350505050565b600061010082019050612342600083018b611f94565b61234f602083018a611f94565b61235c6040830189612289565b6123696060830188612289565b6123766080830187612289565b61238360a0830186612289565b61239060c0830185612289565b61239d60e0830184612289565b9998505050505050505050565b60006040820190506123bf6000830185611f94565b6123cc6020830184611fa3565b9392505050565b60006040820190506123e86000830185611f94565b6123f56020830184612289565b9392505050565b600060a0820190506124116000830188611f94565b61241e6020830187612289565b61242b6040830186612289565b6124386060830185612289565b6124456080830184612289565b9695505050505050565b60006020820190506124646000830184611fa3565b92915050565b600060808201905061247f6000830187611fb2565b61248c60208301866122b6565b6124996040830185611fb2565b6124a66060830184611fb2565b95945050505050565b60006020820190506124c46000830184611fc1565b92915050565b60006020820190506124df6000830184611fd0565b92915050565b600060208201905081810360008301526124fe81611fdf565b9050919050565b6000602082019050818103600083015261251e81612002565b9050919050565b6000602082019050818103600083015261253e81612025565b9050919050565b6000602082019050818103600083015261255e81612048565b9050919050565b6000602082019050818103600083015261257e8161206b565b9050919050565b6000602082019050818103600083015261259e8161208e565b9050919050565b600060208201905081810360008301526125be816120b1565b9050919050565b600060208201905081810360008301526125de816120d4565b9050919050565b600060208201905081810360008301526125fe816120f7565b9050919050565b6000602082019050818103600083015261261e8161211a565b9050919050565b6000602082019050818103600083015261263e8161213d565b9050919050565b6000602082019050818103600083015261265e81612183565b9050919050565b6000602082019050818103600083015261267e816121a6565b9050919050565b6000602082019050818103600083015261269e816121c9565b9050919050565b600060208201905081810360008301526126be816121ec565b9050919050565b600060208201905081810360008301526126de8161220f565b9050919050565b60006060820190506126fa6000830184612232565b92915050565b60006060820190506127156000830186612289565b6127226020830185612289565b61272f6040830184612289565b949350505050565b600060608201905061274c60008301866122a7565b61275960208301856122a7565b61276660408301846122a7565b949350505050565b6000612778612789565b905061278482826129d7565b919050565b6000604051905090565b600067ffffffffffffffff8211156127ae576127ad612ab1565b5b6127b782612ae0565b9050602081019050919050565b600081905092915050565b600082825260208201905092915050565b60006127eb82612919565b91506127f683612919565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561282b5761282a612a82565b5b828201905092915050565b600061284182612923565b915061284c83612923565b92508267ffffffffffffffff0382111561286957612868612a82565b5b828201905092915050565b600061287f82612937565b915061288a83612937565b92508260ff038211156128a05761289f612a82565b5b828201905092915050565b600067ffffffffffffffff82169050919050565b60006128ca826128f9565b9050919050565b60008115159050919050565b6000819050919050565b60006128f2826128bf565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b600061294f82612956565b9050919050565b6000612961826128f9565b9050919050565b600061297382612937565b9050919050565b82818337600083830152505050565b600061299c61299783612af1565b6128ab565b9050919050565b60006129b66129b183612afe565b6128ab565b9050919050565b60006129d06129cb83612b0b565b6128ab565b9050919050565b6129e082612ae0565b810181811067ffffffffffffffff821117156129ff576129fe612ab1565b5b80604052505050565b6000612a1382612919565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a4657612a45612a82565b5b600182019050919050565b6000612a5c82612923565b915067ffffffffffffffff821415612a7757612a76612a82565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160001c9050919050565b60008160801c9050919050565b60008160401c9050919050565b7f696e76616c696420696e74657276616c00000000000000000000000000000000600082015250565b7f61757468656e7469636174696f6e206661696c65640000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7472616e73666572206661696c6564207769746820657263323020746f6b656e600082015250565b7f7472616e73666572206661696c65642077697468206e617469766520746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f656e64206d7573742062652067726561746572207468616e2073746172740000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f696e636f7272656374207061796d656e7420616d6f756e740000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f41646d696e3a2063616c6c6572206973206e6f74207468652061646d696e0000600082015250565b7f6578636565646564206c696d6974000000000000000000000000000000000000600082015250565b50565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f74696d65206f7574000000000000000000000000000000000000000000000000600082015250565b7f7769746864726177206661696c65640000000000000000000000000000000000600082015250565b7f616c7265616479206d696e746564000000000000000000000000000000000000600082015250565b7f76616c7565206572726f72000000000000000000000000000000000000000000600082015250565b612e4c816128bf565b8114612e5757600080fd5b50565b612e63816128d1565b8114612e6e57600080fd5b50565b612e7a816128dd565b8114612e8557600080fd5b50565b612e91816128e7565b8114612e9c57600080fd5b50565b612ea881612919565b8114612eb357600080fd5b50565b612ebf81612923565b8114612eca57600080fd5b5056fea2646970667358221220c4e384f92f9b888b1660623673133d098feaaced490071a465722dabb104b02a64736f6c63430008040033
Deployed Bytecode
0x6080604052600436106100fe5760003560e01c8063715018a611610095578063bd19079111610064578063bd190791146102f9578063cc3c0f0614610315578063d56d229d14610352578063f2fde38b1461037d578063f7260d3e146103a6576100fe565b8063715018a614610265578063718da7ee1461027c5780638da5cb5b146102a5578063b92a9664146102d0576100fe565b8063429b62e5116100d1578063429b62e5146101ad5780634b0bddd2146101ea57806351cff8d914610213578063671dc3371461023c576100fe565b80630457dad21461010357806304fee76614610130578063097eb759146101595780632e33445214610182575b600080fd5b34801561010f57600080fd5b506101186103d1565b60405161012793929190612737565b60405180910390f35b34801561013c57600080fd5b5061015760048036038101906101529190611ee0565b610425565b005b34801561016557600080fd5b50610180600480360381019061017b9190611d73565b610547565b005b34801561018e57600080fd5b50610197610607565b6040516101a491906122da565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf9190611d73565b6106ad565b6040516101e1919061244f565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c9190611d9c565b6106cd565b005b34801561021f57600080fd5b5061023a60048036038101906102359190611d73565b6107dd565b005b34801561024857600080fd5b50610263600480360381019061025e9190611f2f565b610909565b005b34801561027157600080fd5b5061027a6109de565b005b34801561028857600080fd5b506102a3600480360381019061029e9190611d73565b610a66565b005b3480156102b157600080fd5b506102ba610b26565b6040516102c791906122da565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f29190611f58565b610b50565b005b610313600480360381019061030e9190611dd8565b610dfb565b005b34801561032157600080fd5b5061033c60048036038101906103379190611eb7565b61148c565b604051610349919061244f565b60405180910390f35b34801561035e57600080fd5b506103676114ac565b60405161037491906124af565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190611d73565b6114d2565b005b3480156103b257600080fd5b506103bb6115ca565b6040516103c891906122da565b60405180910390f35b60698060000160009054906101000a900467ffffffffffffffff16908060000160089054906101000a900467ffffffffffffffff16908060000160109054906101000a900467ffffffffffffffff16905083565b600061043160016115f0565b90508015610455576001600060016101000a81548160ff0219169083151502179055505b83606860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082606760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506104df6116e0565b6104e882611739565b80156105415760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161053891906124ca565b60405180910390a15b50505050565b61054f611804565b73ffffffffffffffffffffffffffffffffffffffff1661056d610b26565b73ffffffffffffffffffffffffffffffffffffffff16146105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ba906125e5565b60405180910390fd5b80606660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610611611804565b73ffffffffffffffffffffffffffffffffffffffff1661062f610b26565b73ffffffffffffffffffffffffffffffffffffffff1614610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c906125e5565b60405180910390fd5b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60656020528060005260406000206000915054906101000a900460ff1681565b6106d5611804565b73ffffffffffffffffffffffffffffffffffffffff166106f3610b26565b73ffffffffffffffffffffffffffffffffffffffff1614610749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610740906125e5565b60405180910390fd5b80606560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f55a5194bc0174fcaf12b2978bef43911466bf63b34db8d1dd1a0d5dcd5c41bea82826040516107d19291906123aa565b60405180910390a15050565b6107e5611804565b73ffffffffffffffffffffffffffffffffffffffff16610803610b26565b73ffffffffffffffffffffffffffffffffffffffff1614610859576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610850906125e5565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff164760405161087f906122c5565b60006040518083038185875af1925050503d80600081146108bc576040519150601f19603f3d011682016040523d82523d6000602084013e6108c1565b606091505b5050905080610905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fc90612685565b60405180910390fd5b5050565b606560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061099357503373ffffffffffffffffffffffffffffffffffffffff1661097b610b26565b73ffffffffffffffffffffffffffffffffffffffff16145b6109d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c990612605565b60405180910390fd5b6109db81611739565b50565b6109e6611804565b73ffffffffffffffffffffffffffffffffffffffff16610a04610b26565b73ffffffffffffffffffffffffffffffffffffffff1614610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a51906125e5565b60405180910390fd5b610a64600061180c565b565b610a6e611804565b73ffffffffffffffffffffffffffffffffffffffff16610a8c610b26565b73ffffffffffffffffffffffffffffffffffffffff1614610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad9906125e5565b60405180910390fd5b80606760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610bda57503373ffffffffffffffffffffffffffffffffffffffff16610bc2610b26565b73ffffffffffffffffffffffffffffffffffffffff16145b610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1090612605565b60405180910390fd5b8167ffffffffffffffff168167ffffffffffffffff1611610c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6690612585565b60405180910390fd5b606960000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168167ffffffffffffffff161080610cfb5750606960000160109054906101000a900467ffffffffffffffff16606960000160009054906101000a900467ffffffffffffffff16610ce39190612836565b67ffffffffffffffff168267ffffffffffffffff1610155b610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d31906124e5565b60405180910390fd5b81606960000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080606960000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000606960000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f3e105c1666f6f2774bcef9c6615d7f79a55bc33034ec60dd4b6b9c4b8b5d4a286069604051610def91906126e5565b60405180910390a15050565b606960000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16606960000160109054906101000a900467ffffffffffffffff16606960000160009054906101000a900467ffffffffffffffff16610e5d9190612836565b67ffffffffffffffff161115610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9f90612625565b60405180910390fd5b42821015610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290612665565b60405180910390fd5b6000610ef5611804565b90506000818989898989468a604051602001610f1898979695949392919061232c565b604051602081830303815290604052805190602001209050610f3a81846118d2565b610f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7090612505565b60405180910390fd5b6000878787604051602001610f9093929190612700565b604051602081830303815290604052805190602001209050606a600082815260200190815260200160002060009054906101000a900460ff1615611009576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611000906126a5565b60405180910390fd5b6001606a600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161415611180573489146110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a3906125c5565b60405180910390fd5b6000606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a6040516110f4906122c5565b60006040518083038185875af1925050503d8060008114611131576040519150601f19603f3d011682016040523d82523d6000602084013e611136565b606091505b505090508061117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117190612565565b60405180910390fd5b506112ba565b600034146111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ba906126c5565b60405180910390fd5b60008a73ffffffffffffffffffffffffffffffffffffffff166323b872dd85606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168d6040518463ffffffff1660e01b8152600401611224939291906122f5565b602060405180830381600087803b15801561123e57600080fd5b505af1158015611252573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112769190611e8e565b9050806112b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112af90612545565b60405180910390fd5b505b888a73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f9def4e2802183d68ce90a6a226a2962b59298616c27165f12c4fbc5c84cdd77860405160405180910390a46000606960000160109054906101000a900467ffffffffffffffff16606960000160009054906101000a900467ffffffffffffffff166113559190612836565b67ffffffffffffffff169050606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633d6a574585836040518363ffffffff1660e01b81526004016113be9291906123d3565b600060405180830381600087803b1580156113d857600080fd5b505af11580156113ec573d6000803e3d6000fd5b505050507f7708755c9b641bf197be5047b04002d2e88fa658c173a351067747eb5dfc568a848a8a8a856040516114279594939291906123fc565b60405180910390a16069600001601081819054906101000a900467ffffffffffffffff168092919061145890612a51565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505050505050505050505050565b606a6020528060005260406000206000915054906101000a900460ff1681565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114da611804565b73ffffffffffffffffffffffffffffffffffffffff166114f8610b26565b73ffffffffffffffffffffffffffffffffffffffff161461154e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611545906125e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b590612525565b60405180910390fd5b6115c78161180c565b50565b606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060019054906101000a900460ff16156116675760018260ff1614801561161f575061161d30611a2c565b155b61165e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611655906125a5565b60405180910390fd5b600090506116db565b8160ff1660008054906101000a900460ff1660ff16106116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b3906125a5565b60405180910390fd5b816000806101000a81548160ff021916908360ff160217905550600190505b919050565b600060019054906101000a900460ff1661172f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172690612645565b60405180910390fd5b611737611a4f565b565b8060000151606960000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508060400151606960000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508060200151606960000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f3e105c1666f6f2774bcef9c6615d7f79a55bc33034ec60dd4b6b9c4b8b5d4a2860696040516117f991906126e5565b60405180910390a150565b600033905090565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060006118ec6118e78560006020611ab0565b611c0a565b905060006119046118ff86602080611ab0565b611c0a565b905060006119158660406001611ab0565b60008151811061194e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b90506000601b8260f81c61196d9190612874565b9050600060018983878760405160008152602001604052604051611994949392919061246a565b6020604051602081039080840390855afa1580156119b6573d6000803e3d6000fd5b5050506020604051035190508073ffffffffffffffffffffffffffffffffffffffff16606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a1d57600195505b85965050505050505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16611a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9590612645565b60405180910390fd5b611aae611aa9611804565b61180c565b565b606060008267ffffffffffffffff811115611af4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611b265781602001600182028036833780820191505090505b50905060005b83811015611bfe57858582611b4191906127e0565b81518110611b78577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b828281518110611bbc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bf690612a08565b915050611b2c565b50809150509392505050565b600060208201519050919050565b6000611c2b611c2684612793565b61276e565b905082815260208101848484011115611c4357600080fd5b611c4e84828561297a565b509392505050565b600081359050611c6581612e43565b92915050565b600081359050611c7a81612e5a565b92915050565b600081519050611c8f81612e5a565b92915050565b600081359050611ca481612e71565b92915050565b600082601f830112611cbb57600080fd5b8135611ccb848260208601611c18565b91505092915050565b600081359050611ce381612e88565b92915050565b600060608284031215611cfb57600080fd5b611d05606061276e565b90506000611d1584828501611d5e565b6000830152506020611d2984828501611d5e565b6020830152506040611d3d84828501611d5e565b60408301525092915050565b600081359050611d5881612e9f565b92915050565b600081359050611d6d81612eb6565b92915050565b600060208284031215611d8557600080fd5b6000611d9384828501611c56565b91505092915050565b60008060408385031215611daf57600080fd5b6000611dbd85828601611c56565b9250506020611dce85828601611c6b565b9150509250929050565b600080600080600080600060e0888a031215611df357600080fd5b6000611e018a828b01611c56565b9750506020611e128a828b01611d49565b9650506040611e238a828b01611d49565b9550506060611e348a828b01611d49565b9450506080611e458a828b01611d49565b93505060a0611e568a828b01611d49565b92505060c088013567ffffffffffffffff811115611e7357600080fd5b611e7f8a828b01611caa565b91505092959891949750929550565b600060208284031215611ea057600080fd5b6000611eae84828501611c80565b91505092915050565b600060208284031215611ec957600080fd5b6000611ed784828501611c95565b91505092915050565b600080600060a08486031215611ef557600080fd5b6000611f0386828701611cd4565b9350506020611f1486828701611c56565b9250506040611f2586828701611ce9565b9150509250925092565b600060608284031215611f4157600080fd5b6000611f4f84828501611ce9565b91505092915050565b60008060408385031215611f6b57600080fd5b6000611f7985828601611d5e565b9250506020611f8a85828601611d5e565b9150509250929050565b611f9d816128bf565b82525050565b611fac816128d1565b82525050565b611fbb816128dd565b82525050565b611fca81612944565b82525050565b611fd981612968565b82525050565b6000611fec6010836127cf565b9150611ff782612b18565b602082019050919050565b600061200f6015836127cf565b915061201a82612b41565b602082019050919050565b60006120326026836127cf565b915061203d82612b6a565b604082019050919050565b60006120556020836127cf565b915061206082612bb9565b602082019050919050565b60006120786021836127cf565b915061208382612be2565b604082019050919050565b600061209b601e836127cf565b91506120a682612c31565b602082019050919050565b60006120be602e836127cf565b91506120c982612c5a565b604082019050919050565b60006120e16018836127cf565b91506120ec82612ca9565b602082019050919050565b60006121046020836127cf565b915061210f82612cd2565b602082019050919050565b6000612127601e836127cf565b915061213282612cfb565b602082019050919050565b600061214a600e836127cf565b915061215582612d24565b602082019050919050565b600061216d6000836127c4565b915061217882612d4d565b600082019050919050565b6000612190602b836127cf565b915061219b82612d50565b604082019050919050565b60006121b36008836127cf565b91506121be82612d9f565b602082019050919050565b60006121d6600f836127cf565b91506121e182612dc8565b602082019050919050565b60006121f9600e836127cf565b915061220482612df1565b602082019050919050565b600061221c600b836127cf565b915061222782612e1a565b602082019050919050565b60608201600080830154905061224781612989565b6122546000860182612298565b5061225e816129bd565b61226b6020860182612298565b50612275816129a3565b6122826040860182612298565b5050505050565b61229281612919565b82525050565b6122a181612923565b82525050565b6122b081612923565b82525050565b6122bf81612937565b82525050565b60006122d082612160565b9150819050919050565b60006020820190506122ef6000830184611f94565b92915050565b600060608201905061230a6000830186611f94565b6123176020830185611f94565b6123246040830184612289565b949350505050565b600061010082019050612342600083018b611f94565b61234f602083018a611f94565b61235c6040830189612289565b6123696060830188612289565b6123766080830187612289565b61238360a0830186612289565b61239060c0830185612289565b61239d60e0830184612289565b9998505050505050505050565b60006040820190506123bf6000830185611f94565b6123cc6020830184611fa3565b9392505050565b60006040820190506123e86000830185611f94565b6123f56020830184612289565b9392505050565b600060a0820190506124116000830188611f94565b61241e6020830187612289565b61242b6040830186612289565b6124386060830185612289565b6124456080830184612289565b9695505050505050565b60006020820190506124646000830184611fa3565b92915050565b600060808201905061247f6000830187611fb2565b61248c60208301866122b6565b6124996040830185611fb2565b6124a66060830184611fb2565b95945050505050565b60006020820190506124c46000830184611fc1565b92915050565b60006020820190506124df6000830184611fd0565b92915050565b600060208201905081810360008301526124fe81611fdf565b9050919050565b6000602082019050818103600083015261251e81612002565b9050919050565b6000602082019050818103600083015261253e81612025565b9050919050565b6000602082019050818103600083015261255e81612048565b9050919050565b6000602082019050818103600083015261257e8161206b565b9050919050565b6000602082019050818103600083015261259e8161208e565b9050919050565b600060208201905081810360008301526125be816120b1565b9050919050565b600060208201905081810360008301526125de816120d4565b9050919050565b600060208201905081810360008301526125fe816120f7565b9050919050565b6000602082019050818103600083015261261e8161211a565b9050919050565b6000602082019050818103600083015261263e8161213d565b9050919050565b6000602082019050818103600083015261265e81612183565b9050919050565b6000602082019050818103600083015261267e816121a6565b9050919050565b6000602082019050818103600083015261269e816121c9565b9050919050565b600060208201905081810360008301526126be816121ec565b9050919050565b600060208201905081810360008301526126de8161220f565b9050919050565b60006060820190506126fa6000830184612232565b92915050565b60006060820190506127156000830186612289565b6127226020830185612289565b61272f6040830184612289565b949350505050565b600060608201905061274c60008301866122a7565b61275960208301856122a7565b61276660408301846122a7565b949350505050565b6000612778612789565b905061278482826129d7565b919050565b6000604051905090565b600067ffffffffffffffff8211156127ae576127ad612ab1565b5b6127b782612ae0565b9050602081019050919050565b600081905092915050565b600082825260208201905092915050565b60006127eb82612919565b91506127f683612919565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561282b5761282a612a82565b5b828201905092915050565b600061284182612923565b915061284c83612923565b92508267ffffffffffffffff0382111561286957612868612a82565b5b828201905092915050565b600061287f82612937565b915061288a83612937565b92508260ff038211156128a05761289f612a82565b5b828201905092915050565b600067ffffffffffffffff82169050919050565b60006128ca826128f9565b9050919050565b60008115159050919050565b6000819050919050565b60006128f2826128bf565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b600061294f82612956565b9050919050565b6000612961826128f9565b9050919050565b600061297382612937565b9050919050565b82818337600083830152505050565b600061299c61299783612af1565b6128ab565b9050919050565b60006129b66129b183612afe565b6128ab565b9050919050565b60006129d06129cb83612b0b565b6128ab565b9050919050565b6129e082612ae0565b810181811067ffffffffffffffff821117156129ff576129fe612ab1565b5b80604052505050565b6000612a1382612919565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a4657612a45612a82565b5b600182019050919050565b6000612a5c82612923565b915067ffffffffffffffff821415612a7757612a76612a82565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160001c9050919050565b60008160801c9050919050565b60008160401c9050919050565b7f696e76616c696420696e74657276616c00000000000000000000000000000000600082015250565b7f61757468656e7469636174696f6e206661696c65640000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7472616e73666572206661696c6564207769746820657263323020746f6b656e600082015250565b7f7472616e73666572206661696c65642077697468206e617469766520746f6b6560008201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f656e64206d7573742062652067726561746572207468616e2073746172740000600082015250565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b7f696e636f7272656374207061796d656e7420616d6f756e740000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f41646d696e3a2063616c6c6572206973206e6f74207468652061646d696e0000600082015250565b7f6578636565646564206c696d6974000000000000000000000000000000000000600082015250565b50565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b7f74696d65206f7574000000000000000000000000000000000000000000000000600082015250565b7f7769746864726177206661696c65640000000000000000000000000000000000600082015250565b7f616c7265616479206d696e746564000000000000000000000000000000000000600082015250565b7f76616c7565206572726f72000000000000000000000000000000000000000000600082015250565b612e4c816128bf565b8114612e5757600080fd5b50565b612e63816128d1565b8114612e6e57600080fd5b50565b612e7a816128dd565b8114612e8557600080fd5b50565b612e91816128e7565b8114612e9c57600080fd5b50565b612ea881612919565b8114612eb357600080fd5b50565b612ebf81612923565b8114612eca57600080fd5b5056fea2646970667358221220c4e384f92f9b888b1660623673133d098feaaced490071a465722dabb104b02a64736f6c63430008040033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.