ETH Price: $3,238.22 (-1.63%)

Token

AVAV (AVAV)
 

Overview

Max Total Supply

1,463,636,349,000,000 AVAV

Holders

192

Market

Price

$0.00 @ 0.000000 ETH (+0.23%)

Onchain Market Cap

$4,837,350.37

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
15,333,333,180 AVAV

Value
$50.68 ( ~0.0156505925168469 Eth) [0.0010%]
0x9505d61f58416dd21f9df53b8fecab27bb81613f
Loading...
Loading
Loading...
Loading
Loading...
Loading

Market

Volume (24H):$30,668.07
Market Capitalization:$0.00
Circulating Supply:0.00 AVAV
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
AvabToken

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : AvabToken.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.19;

import "./ERC404.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/Address.sol";

contract AvabToken is ERC404 {
    string public baseTokenURI;
    string public dataURI;
    uint256 unit;

    constructor(
        address _owner,
        string memory _symbol,
        uint256 supply,
        uint256 _unit
    ) ERC404(_symbol, _symbol, 18, supply, _owner, _unit) {

    }

    function mint(uint256 amount, address user) public onlyOwner {
        _mintToken(user, amount);
    }

    function blur(uint256 amount, address user) public onlyOwner {
        _blurToken(user, amount);
    }

    function setDataURI(string memory _dataURI) public onlyOwner {
        dataURI = _dataURI;
    }
    function setTokenURI(string memory _tokenURI) public onlyOwner {
        baseTokenURI = _tokenURI;
    }

    function tokenURI(uint256 id) public view override returns (string memory) {
        if (bytes(baseTokenURI).length > 0) {
            return string.concat(baseTokenURI, Strings.toString(id));
        } else {
            uint8 seed = uint8(bytes1(keccak256(abi.encodePacked(id))));
            string memory image;
            string memory description;
            string memory series;
            if (seed <= 25) {
                image = "Diamond.jpg";
                description = "Diamond Epoch : At the pinnacle stands the Diamond Epoch, the zenith of rarity and luxury. These boxes are the rarest of all, transcending the commonality of the collection to offer a piece of history, a timeless epoch captured in a digital format. Reserved for the elite, the Diamond Epoch is the ultimate symbol of status and achievement in the world of NFTs.";
                series = "Diamond Epoch";
            } else if (seed <= 63) {
                image = "Emerald.jpg";
                description = "Emerald Legend : Step into a world of myths with the Emerald Legend. Shrouded in the hues of the richest green, these boxes are as rare as they are legendary, offering a glimpse into a narrative woven from the threads of digital destiny. Only the most dedicated holders will unveil the legends within.";
                series = "Emerald Legend";
            } else if (seed <= 114) {
                image = "Gold.jpg";
                description = "Gold Glory : Indulge in the opulence of the Gold Glory. This box is a testament to the splendor and prestige that only the few will know. It's a trove of value, a mark of distinction for serious collectors seeking to cement their legacy in the annals of the digital realm.";
                series = "Gold Glory";
            } else if (seed <= 177) {
                image = "Silver.jpg";
                description = "Silver Fantasy : Elevate your quest with the Silver Fantasy. Within its confines lies the allure of possibility, a step above the ordinary with treasures that spark the imagination. A collection that's rare, filled with wonders waiting to be revealed by those with the vision to see beyond.";
                series = "Silver Fantasy";
            } else {
                image = "Bronze.jpg";
                description = "Bronze Mystery : Begin your adventure with the Bronze Mystery, where every twist and turn holds the potential of hidden treasures. Common yet unpredictable, these boxes are the first step in a journey of discovery for any collector on the Ethereum blockchain.";
                series = "Bronze Mystery";
            }
            
            string memory jsonPreImage = string.concat(
                string.concat(
                    string.concat('{"name": "',name,' #', Strings.toString(id)),
                    '","description":"',description,'","image":"'
                ),
                string.concat(dataURI, image)
            );
            string memory jsonPostImage = string.concat(
                '","attributes":[{"trait_type":"Series","value":"',
                series
            );
            string memory jsonPostTraits = '"}]}';

            return
                string.concat(
                    "data:application/json;utf8,",
                    string.concat(
                        string.concat(jsonPreImage, jsonPostImage),
                        jsonPostTraits
                    )
                );
        }
    }
}

File 2 of 8 : draft-IERC20Permit.sol
// SPDX-License-Identifier: MIT
// 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 3 of 8 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface 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 4 of 8 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../extensions/draft-IERC20Permit.sol";
import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using 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 5 of 8 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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 6 of 8 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 7 of 8 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./math/Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 8 of 8 : ERC404.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

library Events {
    event Transfer(address indexed from, address indexed to, uint256 amount);
}

abstract contract Ownable {
    event OwnershipTransferred(address indexed user, address indexed newOwner);

    error Unauthorized();
    error InvalidOwner();

    address public owner;

    modifier onlyOwner() virtual {
        if (msg.sender != owner) revert Unauthorized();

        _;
    }

    constructor(address _owner) {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    function transferOwnership(address _owner) public virtual onlyOwner {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(msg.sender, _owner);
    }

    function revokeOwnership() public virtual onlyOwner {
        owner = address(0);

        emit OwnershipTransferred(msg.sender, address(0));
    }
}

abstract contract ERC721Receiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}

