Overview
Max Total Supply
79,999.999999999999999947 GMD
Holders
4,042 ( -0.025%)
Market
Price
$2.65 @ 0.000965 ETH
Onchain Market Cap
$212,000.00
Circulating Supply Market Cap
$156,945.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
1.99472794301289591 GMDValue
$5.29 ( ~0.00192589536156291 ETH) [0.0025%]Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
GMD
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2022-10-23 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // 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 SafeMath { /** * @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; } } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // 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 IERC20 { /** * @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); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @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 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' 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) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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 require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: contracts/final/GMD.sol pragma solidity 0.8.12; contract GMD is ERC20("GMD", "GMD"), Ownable , ReentrancyGuard{ constructor() { _mint(msg.sender, 50000 * 10 ** decimals()); } using SafeERC20 for IERC20; using SafeMath for uint256; struct UserInfo { uint256 totalMinted; uint256 lastInteractionTime; uint256 VestPeriod; } mapping(address => UserInfo) public userInfo; uint256 public mintPrice = 1000; uint256 public mintCap = 0; uint256 public vestingPeriod = 5 days; bool public mintOpen = false; IERC20 public USDC = IERC20(0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8); function burn(uint256 _amount) external { _burn(msg.sender, _amount); } function setMintCap(uint256 _mintCap) external onlyOwner { mintCap = _mintCap; } function setMintPrice(uint256 _mintPrice) external onlyOwner { require(_mintPrice >= mintPrice, "can't be lower than last mint"); mintPrice = _mintPrice; } function setVestingPeriod(uint256 _period) external onlyOwner { require(_period >= 3 days &&_period <=5 days, "not in range"); vestingPeriod = _period; } function claimableTokens(address _address) external view returns(uint256) { uint256 timePass = block.timestamp.sub(userInfo[_address].lastInteractionTime); uint256 claimable; if (timePass >= userInfo[_address].VestPeriod){ claimable = userInfo[_address].totalMinted; } else { claimable = userInfo[_address].totalMinted.mul(timePass).div(userInfo[_address].VestPeriod); } return claimable; } function setOpenMint(bool _mintOpen) external onlyOwner { mintOpen = _mintOpen; } function recoverTreasuryTokens() external onlyOwner { USDC.safeTransfer(owner(), USDC.balanceOf(address(this))); } function mint(uint256 _amount) external nonReentrant { require(_amount <= 2000000000, "max 2000 usdc per tx"); require(mintOpen, "mint not opened"); require(USDC.balanceOf(msg.sender) >= _amount, "USDC balance too low"); uint256 _amountin = _amount.mul(10**12); uint256 amountOut = _amountin.mul(1000).div(mintPrice); require(this.totalSupply().add(amountOut) <= mintCap, "over mint cap"); userInfo[msg.sender].totalMinted = userInfo[msg.sender].totalMinted.add(amountOut); userInfo[msg.sender].lastInteractionTime = block.timestamp; userInfo[msg.sender].VestPeriod = vestingPeriod; _mint(address(this), amountOut); USDC.safeTransferFrom(msg.sender, address(this), _amount); } function claim() external nonReentrant { require(userInfo[msg.sender].totalMinted > 0, "no mint"); uint256 timePass = block.timestamp.sub(userInfo[msg.sender].lastInteractionTime); uint256 claimable; if (timePass >= userInfo[msg.sender].VestPeriod){ claimable = userInfo[msg.sender].totalMinted; userInfo[msg.sender].VestPeriod = 0; } else { claimable = userInfo[msg.sender].totalMinted.mul(timePass).div(userInfo[msg.sender].VestPeriod); userInfo[msg.sender].VestPeriod = userInfo[msg.sender].VestPeriod.sub(timePass); } userInfo[msg.sender].totalMinted = userInfo[msg.sender].totalMinted.sub(claimable); userInfo[msg.sender].lastInteractionTime = block.timestamp; this.transfer(msg.sender, claimable); } function remainingMintableTokens() external view returns(uint256){ return mintCap.sub(this.totalSupply()); } function remainingVestedTime(address _address) external view returns(uint256){ uint256 timePass = block.timestamp.sub(userInfo[_address].lastInteractionTime); if (timePass >= userInfo[_address].VestPeriod){ return 0; } else { return userInfo[_address].VestPeriod.sub(timePass); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"claimableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverTreasuryTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"remainingMintableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"remainingVestedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintCap","type":"uint256"}],"name":"setMintCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintOpen","type":"bool"}],"name":"setOpenMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setVestingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"totalMinted","type":"uint256"},{"internalType":"uint256","name":"lastInteractionTime","type":"uint256"},{"internalType":"uint256","name":"VestPeriod","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526103e8600855600060095562069780600a55600b80546001600160a81b03191674ff970a61a04b1ca14834a43f5de4533ebddb5cc8001790553480156200004a57600080fd5b506040518060400160405280600381526020016211d35160ea1b8152506040518060400160405280600381526020016211d35160ea1b81525081600390805190602001906200009b9291906200023e565b508051620000b19060049060208401906200023e565b505050620000ce620000c86200010060201b60201c565b62000104565b6001600655620000fa33620000e66012600a620003f9565b620000f49061c35062000411565b62000156565b6200048b565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620001b15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620001c5919062000433565b90915550506001600160a01b03821660009081526020819052604081208054839290620001f490849062000433565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b8280546200024c906200044e565b90600052602060002090601f016020900481019282620002705760008555620002bb565b82601f106200028b57805160ff1916838001178555620002bb565b82800160010185558215620002bb579182015b82811115620002bb5782518255916020019190600101906200029e565b50620002c9929150620002cd565b5090565b5b80821115620002c95760008155600101620002ce565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200033b5781600019048211156200031f576200031f620002e4565b808516156200032d57918102915b93841c9390800290620002ff565b509250929050565b6000826200035457506001620003f3565b816200036357506000620003f3565b81600181146200037c57600281146200038757620003a7565b6001915050620003f3565b60ff8411156200039b576200039b620002e4565b50506001821b620003f3565b5060208310610133831016604e8410600b8410161715620003cc575081810a620003f3565b620003d88383620002fa565b8060001904821115620003ef57620003ef620002e4565b0290505b92915050565b60006200040a60ff84168362000343565b9392505050565b60008160001904831182151516156200042e576200042e620002e4565b500290565b60008219821115620004495762000449620002e4565b500190565b600181811c908216806200046357607f821691505b602082108114156200048557634e487b7160e01b600052602260045260246000fd5b50919050565b611a63806200049b6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063a0712d68116100a2578063e2af30f411610071578063e2af30f41461041b578063e2e5c15c1461042e578063f2fde38b14610436578063f4a0a5281461044957600080fd5b8063a0712d68146103cf578063a457c2d7146103e2578063a9059cbb146103f5578063dd62ed3e1461040857600080fd5b806384d24226116100de57806384d242261461037357806389a30271146103865780638da5cb5b146103b657806395d89b41146103c757600080fd5b806370a0823114610330578063715018a6146103595780637313ee5a1461036157806376c71ca11461036a57600080fd5b8063313ce5671161018757806342966c681161015657806342966c68146103045780634e274514146103175780634e71d92d1461031f5780636817c76c1461032757600080fd5b8063313ce567146102ba57806339509351146102c95780634070a0c9146102dc57806340bee0ed146102f157600080fd5b806318160ddd116101c357806318160ddd146102485780631959a0021461025057806323b872dd1461029a57806324bbd049146102ad57600080fd5b806303c824da146101ea57806306fdde0314610210578063095ea7b314610225575b600080fd5b6101fd6101f83660046117c9565b61045c565b6040519081526020015b60405180910390f35b6102186104e6565b6040516102079190611810565b610238610233366004611843565b610578565b6040519015158152602001610207565b6002546101fd565b61027f61025e3660046117c9565b60076020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610207565b6102386102a836600461186d565b610590565b600b546102389060ff1681565b60405160128152602001610207565b6102386102d7366004611843565b6105b4565b6102ef6102ea3660046118a9565b6105d6565b005b6102ef6102ff3660046118a9565b6105e3565b6102ef6103123660046118a9565b610646565b6102ef610653565b6102ef6106fa565b6101fd60085481565b6101fd61033e3660046117c9565b6001600160a01b031660009081526020819052604090205490565b6102ef6108fd565b6101fd600a5481565b6101fd60095481565b6101fd6103813660046117c9565b61090f565b600b5461039e9061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610207565b6005546001600160a01b031661039e565b6102186109b3565b6102ef6103dd3660046118a9565b6109c2565b6102386103f0366004611843565b610ca0565b610238610403366004611843565b610d1b565b6101fd6104163660046118c2565b610d29565b6102ef610429366004611903565b610d54565b6101fd610d6f565b6102ef6104443660046117c9565b610de4565b6102ef6104573660046118a9565b610e5a565b6001600160a01b0381166000908152600760205260408120600101548190610485904290610eb9565b6001600160a01b03841660009081526007602052604090206002015490915081106104b35750600092915050565b6001600160a01b0383166000908152600760205260409020600201546104d99082610eb9565b9392505050565b50919050565b6060600380546104f590611920565b80601f016020809104026020016040519081016040528092919081815260200182805461052190611920565b801561056e5780601f106105435761010080835404028352916020019161056e565b820191906000526020600020905b81548152906001019060200180831161055157829003601f168201915b5050505050905090565b600033610586818585610ec5565b5060019392505050565b60003361059e858285610fea565b6105a9858585611064565b506001949350505050565b6000336105868185856105c78383610d29565b6105d1919061196b565b610ec5565b6105de611232565b600955565b6105eb611232565b6203f48081101580156106015750620697808111155b6106415760405162461bcd60e51b815260206004820152600c60248201526b6e6f7420696e2072616e676560a01b60448201526064015b60405180910390fd5b600a55565b610650338261128c565b50565b61065b611232565b6106f86106706005546001600160a01b031690565b600b546040516370a0823160e01b81523060048201526101009091046001600160a01b0316906370a0823190602401602060405180830381865afa1580156106bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e09190611983565b600b5461010090046001600160a01b031691906113d7565b565b6002600654141561074d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610638565b6002600655336000908152600760205260409020546107985760405162461bcd60e51b81526020600482015260076024820152661b9bc81b5a5b9d60ca1b6044820152606401610638565b336000908152600760205260408120600101546107b6904290610eb9565b336000908152600760205260408120600201549192509082106107f357503360009081526007602052604081208054600290910191909155610852565b3360009081526007602052604090206002810154905461081e9190610818908561143a565b90611446565b3360009081526007602052604090206002015490915061083e9083610eb9565b336000908152600760205260409020600201555b3360009081526007602052604090205461086c9082610eb9565b336000818152600760205260409081902092835542600190930192909255905163a9059cbb60e01b8152600481019190915260248101829052309063a9059cbb906044016020604051808303816000875af11580156108cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f3919061199c565b5050600160065550565b610905611232565b6106f86000611452565b6001600160a01b0381166000908152600760205260408120600101548190610938904290610eb9565b6001600160a01b03841660009081526007602052604081206002015491925090821061097d57506001600160a01b0383166000908152600760205260409020546104d9565b6001600160a01b0384166000908152600760205260409020600281015490546109ab9190610818908561143a565b949350505050565b6060600480546104f590611920565b60026006541415610a155760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610638565b60026006556377359400811115610a655760405162461bcd60e51b81526020600482015260146024820152730dac2f0406460606040eae6c8c640e0cae440e8f60631b6044820152606401610638565b600b5460ff16610aa95760405162461bcd60e51b815260206004820152600f60248201526e1b5a5b9d081b9bdd081bdc195b9959608a1b6044820152606401610638565b600b546040516370a0823160e01b8152336004820152829161010090046001600160a01b0316906370a0823190602401602060405180830381865afa158015610af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1a9190611983565b1015610b5f5760405162461bcd60e51b8152602060048201526014602482015273555344432062616c616e636520746f6f206c6f7760601b6044820152606401610638565b6000610b708264e8d4a5100061143a565b90506000610b8f6008546108186103e88561143a90919063ffffffff16565b9050600954610c0082306001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfa9190611983565b906114a4565b1115610c3e5760405162461bcd60e51b815260206004820152600d60248201526c06f766572206d696e742063617609c1b6044820152606401610638565b33600090815260076020526040902054610c5890826114a4565b336000908152600760205260409020908155426001820155600a54600290910155610c8330826114b0565b600b546108f39061010090046001600160a01b031633308661158f565b60003381610cae8286610d29565b905083811015610d0e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610638565b6105a98286868403610ec5565b600033610586818585611064565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610d5c611232565b600b805460ff1916911515919091179055565b6000610ddf306001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd69190611983565b60095490610eb9565b905090565b610dec611232565b6001600160a01b038116610e515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610638565b61065081611452565b610e62611232565b600854811015610eb45760405162461bcd60e51b815260206004820152601d60248201527f63616e2774206265206c6f776572207468616e206c617374206d696e740000006044820152606401610638565b600855565b60006104d982846119b9565b6001600160a01b038316610f275760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610638565b6001600160a01b038216610f885760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610638565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000610ff68484610d29565b9050600019811461105e57818110156110515760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610638565b61105e8484848403610ec5565b50505050565b6001600160a01b0383166110c85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610638565b6001600160a01b03821661112a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610638565b6001600160a01b038316600090815260208190526040902054818110156111a25760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610638565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906111d990849061196b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161122591815260200190565b60405180910390a361105e565b6005546001600160a01b031633146106f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610638565b6001600160a01b0382166112ec5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610638565b6001600160a01b038216600090815260208190526040902054818110156113605760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610638565b6001600160a01b038316600090815260208190526040812083830390556002805484929061138f9084906119b9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610fdd565b505050565b6040516001600160a01b0383166024820152604481018290526113d290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526115c7565b60006104d982846119d0565b60006104d982846119ef565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006104d9828461196b565b6001600160a01b0382166115065760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610638565b8060026000828254611518919061196b565b90915550506001600160a01b0382166000908152602081905260408120805483929061154590849061196b565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6040516001600160a01b038085166024830152831660448201526064810182905261105e9085906323b872dd60e01b90608401611403565b600061161c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116999092919063ffffffff16565b8051909150156113d2578080602001905181019061163a919061199c565b6113d25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610638565b60606109ab8484600085856001600160a01b0385163b6116fb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610638565b600080866001600160a01b031685876040516117179190611a11565b60006040518083038185875af1925050503d8060008114611754576040519150601f19603f3d011682016040523d82523d6000602084013e611759565b606091505b5091509150611769828286611774565b979650505050505050565b606083156117835750816104d9565b8251156117935782518084602001fd5b8160405162461bcd60e51b81526004016106389190611810565b80356001600160a01b03811681146117c457600080fd5b919050565b6000602082840312156117db57600080fd5b6104d9826117ad565b60005b838110156117ff5781810151838201526020016117e7565b8381111561105e5750506000910152565b602081526000825180602084015261182f8160408501602087016117e4565b601f01601f19169190910160400192915050565b6000806040838503121561185657600080fd5b61185f836117ad565b946020939093013593505050565b60008060006060848603121561188257600080fd5b61188b846117ad565b9250611899602085016117ad565b9150604084013590509250925092565b6000602082840312156118bb57600080fd5b5035919050565b600080604083850312156118d557600080fd5b6118de836117ad565b91506118ec602084016117ad565b90509250929050565b801515811461065057600080fd5b60006020828403121561191557600080fd5b81356104d9816118f5565b600181811c9082168061193457607f821691505b602082108114156104e057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561197e5761197e611955565b500190565b60006020828403121561199557600080fd5b5051919050565b6000602082840312156119ae57600080fd5b81516104d9816118f5565b6000828210156119cb576119cb611955565b500390565b60008160001904831182151516156119ea576119ea611955565b500290565b600082611a0c57634e487b7160e01b600052601260045260246000fd5b500490565b60008251611a238184602087016117e4565b919091019291505056fea26469706673582212203482d0f37c344f1c81eacf1e243fe297eefab639595f1279064fc1985aa44e9f64736f6c634300080c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063a0712d68116100a2578063e2af30f411610071578063e2af30f41461041b578063e2e5c15c1461042e578063f2fde38b14610436578063f4a0a5281461044957600080fd5b8063a0712d68146103cf578063a457c2d7146103e2578063a9059cbb146103f5578063dd62ed3e1461040857600080fd5b806384d24226116100de57806384d242261461037357806389a30271146103865780638da5cb5b146103b657806395d89b41146103c757600080fd5b806370a0823114610330578063715018a6146103595780637313ee5a1461036157806376c71ca11461036a57600080fd5b8063313ce5671161018757806342966c681161015657806342966c68146103045780634e274514146103175780634e71d92d1461031f5780636817c76c1461032757600080fd5b8063313ce567146102ba57806339509351146102c95780634070a0c9146102dc57806340bee0ed146102f157600080fd5b806318160ddd116101c357806318160ddd146102485780631959a0021461025057806323b872dd1461029a57806324bbd049146102ad57600080fd5b806303c824da146101ea57806306fdde0314610210578063095ea7b314610225575b600080fd5b6101fd6101f83660046117c9565b61045c565b6040519081526020015b60405180910390f35b6102186104e6565b6040516102079190611810565b610238610233366004611843565b610578565b6040519015158152602001610207565b6002546101fd565b61027f61025e3660046117c9565b60076020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610207565b6102386102a836600461186d565b610590565b600b546102389060ff1681565b60405160128152602001610207565b6102386102d7366004611843565b6105b4565b6102ef6102ea3660046118a9565b6105d6565b005b6102ef6102ff3660046118a9565b6105e3565b6102ef6103123660046118a9565b610646565b6102ef610653565b6102ef6106fa565b6101fd60085481565b6101fd61033e3660046117c9565b6001600160a01b031660009081526020819052604090205490565b6102ef6108fd565b6101fd600a5481565b6101fd60095481565b6101fd6103813660046117c9565b61090f565b600b5461039e9061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610207565b6005546001600160a01b031661039e565b6102186109b3565b6102ef6103dd3660046118a9565b6109c2565b6102386103f0366004611843565b610ca0565b610238610403366004611843565b610d1b565b6101fd6104163660046118c2565b610d29565b6102ef610429366004611903565b610d54565b6101fd610d6f565b6102ef6104443660046117c9565b610de4565b6102ef6104573660046118a9565b610e5a565b6001600160a01b0381166000908152600760205260408120600101548190610485904290610eb9565b6001600160a01b03841660009081526007602052604090206002015490915081106104b35750600092915050565b6001600160a01b0383166000908152600760205260409020600201546104d99082610eb9565b9392505050565b50919050565b6060600380546104f590611920565b80601f016020809104026020016040519081016040528092919081815260200182805461052190611920565b801561056e5780601f106105435761010080835404028352916020019161056e565b820191906000526020600020905b81548152906001019060200180831161055157829003601f168201915b5050505050905090565b600033610586818585610ec5565b5060019392505050565b60003361059e858285610fea565b6105a9858585611064565b506001949350505050565b6000336105868185856105c78383610d29565b6105d1919061196b565b610ec5565b6105de611232565b600955565b6105eb611232565b6203f48081101580156106015750620697808111155b6106415760405162461bcd60e51b815260206004820152600c60248201526b6e6f7420696e2072616e676560a01b60448201526064015b60405180910390fd5b600a55565b610650338261128c565b50565b61065b611232565b6106f86106706005546001600160a01b031690565b600b546040516370a0823160e01b81523060048201526101009091046001600160a01b0316906370a0823190602401602060405180830381865afa1580156106bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e09190611983565b600b5461010090046001600160a01b031691906113d7565b565b6002600654141561074d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610638565b6002600655336000908152600760205260409020546107985760405162461bcd60e51b81526020600482015260076024820152661b9bc81b5a5b9d60ca1b6044820152606401610638565b336000908152600760205260408120600101546107b6904290610eb9565b336000908152600760205260408120600201549192509082106107f357503360009081526007602052604081208054600290910191909155610852565b3360009081526007602052604090206002810154905461081e9190610818908561143a565b90611446565b3360009081526007602052604090206002015490915061083e9083610eb9565b336000908152600760205260409020600201555b3360009081526007602052604090205461086c9082610eb9565b336000818152600760205260409081902092835542600190930192909255905163a9059cbb60e01b8152600481019190915260248101829052309063a9059cbb906044016020604051808303816000875af11580156108cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f3919061199c565b5050600160065550565b610905611232565b6106f86000611452565b6001600160a01b0381166000908152600760205260408120600101548190610938904290610eb9565b6001600160a01b03841660009081526007602052604081206002015491925090821061097d57506001600160a01b0383166000908152600760205260409020546104d9565b6001600160a01b0384166000908152600760205260409020600281015490546109ab9190610818908561143a565b949350505050565b6060600480546104f590611920565b60026006541415610a155760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610638565b60026006556377359400811115610a655760405162461bcd60e51b81526020600482015260146024820152730dac2f0406460606040eae6c8c640e0cae440e8f60631b6044820152606401610638565b600b5460ff16610aa95760405162461bcd60e51b815260206004820152600f60248201526e1b5a5b9d081b9bdd081bdc195b9959608a1b6044820152606401610638565b600b546040516370a0823160e01b8152336004820152829161010090046001600160a01b0316906370a0823190602401602060405180830381865afa158015610af6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1a9190611983565b1015610b5f5760405162461bcd60e51b8152602060048201526014602482015273555344432062616c616e636520746f6f206c6f7760601b6044820152606401610638565b6000610b708264e8d4a5100061143a565b90506000610b8f6008546108186103e88561143a90919063ffffffff16565b9050600954610c0082306001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfa9190611983565b906114a4565b1115610c3e5760405162461bcd60e51b815260206004820152600d60248201526c06f766572206d696e742063617609c1b6044820152606401610638565b33600090815260076020526040902054610c5890826114a4565b336000908152600760205260409020908155426001820155600a54600290910155610c8330826114b0565b600b546108f39061010090046001600160a01b031633308661158f565b60003381610cae8286610d29565b905083811015610d0e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610638565b6105a98286868403610ec5565b600033610586818585611064565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610d5c611232565b600b805460ff1916911515919091179055565b6000610ddf306001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd69190611983565b60095490610eb9565b905090565b610dec611232565b6001600160a01b038116610e515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610638565b61065081611452565b610e62611232565b600854811015610eb45760405162461bcd60e51b815260206004820152601d60248201527f63616e2774206265206c6f776572207468616e206c617374206d696e740000006044820152606401610638565b600855565b60006104d982846119b9565b6001600160a01b038316610f275760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610638565b6001600160a01b038216610f885760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610638565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000610ff68484610d29565b9050600019811461105e57818110156110515760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610638565b61105e8484848403610ec5565b50505050565b6001600160a01b0383166110c85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610638565b6001600160a01b03821661112a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610638565b6001600160a01b038316600090815260208190526040902054818110156111a25760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610638565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906111d990849061196b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161122591815260200190565b60405180910390a361105e565b6005546001600160a01b031633146106f85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610638565b6001600160a01b0382166112ec5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610638565b6001600160a01b038216600090815260208190526040902054818110156113605760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610638565b6001600160a01b038316600090815260208190526040812083830390556002805484929061138f9084906119b9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610fdd565b505050565b6040516001600160a01b0383166024820152604481018290526113d290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526115c7565b60006104d982846119d0565b60006104d982846119ef565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006104d9828461196b565b6001600160a01b0382166115065760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610638565b8060026000828254611518919061196b565b90915550506001600160a01b0382166000908152602081905260408120805483929061154590849061196b565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6040516001600160a01b038085166024830152831660448201526064810182905261105e9085906323b872dd60e01b90608401611403565b600061161c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116999092919063ffffffff16565b8051909150156113d2578080602001905181019061163a919061199c565b6113d25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610638565b60606109ab8484600085856001600160a01b0385163b6116fb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610638565b600080866001600160a01b031685876040516117179190611a11565b60006040518083038185875af1925050503d8060008114611754576040519150601f19603f3d011682016040523d82523d6000602084013e611759565b606091505b5091509150611769828286611774565b979650505050505050565b606083156117835750816104d9565b8251156117935782518084602001fd5b8160405162461bcd60e51b81526004016106389190611810565b80356001600160a01b03811681146117c457600080fd5b919050565b6000602082840312156117db57600080fd5b6104d9826117ad565b60005b838110156117ff5781810151838201526020016117e7565b8381111561105e5750506000910152565b602081526000825180602084015261182f8160408501602087016117e4565b601f01601f19169190910160400192915050565b6000806040838503121561185657600080fd5b61185f836117ad565b946020939093013593505050565b60008060006060848603121561188257600080fd5b61188b846117ad565b9250611899602085016117ad565b9150604084013590509250925092565b6000602082840312156118bb57600080fd5b5035919050565b600080604083850312156118d557600080fd5b6118de836117ad565b91506118ec602084016117ad565b90509250929050565b801515811461065057600080fd5b60006020828403121561191557600080fd5b81356104d9816118f5565b600181811c9082168061193457607f821691505b602082108114156104e057634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561197e5761197e611955565b500190565b60006020828403121561199557600080fd5b5051919050565b6000602082840312156119ae57600080fd5b81516104d9816118f5565b6000828210156119cb576119cb611955565b500390565b60008160001904831182151516156119ea576119ea611955565b500290565b600082611a0c57634e487b7160e01b600052601260045260246000fd5b500490565b60008251611a238184602087016117e4565b919091019291505056fea26469706673582212203482d0f37c344f1c81eacf1e243fe297eefab639595f1279064fc1985aa44e9f64736f6c634300080c0033
Deployed Bytecode Sourcemap
45438:4136:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49202:367;;;;;;:::i;:::-;;:::i;:::-;;;529:25:1;;;517:2;502:18;49202:367:0;;;;;;;;34575:100;;;:::i;:::-;;;;;;;:::i;36926:201::-;;;;;;:::i;:::-;;:::i;:::-;;;1640:14:1;;1633:22;1615:41;;1603:2;1588:18;36926:201:0;1475:187:1;35695:108:0;35783:12;;35695:108;;45790:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1869:25:1;;;1925:2;1910:18;;1903:34;;;;1953:18;;;1946:34;1857:2;1842:18;45790:44:0;1667:319:1;37707:295:0;;;;;;:::i;:::-;;:::i;45958:28::-;;;;;;;;;35537:93;;;35620:2;2466:36:1;;2454:2;2439:18;35537:93:0;2324:184:1;38411:238:0;;;;;;:::i;:::-;;:::i;46169:94::-;;;;;;:::i;:::-;;:::i;:::-;;46463:176;;;;;;:::i;:::-;;:::i;46075:86::-;;;;;;:::i;:::-;;:::i;47244:128::-;;;:::i;48184:870::-;;;:::i;45843:31::-;;;;;;35866:127;;;;;;:::i;:::-;-1:-1:-1;;;;;35967:18:0;35940:7;35967:18;;;;;;;;;;;;35866:127;23494:103;;;:::i;45914:37::-;;;;;;45881:26;;;;;;46647:484;;;;;;:::i;:::-;;:::i;45993:71::-;;;;;;;;-1:-1:-1;;;;;45993:71:0;;;;;;-1:-1:-1;;;;;2876:32:1;;;2858:51;;2846:2;2831:18;45993:71:0;2698:217:1;22846:87:0;22919:6;;-1:-1:-1;;;;;22919:6:0;22846:87;;34794:104;;;:::i;47382:794::-;;;;;;:::i;:::-;;:::i;39152:436::-;;;;;;:::i;:::-;;:::i;36199:193::-;;;;;;:::i;:::-;;:::i;36455:151::-;;;;;;:::i;:::-;;:::i;47141:95::-;;;;;;:::i;:::-;;:::i;49062:132::-;;;:::i;23752:201::-;;;;;;:::i;:::-;;:::i;46277:178::-;;;;;;:::i;:::-;;:::i;49202:367::-;-1:-1:-1;;;;;49329:18:0;;49271:7;49329:18;;;:8;:18;;;;;:38;;;49271:7;;49309:59;;:15;;:19;:59::i;:::-;-1:-1:-1;;;;;49395:18:0;;;;;;:8;:18;;;;;:29;;;49290:78;;-1:-1:-1;49383:41:0;;49379:173;;-1:-1:-1;49447:1:0;;49202:367;-1:-1:-1;;49202:367:0:o;49379:173::-;-1:-1:-1;;;;;49497:18:0;;;;;;:8;:18;;;;;:29;;;:43;;49531:8;49497:33;:43::i;:::-;49490:50;49202:367;-1:-1:-1;;;49202:367:0:o;49379:173::-;49279:290;49202:367;;;:::o;34575:100::-;34629:13;34662:5;34655:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34575:100;:::o;36926:201::-;37009:4;21477:10;37065:32;21477:10;37081:7;37090:6;37065:8;:32::i;:::-;-1:-1:-1;37115:4:0;;36926:201;-1:-1:-1;;;36926:201:0:o;37707:295::-;37838:4;21477:10;37896:38;37912:4;21477:10;37927:6;37896:15;:38::i;:::-;37945:27;37955:4;37961:2;37965:6;37945:9;:27::i;:::-;-1:-1:-1;37990:4:0;;37707:295;-1:-1:-1;;;;37707:295:0:o;38411:238::-;38499:4;21477:10;38555:64;21477:10;38571:7;38608:10;38580:25;21477:10;38571:7;38580:9;:25::i;:::-;:38;;;;:::i;:::-;38555:8;:64::i;46169:94::-;22732:13;:11;:13::i;:::-;46237:7:::1;:18:::0;46169:94::o;46463:176::-;22732:13;:11;:13::i;:::-;46555:6:::1;46544:7;:17;;:36;;;;;46574:6;46564:7;:16;;46544:36;46536:61;;;::::0;-1:-1:-1;;;46536:61:0;;4614:2:1;46536:61:0::1;::::0;::::1;4596:21:1::0;4653:2;4633:18;;;4626:30;-1:-1:-1;;;4672:18:1;;;4665:42;4724:18;;46536:61:0::1;;;;;;;;;46608:13;:23:::0;46463:176::o;46075:86::-;46127:26;46133:10;46145:7;46127:5;:26::i;:::-;46075:86;:::o;47244:128::-;22732:13;:11;:13::i;:::-;47307:57:::1;47325:7;22919:6:::0;;-1:-1:-1;;;;;22919:6:0;;22846:87;47325:7:::1;47334:4;::::0;:29:::1;::::0;-1:-1:-1;;;47334:29:0;;47357:4:::1;47334:29;::::0;::::1;2858:51:1::0;47334:4:0::1;::::0;;::::1;-1:-1:-1::0;;;;;47334:4:0::1;::::0;:14:::1;::::0;2831:18:1;;47334:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47307:4;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;47307:4:0::1;::::0;;:17:::1;:57::i;:::-;47244:128::o:0;48184:870::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;5144:2:1;2402:63:0;;;5126:21:1;5183:2;5163:18;;;5156:30;5222:33;5202:18;;;5195:61;5273:18;;2402:63:0;4942:355:1;2402:63:0;1812:1;2543:7;:18;48253:10:::1;48279:1;48244:20:::0;;;:8:::1;:20;::::0;;;;:32;48236:56:::1;;;::::0;-1:-1:-1;;;48236:56:0;;5504:2:1;48236:56:0::1;::::0;::::1;5486:21:1::0;5543:1;5523:18;;;5516:29;-1:-1:-1;;;5561:18:1;;;5554:37;5608:18;;48236:56:0::1;5302:330:1::0;48236:56:0::1;48351:10;48303:16;48342:20:::0;;;:8:::1;:20;::::0;;;;:40:::1;;::::0;48322:61:::1;::::0;:15:::1;::::0;:19:::1;:61::i;:::-;48447:10;48394:17;48438:20:::0;;;:8:::1;:20;::::0;;;;:31:::1;;::::0;48303:80;;-1:-1:-1;48394:17:0;48426:43;::::1;48422:414;;-1:-1:-1::0;48506:10:0::1;48497:20;::::0;;;:8:::1;:20;::::0;;;;:32;;48544:31:::1;::::0;;::::1;:35:::0;;;;48422:414:::1;;;48693:10;48684:20;::::0;;;:8:::1;:20;::::0;;;;:31:::1;::::0;::::1;::::0;48633:32;;:83:::1;::::0;48684:31;48633:46:::1;::::0;48670:8;48633:36:::1;:46::i;:::-;:50:::0;::::1;:83::i;:::-;48774:10;48765:20;::::0;;;:8:::1;:20;::::0;;;;:31:::1;;::::0;48621:95;;-1:-1:-1;48765:45:0::1;::::0;48801:8;48765:35:::1;:45::i;:::-;48740:10;48731:20;::::0;;;:8:::1;:20;::::0;;;;:31:::1;;:79:::0;48422:414:::1;48890:10;48881:20;::::0;;;:8:::1;:20;::::0;;;;:32;:47:::1;::::0;48918:9;48881:36:::1;:47::i;:::-;48855:10;48846:20;::::0;;;:8:::1;:20;::::0;;;;;;:82;;;48982:15:::1;48939:40;::::0;;::::1;:58:::0;;;;49010:36;;-1:-1:-1;;;49010:36:0;;::::1;::::0;::::1;5811:51:1::0;;;;5878:18;;;5871:34;;;49010:4:0::1;::::0;:13:::1;::::0;5784:18:1;;49010:36:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;1768:1:0;2722:7;:22;-1:-1:-1;48184:870:0:o;23494:103::-;22732:13;:11;:13::i;:::-;23559:30:::1;23586:1;23559:18;:30::i;46647:484::-:0;-1:-1:-1;;;;;46771:18:0;;46712:7;46771:18;;;:8;:18;;;;;:38;;;46712:7;;46751:59;;:15;;:19;:59::i;:::-;-1:-1:-1;;;;;46865:18:0;;46821:17;46865:18;;;:8;:18;;;;;:29;;;46732:78;;-1:-1:-1;46821:17:0;46853:41;;46849:248;;-1:-1:-1;;;;;;46922:18:0;;;;;;:8;:18;;;;;:30;46849:248;;;-1:-1:-1;;;;;47055:18:0;;;;;;:8;:18;;;;;:29;;;;47006:30;;:79;;47055:29;47006:44;;47041:8;47006:34;:44::i;:79::-;46994:91;47114:9;-1:-1:-1;;;;46647:484:0:o;34794:104::-;34850:13;34883:7;34876:14;;;;;:::i;47382:794::-;1812:1;2410:7;;:19;;2402:63;;;;-1:-1:-1;;;2402:63:0;;5144:2:1;2402:63:0;;;5126:21:1;5183:2;5163:18;;;5156:30;5222:33;5202:18;;;5195:61;5273:18;;2402:63:0;4942:355:1;2402:63:0;1812:1;2543:7;:18;47467:10:::1;47456:21:::0;::::1;;47448:54;;;::::0;-1:-1:-1;;;47448:54:0;;6368:2:1;47448:54:0::1;::::0;::::1;6350:21:1::0;6407:2;6387:18;;;6380:30;-1:-1:-1;;;6426:18:1;;;6419:50;6486:18;;47448:54:0::1;6166:344:1::0;47448:54:0::1;47521:8;::::0;::::1;;47513:36;;;::::0;-1:-1:-1;;;47513:36:0;;6717:2:1;47513:36:0::1;::::0;::::1;6699:21:1::0;6756:2;6736:18;;;6729:30;-1:-1:-1;;;6775:18:1;;;6768:45;6830:18;;47513:36:0::1;6515:339:1::0;47513:36:0::1;47568:4;::::0;:26:::1;::::0;-1:-1:-1;;;47568:26:0;;47583:10:::1;47568:26;::::0;::::1;2858:51:1::0;47598:7:0;;47568:4:::1;::::0;::::1;-1:-1:-1::0;;;;;47568:4:0::1;::::0;:14:::1;::::0;2831:18:1;;47568:26:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;47560:70;;;::::0;-1:-1:-1;;;47560:70:0;;7061:2:1;47560:70:0::1;::::0;::::1;7043:21:1::0;7100:2;7080:18;;;7073:30;-1:-1:-1;;;7119:18:1;;;7112:50;7179:18;;47560:70:0::1;6859:344:1::0;47560:70:0::1;47641:17;47661:19;:7:::0;47673:6:::1;47661:11;:19::i;:::-;47641:39;;47691:17;47711:34;47735:9;;47711:19;47725:4;47711:9;:13;;:19;;;;:::i;:34::-;47691:54;;47811:7;;47774:33;47797:9;47774:4;-1:-1:-1::0;;;;;47774:16:0::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:22:::0;::::1;:33::i;:::-;:44;;47766:70;;;::::0;-1:-1:-1;;;47766:70:0;;7410:2:1;47766:70:0::1;::::0;::::1;7392:21:1::0;7449:2;7429:18;;;7422:30;-1:-1:-1;;;7468:18:1;;;7461:43;7521:18;;47766:70:0::1;7208:337:1::0;47766:70:0::1;47891:10;47882:20;::::0;;;:8:::1;:20;::::0;;;;:32;:47:::1;::::0;47919:9;47882:36:::1;:47::i;:::-;47856:10;47847:20;::::0;;;:8:::1;:20;::::0;;;;:82;;;47983:15:::1;47940:40;::::0;::::1;:58:::0;48043:13:::1;::::0;48009:31:::1;::::0;;::::1;:47:::0;48069:31:::1;48083:4;48090:9:::0;48069:5:::1;:31::i;:::-;48111:4;::::0;:57:::1;::::0;:4:::1;::::0;::::1;-1:-1:-1::0;;;;;48111:4:0::1;48133:10;48153:4;48160:7:::0;48111:21:::1;:57::i;39152:436::-:0;39245:4;21477:10;39245:4;39328:25;21477:10;39345:7;39328:9;:25::i;:::-;39301:52;;39392:15;39372:16;:35;;39364:85;;;;-1:-1:-1;;;39364:85:0;;7752:2:1;39364:85:0;;;7734:21:1;7791:2;7771:18;;;7764:30;7830:34;7810:18;;;7803:62;-1:-1:-1;;;7881:18:1;;;7874:35;7926:19;;39364:85:0;7550:401:1;39364:85:0;39485:60;39494:5;39501:7;39529:15;39510:16;:34;39485:8;:60::i;36199:193::-;36278:4;21477:10;36334:28;21477:10;36351:2;36355:6;36334:9;:28::i;36455:151::-;-1:-1:-1;;;;;36571:18:0;;;36544:7;36571:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;36455:151::o;47141:95::-;22732:13;:11;:13::i;:::-;47208:8:::1;:20:::0;;-1:-1:-1;;47208:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47141:95::o;49062:132::-;49119:7;49155:31;49167:4;-1:-1:-1;;;;;49167:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49155:7;;;:11;:31::i;:::-;49148:38;;49062:132;:::o;23752:201::-;22732:13;:11;:13::i;:::-;-1:-1:-1;;;;;23841:22:0;::::1;23833:73;;;::::0;-1:-1:-1;;;23833:73:0;;8158:2:1;23833:73:0::1;::::0;::::1;8140:21:1::0;8197:2;8177:18;;;8170:30;8236:34;8216:18;;;8209:62;-1:-1:-1;;;8287:18:1;;;8280:36;8333:19;;23833:73:0::1;7956:402:1::0;23833:73:0::1;23917:28;23936:8;23917:18;:28::i;46277:178::-:0;22732:13;:11;:13::i;:::-;46371:9:::1;;46357:10;:23;;46349:65;;;::::0;-1:-1:-1;;;46349:65:0;;8565:2:1;46349:65:0::1;::::0;::::1;8547:21:1::0;8604:2;8584:18;;;8577:30;8643:31;8623:18;;;8616:59;8692:18;;46349:65:0::1;8363:353:1::0;46349:65:0::1;46425:9;:22:::0;46277:178::o;6016:98::-;6074:7;6101:5;6105:1;6101;:5;:::i;42777:380::-;-1:-1:-1;;;;;42913:19:0;;42905:68;;;;-1:-1:-1;;;42905:68:0;;9053:2:1;42905:68:0;;;9035:21:1;9092:2;9072:18;;;9065:30;9131:34;9111:18;;;9104:62;-1:-1:-1;;;9182:18:1;;;9175:34;9226:19;;42905:68:0;8851:400:1;42905:68:0;-1:-1:-1;;;;;42992:21:0;;42984:68;;;;-1:-1:-1;;;42984:68:0;;9458:2:1;42984:68:0;;;9440:21:1;9497:2;9477:18;;;9470:30;9536:34;9516:18;;;9509:62;-1:-1:-1;;;9587:18:1;;;9580:32;9629:19;;42984:68:0;9256:398:1;42984:68:0;-1:-1:-1;;;;;43065:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;43117:32;;529:25:1;;;43117:32:0;;502:18:1;43117:32:0;;;;;;;;42777:380;;;:::o;43448:453::-;43583:24;43610:25;43620:5;43627:7;43610:9;:25::i;:::-;43583:52;;-1:-1:-1;;43650:16:0;:37;43646:248;;43732:6;43712:16;:26;;43704:68;;;;-1:-1:-1;;;43704:68:0;;9861:2:1;43704:68:0;;;9843:21:1;9900:2;9880:18;;;9873:30;9939:31;9919:18;;;9912:59;9988:18;;43704:68:0;9659:353:1;43704:68:0;43816:51;43825:5;43832:7;43860:6;43841:16;:25;43816:8;:51::i;:::-;43572:329;43448:453;;;:::o;40058:671::-;-1:-1:-1;;;;;40189:18:0;;40181:68;;;;-1:-1:-1;;;40181:68:0;;10219:2:1;40181:68:0;;;10201:21:1;10258:2;10238:18;;;10231:30;10297:34;10277:18;;;10270:62;-1:-1:-1;;;10348:18:1;;;10341:35;10393:19;;40181:68:0;10017:401:1;40181:68:0;-1:-1:-1;;;;;40268:16:0;;40260:64;;;;-1:-1:-1;;;40260:64:0;;10625:2:1;40260:64:0;;;10607:21:1;10664:2;10644:18;;;10637:30;10703:34;10683:18;;;10676:62;-1:-1:-1;;;10754:18:1;;;10747:33;10797:19;;40260:64:0;10423:399:1;40260:64:0;-1:-1:-1;;;;;40410:15:0;;40388:19;40410:15;;;;;;;;;;;40444:21;;;;40436:72;;;;-1:-1:-1;;;40436:72:0;;11029:2:1;40436:72:0;;;11011:21:1;11068:2;11048:18;;;11041:30;11107:34;11087:18;;;11080:62;-1:-1:-1;;;11158:18:1;;;11151:36;11204:19;;40436:72:0;10827:402:1;40436:72:0;-1:-1:-1;;;;;40544:15:0;;;:9;:15;;;;;;;;;;;40562:20;;;40544:38;;40604:13;;;;;;;;:23;;40576:6;;40544:9;40604:23;;40576:6;;40604:23;:::i;:::-;;;;;;;;40660:2;-1:-1:-1;;;;;40645:26:0;40654:4;-1:-1:-1;;;;;40645:26:0;;40664:6;40645:26;;;;529:25:1;;517:2;502:18;;383:177;40645:26:0;;;;;;;;40684:37;41748:591;23011:132;22919:6;;-1:-1:-1;;;;;22919:6:0;21477:10;23075:23;23067:68;;;;-1:-1:-1;;;23067:68:0;;11436:2:1;23067:68:0;;;11418:21:1;;;11455:18;;;11448:30;11514:34;11494:18;;;11487:62;11566:18;;23067:68:0;11234:356:1;41748:591:0;-1:-1:-1;;;;;41832:21:0;;41824:67;;;;-1:-1:-1;;;41824:67:0;;11797:2:1;41824:67:0;;;11779:21:1;11836:2;11816:18;;;11809:30;11875:34;11855:18;;;11848:62;-1:-1:-1;;;11926:18:1;;;11919:31;11967:19;;41824:67:0;11595:397:1;41824:67:0;-1:-1:-1;;;;;41991:18:0;;41966:22;41991:18;;;;;;;;;;;42028:24;;;;42020:71;;;;-1:-1:-1;;;42020:71:0;;12199:2:1;42020:71:0;;;12181:21:1;12238:2;12218:18;;;12211:30;12277:34;12257:18;;;12250:62;-1:-1:-1;;;12328:18:1;;;12321:32;12370:19;;42020:71:0;11997:398:1;42020:71:0;-1:-1:-1;;;;;42127:18:0;;:9;:18;;;;;;;;;;42148:23;;;42127:44;;42193:12;:22;;42165:6;;42127:9;42193:22;;42165:6;;42193:22;:::i;:::-;;;;-1:-1:-1;;42233:37:0;;529:25:1;;;42259:1:0;;-1:-1:-1;;;;;42233:37:0;;;;;517:2:1;502:18;42233:37:0;383:177:1;42283:48:0;41813:526;41748:591;;:::o;27904:211::-;28048:58;;-1:-1:-1;;;;;5829:32:1;;28048:58:0;;;5811:51:1;5878:18;;;5871:34;;;28021:86:0;;28041:5;;-1:-1:-1;;;28071:23:0;5784:18:1;;28048:58:0;;;;-1:-1:-1;;28048:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;28048:58:0;-1:-1:-1;;;;;;28048:58:0;;;;;;;;;;28021:19;:86::i;6373:98::-;6431:7;6458:5;6462:1;6458;:5;:::i;6772:98::-;6830:7;6857:5;6861:1;6857;:5;:::i;24113:191::-;24206:6;;;-1:-1:-1;;;;;24223:17:0;;;-1:-1:-1;;;;;;24223:17:0;;;;;;;24256:40;;24206:6;;;24223:17;24206:6;;24256:40;;24187:16;;24256:40;24176:128;24113:191;:::o;5635:98::-;5693:7;5720:5;5724:1;5720;:5;:::i;41016:399::-;-1:-1:-1;;;;;41100:21:0;;41092:65;;;;-1:-1:-1;;;41092:65:0;;12997:2:1;41092:65:0;;;12979:21:1;13036:2;13016:18;;;13009:30;13075:33;13055:18;;;13048:61;13126:18;;41092:65:0;12795:355:1;41092:65:0;41248:6;41232:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;41265:18:0;;:9;:18;;;;;;;;;;:28;;41287:6;;41265:9;:28;;41287:6;;41265:28;:::i;:::-;;;;-1:-1:-1;;41309:37:0;;529:25:1;;;-1:-1:-1;;;;;41309:37:0;;;41326:1;;41309:37;;517:2:1;502:18;41309:37:0;;;;;;;41016:399;;:::o;28123:248::-;28294:68;;-1:-1:-1;;;;;13413:15:1;;;28294:68:0;;;13395:34:1;13465:15;;13445:18;;;13438:43;13497:18;;;13490:34;;;28267:96:0;;28287:5;;-1:-1:-1;;;28317:27:0;13330:18:1;;28294:68:0;13155:375:1;30971:716:0;31395:23;31421:69;31449:4;31421:69;;;;;;;;;;;;;;;;;31429:5;-1:-1:-1;;;;;31421:27:0;;;:69;;;;;:::i;:::-;31505:17;;31395:95;;-1:-1:-1;31505:21:0;31501:179;;31602:10;31591:30;;;;;;;;;;;;:::i;:::-;31583:85;;;;-1:-1:-1;;;31583:85:0;;13737:2:1;31583:85:0;;;13719:21:1;13776:2;13756:18;;;13749:30;13815:34;13795:18;;;13788:62;-1:-1:-1;;;13866:18:1;;;13859:40;13916:19;;31583:85:0;13535:406:1;13778:229:0;13915:12;13947:52;13969:6;13977:4;13983:1;13986:12;13915;-1:-1:-1;;;;;11328:19:0;;;15185:60;;;;-1:-1:-1;;;15185:60:0;;14555:2:1;15185:60:0;;;14537:21:1;14594:2;14574:18;;;14567:30;14633:31;14613:18;;;14606:59;14682:18;;15185:60:0;14353:353:1;15185:60:0;15259:12;15273:23;15300:6;-1:-1:-1;;;;;15300:11:0;15319:5;15326:4;15300:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15258:73;;;;15349:51;15366:7;15375:10;15387:12;15349:16;:51::i;:::-;15342:58;14898:510;-1:-1:-1;;;;;;;14898:510:0:o;17584:762::-;17734:12;17763:7;17759:580;;;-1:-1:-1;17794:10:0;17787:17;;17759:580;17908:17;;:21;17904:424;;18156:10;18150:17;18217:15;18204:10;18200:2;18196:19;18189:44;17904:424;18299:12;18292:20;;-1:-1:-1;;;18292:20:0;;;;;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;565:258::-;637:1;647:113;661:6;658:1;655:13;647:113;;;737:11;;;731:18;718:11;;;711:39;683:2;676:10;647:113;;;778:6;775:1;772:13;769:48;;;-1:-1:-1;;813:1:1;795:16;;788:27;565:258::o;828:383::-;977:2;966:9;959:21;940:4;1009:6;1003:13;1052:6;1047:2;1036:9;1032:18;1025:34;1068:66;1127:6;1122:2;1111:9;1107:18;1102:2;1094:6;1090:15;1068:66;:::i;:::-;1195:2;1174:15;-1:-1:-1;;1170:29:1;1155:45;;;;1202:2;1151:54;;828:383;-1:-1:-1;;828:383:1:o;1216:254::-;1284:6;1292;1345:2;1333:9;1324:7;1320:23;1316:32;1313:52;;;1361:1;1358;1351:12;1313:52;1384:29;1403:9;1384:29;:::i;:::-;1374:39;1460:2;1445:18;;;;1432:32;;-1:-1:-1;;;1216:254:1:o;1991:328::-;2068:6;2076;2084;2137:2;2125:9;2116:7;2112:23;2108:32;2105:52;;;2153:1;2150;2143:12;2105:52;2176:29;2195:9;2176:29;:::i;:::-;2166:39;;2224:38;2258:2;2247:9;2243:18;2224:38;:::i;:::-;2214:48;;2309:2;2298:9;2294:18;2281:32;2271:42;;1991:328;;;;;:::o;2513:180::-;2572:6;2625:2;2613:9;2604:7;2600:23;2596:32;2593:52;;;2641:1;2638;2631:12;2593:52;-1:-1:-1;2664:23:1;;2513:180;-1:-1:-1;2513:180:1:o;3128:260::-;3196:6;3204;3257:2;3245:9;3236:7;3232:23;3228:32;3225:52;;;3273:1;3270;3263:12;3225:52;3296:29;3315:9;3296:29;:::i;:::-;3286:39;;3344:38;3378:2;3367:9;3363:18;3344:38;:::i;:::-;3334:48;;3128:260;;;;;:::o;3393:118::-;3479:5;3472:13;3465:21;3458:5;3455:32;3445:60;;3501:1;3498;3491:12;3516:241;3572:6;3625:2;3613:9;3604:7;3600:23;3596:32;3593:52;;;3641:1;3638;3631:12;3593:52;3680:9;3667:23;3699:28;3721:5;3699:28;:::i;3762:380::-;3841:1;3837:12;;;;3884;;;3905:61;;3959:4;3951:6;3947:17;3937:27;;3905:61;4012:2;4004:6;4001:14;3981:18;3978:38;3975:161;;;4058:10;4053:3;4049:20;4046:1;4039:31;4093:4;4090:1;4083:15;4121:4;4118:1;4111:15;4147:127;4208:10;4203:3;4199:20;4196:1;4189:31;4239:4;4236:1;4229:15;4263:4;4260:1;4253:15;4279:128;4319:3;4350:1;4346:6;4343:1;4340:13;4337:39;;;4356:18;;:::i;:::-;-1:-1:-1;4392:9:1;;4279:128::o;4753:184::-;4823:6;4876:2;4864:9;4855:7;4851:23;4847:32;4844:52;;;4892:1;4889;4882:12;4844:52;-1:-1:-1;4915:16:1;;4753:184;-1:-1:-1;4753:184:1:o;5916:245::-;5983:6;6036:2;6024:9;6015:7;6011:23;6007:32;6004:52;;;6052:1;6049;6042:12;6004:52;6084:9;6078:16;6103:28;6125:5;6103:28;:::i;8721:125::-;8761:4;8789:1;8786;8783:8;8780:34;;;8794:18;;:::i;:::-;-1:-1:-1;8831:9:1;;8721:125::o;12400:168::-;12440:7;12506:1;12502;12498:6;12494:14;12491:1;12488:21;12483:1;12476:9;12469:17;12465:45;12462:71;;;12513:18;;:::i;:::-;-1:-1:-1;12553:9:1;;12400:168::o;12573:217::-;12613:1;12639;12629:132;;12683:10;12678:3;12674:20;12671:1;12664:31;12718:4;12715:1;12708:15;12746:4;12743:1;12736:15;12629:132;-1:-1:-1;12775:9:1;;12573:217::o;14711:274::-;14840:3;14878:6;14872:13;14894:53;14940:6;14935:3;14928:4;14920:6;14916:17;14894:53;:::i;:::-;14963:16;;;;;14711:274;-1:-1:-1;;14711:274:1:o
Swarm Source
ipfs://3482d0f37c344f1c81eacf1e243fe297eefab639595f1279064fc1985aa44e9f
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.