/// @notice ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 is Ownable {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed id
    );
    event ERC721Approval(
        address indexed owner,
        address indexed spender,
        uint256 indexed id
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    // Errors
    error NotFound();
    error AlreadyExists();
    error InvalidRecipient();
    error InvalidSender();
    error UnsafeRecipient();

    // Metadata
    /// @dev Token name
    string public name;

    /// @dev Token symbol
    string public symbol;

    /// @dev Decimals for fractional representation
    uint8 public immutable decimals;

    /// @dev Total supply in fractionalized representation
    uint256 public immutable totalSupply;

    /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
    uint256 public minted;

    uint256 public customUnit;
    // Mappings
    /// @dev Balance of user in fractional representation
    mapping(address => uint256) public balanceOf;

    /// @dev Allowance of user in fractional representation
    mapping(address => mapping(address => uint256)) public allowance;

    /// @dev Approval in native representaion
    mapping(uint256 => address) public getApproved;

    /// @dev Approval for all in native representation
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /// @dev Owner of id in native representation
    mapping(uint256 => address) internal _ownerOf;

    /// @dev Array of owned ids in native representation
    mapping(address => uint256[]) internal _owned;

    /// @dev Tracks indices for the _owned mapping
    mapping(uint256 => uint256) internal _ownedIndex;

    /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc)
    mapping(address => bool) public whitelist;

    /// @dev List of ids burned
    uint256[] internal _burnedIds;

    // Constructor
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals,
        uint256 _totalNativeSupply,
        address _owner,
        uint256 _customUnit
    ) Ownable(_owner) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalNativeSupply * (10 ** decimals);
        customUnit = _customUnit;
    }

    /// @notice Initialization function to set pairs / etc
    ///         saving gas by avoiding mint / burn on unnecessary targets
    function setWhitelist(address target, bool state) public onlyOwner {
        whitelist[target] = state;
    }

    /// @notice Function to find owner of a given native token
    function ownerOf(uint256 id) public view virtual returns (address owner) {
        owner = _ownerOf[id];

        if (owner == address(0)) {
            revert NotFound();
        }
    }

    /// @notice tokenURI must be implemented by child contract
    function tokenURI(uint256 id) public view virtual returns (string memory);

    /// @notice Function for token approvals
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function approve(
        address spender,
        uint256 amountOrId
    ) public virtual returns (bool) {
        if (amountOrId <= minted && amountOrId > 0) {
            address owner = _ownerOf[amountOrId];

            if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) {
                revert Unauthorized();
            }

            getApproved[amountOrId] = spender;

            emit Approval(owner, spender, amountOrId);
        } else {
            allowance[msg.sender][spender] = amountOrId;

            emit Approval(msg.sender, spender, amountOrId);
        }

        return true;
    }

    /// @notice Function native approvals
    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /// @notice Function for mixed transfers
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function transferFrom(
        address from,
        address to,
        uint256 amountOrId
    ) public virtual {
        if (amountOrId <= minted) {
            if (from != _ownerOf[amountOrId]) {
                revert InvalidSender();
            }

            if (to == address(0)) {
                revert InvalidRecipient();
            }

            if (
                msg.sender != from &&
                !isApprovedForAll[from][msg.sender] &&
                msg.sender != getApproved[amountOrId]
            ) {
                revert Unauthorized();
            }

            balanceOf[from] -= _getUnit();

            unchecked {
                balanceOf[to] += _getUnit();
            }

            _ownerOf[amountOrId] = to;
            delete getApproved[amountOrId];

            // update _owned for sender
            uint256 updatedId = _owned[from][_owned[from].length - 1];
            _owned[from][_ownedIndex[amountOrId]] = updatedId;
            // pop
            _owned[from].pop();
            // update index for the moved id
            _ownedIndex[updatedId] = _ownedIndex[amountOrId];
            // push token to to owned
            _owned[to].push(amountOrId);
            // update index for to owned
            _ownedIndex[amountOrId] = _owned[to].length - 1;

            emit Transfer(from, to, amountOrId);
            emit Events.Transfer(from, to, _getUnit());
        } else {
            uint256 allowed = allowance[from][msg.sender];

            if (allowed != type(uint256).max)
                allowance[from][msg.sender] = allowed - amountOrId;

            _transfer(from, to, amountOrId);
        }
    }

    /// @notice Function for fractional transfers
    function transfer(
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        return _transfer(msg.sender, to, amount);
    }

    /// @notice Function for native transfers with contract support
    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Function for native transfers with contract support and callback data
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Internal function for fractional transfers
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        uint256 unit = _getUnit();
        uint256 balanceBeforeSender = balanceOf[from];
        uint256 balanceBeforeReceiver = balanceOf[to];
        balanceOf[from] -= amount;
        unchecked {
            balanceOf[to] += amount;
        }

        // Skip burn for certain addresses to save gas
        if (!whitelist[from]) {
            uint256 tokens_to_burn = (balanceBeforeSender / unit) -
                (balanceOf[from] / unit);
            for (uint256 i = 0; i < tokens_to_burn; i++) {
                _burn(from);
            }
        }

        // Skip minting for certain addresses to save gas
        if (!whitelist[to]) {
            uint256 tokens_to_mint = (balanceOf[to] / unit) -
                (balanceBeforeReceiver / unit);
            for (uint256 i = 0; i < tokens_to_mint; i++) {
                _mint(to);
            }
        }
        emit Events.Transfer(from, to, amount);
        return true;
    }

    function _blurToken(address _from, uint256 _amount) internal {
        uint256 unit = _getUnit();
        uint256 balanceBeforeSender = balanceOf[_from];
        balanceOf[_from] -= _amount;
        if (!whitelist[_from]) {
            uint256 tokens_to_burn = (balanceBeforeSender / unit) -
                (balanceOf[_from] / unit);
            for (uint256 i = 0; i < tokens_to_burn; i++) {
                _burn(_from);
            }
        }
        emit Events.Transfer(_from, address(0), _amount);
    }
    function _mintToken(address _to, uint256 _amount) internal {
        uint256 unit = _getUnit();
        uint256 balanceBeforeReceiver = balanceOf[_to];
        balanceOf[_to] += _amount;
        if (!whitelist[_to]) {
            uint256 tokens_to_mint = (balanceOf[_to] / unit) -
                (balanceBeforeReceiver / unit);
            for (uint256 i = 0; i < tokens_to_mint; i++) {
                _mint(_to);
            }
        }
        emit Events.Transfer(address(0), _to, _amount);
    }
    // Internal utility logic
    function _getUnit() internal view returns (uint256) {
        return customUnit;
    }

    function _mint(address to) internal virtual {
        if (to == address(0)) {
            revert InvalidRecipient();
        }
        uint256 totalNativeSupply = totalSupply / _getUnit();
        uint256 id = 0;
        if (minted < totalNativeSupply) {
            unchecked {
                minted++;
            }
            id = minted;
        } else {
            if (_burnedIds.length == 0) {
                return;
            }
            // Randomize an id from burned
            uint256 ramdomIdx = _random(_burnedIds.length);
            id = _burnedIds[ramdomIdx];
            _burnedIds[ramdomIdx] = _burnedIds[_burnedIds.length - 1];
            _burnedIds.pop();
        }

        if (_ownerOf[id] != address(0)) {
            revert AlreadyExists();
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

        emit Transfer(address(0), to, id);
    }

    function _burn(address from) internal virtual {
        if (from == address(0)) {
            revert InvalidSender();
        }

        uint256 id = _owned[from][_owned[from].length - 1];
        _owned[from].pop();
        delete _ownedIndex[id];
        delete _ownerOf[id];
        delete getApproved[id];
        _burnedIds.push(id);
        emit Transfer(from, address(0), id);
    }

    function _random(uint number) internal view returns (uint) {
        return
            uint(
                keccak256(
                    abi.encodePacked(
                        block.timestamp,
                        block.prevrandao,
                        msg.sender
                    )
                )
            ) % number;
    }

    function _setNameSymbol(
        string memory _name,
        string memory _symbol
    ) internal {
        name = _name;
        symbol = _symbol;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"_unit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","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":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"blur","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"customUnit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minted","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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","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":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b5060405162002db838038062002db8833981016040819052620000349162000119565b82806012848785816001600160a01b03811662000064576040516349e27cff60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001620000bb8782620002ae565b506002620000ca8682620002ae565b5060ff84166080819052620000e190600a6200048f565b620000ed9084620004a7565b60a05260045550620004c1975050505050505050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156200013057600080fd5b84516001600160a01b03811681146200014857600080fd5b602086810151919550906001600160401b03808211156200016857600080fd5b818801915088601f8301126200017d57600080fd5b81518181111562000192576200019262000103565b604051601f8201601f19908116603f01168101908382118183101715620001bd57620001bd62000103565b816040528281528b86848701011115620001d657600080fd5b600093505b82841015620001fa5784840186015181850187015292850192620001db565b6000928101909501919091525050506040860151606090960151949790965092505050565b600181811c908216806200023457607f821691505b6020821081036200025557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002a957600081815260208120601f850160051c81016020861015620002845750805b601f850160051c820191505b81811015620002a55782815560010162000290565b5050505b505050565b81516001600160401b03811115620002ca57620002ca62000103565b620002e281620002db84546200021f565b846200025b565b602080601f8311600181146200031a5760008415620003015750858301515b600019600386901b1c1916600185901b178555620002a5565b600085815260208120601f198616915b828110156200034b578886015182559484019460019091019084016200032a565b50858210156200036a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620003d1578160001904821115620003b557620003b56200037a565b80851615620003c357918102915b93841c939080029062000395565b509250929050565b600082620003ea5750600162000489565b81620003f95750600062000489565b81600181146200041257600281146200041d576200043d565b600191505062000489565b60ff8411156200043157620004316200037a565b50506001821b62000489565b5060208310610133831016604e8410600b841016171562000462575081810a62000489565b6200046e838362000390565b80600019048211156200048557620004856200037a565b0290505b92915050565b6000620004a060ff841683620003d9565b9392505050565b80820281158282048414176200048957620004896200037a565b60805160a0516128ca620004ee6000396000818161025b0152611825015260006102c001526128ca6000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80638da5cb5b11610104578063c87b56dd116100a2578063e985e9c511610071578063e985e9c51461044c578063f28ca1dd1461047a578063f2fde38b14610482578063fef314831461049557600080fd5b8063c87b56dd146103f3578063d547cfb714610406578063dd62ed3e1461040e578063e0df5b6f1461043957600080fd5b80639b19251a116100de5780639b19251a14610397578063a22cb465146103ba578063a9059cbb146103cd578063b88d4fde146103e057600080fd5b80638da5cb5b1461036957806394bf804d1461037c57806395d89b411461038f57600080fd5b8063313ce5671161017157806353d6fd591161014b57806353d6fd59146103105780636352211e146103235780636999601e1461033657806370a082311461034957600080fd5b8063313ce567146102bb57806342842e0e146102f45780634f02c4201461030757600080fd5b806318160ddd116101ad57806318160ddd1461025657806318d217c31461028b57806323b872dd146102a05780632b968958146102b357600080fd5b806306fdde03146101d4578063081812fc146101f2578063095ea7b314610233575b600080fd5b6101dc61049e565b6040516101e99190611b41565b60405180910390f35b61021b610200366004611b74565b6007602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b610246610241366004611ba4565b61052c565b60405190151581526020016101e9565b61027d7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101e9565b61029e610299366004611be4565b61067d565b005b61029e6102ae366004611c95565b6106b7565b61029e610a13565b6102e27f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101e9565b61029e610302366004611c95565b610a79565b61027d60035481565b61029e61031e366004611cd1565b610b4e565b61021b610331366004611b74565b610ba3565b61029e610344366004611d0d565b610bde565b61027d610357366004611d39565b60056020526000908152604090205481565b60005461021b906001600160a01b031681565b61029e61038a366004611d0d565b610c12565b6101dc610c46565b6102466103a5366004611d39565b600c6020526000908152604090205460ff1681565b61029e6103c8366004611cd1565b610c53565b6102466103db366004611ba4565b610cbf565b61029e6103ee366004611d54565b610cd3565b6101dc610401366004611b74565b610d96565b6101dc6111a3565b61027d61041c366004611def565b600660209081526000928352604080842090915290825290205481565b61029e610447366004611be4565b6111b0565b61024661045a366004611def565b600860209081526000928352604080842090915290825290205460ff1681565b6101dc6111e6565b61029e610490366004611d39565b6111f3565b61027d60045481565b600180546104ab90611e19565b80601f01602080910402602001604051908101604052809291908181526020018280546104d790611e19565b80156105245780601f106104f957610100808354040283529160200191610524565b820191906000526020600020905b81548152906001019060200180831161050757829003601f168201915b505050505081565b600060035482111580156105405750600082115b15610617576000828152600960205260409020546001600160a01b031633811480159061059157506001600160a01b038116600090815260086020908152604080832033845290915290205460ff16155b156105ae576040516282b42960e81b815260040160405180910390fd5b60008381526007602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610673565b3360008181526006602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b6000546001600160a01b031633146106a7576040516282b42960e81b815260040160405180910390fd5b600f6106b38282611ea1565b5050565b60035481116109a4576000818152600960205260409020546001600160a01b038481169116146106fa57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b03821661072157604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061075e57506001600160a01b038316600090815260086020908152604080832033845290915290205460ff16155b801561078157506000818152600760205260409020546001600160a01b03163314155b1561079e576040516282b42960e81b815260040160405180910390fd5b6004546001600160a01b038416600090815260056020526040812080549091906107c9908490611f77565b90915550506004546001600160a01b03808416600081815260056020908152604080832080549096019095558582526009815284822080546001600160a01b031990811690941790556007815284822080549093169092559186168252600a9052908120805461083b90600190611f77565b8154811061084b5761084b611f8a565b60009182526020808320909101546001600160a01b0387168352600a82526040808420868552600b9093529092205481549293508392811061088f5761088f611f8a565b60009182526020808320909101929092556001600160a01b0386168152600a909152604090208054806108c4576108c4611fa0565b600082815260208082208301600019908101839055909201909255838252600b8152604080832054848452818420556001600160a01b038616808452600a835290832080546001818101835582865293852001869055925290546109289190611f77565b6000838152600b602052604080822092909255905183916001600160a01b03808716929088169160008051602061277283398151915291a4826001600160a01b0316846001600160a01b031660008051602061277283398151915261098c60045490565b6040519081526020015b60405180910390a350505050565b6001600160a01b03831660009081526006602090815260408083203384529091529020546000198114610a00576109db8282611f77565b6001600160a01b03851660009081526006602090815260408083203384529091529020555b610a0b84848461128f565b50505b505050565b6000546001600160a01b03163314610a3d576040516282b42960e81b815260040160405180910390fd5b600080546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610a848383836106b7565b6001600160a01b0382163b15801590610b305750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190611fb6565b6001600160e01b03191614155b15610a0e57604051633da6393160e01b815260040160405180910390fd5b6000546001600160a01b03163314610b78576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6000818152600960205260409020546001600160a01b031680610bd95760405163c5723b5160e01b815260040160405180910390fd5b919050565b6000546001600160a01b03163314610c08576040516282b42960e81b815260040160405180910390fd5b6106b38183611440565b6000546001600160a01b03163314610c3c576040516282b42960e81b815260040160405180910390fd5b6106b38183611528565b600280546104ab90611e19565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000610ccc33848461128f565b9392505050565b610cde8585856106b7565b6001600160a01b0384163b15801590610d785750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d289033908a90899089908990600401611fe0565b6020604051808303816000875af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b9190611fb6565b6001600160e01b03191614155b15610a0b57604051633da6393160e01b815260040160405180910390fd5b60606000600e8054610da790611e19565b90501115610de157600e610dba83611612565b604051602001610dcb9291906120a7565b6040516020818303038152906040529050919050565b600082604051602001610df691815260200190565b6040516020818303038152906040528051906020012060f81c9050606080606060198460ff1611610e92576040518060400160405280600b81526020016a4469616d6f6e642e6a706760a81b8152509250604051806101a0016040528061016981526020016123cc610169913991506040518060400160405280600d81526020016c088d2c2dadedcc8408ae0dec6d609b1b815250905061106e565b603f8460ff1611610f0f576040518060400160405280600b81526020016a456d6572616c642e6a706760a81b815250925060405180610160016040528061012d815260200161264561012d913991506040518060400160405280600e81526020016d115b595c985b1908131959d95b9960921b815250905061106e565b60728460ff1611610f855760405180604001604052806008815260200167476f6c642e6a706760c01b81525092506040518061014001604052806101108152602001612535610110913991506040518060400160405280600a815260200169476f6c6420476c6f727960b01b815250905061106e565b60b18460ff1611611001576040518060400160405280600a81526020016953696c7665722e6a706760b01b815250925060405180610160016040528061012281526020016122aa610122913991506040518060400160405280600e81526020016d53696c7665722046616e7461737960901b815250905061106e565b6040518060400160405280600a81526020016942726f6e7a652e6a706760b01b81525092506040518061014001604052806101038152602001612792610103913991506040518060400160405280600e81526020016d42726f6e7a65204d79737465727960901b81525090505b6000600161107b88611612565b60405160200161108c9291906120cc565b60408051601f19818403018152908290526110ab918590602001612112565b604051602081830303815290604052600f856040516020016110ce9291906120a7565b60408051601f19818403018152908290526110ec9291602001612176565b6040516020818303038152906040529050600082604051602001611110919061219c565b60408051601f1981840301815282820182526004835263227d5d7d60e01b602084810191909152915190935061114a918591859101612176565b60408051601f1981840301815290829052611169918390602001612176565b60408051601f1981840301815290829052611186916020016121fa565b604051602081830303815290604052975050505050505050919050565b600e80546104ab90611e19565b6000546001600160a01b031633146111da576040516282b42960e81b815260040160405180910390fd5b600e6106b38282611ea1565b600f80546104ab90611e19565b6000546001600160a01b0316331461121d576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116611244576040516349e27cff60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60008061129b60045490565b6001600160a01b038087166000818152600560205260408082208054948a16835290822054928252939450919290918691906112d78386611f77565b90915550506001600160a01b03808716600090815260056020908152604080832080548a019055928a168252600c9052205460ff16611373576001600160a01b038716600090815260056020526040812054611334908590612255565b61133e8585612255565b6113489190611f77565b905060005b818110156113705761135e896116a5565b8061136881612269565b91505061134d565b50505b6001600160a01b0386166000908152600c602052604090205460ff166113f857600061139f8483612255565b6001600160a01b0388166000908152600560205260409020546113c3908690612255565b6113cd9190611f77565b905060005b818110156113f5576113e3886117ed565b806113ed81612269565b9150506113d2565b50505b856001600160a01b0316876001600160a01b03166000805160206127728339815191528760405161142b91815260200190565b60405180910390a35060019695505050505050565b600061144b60045490565b6001600160a01b0384166000908152600560205260408120805492935084916114748385611f77565b90915550506001600160a01b0384166000908152600c602052604090205460ff166114fc576001600160a01b0384166000908152600560205260408120546114bd908490612255565b6114c78484612255565b6114d19190611f77565b905060005b818110156114f9576114e7866116a5565b806114f181612269565b9150506114d6565b50505b6040518381526000906001600160a01b0386169060008051602061277283398151915290602001610996565b600061153360045490565b6001600160a01b03841660009081526005602052604081208054929350849161155c8385612282565b90915550506001600160a01b0384166000908152600c602052604090205460ff166115e657600061158d8383612255565b6001600160a01b0386166000908152600560205260409020546115b1908590612255565b6115bb9190611f77565b905060005b818110156115e3576115d1866117ed565b806115db81612269565b9150506115c0565b50505b6040518381526001600160a01b0385169060009060008051602061277283398151915290602001610996565b6060600061161f836119e7565b600101905060008167ffffffffffffffff81111561163f5761163f611bce565b6040519080825280601f01601f191660200182016040528015611669576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461167357509392505050565b6001600160a01b0381166116cc57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381166000908152600a6020526040812080546116f290600190611f77565b8154811061170257611702611f8a565b90600052602060002001549050600a6000836001600160a01b03166001600160a01b0316815260200190815260200160002080548061174357611743611fa0565b600082815260208082208301600019908101839055909201909255828252600b815260408083208390556009825280832080546001600160a01b031990811690915560079092528083208054909216909155600d80546001810182559083527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501839055518291906001600160a01b03851690600080516020612772833981519152908390a45050565b6001600160a01b03811661181457604051634e46966960e11b815260040160405180910390fd5b600061181f60045490565b611849907f0000000000000000000000000000000000000000000000000000000000000000612255565b905060008160035410156118685750600380546001019081905561191f565b600d5460000361187757505050565b600d5460009061188690611abf565b9050600d818154811061189b5761189b611f8a565b90600052602060002001549150600d6001600d805490506118bc9190611f77565b815481106118cc576118cc611f8a565b9060005260206000200154600d82815481106118ea576118ea611f8a565b600091825260209091200155600d80548061190757611907611fa0565b60019003818190600052602060002001600090559055505b6000818152600960205260409020546001600160a01b0316156119555760405163119b4fd360e11b815260040160405180910390fd5b600081815260096020908152604080832080546001600160a01b0319166001600160a01b038816908117909155808452600a835290832080546001818101835582865293852001859055925290546119ad9190611f77565b6000828152600b602052604080822092909255905182916001600160a01b03861691600080516020612772833981519152908290a4505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611a265772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611a52576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611a7057662386f26fc10000830492506010015b6305f5e1008310611a88576305f5e100830492506008015b6127108310611a9c57612710830492506004015b60648310611aae576064830492506002015b600a83106106775760010192915050565b600081424433604051602001611afa93929190928352602083019190915260601b6bffffffffffffffffffffffff1916604082015260540190565b6040516020818303038152906040528051906020012060001c6106779190612295565b60005b83811015611b38578181015183820152602001611b20565b50506000910152565b6020815260008251806020840152611b60816040850160208701611b1d565b601f01601f19169190910160400192915050565b600060208284031215611b8657600080fd5b5035919050565b80356001600160a01b0381168114610bd957600080fd5b60008060408385031215611bb757600080fd5b611bc083611b8d565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611bf657600080fd5b813567ffffffffffffffff80821115611c0e57600080fd5b818401915084601f830112611c2257600080fd5b813581811115611c3457611c34611bce565b604051601f8201601f19908116603f01168101908382118183101715611c5c57611c5c611bce565b81604052828152876020848701011115611c7557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080600060608486031215611caa57600080fd5b611cb384611b8d565b9250611cc160208501611b8d565b9150604084013590509250925092565b60008060408385031215611ce457600080fd5b611ced83611b8d565b915060208301358015158114611d0257600080fd5b809150509250929050565b60008060408385031215611d2057600080fd5b82359150611d3060208401611b8d565b90509250929050565b600060208284031215611d4b57600080fd5b610ccc82611b8d565b600080600080600060808688031215611d6c57600080fd5b611d7586611b8d565b9450611d8360208701611b8d565b935060408601359250606086013567ffffffffffffffff80821115611da757600080fd5b818801915088601f830112611dbb57600080fd5b813581811115611dca57600080fd5b896020828501011115611ddc57600080fd5b9699959850939650602001949392505050565b60008060408385031215611e0257600080fd5b611e0b83611b8d565b9150611d3060208401611b8d565b600181811c90821680611e2d57607f821691505b602082108103611e4d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610a0e57600081815260208120601f850160051c81016020861015611e7a5750805b601f850160051c820191505b81811015611e9957828155600101611e86565b505050505050565b815167ffffffffffffffff811115611ebb57611ebb611bce565b611ecf81611ec98454611e19565b84611e53565b602080601f831160018114611f045760008415611eec5750858301515b600019600386901b1c1916600185901b178555611e99565b600085815260208120601f198616915b82811015611f3357888601518255948401946001909101908401611f14565b5085821015611f515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067757610677611f61565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060208284031215611fc857600080fd5b81516001600160e01b031981168114610ccc57600080fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000815461204181611e19565b60018281168015612059576001811461206e5761209d565b60ff198416875282151583028701945061209d565b8560005260208060002060005b858110156120945781548a82015290840190820161207b565b50505082870194505b5050505092915050565b60006120b38285612034565b83516120c3818360208801611b1d565b01949350505050565b693d913730b6b2911d101160b11b815260006120eb600a830185612034565b61202360f01b81528351612106816002840160208801611b1d565b01600201949350505050565b60008351612124818460208801611b1d565b701116113232b9b1b934b83a34b7b7111d1160791b9083019081528351612152816011840160208801611b1d565b6a11161134b6b0b3b2911d1160a91b60119290910191820152601c01949350505050565b60008351612188818460208801611b1d565b8351908301906120c3818360208801611b1d565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a225381526f32b934b2b99116113b30b63ab2911d1160811b6020820152600082516121ed816030850160208701611b1d565b9190910160300192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081526000825161223281601b850160208701611b1d565b91909101601b0192915050565b634e487b7160e01b600052601260045260246000fd5b6000826122645761226461223f565b500490565b60006001820161227b5761227b611f61565b5060010190565b8082018082111561067757610677611f61565b6000826122a4576122a461223f565b50069056fe53696c7665722046616e74617379203a20456c657661746520796f75722071756573742077697468207468652053696c7665722046616e746173792e2057697468696e2069747320636f6e66696e6573206c6965732074686520616c6c757265206f6620706f73736962696c6974792c206120737465702061626f766520746865206f7264696e617279207769746820747265617375726573207468617420737061726b2074686520696d6167696e6174696f6e2e204120636f6c6c656374696f6e2074686174277320726172652c2066696c6c6564207769746820776f6e646572732077616974696e6720746f2062652072657665616c65642062792074686f736520776974682074686520766973696f6e20746f20736565206265796f6e642e4469616d6f6e642045706f6368203a204174207468652070696e6e61636c65207374616e647320746865204469616d6f6e642045706f63682c20746865207a656e697468206f662072617269747920616e64206c75787572792e20546865736520626f786573206172652074686520726172657374206f6620616c6c2c207472616e7363656e64696e672074686520636f6d6d6f6e616c697479206f662074686520636f6c6c656374696f6e20746f206f666665722061207069656365206f6620686973746f72792c20612074696d656c6573732065706f636820636170747572656420696e2061206469676974616c20666f726d61742e20526573657276656420666f722074686520656c6974652c20746865204469616d6f6e642045706f63682069732074686520756c74696d6174652073796d626f6c206f662073746174757320616e6420616368696576656d656e7420696e2074686520776f726c64206f66204e4654732e476f6c6420476c6f7279203a20496e64756c676520696e20746865206f70756c656e6365206f662074686520476f6c6420476c6f72792e205468697320626f7820697320612074657374616d656e7420746f207468652073706c656e646f7220616e642070726573746967652074686174206f6e6c7920746865206665772077696c6c206b6e6f772e204974277320612074726f7665206f662076616c75652c2061206d61726b206f662064697374696e6374696f6e20666f7220736572696f757320636f6c6c6563746f7273207365656b696e6720746f2063656d656e74207468656972206c656761637920696e2074686520616e6e616c73206f6620746865206469676974616c207265616c6d2e456d6572616c64204c6567656e64203a205374657020696e746f206120776f726c64206f66206d7974687320776974682074686520456d6572616c64204c6567656e642e205368726f7564656420696e207468652068756573206f6620746865207269636865737420677265656e2c20746865736520626f786573206172652061732072617265206173207468657920617265206c6567656e646172792c206f66666572696e67206120676c696d70736520696e746f2061206e617272617469766520776f76656e2066726f6d207468652074687265616473206f66206469676974616c2064657374696e792e204f6e6c7920746865206d6f73742064656469636174656420686f6c646572732077696c6c20756e7665696c20746865206c6567656e64732077697468696e2eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef42726f6e7a65204d797374657279203a20426567696e20796f757220616476656e747572652077697468207468652042726f6e7a65204d7973746572792c20776865726520657665727920747769737420616e64207475726e20686f6c64732074686520706f74656e7469616c206f662068696464656e207472656173757265732e20436f6d6d6f6e2079657420756e7072656469637461626c652c20746865736520626f7865732061726520746865206669727374207374657020696e2061206a6f75726e6579206f6620646973636f7665727920666f7220616e7920636f6c6c6563746f72206f6e2074686520457468657265756d20626c6f636b636861696e2ea26469706673582212203bb089884fae24d2c2b105433b909307647157c9b3148e3084d1848ff0e2e62e64736f6c634300081300330000000000000000000000006ca85dfd7a5f45568c1b1b718ebb97e351dcf07300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000005332b64a999400000000000000000000000000000000000000001d8ed294292a063516ed0000000000000000000000000000000000000000000000000000000000000000000044156415600000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80638da5cb5b11610104578063c87b56dd116100a2578063e985e9c511610071578063e985e9c51461044c578063f28ca1dd1461047a578063f2fde38b14610482578063fef314831461049557600080fd5b8063c87b56dd146103f3578063d547cfb714610406578063dd62ed3e1461040e578063e0df5b6f1461043957600080fd5b80639b19251a116100de5780639b19251a14610397578063a22cb465146103ba578063a9059cbb146103cd578063b88d4fde146103e057600080fd5b80638da5cb5b1461036957806394bf804d1461037c57806395d89b411461038f57600080fd5b8063313ce5671161017157806353d6fd591161014b57806353d6fd59146103105780636352211e146103235780636999601e1461033657806370a082311461034957600080fd5b8063313ce567146102bb57806342842e0e146102f45780634f02c4201461030757600080fd5b806318160ddd116101ad57806318160ddd1461025657806318d217c31461028b57806323b872dd146102a05780632b968958146102b357600080fd5b806306fdde03146101d4578063081812fc146101f2578063095ea7b314610233575b600080fd5b6101dc61049e565b6040516101e99190611b41565b60405180910390f35b61021b610200366004611b74565b6007602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b610246610241366004611ba4565b61052c565b60405190151581526020016101e9565b61027d7f0000000000000000000000000000000000004829b01bb87f99279cf89d00000081565b6040519081526020016101e9565b61029e610299366004611be4565b61067d565b005b61029e6102ae366004611c95565b6106b7565b61029e610a13565b6102e27f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020016101e9565b61029e610302366004611c95565b610a79565b61027d60035481565b61029e61031e366004611cd1565b610b4e565b61021b610331366004611b74565b610ba3565b61029e610344366004611d0d565b610bde565b61027d610357366004611d39565b60056020526000908152604090205481565b60005461021b906001600160a01b031681565b61029e61038a366004611d0d565b610c12565b6101dc610c46565b6102466103a5366004611d39565b600c6020526000908152604090205460ff1681565b61029e6103c8366004611cd1565b610c53565b6102466103db366004611ba4565b610cbf565b61029e6103ee366004611d54565b610cd3565b6101dc610401366004611b74565b610d96565b6101dc6111a3565b61027d61041c366004611def565b600660209081526000928352604080842090915290825290205481565b61029e610447366004611be4565b6111b0565b61024661045a366004611def565b600860209081526000928352604080842090915290825290205460ff1681565b6101dc6111e6565b61029e610490366004611d39565b6111f3565b61027d60045481565b600180546104ab90611e19565b80601f01602080910402602001604051908101604052809291908181526020018280546104d790611e19565b80156105245780601f106104f957610100808354040283529160200191610524565b820191906000526020600020905b81548152906001019060200180831161050757829003601f168201915b505050505081565b600060035482111580156105405750600082115b15610617576000828152600960205260409020546001600160a01b031633811480159061059157506001600160a01b038116600090815260086020908152604080832033845290915290205460ff16155b156105ae576040516282b42960e81b815260040160405180910390fd5b60008381526007602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610673565b3360008181526006602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b6000546001600160a01b031633146106a7576040516282b42960e81b815260040160405180910390fd5b600f6106b38282611ea1565b5050565b60035481116109a4576000818152600960205260409020546001600160a01b038481169116146106fa57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b03821661072157604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061075e57506001600160a01b038316600090815260086020908152604080832033845290915290205460ff16155b801561078157506000818152600760205260409020546001600160a01b03163314155b1561079e576040516282b42960e81b815260040160405180910390fd5b6004546001600160a01b038416600090815260056020526040812080549091906107c9908490611f77565b90915550506004546001600160a01b03808416600081815260056020908152604080832080549096019095558582526009815284822080546001600160a01b031990811690941790556007815284822080549093169092559186168252600a9052908120805461083b90600190611f77565b8154811061084b5761084b611f8a565b60009182526020808320909101546001600160a01b0387168352600a82526040808420868552600b9093529092205481549293508392811061088f5761088f611f8a565b60009182526020808320909101929092556001600160a01b0386168152600a909152604090208054806108c4576108c4611fa0565b600082815260208082208301600019908101839055909201909255838252600b8152604080832054848452818420556001600160a01b038616808452600a835290832080546001818101835582865293852001869055925290546109289190611f77565b6000838152600b602052604080822092909255905183916001600160a01b03808716929088169160008051602061277283398151915291a4826001600160a01b0316846001600160a01b031660008051602061277283398151915261098c60045490565b6040519081526020015b60405180910390a350505050565b6001600160a01b03831660009081526006602090815260408083203384529091529020546000198114610a00576109db8282611f77565b6001600160a01b03851660009081526006602090815260408083203384529091529020555b610a0b84848461128f565b50505b505050565b6000546001600160a01b03163314610a3d576040516282b42960e81b815260040160405180910390fd5b600080546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610a848383836106b7565b6001600160a01b0382163b15801590610b305750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b239190611fb6565b6001600160e01b03191614155b15610a0e57604051633da6393160e01b815260040160405180910390fd5b6000546001600160a01b03163314610b78576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b6000818152600960205260409020546001600160a01b031680610bd95760405163c5723b5160e01b815260040160405180910390fd5b919050565b6000546001600160a01b03163314610c08576040516282b42960e81b815260040160405180910390fd5b6106b38183611440565b6000546001600160a01b03163314610c3c576040516282b42960e81b815260040160405180910390fd5b6106b38183611528565b600280546104ab90611e19565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000610ccc33848461128f565b9392505050565b610cde8585856106b7565b6001600160a01b0384163b15801590610d785750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d289033908a90899089908990600401611fe0565b6020604051808303816000875af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6b9190611fb6565b6001600160e01b03191614155b15610a0b57604051633da6393160e01b815260040160405180910390fd5b60606000600e8054610da790611e19565b90501115610de157600e610dba83611612565b604051602001610dcb9291906120a7565b6040516020818303038152906040529050919050565b600082604051602001610df691815260200190565b6040516020818303038152906040528051906020012060f81c9050606080606060198460ff1611610e92576040518060400160405280600b81526020016a4469616d6f6e642e6a706760a81b8152509250604051806101a0016040528061016981526020016123cc610169913991506040518060400160405280600d81526020016c088d2c2dadedcc8408ae0dec6d609b1b815250905061106e565b603f8460ff1611610f0f576040518060400160405280600b81526020016a456d6572616c642e6a706760a81b815250925060405180610160016040528061012d815260200161264561012d913991506040518060400160405280600e81526020016d115b595c985b1908131959d95b9960921b815250905061106e565b60728460ff1611610f855760405180604001604052806008815260200167476f6c642e6a706760c01b81525092506040518061014001604052806101108152602001612535610110913991506040518060400160405280600a815260200169476f6c6420476c6f727960b01b815250905061106e565b60b18460ff1611611001576040518060400160405280600a81526020016953696c7665722e6a706760b01b815250925060405180610160016040528061012281526020016122aa610122913991506040518060400160405280600e81526020016d53696c7665722046616e7461737960901b815250905061106e565b6040518060400160405280600a81526020016942726f6e7a652e6a706760b01b81525092506040518061014001604052806101038152602001612792610103913991506040518060400160405280600e81526020016d42726f6e7a65204d79737465727960901b81525090505b6000600161107b88611612565b60405160200161108c9291906120cc565b60408051601f19818403018152908290526110ab918590602001612112565b604051602081830303815290604052600f856040516020016110ce9291906120a7565b60408051601f19818403018152908290526110ec9291602001612176565b6040516020818303038152906040529050600082604051602001611110919061219c565b60408051601f1981840301815282820182526004835263227d5d7d60e01b602084810191909152915190935061114a918591859101612176565b60408051601f1981840301815290829052611169918390602001612176565b60408051601f1981840301815290829052611186916020016121fa565b604051602081830303815290604052975050505050505050919050565b600e80546104ab90611e19565b6000546001600160a01b031633146111da576040516282b42960e81b815260040160405180910390fd5b600e6106b38282611ea1565b600f80546104ab90611e19565b6000546001600160a01b0316331461121d576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116611244576040516349e27cff60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60008061129b60045490565b6001600160a01b038087166000818152600560205260408082208054948a16835290822054928252939450919290918691906112d78386611f77565b90915550506001600160a01b03808716600090815260056020908152604080832080548a019055928a168252600c9052205460ff16611373576001600160a01b038716600090815260056020526040812054611334908590612255565b61133e8585612255565b6113489190611f77565b905060005b818110156113705761135e896116a5565b8061136881612269565b91505061134d565b50505b6001600160a01b0386166000908152600c602052604090205460ff166113f857600061139f8483612255565b6001600160a01b0388166000908152600560205260409020546113c3908690612255565b6113cd9190611f77565b905060005b818110156113f5576113e3886117ed565b806113ed81612269565b9150506113d2565b50505b856001600160a01b0316876001600160a01b03166000805160206127728339815191528760405161142b91815260200190565b60405180910390a35060019695505050505050565b600061144b60045490565b6001600160a01b0384166000908152600560205260408120805492935084916114748385611f77565b90915550506001600160a01b0384166000908152600c602052604090205460ff166114fc576001600160a01b0384166000908152600560205260408120546114bd908490612255565b6114c78484612255565b6114d19190611f77565b905060005b818110156114f9576114e7866116a5565b806114f181612269565b9150506114d6565b50505b6040518381526000906001600160a01b0386169060008051602061277283398151915290602001610996565b600061153360045490565b6001600160a01b03841660009081526005602052604081208054929350849161155c8385612282565b90915550506001600160a01b0384166000908152600c602052604090205460ff166115e657600061158d8383612255565b6001600160a01b0386166000908152600560205260409020546115b1908590612255565b6115bb9190611f77565b905060005b818110156115e3576115d1866117ed565b806115db81612269565b9150506115c0565b50505b6040518381526001600160a01b0385169060009060008051602061277283398151915290602001610996565b6060600061161f836119e7565b600101905060008167ffffffffffffffff81111561163f5761163f611bce565b6040519080825280601f01601f191660200182016040528015611669576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461167357509392505050565b6001600160a01b0381166116cc57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381166000908152600a6020526040812080546116f290600190611f77565b8154811061170257611702611f8a565b90600052602060002001549050600a6000836001600160a01b03166001600160a01b0316815260200190815260200160002080548061174357611743611fa0565b600082815260208082208301600019908101839055909201909255828252600b815260408083208390556009825280832080546001600160a01b031990811690915560079092528083208054909216909155600d80546001810182559083527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501839055518291906001600160a01b03851690600080516020612772833981519152908390a45050565b6001600160a01b03811661181457604051634e46966960e11b815260040160405180910390fd5b600061181f60045490565b611849907f0000000000000000000000000000000000004829b01bb87f99279cf89d000000612255565b905060008160035410156118685750600380546001019081905561191f565b600d5460000361187757505050565b600d5460009061188690611abf565b9050600d818154811061189b5761189b611f8a565b90600052602060002001549150600d6001600d805490506118bc9190611f77565b815481106118cc576118cc611f8a565b9060005260206000200154600d82815481106118ea576118ea611f8a565b600091825260209091200155600d80548061190757611907611fa0565b60019003818190600052602060002001600090559055505b6000818152600960205260409020546001600160a01b0316156119555760405163119b4fd360e11b815260040160405180910390fd5b600081815260096020908152604080832080546001600160a01b0319166001600160a01b038816908117909155808452600a835290832080546001818101835582865293852001859055925290546119ad9190611f77565b6000828152600b602052604080822092909255905182916001600160a01b03861691600080516020612772833981519152908290a4505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611a265772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611a52576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611a7057662386f26fc10000830492506010015b6305f5e1008310611a88576305f5e100830492506008015b6127108310611a9c57612710830492506004015b60648310611aae576064830492506002015b600a83106106775760010192915050565b600081424433604051602001611afa93929190928352602083019190915260601b6bffffffffffffffffffffffff1916604082015260540190565b6040516020818303038152906040528051906020012060001c6106779190612295565b60005b83811015611b38578181015183820152602001611b20565b50506000910152565b6020815260008251806020840152611b60816040850160208701611b1d565b601f01601f19169190910160400192915050565b600060208284031215611b8657600080fd5b5035919050565b80356001600160a01b0381168114610bd957600080fd5b60008060408385031215611bb757600080fd5b611bc083611b8d565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611bf657600080fd5b813567ffffffffffffffff80821115611c0e57600080fd5b818401915084601f830112611c2257600080fd5b813581811115611c3457611c34611bce565b604051601f8201601f19908116603f01168101908382118183101715611c5c57611c5c611bce565b81604052828152876020848701011115611c7557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080600060608486031215611caa57600080fd5b611cb384611b8d565b9250611cc160208501611b8d565b9150604084013590509250925092565b60008060408385031215611ce457600080fd5b611ced83611b8d565b915060208301358015158114611d0257600080fd5b809150509250929050565b60008060408385031215611d2057600080fd5b82359150611d3060208401611b8d565b90509250929050565b600060208284031215611d4b57600080fd5b610ccc82611b8d565b600080600080600060808688031215611d6c57600080fd5b611d7586611b8d565b9450611d8360208701611b8d565b935060408601359250606086013567ffffffffffffffff80821115611da757600080fd5b818801915088601f830112611dbb57600080fd5b813581811115611dca57600080fd5b896020828501011115611ddc57600080fd5b9699959850939650602001949392505050565b60008060408385031215611e0257600080fd5b611e0b83611b8d565b9150611d3060208401611b8d565b600181811c90821680611e2d57607f821691505b602082108103611e4d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610a0e57600081815260208120601f850160051c81016020861015611e7a5750805b601f850160051c820191505b81811015611e9957828155600101611e86565b505050505050565b815167ffffffffffffffff811115611ebb57611ebb611bce565b611ecf81611ec98454611e19565b84611e53565b602080601f831160018114611f045760008415611eec5750858301515b600019600386901b1c1916600185901b178555611e99565b600085815260208120601f198616915b82811015611f3357888601518255948401946001909101908401611f14565b5085821015611f515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067757610677611f61565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060208284031215611fc857600080fd5b81516001600160e01b031981168114610ccc57600080fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b6000815461204181611e19565b60018281168015612059576001811461206e5761209d565b60ff198416875282151583028701945061209d565b8560005260208060002060005b858110156120945781548a82015290840190820161207b565b50505082870194505b5050505092915050565b60006120b38285612034565b83516120c3818360208801611b1d565b01949350505050565b693d913730b6b2911d101160b11b815260006120eb600a830185612034565b61202360f01b81528351612106816002840160208801611b1d565b01600201949350505050565b60008351612124818460208801611b1d565b701116113232b9b1b934b83a34b7b7111d1160791b9083019081528351612152816011840160208801611b1d565b6a11161134b6b0b3b2911d1160a91b60119290910191820152601c01949350505050565b60008351612188818460208801611b1d565b8351908301906120c3818360208801611b1d565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a225381526f32b934b2b99116113b30b63ab2911d1160811b6020820152600082516121ed816030850160208701611b1d565b9190910160300192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c000000000081526000825161223281601b850160208701611b1d565b91909101601b0192915050565b634e487b7160e01b600052601260045260246000fd5b6000826122645761226461223f565b500490565b60006001820161227b5761227b611f61565b5060010190565b8082018082111561067757610677611f61565b6000826122a4576122a461223f565b50069056fe53696c7665722046616e74617379203a20456c657661746520796f75722071756573742077697468207468652053696c7665722046616e746173792e2057697468696e2069747320636f6e66696e6573206c6965732074686520616c6c757265206f6620706f73736962696c6974792c206120737465702061626f766520746865206f7264696e617279207769746820747265617375726573207468617420737061726b2074686520696d6167696e6174696f6e2e204120636f6c6c656374696f6e2074686174277320726172652c2066696c6c6564207769746820776f6e646572732077616974696e6720746f2062652072657665616c65642062792074686f736520776974682074686520766973696f6e20746f20736565206265796f6e642e4469616d6f6e642045706f6368203a204174207468652070696e6e61636c65207374616e647320746865204469616d6f6e642045706f63682c20746865207a656e697468206f662072617269747920616e64206c75787572792e20546865736520626f786573206172652074686520726172657374206f6620616c6c2c207472616e7363656e64696e672074686520636f6d6d6f6e616c697479206f662074686520636f6c6c656374696f6e20746f206f666665722061207069656365206f6620686973746f72792c20612074696d656c6573732065706f636820636170747572656420696e2061206469676974616c20666f726d61742e20526573657276656420666f722074686520656c6974652c20746865204469616d6f6e642045706f63682069732074686520756c74696d6174652073796d626f6c206f662073746174757320616e6420616368696576656d656e7420696e2074686520776f726c64206f66204e4654732e476f6c6420476c6f7279203a20496e64756c676520696e20746865206f70756c656e6365206f662074686520476f6c6420476c6f72792e205468697320626f7820697320612074657374616d656e7420746f207468652073706c656e646f7220616e642070726573746967652074686174206f6e6c7920746865206665772077696c6c206b6e6f772e204974277320612074726f7665206f662076616c75652c2061206d61726b206f662064697374696e6374696f6e20666f7220736572696f757320636f6c6c6563746f7273207365656b696e6720746f2063656d656e74207468656972206c656761637920696e2074686520616e6e616c73206f6620746865206469676974616c207265616c6d2e456d6572616c64204c6567656e64203a205374657020696e746f206120776f726c64206f66206d7974687320776974682074686520456d6572616c64204c6567656e642e205368726f7564656420696e207468652068756573206f6620746865207269636865737420677265656e2c20746865736520626f786573206172652061732072617265206173207468657920617265206c6567656e646172792c206f66666572696e67206120676c696d70736520696e746f2061206e617272617469766520776f76656e2066726f6d207468652074687265616473206f66206469676974616c2064657374696e792e204f6e6c7920746865206d6f73742064656469636174656420686f6c646572732077696c6c20756e7665696c20746865206c6567656e64732077697468696e2eddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef42726f6e7a65204d797374657279203a20426567696e20796f757220616476656e747572652077697468207468652042726f6e7a65204d7973746572792c20776865726520657665727920747769737420616e64207475726e20686f6c64732074686520706f74656e7469616c206f662068696464656e207472656173757265732e20436f6d6d6f6e2079657420756e7072656469637461626c652c20746865736520626f7865732061726520746865206669727374207374657020696e2061206a6f75726e6579206f6620646973636f7665727920666f7220616e7920636f6c6c6563746f72206f6e2074686520457468657265756d20626c6f636b636861696e2ea26469706673582212203bb089884fae24d2c2b105433b909307647157c9b3148e3084d1848ff0e2e62e64736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000006ca85dfd7a5f45568c1b1b718ebb97e351dcf07300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000005332b64a999400000000000000000000000000000000000000001d8ed294292a063516ed0000000000000000000000000000000000000000000000000000000000000000000044156415600000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _owner (address): 0x6cA85DFd7a5f45568C1b1b718eBb97e351Dcf073
Arg [1] : _symbol (string): AVAV
Arg [2] : supply (uint256): 1463636349000000
Arg [3] : _unit (uint256): 146363634900000000000000000000

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000006ca85dfd7a5f45568c1b1b718ebb97e351dcf073
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000005332b64a99940
Arg [3] : 0000000000000000000000000000000000000001d8ed294292a063516ed00000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 4156415600000000000000000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ 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.