ETH Price: $3,389.82 (-1.51%)
Gas: 2 Gwei

Token

Nation3 Genesis Passport (PASS3)
 

Overview

Max Total Supply

287 PASS3

Holders

287

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
wilsonng.eth
Balance
1 PASS3
0xaf4807d083287f205d897e6d00c6fde1bf0a241a
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Passport

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license
File 1 of 7 : Passport.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity =0.8.10;

import {ERC20} from "@rari-capital/solmate/src/tokens/ERC20.sol";
import {ERC721, ERC721TokenReceiver} from "@rari-capital/solmate/src/tokens/ERC721.sol";
import {SafeTransferLib} from "@rari-capital/solmate/src/utils/SafeTransferLib.sol";
import {Controlled} from "../utils/Controlled.sol";
import {Renderer} from "./render/Renderer.sol";

/// @notice Non-fungible, limited-transferable token that grants citizen status in Nation3.
/// @author Nation3 (https://github.com/nation3/app/blob/main/contracts/contracts/passport/Passport.sol).
/// @dev Most ERC721 operations are restricted to controller contract.
/// @dev Is modified from the EIP-721 because of the lack of enough integration of the EIP-4973 at the moment of development.
/// @dev Token metadata is renderer on-chain through an external contract.
contract Passport is ERC721, Controlled {
    /*///////////////////////////////////////////////////////////////
                               LIBRARIES
    //////////////////////////////////////////////////////////////*/

    using SafeTransferLib for ERC20;

    /*///////////////////////////////////////////////////////////////
                               ERRORS
    //////////////////////////////////////////////////////////////*/

    error NotMinted();
    error NotAuthorized();
    error InvalidFrom();
    error NotSafeRecipient();

    /*///////////////////////////////////////////////////////////////
                            STORAGE
    //////////////////////////////////////////////////////////////*/

    // @notice On-chain metadata renderer.
    Renderer public renderer;

    /// @dev Tracks the number of tokens minted & not burned.
    uint256 internal _supply;
    /// @dev Tracks the next id to mint.
    uint256 internal _idTracker;

    // @dev Timestamp of each token mint.
    mapping(uint256 => uint256) internal _timestampOf;
    // @dev Authorized address to sign messages in behalf of the passport holder, it can be different from the owner.
    // @dev Could be used for IRL events authentication.
    mapping(uint256 => address) internal _signerOf;

    /*///////////////////////////////////////////////////////////////
                            VIEWS
    //////////////////////////////////////////////////////////////*/

    /// @notice Returns total number of tokens in supply.
    function totalSupply() external view virtual returns (uint256) {
        return _supply;
    }

    /// @notice Gets next id to mint.
    function getNextId() external view virtual returns (uint256) {
        return _idTracker;
    }

    /// @notice Returns the timestamp of the mint of a token.
    /// @param id Token to retrieve timestamp from.
    function timestampOf(uint256 id) public view virtual returns (uint256) {
        if (_ownerOf[id] == address(0)) revert NotMinted();
        return _timestampOf[id];
    }

    /// @notice Returns the authorized signer of a token.
    /// @param id Token to retrieve signer from.
    function signerOf(uint256 id) external view virtual returns (address) {
        if (_ownerOf[id] == address(0)) revert NotMinted();
        return _signerOf[id];
    }

    /// @notice Get encoded metadata from renderer.
    /// @param id Token to retrieve metadata from.
    function tokenURI(uint256 id) public view override returns (string memory) {
        return renderer.render(id, ownerOf(id), timestampOf(id));
    }

    /*///////////////////////////////////////////////////////////////
                           CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    /// @dev Sets name & symbol.
    constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) {}

    /*///////////////////////////////////////////////////////////////
                       USER ACTIONS
    //////////////////////////////////////////////////////////////*/

    /// @notice Allows the owner of a passport to update the signer.
    /// @param id Token to update the signer.
    /// @param signer Address of the new signer account.
    function setSigner(uint256 id, address signer) external virtual {
        if (_ownerOf[id] != msg.sender) revert NotAuthorized();
        _signerOf[id] = signer;
    }

    /*///////////////////////////////////////////////////////////////
                       CONTROLLED ACTIONS
    //////////////////////////////////////////////////////////////*/

    /// @notice ERC721 method to set allowance. Only allowed to controller.
    /// @dev Prevent approvals on marketplaces & other contracts.
    function approve(address spender, uint256 id) public override onlyController {
        getApproved[id] = spender;

        emit Approval(_ownerOf[id], spender, id);
    }

    /// @notice ERC721 method to set allowance. Only allowed to controller.
    /// @dev Prevent approvals on marketplaces & other contracts.
    function setApprovalForAll(address operator, bool approved) public override onlyController {
        isApprovedForAll[msg.sender][operator] = approved;

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

    /// @notice Allows controller to transfer a passport (id) between two addresses.
    /// @param from Current owner of the token.
    /// @param to Recipient of the token.
    /// @param id Token to transfer.
    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public override onlyController {
        if (from != _ownerOf[id]) revert InvalidFrom();
        if (to == address(0)) revert TargetIsZeroAddress();

        unchecked {
            _balanceOf[from]--;
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;
        _timestampOf[id] = block.timestamp;
        _signerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    /// @notice Allows controller to safe transfer a passport (id) between two address.
    /// @param from Curent owner of the token.
    /// @param to Recipient of the token.
    /// @param id Token to transfer.
    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public override onlyController {
        transferFrom(from, to, id);

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

    /// @notice Allows controller to safe transfer a passport (id) between two address.
    /// @param from Curent owner of the token.
    /// @param to Recipient of the token.
    /// @param id Token to transfer.
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public override onlyController {
        transferFrom(from, to, id);

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

    /// @notice Mints a new passport to the recipient.
    /// @param to Token recipient.
    /// @dev Id is auto assigned.
    function mint(address to) external virtual onlyController returns (uint256 tokenId) {
        tokenId = _idTracker;
        _mint(to, tokenId);

        // Realistically won't overflow;
        unchecked {
            _timestampOf[tokenId] = block.timestamp;
            _signerOf[tokenId] = to;
            _idTracker++;
            _supply++;
        }
    }

    /// @notice Mints a new passport to the recipient.
    /// @param to Token recipient.
    /// @dev Id is auto assigned.
    function safeMint(address to) external virtual onlyController returns (uint256 tokenId) {
        tokenId = _idTracker;
        _safeMint(to, tokenId);

        // Realistically won't overflow;
        unchecked {
            _timestampOf[tokenId] = block.timestamp;
            _signerOf[tokenId] = to;
            _idTracker++;
            _supply++;
        }
    }

    /// @notice Burns the specified token.
    /// @param id Token to burn.
    function burn(uint256 id) external virtual onlyController {
        _burn(id);

        // Would have reverted before if the token wasnt minted
        unchecked {
            delete _timestampOf[id];
            delete _signerOf[id];
            _supply--;
        }
    }

    /*///////////////////////////////////////////////////////////////
                       ADMIN ACTIONS
    //////////////////////////////////////////////////////////////*/

    /// @notice Allows the owner to update the renderer contract.
    /// @param _renderer New renderer address.
    function setRenderer(Renderer _renderer) external virtual onlyOwner {
        renderer = _renderer;
    }

    /// @notice Allows the owner to withdraw any ERC20 sent to the contract.
    /// @param token Token to withdraw.
    /// @param to Recipient address of the tokens.
    function recoverTokens(ERC20 token, address to) external virtual onlyOwner returns (uint256 amount) {
        amount = token.balanceOf(address(this));
        token.safeTransfer(to, amount);
    }
}

File 2 of 7 : Renderer.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity =0.8.10;

import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";

contract Renderer {
    function render(
        uint256 tokenId,
        address owner,
        uint256 timestamp
    ) public view virtual returns (string memory tokenURI) {
        string memory name = Strings.toString(uint256(uint160(owner)));
        tokenURI = string(abi.encodePacked(Strings.toString(tokenId),'-',name,'-',Strings.toString(timestamp)));
    }
}

File 3 of 7 : Controlled.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity =0.8.10;

/// @notice Minimal implementation of access control mechanism with two roles (owner & controller)
/// @dev Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol)
contract Controlled {
    /*///////////////////////////////////////////////////////////////
                                 ERRORS
    //////////////////////////////////////////////////////////////*/

    error CallerIsNotAuthorized();
    error TargetIsZeroAddress();

    /*///////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event ControlTransferred(address indexed previousController, address indexed newController);

    /*///////////////////////////////////////////////////////////////
                             ROLES STORAGE
    //////////////////////////////////////////////////////////////*/

    address private _owner;
    address private _controller;

    /*///////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor() {
        _transferOwnership(msg.sender);
        _transferControl(msg.sender);
    }

    /*///////////////////////////////////////////////////////////////
                               MODIFIERS
    //////////////////////////////////////////////////////////////*/

    modifier onlyOwner() {
        if (_owner != msg.sender) revert CallerIsNotAuthorized();
        _;
    }

    modifier onlyController() {
        if (_controller != msg.sender) revert CallerIsNotAuthorized();
        _;
    }

    modifier onlyOwnerOrController() {
        if (_owner != msg.sender && _controller != msg.sender) revert CallerIsNotAuthorized();
        _;
    }

    /*///////////////////////////////////////////////////////////////
                                VIEWS
    //////////////////////////////////////////////////////////////*/

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function controller() public view virtual returns (address) {
        return _controller;
    }

    /*///////////////////////////////////////////////////////////////
                               ACTIONS
    //////////////////////////////////////////////////////////////*/

    function renounceOwnership() external virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function removeControl() external virtual onlyOwnerOrController {
        _transferControl(address(0));
    }

    function transferOwnership(address newOwner) external virtual onlyOwner {
        if (newOwner == address(0)) revert TargetIsZeroAddress();
        _transferOwnership(newOwner);
    }

    function transferControl(address newController) external virtual onlyOwnerOrController {
        if (newController == address(0)) revert TargetIsZeroAddress();
        _transferControl(newController);
    }

    /*///////////////////////////////////////////////////////////////
                            INTERNAL LOGIC
    //////////////////////////////////////////////////////////////*/

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    function _transferControl(address newController) internal virtual {
        address oldController = _controller;
        _controller = newController;
        emit ControlTransferred(oldController, newController);
    }
}

File 4 of 7 : SafeTransferLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
            mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

File 5 of 7 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*//////////////////////////////////////////////////////////////
                         METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

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

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

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

    function _burn(uint256 id) internal virtual {
        address owner = _ownerOf[id];

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _ownerOf[id];

        delete getApproved[id];

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

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

File 6 of 7 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

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

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

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

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

File 7 of 7 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @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] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CallerIsNotAuthorized","type":"error"},{"inputs":[],"name":"InvalidFrom","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[],"name":"NotMinted","type":"error"},{"inputs":[],"name":"NotSafeRecipient","type":"error"},{"inputs":[],"name":"TargetIsZeroAddress","type":"error"},{"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":"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":"previousController","type":"address"},{"indexed":true,"internalType":"address","name":"newController","type":"address"}],"name":"ControlTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","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":[{"internalType":"contract ERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"recoverTokens","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeControl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renderer","outputs":[{"internalType":"contract Renderer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"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":"contract Renderer","name":"_renderer","type":"address"}],"name":"setRenderer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"signerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"timestampOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"newController","type":"address"}],"name":"transferControl","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162001af638038062001af68339810160408190526200003491620002a1565b8151829082906200004d9060009060208501906200012e565b508051620000639060019060208401906200012e565b50505062000077336200008a60201b60201c565b6200008233620000dc565b505062000348565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fa06677f7b64342b4bcbde423684dbdb5356acfe41ad0285b6ecbe6dc4bf427f290600090a35050565b8280546200013c906200030b565b90600052602060002090601f016020900481019282620001605760008555620001ab565b82601f106200017b57805160ff1916838001178555620001ab565b82800160010185558215620001ab579182015b82811115620001ab5782518255916020019190600101906200018e565b50620001b9929150620001bd565b5090565b5b80821115620001b95760008155600101620001be565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001fc57600080fd5b81516001600160401b0380821115620002195762000219620001d4565b604051601f8301601f19908116603f01168101908282118183101715620002445762000244620001d4565b816040528381526020925086838588010111156200026157600080fd5b600091505b8382101562000285578582018301518183018401529082019062000266565b83821115620002975760008385830101525b9695505050505050565b60008060408385031215620002b557600080fd5b82516001600160401b0380821115620002cd57600080fd5b620002db86838701620001ea565b93506020850151915080821115620002f257600080fd5b506200030185828601620001ea565b9150509250929050565b600181811c908216806200032057607f821691505b602082108114156200034257634e487b7160e01b600052602260045260246000fd5b50919050565b61179e80620003586000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80636d16fa411161010457806395d89b41116100a2578063c87b56dd11610071578063c87b56dd146103e9578063e985e9c5146103fc578063f2fde38b1461042a578063f77c47911461043d57600080fd5b806395d89b41146103b3578063a22cb465146103bb578063b88d4fde146103ce578063bc968326146103e157600080fd5b80637bee684b116100de5780637bee684b14610374578063852679071461037c5780638ada6b0f1461038f5780638da5cb5b146103a257600080fd5b80636d16fa411461034657806370a0823114610359578063715018a61461036c57600080fd5b80632d9c77e11161017c5780635161fdf51161014b5780635161fdf5146102fa57806356d3163d1461030d5780636352211e146103205780636a6278421461033357600080fd5b80632d9c77e1146102ae57806340d097c3146102c157806342842e0e146102d457806342966c68146102e757600080fd5b8063081812fc116101b8578063081812fc1461023d578063095ea7b31461027e57806318160ddd1461029357806323b872dd1461029b57600080fd5b806301ffc9a7146101df578063056097ac1461020757806306fdde0314610228575b600080fd5b6101f26101ed366004611375565b61044e565b60405190151581526020015b60405180910390f35b61021a6102153660046113ae565b6104a0565b6040519081526020016101fe565b61023061054c565b6040516101fe9190611413565b61026661024b366004611446565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101fe565b61029161028c36600461145f565b6105da565b005b60095461021a565b6102916102a936600461148b565b61066c565b61021a6102bc366004611446565b6107a0565b61021a6102cf3660046114cc565b6107e8565b6102916102e236600461148b565b610876565b6102916102f5366004611446565b61097b565b610266610308366004611446565b6109e4565b61029161031b3660046114cc565b610a35565b61026661032e366004611446565b610a82565b61021a6103413660046114cc565b610ade565b6102916103543660046114cc565b610b1a565b61021a6103673660046114cc565b610b91565b610291610bf4565b610291610c2b565b61029161038a3660046114e9565b610c79565b600854610266906001600160a01b031681565b6006546001600160a01b0316610266565b610230610cde565b6102916103c936600461150e565b610ceb565b6102916103dc366004611541565b610d82565b600a5461021a565b6102306103f7366004611446565b610e77565b6101f261040a3660046113ae565b600560209081526000928352604080842090915290825290205460ff1681565b6102916104383660046114cc565b610f17565b6007546001600160a01b0316610266565b60006301ffc9a760e01b6001600160e01b03198316148061047f57506380ac58cd60e01b6001600160e01b03198316145b8061049a5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6006546000906001600160a01b031633146104ce57604051632e57521560e01b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015610512573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053691906115e0565b905061049a6001600160a01b0384168383610f72565b60008054610559906115f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610585906115f9565b80156105d25780601f106105a7576101008083540402835291602001916105d2565b820191906000526020600020905b8154815290600101906020018083116105b557829003601f168201915b505050505081565b6007546001600160a01b0316331461060557604051632e57521560e01b815260040160405180910390fd5b600081815260046020908152604080832080546001600160a01b0319166001600160a01b038781169182179092556002909352818420549151859492909116917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050565b6007546001600160a01b0316331461069757604051632e57521560e01b815260040160405180910390fd5b6000818152600260205260409020546001600160a01b038481169116146106d15760405163104ca12160e11b815260040160405180910390fd5b6001600160a01b0382166106f857604051631b8fe22360e01b815260040160405180910390fd5b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600b8352858420429055600c83528584208054821683179055600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600260205260408120546001600160a01b03166107d557604051634d5e5fb360e01b815260040160405180910390fd5b506000908152600b602052604090205490565b6007546000906001600160a01b0316331461081657604051632e57521560e01b815260040160405180910390fd5b50600a546108248282610ff0565b6000818152600b60209081526040808320429055600c909152902080546001600160a01b0319166001600160a01b039390931692909217909155600a8054600190810190915560098054909101905590565b6007546001600160a01b031633146108a157604051632e57521560e01b815260040160405180910390fd5b6108ac83838361066c565b6001600160a01b0382163b158015906109585750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b9190611634565b6001600160e01b03191614155b1561097657604051630ca72d9160e31b815260040160405180910390fd5b505050565b6007546001600160a01b031633146109a657604051632e57521560e01b815260040160405180910390fd5b6109af816110e3565b6000908152600b60209081526040808320839055600c909152902080546001600160a01b031916905560098054600019019055565b6000818152600260205260408120546001600160a01b0316610a1957604051634d5e5fb360e01b815260040160405180910390fd5b506000908152600c60205260409020546001600160a01b031690565b6006546001600160a01b03163314610a6057604051632e57521560e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260409020546001600160a01b031680610ad95760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b60448201526064015b60405180910390fd5b919050565b6007546000906001600160a01b03163314610b0c57604051632e57521560e01b815260040160405180910390fd5b50600a5461082482826111b0565b6006546001600160a01b03163314801590610b4057506007546001600160a01b03163314155b15610b5e57604051632e57521560e01b815260040160405180910390fd5b6001600160a01b038116610b8557604051631b8fe22360e01b815260040160405180910390fd5b610b8e816112bb565b50565b60006001600160a01b038216610bd85760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610ad0565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610c1f57604051632e57521560e01b815260040160405180910390fd5b610c29600061130d565b565b6006546001600160a01b03163314801590610c5157506007546001600160a01b03163314155b15610c6f57604051632e57521560e01b815260040160405180910390fd5b610c2960006112bb565b6000828152600260205260409020546001600160a01b03163314610cb05760405163ea8e4eb560e01b815260040160405180910390fd5b6000918252600c602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b60018054610559906115f9565b6007546001600160a01b03163314610d1657604051632e57521560e01b815260040160405180910390fd5b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b03163314610dad57604051632e57521560e01b815260040160405180910390fd5b610db885858561066c565b6001600160a01b0384163b15801590610e525750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610e029033908a90899089908990600401611651565b6020604051808303816000875af1158015610e21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e459190611634565b6001600160e01b03191614155b15610e7057604051630ca72d9160e31b815260040160405180910390fd5b5050505050565b6008546060906001600160a01b0316635bdd141f83610e9581610a82565b610e9e866107a0565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b0390911660248301526044820152606401600060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261049a91908101906116bb565b6006546001600160a01b03163314610f4257604051632e57521560e01b815260040160405180910390fd5b6001600160a01b038116610f6957604051631b8fe22360e01b815260040160405180910390fd5b610b8e8161130d565b600060405163a9059cbb60e01b8152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080610fea5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610ad0565b50505050565b610ffa82826111b0565b6001600160a01b0382163b15806110a05750604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af1158015611070573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110949190611634565b6001600160e01b031916145b6110df5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610ad0565b5050565b6000818152600260205260409020546001600160a01b0316806111355760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610ad0565b6001600160a01b038116600081815260036020908152604080832080546000190190558583526002825280832080546001600160a01b031990811690915560049092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b0382166111fa5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610ad0565b6000818152600260205260409020546001600160a01b0316156112505760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610ad0565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fa06677f7b64342b4bcbde423684dbdb5356acfe41ad0285b6ecbe6dc4bf427f290600090a35050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160e01b031981168114610b8e57600080fd5b60006020828403121561138757600080fd5b81356113928161135f565b9392505050565b6001600160a01b0381168114610b8e57600080fd5b600080604083850312156113c157600080fd5b82356113cc81611399565b915060208301356113dc81611399565b809150509250929050565b60005b838110156114025781810151838201526020016113ea565b83811115610fea5750506000910152565b60208152600082518060208401526114328160408501602087016113e7565b601f01601f19169190910160400192915050565b60006020828403121561145857600080fd5b5035919050565b6000806040838503121561147257600080fd5b823561147d81611399565b946020939093013593505050565b6000806000606084860312156114a057600080fd5b83356114ab81611399565b925060208401356114bb81611399565b929592945050506040919091013590565b6000602082840312156114de57600080fd5b813561139281611399565b600080604083850312156114fc57600080fd5b8235915060208301356113dc81611399565b6000806040838503121561152157600080fd5b823561152c81611399565b9150602083013580151581146113dc57600080fd5b60008060008060006080868803121561155957600080fd5b853561156481611399565b9450602086013561157481611399565b935060408601359250606086013567ffffffffffffffff8082111561159857600080fd5b818801915088601f8301126115ac57600080fd5b8135818111156115bb57600080fd5b8960208285010111156115cd57600080fd5b9699959850939650602001949392505050565b6000602082840312156115f257600080fd5b5051919050565b600181811c9082168061160d57607f821691505b6020821081141561162e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561164657600080fd5b81516113928161135f565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156116cd57600080fd5b815167ffffffffffffffff808211156116e557600080fd5b818401915084601f8301126116f957600080fd5b81518181111561170b5761170b6116a5565b604051601f8201601f19908116603f01168101908382118183101715611733576117336116a5565b8160405282815287602084870101111561174c57600080fd5b61175d8360208301602088016113e7565b97965050505050505056fea26469706673582212205d6bbec668bf6248ac6187a5739646c475750e9a3c31018e4295a61c5821e46864736f6c634300080a00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000184e6174696f6e332047656e657369732050617373706f7274000000000000000000000000000000000000000000000000000000000000000000000000000000055041535333000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80636d16fa411161010457806395d89b41116100a2578063c87b56dd11610071578063c87b56dd146103e9578063e985e9c5146103fc578063f2fde38b1461042a578063f77c47911461043d57600080fd5b806395d89b41146103b3578063a22cb465146103bb578063b88d4fde146103ce578063bc968326146103e157600080fd5b80637bee684b116100de5780637bee684b14610374578063852679071461037c5780638ada6b0f1461038f5780638da5cb5b146103a257600080fd5b80636d16fa411461034657806370a0823114610359578063715018a61461036c57600080fd5b80632d9c77e11161017c5780635161fdf51161014b5780635161fdf5146102fa57806356d3163d1461030d5780636352211e146103205780636a6278421461033357600080fd5b80632d9c77e1146102ae57806340d097c3146102c157806342842e0e146102d457806342966c68146102e757600080fd5b8063081812fc116101b8578063081812fc1461023d578063095ea7b31461027e57806318160ddd1461029357806323b872dd1461029b57600080fd5b806301ffc9a7146101df578063056097ac1461020757806306fdde0314610228575b600080fd5b6101f26101ed366004611375565b61044e565b60405190151581526020015b60405180910390f35b61021a6102153660046113ae565b6104a0565b6040519081526020016101fe565b61023061054c565b6040516101fe9190611413565b61026661024b366004611446565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101fe565b61029161028c36600461145f565b6105da565b005b60095461021a565b6102916102a936600461148b565b61066c565b61021a6102bc366004611446565b6107a0565b61021a6102cf3660046114cc565b6107e8565b6102916102e236600461148b565b610876565b6102916102f5366004611446565b61097b565b610266610308366004611446565b6109e4565b61029161031b3660046114cc565b610a35565b61026661032e366004611446565b610a82565b61021a6103413660046114cc565b610ade565b6102916103543660046114cc565b610b1a565b61021a6103673660046114cc565b610b91565b610291610bf4565b610291610c2b565b61029161038a3660046114e9565b610c79565b600854610266906001600160a01b031681565b6006546001600160a01b0316610266565b610230610cde565b6102916103c936600461150e565b610ceb565b6102916103dc366004611541565b610d82565b600a5461021a565b6102306103f7366004611446565b610e77565b6101f261040a3660046113ae565b600560209081526000928352604080842090915290825290205460ff1681565b6102916104383660046114cc565b610f17565b6007546001600160a01b0316610266565b60006301ffc9a760e01b6001600160e01b03198316148061047f57506380ac58cd60e01b6001600160e01b03198316145b8061049a5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6006546000906001600160a01b031633146104ce57604051632e57521560e01b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015610512573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053691906115e0565b905061049a6001600160a01b0384168383610f72565b60008054610559906115f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610585906115f9565b80156105d25780601f106105a7576101008083540402835291602001916105d2565b820191906000526020600020905b8154815290600101906020018083116105b557829003601f168201915b505050505081565b6007546001600160a01b0316331461060557604051632e57521560e01b815260040160405180910390fd5b600081815260046020908152604080832080546001600160a01b0319166001600160a01b038781169182179092556002909352818420549151859492909116917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050565b6007546001600160a01b0316331461069757604051632e57521560e01b815260040160405180910390fd5b6000818152600260205260409020546001600160a01b038481169116146106d15760405163104ca12160e11b815260040160405180910390fd5b6001600160a01b0382166106f857604051631b8fe22360e01b815260040160405180910390fd5b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600b8352858420429055600c83528584208054821683179055600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600260205260408120546001600160a01b03166107d557604051634d5e5fb360e01b815260040160405180910390fd5b506000908152600b602052604090205490565b6007546000906001600160a01b0316331461081657604051632e57521560e01b815260040160405180910390fd5b50600a546108248282610ff0565b6000818152600b60209081526040808320429055600c909152902080546001600160a01b0319166001600160a01b039390931692909217909155600a8054600190810190915560098054909101905590565b6007546001600160a01b031633146108a157604051632e57521560e01b815260040160405180910390fd5b6108ac83838361066c565b6001600160a01b0382163b158015906109585750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b9190611634565b6001600160e01b03191614155b1561097657604051630ca72d9160e31b815260040160405180910390fd5b505050565b6007546001600160a01b031633146109a657604051632e57521560e01b815260040160405180910390fd5b6109af816110e3565b6000908152600b60209081526040808320839055600c909152902080546001600160a01b031916905560098054600019019055565b6000818152600260205260408120546001600160a01b0316610a1957604051634d5e5fb360e01b815260040160405180910390fd5b506000908152600c60205260409020546001600160a01b031690565b6006546001600160a01b03163314610a6057604051632e57521560e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260409020546001600160a01b031680610ad95760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b60448201526064015b60405180910390fd5b919050565b6007546000906001600160a01b03163314610b0c57604051632e57521560e01b815260040160405180910390fd5b50600a5461082482826111b0565b6006546001600160a01b03163314801590610b4057506007546001600160a01b03163314155b15610b5e57604051632e57521560e01b815260040160405180910390fd5b6001600160a01b038116610b8557604051631b8fe22360e01b815260040160405180910390fd5b610b8e816112bb565b50565b60006001600160a01b038216610bd85760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610ad0565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610c1f57604051632e57521560e01b815260040160405180910390fd5b610c29600061130d565b565b6006546001600160a01b03163314801590610c5157506007546001600160a01b03163314155b15610c6f57604051632e57521560e01b815260040160405180910390fd5b610c2960006112bb565b6000828152600260205260409020546001600160a01b03163314610cb05760405163ea8e4eb560e01b815260040160405180910390fd5b6000918252600c602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b60018054610559906115f9565b6007546001600160a01b03163314610d1657604051632e57521560e01b815260040160405180910390fd5b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b03163314610dad57604051632e57521560e01b815260040160405180910390fd5b610db885858561066c565b6001600160a01b0384163b15801590610e525750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610e029033908a90899089908990600401611651565b6020604051808303816000875af1158015610e21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e459190611634565b6001600160e01b03191614155b15610e7057604051630ca72d9160e31b815260040160405180910390fd5b5050505050565b6008546060906001600160a01b0316635bdd141f83610e9581610a82565b610e9e866107a0565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b0390911660248301526044820152606401600060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261049a91908101906116bb565b6006546001600160a01b03163314610f4257604051632e57521560e01b815260040160405180910390fd5b6001600160a01b038116610f6957604051631b8fe22360e01b815260040160405180910390fd5b610b8e8161130d565b600060405163a9059cbb60e01b8152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080610fea5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610ad0565b50505050565b610ffa82826111b0565b6001600160a01b0382163b15806110a05750604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af1158015611070573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110949190611634565b6001600160e01b031916145b6110df5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610ad0565b5050565b6000818152600260205260409020546001600160a01b0316806111355760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610ad0565b6001600160a01b038116600081815260036020908152604080832080546000190190558583526002825280832080546001600160a01b031990811690915560049092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b0382166111fa5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610ad0565b6000818152600260205260409020546001600160a01b0316156112505760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610ad0565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fa06677f7b64342b4bcbde423684dbdb5356acfe41ad0285b6ecbe6dc4bf427f290600090a35050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160e01b031981168114610b8e57600080fd5b60006020828403121561138757600080fd5b81356113928161135f565b9392505050565b6001600160a01b0381168114610b8e57600080fd5b600080604083850312156113c157600080fd5b82356113cc81611399565b915060208301356113dc81611399565b809150509250929050565b60005b838110156114025781810151838201526020016113ea565b83811115610fea5750506000910152565b60208152600082518060208401526114328160408501602087016113e7565b601f01601f19169190910160400192915050565b60006020828403121561145857600080fd5b5035919050565b6000806040838503121561147257600080fd5b823561147d81611399565b946020939093013593505050565b6000806000606084860312156114a057600080fd5b83356114ab81611399565b925060208401356114bb81611399565b929592945050506040919091013590565b6000602082840312156114de57600080fd5b813561139281611399565b600080604083850312156114fc57600080fd5b8235915060208301356113dc81611399565b6000806040838503121561152157600080fd5b823561152c81611399565b9150602083013580151581146113dc57600080fd5b60008060008060006080868803121561155957600080fd5b853561156481611399565b9450602086013561157481611399565b935060408601359250606086013567ffffffffffffffff8082111561159857600080fd5b818801915088601f8301126115ac57600080fd5b8135818111156115bb57600080fd5b8960208285010111156115cd57600080fd5b9699959850939650602001949392505050565b6000602082840312156115f257600080fd5b5051919050565b600181811c9082168061160d57607f821691505b6020821081141561162e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561164657600080fd5b81516113928161135f565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156116cd57600080fd5b815167ffffffffffffffff808211156116e557600080fd5b818401915084601f8301126116f957600080fd5b81518181111561170b5761170b6116a5565b604051601f8201601f19908116603f01168101908382118183101715611733576117336116a5565b8160405282815287602084870101111561174c57600080fd5b61175d8360208301602088016113e7565b97965050505050505056fea26469706673582212205d6bbec668bf6248ac6187a5739646c475750e9a3c31018e4295a61c5821e46864736f6c634300080a0033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000184e6174696f6e332047656e657369732050617373706f7274000000000000000000000000000000000000000000000000000000000000000000000000000000055041535333000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Nation3 Genesis Passport
Arg [1] : _symbol (string): PASS3

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [3] : 4e6174696f6e332047656e657369732050617373706f72740000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 5041535333000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

876:8372:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4711:335:2;;;;;;:::i;:::-;;:::i;:::-;;;565:14:7;;558:22;540:41;;528:2;513:18;4711:335:2;;;;;;;;9050:196:4;;;;;;:::i;:::-;;:::i;:::-;;;1301:25:7;;;1289:2;1274:18;9050:196:4;1155:177:7;896:18:2;;;:::i;:::-;;;;;;;:::i;1841:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1841:46:2;;;;;;-1:-1:-1;;;;;2337:32:7;;;2319:51;;2307:2;2292:18;1841:46:2;2173:203:7;4610:170:4;;;;;;:::i;:::-;;:::i;:::-;;2399:94;2479:7;;2399:94;;5365:508;;;;;;:::i;:::-;;:::i;2752:171::-;;;;;;:::i;:::-;;:::i;7752:368::-;;;;;;:::i;:::-;;:::i;6093:394::-;;;;;;:::i;:::-;;:::i;8202:273::-;;;;;;:::i;:::-;;:::i;3036:167::-;;;;;;:::i;:::-;;:::i;8771:105::-;;;;;;:::i;:::-;;:::i;1324:149:2:-;;;;;;:::i;:::-;;:::i;7262:360:4:-;;;;;;:::i;:::-;;:::i;2999:206:6:-;;;;;;:::i;:::-;;:::i;1479:168:2:-;;;;;;:::i;:::-;;:::i;2586:103:6:-;;;:::i;2695:109::-;;;:::i;4113:167:4:-;;;;;;:::i;:::-;;:::i;1644:24::-;;;;;-1:-1:-1;;;;;1644:24:4;;;2215:85:6;2287:6;;-1:-1:-1;;;;;2287:6:6;2215:85;;921:20:2;;;:::i;4928:219:4:-;;;;;;:::i;:::-;;:::i;6707:425::-;;;;;;:::i;:::-;;:::i;2537:95::-;2615:10;;2537:95;;3312:148;;;;;;:::i;:::-;;:::i;1894:68:2:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2810:183:6;;;;;;:::i;:::-;;:::i;2306:95::-;2383:11;;-1:-1:-1;;;;;2383:11:6;2306:95;;4711:335:2;4787:4;-1:-1:-1;;;;;;;;;4822:25:2;;;;:100;;-1:-1:-1;;;;;;;;;;4897:25:2;;;4822:100;:175;;;-1:-1:-1;;;;;;;;;;4972:25:2;;;4822:175;4803:194;4711:335;-1:-1:-1;;4711:335:2:o;9050:196:4:-;1688:6:6;;9134:14:4;;-1:-1:-1;;;;;1688:6:6;1698:10;1688:20;1684:56;;1717:23;;-1:-1:-1;;;1717:23:6;;;;;;;;;;;1684:56;9169:30:4::1;::::0;-1:-1:-1;;;9169:30:4;;9193:4:::1;9169:30;::::0;::::1;2319:51:7::0;-1:-1:-1;;;;;9169:15:4;::::1;::::0;::::1;::::0;2292:18:7;;9169:30:4::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9160:39:::0;-1:-1:-1;9209:30:4::1;-1:-1:-1::0;;;;;9209:18:4;::::1;9228:2:::0;9160:39;9209:18:::1;:30::i;896:18:2:-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4610:170:4:-;1804:11:6;;-1:-1:-1;;;;;1804:11:6;1819:10;1804:25;1800:61;;1838:23;;-1:-1:-1;;;1838:23:6;;;;;;;;;;;1800:61;4697:15:4::1;::::0;;;:11:::1;:15;::::0;;;;;;;:25;;-1:-1:-1;;;;;;4697:25:4::1;-1:-1:-1::0;;;;;4697:25:4;;::::1;::::0;;::::1;::::0;;;4747:8:::1;:12:::0;;;;;;;4738:35;;4697:15;;4747:12;;;::::1;::::0;4738:35:::1;::::0;::::1;4610:170:::0;;:::o;5365:508::-;1804:11:6;;-1:-1:-1;;;;;1804:11:6;1819:10;1804:25;1800:61;;1838:23;;-1:-1:-1;;;1838:23:6;;;;;;;;;;;1800:61;5508:12:4::1;::::0;;;:8:::1;:12;::::0;;;;;-1:-1:-1;;;;;5500:20:4;;::::1;5508:12:::0;::::1;5500:20;5496:46;;5529:13;;-1:-1:-1::0;;;5529:13:4::1;;;;;;;;;;;5496:46;-1:-1:-1::0;;;;;5556:16:4;::::1;5552:50;;5581:21;;-1:-1:-1::0;;;5581:21:4::1;;;;;;;;;;;5552:50;-1:-1:-1::0;;;;;5637:16:4;;::::1;;::::0;;;:10:::1;:16;::::0;;;;;;;:18;;-1:-1:-1;;5637:18:4;;;5669:14;;::::1;::::0;;;;;;:16;;5637:18:::1;5669:16;::::0;;5706:12;;;:8:::1;:12:::0;;;;;:17;;-1:-1:-1;;;;;;5706:17:4;;::::1;::::0;::::1;::::0;;;5733:12:::1;:16:::0;;;;;5752:15:::1;5733:34:::0;;5777:9:::1;:13:::0;;;;;:18;;;::::1;::::0;::::1;::::0;;5813:11:::1;:15:::0;;;;;;5806:22;;;;::::1;::::0;;;5844;;5715:2;;5669:14;5637:16;5844:22:::1;::::0;::::1;5365:508:::0;;;:::o;2752:171::-;2814:7;2837:12;;;:8;:12;;;;;;-1:-1:-1;;;;;2837:12:4;2833:50;;2872:11;;-1:-1:-1;;;2872:11:4;;;;;;;;;;;2833:50;-1:-1:-1;2900:16:4;;;;:12;:16;;;;;;;2752:171::o;7752:368::-;1804:11:6;;7823:15:4;;-1:-1:-1;;;;;1804:11:6;1819:10;1804:25;1800:61;;1838:23;;-1:-1:-1;;;1838:23:6;;;;;;;;;;;1800:61;-1:-1:-1;7860:10:4::1;::::0;7880:22:::1;7890:2:::0;7860:10;7880:9:::1;:22::i;:::-;7978:21;::::0;;;:12:::1;:21;::::0;;;;;;;8002:15:::1;7978:39:::0;;8031:9:::1;:18:::0;;;;;:23;;-1:-1:-1;;;;;;8031:23:4::1;-1:-1:-1::0;;;;;8031:23:4;;;::::1;::::0;;;::::1;::::0;;;8068:10:::1;:12:::0;;-1:-1:-1;8068:12:4;;::::1;::::0;;;8094:7:::1;:9:::0;;;;::::1;::::0;;7978:21;7752:368::o;6093:394::-;1804:11:6;;-1:-1:-1;;;;;1804:11:6;1819:10;1804:25;1800:61;;1838:23;;-1:-1:-1;;;1838:23:6;;;;;;;;;;;1800:61;6228:26:4::1;6241:4;6247:2;6251;6228:12;:26::i;:::-;-1:-1:-1::0;;;;;6282:14:4;::::1;;:19:::0;;::::1;::::0;:162:::1;;-1:-1:-1::0;6317:66:4::1;::::0;-1:-1:-1;;;6317:66:4;;;6358:10:::1;6317:66;::::0;::::1;6939:34:7::0;-1:-1:-1;;;;;7009:15:7;;;6989:18;;;6982:43;7041:18;;;7034:34;;;7104:3;7084:18;;;7077:31;-1:-1:-1;7124:19:7;;;7117:30;6399:45:4;;6317:40;;::::1;::::0;6399:45:::1;::::0;7164:19:7;;6317:66:4::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;6317:127:4::1;;;6282:162;6265:215;;;6462:18;;-1:-1:-1::0;;;6462:18:4::1;;;;;;;;;;;6265:215;6093:394:::0;;;:::o;8202:273::-;1804:11:6;;-1:-1:-1;;;;;1804:11:6;1819:10;1804:25;1800:61;;1838:23;;-1:-1:-1;;;1838:23:6;;;;;;;;;;;1800:61;8270:9:4::1;8276:2;8270:5;:9::i;:::-;8385:16;::::0;;;:12:::1;:16;::::0;;;;;;;8378:23;;;8422:9:::1;:13:::0;;;;;8415:20;;-1:-1:-1;;;;;;8415:20:4::1;::::0;;8449:7:::1;:9:::0;;-1:-1:-1;;8449:9:4;;;8202:273::o;3036:167::-;3097:7;3120:12;;;:8;:12;;;;;;-1:-1:-1;;;;;3120:12:4;3116:50;;3155:11;;-1:-1:-1;;;3155:11:4;;;;;;;;;;;3116:50;-1:-1:-1;3183:13:4;;;;:9;:13;;;;;;-1:-1:-1;;;;;3183:13:4;;3036:167::o;8771:105::-;1688:6:6;;-1:-1:-1;;;;;1688:6:6;1698:10;1688:20;1684:56;;1717:23;;-1:-1:-1;;;1717:23:6;;;;;;;;;;;1684:56;8849:8:4::1;:20:::0;;-1:-1:-1;;;;;;8849:20:4::1;-1:-1:-1::0;;;;;8849:20:4;;;::::1;::::0;;;::::1;::::0;;8771:105::o;1324:149:2:-;1382:13;1424:12;;;:8;:12;;;;;;-1:-1:-1;;;;;1424:12:2;1415:36;1407:59;;;;-1:-1:-1;;;1407:59:2;;7650:2:7;1407:59:2;;;7632:21:7;7689:2;7669:18;;;7662:30;-1:-1:-1;;;7708:18:7;;;7701:40;7758:18;;1407:59:2;;;;;;;;;1324:149;;;:::o;7262:360:4:-;1804:11:6;;7329:15:4;;-1:-1:-1;;;;;1804:11:6;1819:10;1804:25;1800:61;;1838:23;;-1:-1:-1;;;1838:23:6;;;;;;;;;;;1800:61;-1:-1:-1;7366:10:4::1;::::0;7386:18:::1;7392:2:::0;7366:10;7386:5:::1;:18::i;2999:206:6:-:0;1932:6;;-1:-1:-1;;;;;1932:6:6;1942:10;1932:20;;;;:49;;-1:-1:-1;1956:11:6;;-1:-1:-1;;;;;1956:11:6;1971:10;1956:25;;1932:49;1928:85;;;1990:23;;-1:-1:-1;;;1990:23:6;;;;;;;;;;;1928:85;-1:-1:-1;;;;;3100:27:6;::::1;3096:61;;3136:21;;-1:-1:-1::0;;;3136:21:6::1;;;;;;;;;;;3096:61;3167:31;3184:13;3167:16;:31::i;:::-;2999:206:::0;:::o;1479:168:2:-;1542:7;-1:-1:-1;;;;;1569:19:2;;1561:44;;;;-1:-1:-1;;;1561:44:2;;7989:2:7;1561:44:2;;;7971:21:7;8028:2;8008:18;;;8001:30;-1:-1:-1;;;8047:18:7;;;8040:42;8099:18;;1561:44:2;7787:336:7;1561:44:2;-1:-1:-1;;;;;;1623:17:2;;;;;:10;:17;;;;;;;1479:168::o;2586:103:6:-;1688:6;;-1:-1:-1;;;;;1688:6:6;1698:10;1688:20;1684:56;;1717:23;;-1:-1:-1;;;1717:23:6;;;;;;;;;;;1684:56;2652:30:::1;2679:1;2652:18;:30::i;:::-;2586:103::o:0;2695:109::-;1932:6;;-1:-1:-1;;;;;1932:6:6;1942:10;1932:20;;;;:49;;-1:-1:-1;1956:11:6;;-1:-1:-1;;;;;1956:11:6;1971:10;1956:25;;1932:49;1928:85;;;1990:23;;-1:-1:-1;;;1990:23:6;;;;;;;;;;;1928:85;2769:28:::1;2794:1;2769:16;:28::i;4113:167:4:-:0;4191:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;4191:12:4;4207:10;4191:26;4187:54;;4226:15;;-1:-1:-1;;;4226:15:4;;;;;;;;;;;4187:54;4251:13;;;;:9;:13;;;;;;:22;;-1:-1:-1;;;;;;4251:22:4;-1:-1:-1;;;;;4251:22:4;;;;;;;;;4113:167::o;921:20:2:-;;;;;;;:::i;4928:219:4:-;1804:11:6;;-1:-1:-1;;;;;1804:11:6;1819:10;1804:25;1800:61;;1838:23;;-1:-1:-1;;;1838:23:6;;;;;;;;;;;1800:61;5046:10:4::1;5029:28;::::0;;;:16:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;5029:38:4;::::1;::::0;;;;;;;;;;:49;;-1:-1:-1;;5029:49:4::1;::::0;::::1;;::::0;;::::1;::::0;;;5094:46;;540:41:7;;;5029:38:4;;5046:10;5094:46:::1;::::0;513:18:7;5094:46:4::1;;;;;;;4928:219:::0;;:::o;6707:425::-;1804:11:6;;-1:-1:-1;;;;;1804:11:6;1819:10;1804:25;1800:61;;1838:23;;-1:-1:-1;;;1838:23:6;;;;;;;;;;;1800:61;6871:26:4::1;6884:4;6890:2;6894;6871:12;:26::i;:::-;-1:-1:-1::0;;;;;6925:14:4;::::1;;:19:::0;;::::1;::::0;:164:::1;;-1:-1:-1::0;6960:68:4::1;::::0;-1:-1:-1;;;6960:68:4;;;7044:45;-1:-1:-1;;;;;6960:40:4;::::1;::::0;7044:45:::1;::::0;6960:68:::1;::::0;7001:10:::1;::::0;7013:4;;7019:2;;7023:4;;;;6960:68:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;6960:129:4::1;;;6925:164;6908:217;;;7107:18;;-1:-1:-1::0;;;7107:18:4::1;;;;;;;;;;;6908:217;6707:425:::0;;;;;:::o;3312:148::-;3404:8;;3372:13;;-1:-1:-1;;;;;3404:8:4;:15;3420:2;3424:11;3420:2;3424:7;:11::i;:::-;3437:15;3449:2;3437:11;:15::i;:::-;3404:49;;-1:-1:-1;;;;;;3404:49:4;;;;;;;;;;8997:25:7;;;;-1:-1:-1;;;;;9058:32:7;;;9038:18;;;9031:60;9107:18;;;9100:34;8970:18;;3404:49:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3404:49:4;;;;;;;;;;;;:::i;2810:183:6:-;1688:6;;-1:-1:-1;;;;;1688:6:6;1698:10;1688:20;1684:56;;1717:23;;-1:-1:-1;;;1717:23:6;;;;;;;;;;;1684:56;-1:-1:-1;;;;;2896:22:6;::::1;2892:56;;2927:21;;-1:-1:-1::0;;;2927:21:6::1;;;;;;;;;;;2892:56;2958:28;2977:8;2958:18;:28::i;2861:1456:3:-:0;2973:12;3100:4;3094:11;-1:-1:-1;;;3223:17:3;3216:93;3356:2;3352:1;3333:17;3329:25;3322:37;3436:6;3431:2;3412:17;3408:26;3401:42;4238:2;4235:1;4231:2;4212:17;4209:1;4202:5;4195;4190:51;3759:16;3752:24;3746:2;3728:16;3725:24;3721:1;3717;3711:8;3708:15;3704:46;3701:76;3501:754;3490:765;;;4283:7;4275:35;;;;-1:-1:-1;;;4275:35:3;;10368:2:7;4275:35:3;;;10350:21:7;10407:2;10387:18;;;10380:30;-1:-1:-1;;;10426:18:7;;;10419:45;10481:18;;4275:35:3;10166:339:7;4275:35:3;2963:1354;2861:1456;;;:::o;6182:340:2:-;6252:13;6258:2;6262;6252:5;:13::i;:::-;-1:-1:-1;;;;;6297:14:2;;;:19;;:176;;-1:-1:-1;6336:72:2;;-1:-1:-1;;;6336:72:2;;;6377:10;6336:72;;;6939:34:7;6397:1:2;6989:18:7;;;6982:43;;;7041:18;;;7034:34;;;7104:3;7084:18;;;7077:31;7124:19;;;7117:30;6428:45:2;-1:-1:-1;;;;;6336:40:2;;;6428:45;;7164:19:7;;6336:72:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;6336:137:2;;6297:176;6276:239;;;;-1:-1:-1;;;6276:239:2;;10712:2:7;6276:239:2;;;10694:21:7;10751:2;10731:18;;;10724:30;-1:-1:-1;;;10770:18:7;;;10763:46;10826:18;;6276:239:2;10510:340:7;6276:239:2;6182:340;;:::o;5617:371::-;5671:13;5687:12;;;:8;:12;;;;;;-1:-1:-1;;;;;5687:12:2;5718:19;5710:42;;;;-1:-1:-1;;;5710:42:2;;7650:2:7;5710:42:2;;;7632:21:7;7689:2;7669:18;;;7662:30;-1:-1:-1;;;7708:18:7;;;7701:40;7758:18;;5710:42:2;7448:334:7;5710:42:2;-1:-1:-1;;;;;5842:17:2;;;;;;:10;:17;;;;;;;;:19;;-1:-1:-1;;5842:19:2;;;5889:12;;;:8;:12;;;;;5882:19;;-1:-1:-1;;;;;;5882:19:2;;;;;;5919:11;:15;;;;;;5912:22;;;;;;;;5950:31;5898:2;;5842:17;5950:31;;5842:17;;5950:31;5661:327;5617:371;:::o;5240:::-;-1:-1:-1;;;;;5314:16:2;;5306:46;;;;-1:-1:-1;;;5306:46:2;;11057:2:7;5306:46:2;;;11039:21:7;11096:2;11076:18;;;11069:30;-1:-1:-1;;;11115:18:7;;;11108:47;11172:18;;5306:46:2;10855:341:7;5306:46:2;5395:1;5371:12;;;:8;:12;;;;;;-1:-1:-1;;;;;5371:12:2;:26;5363:53;;;;-1:-1:-1;;;5363:53:2;;11403:2:7;5363:53:2;;;11385:21:7;11442:2;11422:18;;;11415:30;-1:-1:-1;;;11461:18:7;;;11454:44;11515:18;;5363:53:2;11201:338:7;5363:53:2;-1:-1:-1;;;;;5506:14:2;;;;;;:10;:14;;;;;;;;:16;;;;;;5543:12;;;:8;:12;;;;;;:17;;-1:-1:-1;;;;;;5543:17:2;;;;;5576:28;5552:2;;5506:14;;5576:28;;5506:14;;5576:28;5240:371;;:::o;3587:218:6:-;3687:11;;;-1:-1:-1;;;;;3708:27:6;;;-1:-1:-1;;;;;;3708:27:6;;;;;;;3750:48;;3687:11;;;3708:27;3687:11;;3750:48;;3663:21;;3750:48;3653:152;3587:218;:::o;3394:187::-;3486:6;;;-1:-1:-1;;;;;3502:17:6;;;-1:-1:-1;;;;;;3502:17:6;;;;;;;3534:40;;3486:6;;;3502:17;3486:6;;3534:40;;3467:16;;3534:40;3457:124;3394:187;:::o;14:131:7:-;-1:-1:-1;;;;;;88:32:7;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:7:o;592:138::-;-1:-1:-1;;;;;674:31:7;;664:42;;654:70;;720:1;717;710:12;735:415;816:6;824;877:2;865:9;856:7;852:23;848:32;845:52;;;893:1;890;883:12;845:52;932:9;919:23;951:38;983:5;951:38;:::i;:::-;1008:5;-1:-1:-1;1065:2:7;1050:18;;1037:32;1078:40;1037:32;1078:40;:::i;:::-;1137:7;1127:17;;;735:415;;;;;:::o;1337:258::-;1409:1;1419:113;1433:6;1430:1;1427:13;1419:113;;;1509:11;;;1503:18;1490:11;;;1483:39;1455:2;1448:10;1419:113;;;1550:6;1547:1;1544:13;1541:48;;;-1:-1:-1;;1585:1:7;1567:16;;1560:27;1337:258::o;1600:383::-;1749:2;1738:9;1731:21;1712:4;1781:6;1775:13;1824:6;1819:2;1808:9;1804:18;1797:34;1840:66;1899:6;1894:2;1883:9;1879:18;1874:2;1866:6;1862:15;1840:66;:::i;:::-;1967:2;1946:15;-1:-1:-1;;1942:29:7;1927:45;;;;1974:2;1923:54;;1600:383;-1:-1:-1;;1600:383:7:o;1988:180::-;2047:6;2100:2;2088:9;2079:7;2075:23;2071:32;2068:52;;;2116:1;2113;2106:12;2068:52;-1:-1:-1;2139:23:7;;1988:180;-1:-1:-1;1988:180:7:o;2381:322::-;2449:6;2457;2510:2;2498:9;2489:7;2485:23;2481:32;2478:52;;;2526:1;2523;2516:12;2478:52;2565:9;2552:23;2584:38;2616:5;2584:38;:::i;:::-;2641:5;2693:2;2678:18;;;;2665:32;;-1:-1:-1;;;2381:322:7:o;2708:470::-;2785:6;2793;2801;2854:2;2842:9;2833:7;2829:23;2825:32;2822:52;;;2870:1;2867;2860:12;2822:52;2909:9;2896:23;2928:38;2960:5;2928:38;:::i;:::-;2985:5;-1:-1:-1;3042:2:7;3027:18;;3014:32;3055:40;3014:32;3055:40;:::i;:::-;2708:470;;3114:7;;-1:-1:-1;;;3168:2:7;3153:18;;;;3140:32;;2708:470::o;3183:254::-;3242:6;3295:2;3283:9;3274:7;3270:23;3266:32;3263:52;;;3311:1;3308;3301:12;3263:52;3350:9;3337:23;3369:38;3401:5;3369:38;:::i;3718:322::-;3786:6;3794;3847:2;3835:9;3826:7;3822:23;3818:32;3815:52;;;3863:1;3860;3853:12;3815:52;3899:9;3886:23;3876:33;;3959:2;3948:9;3944:18;3931:32;3972:38;4004:5;3972:38;:::i;4270:423::-;4335:6;4343;4396:2;4384:9;4375:7;4371:23;4367:32;4364:52;;;4412:1;4409;4402:12;4364:52;4451:9;4438:23;4470:38;4502:5;4470:38;:::i;:::-;4527:5;-1:-1:-1;4584:2:7;4569:18;;4556:32;4626:15;;4619:23;4607:36;;4597:64;;4657:1;4654;4647:12;4698:950;4795:6;4803;4811;4819;4827;4880:3;4868:9;4859:7;4855:23;4851:33;4848:53;;;4897:1;4894;4887:12;4848:53;4936:9;4923:23;4955:38;4987:5;4955:38;:::i;:::-;5012:5;-1:-1:-1;5069:2:7;5054:18;;5041:32;5082:40;5041:32;5082:40;:::i;:::-;5141:7;-1:-1:-1;5195:2:7;5180:18;;5167:32;;-1:-1:-1;5250:2:7;5235:18;;5222:32;5273:18;5303:14;;;5300:34;;;5330:1;5327;5320:12;5300:34;5368:6;5357:9;5353:22;5343:32;;5413:7;5406:4;5402:2;5398:13;5394:27;5384:55;;5435:1;5432;5425:12;5384:55;5475:2;5462:16;5501:2;5493:6;5490:14;5487:34;;;5517:1;5514;5507:12;5487:34;5562:7;5557:2;5548:6;5544:2;5540:15;5536:24;5533:37;5530:57;;;5583:1;5580;5573:12;5530:57;4698:950;;;;-1:-1:-1;4698:950:7;;-1:-1:-1;5614:2:7;5606:11;;5636:6;4698:950;-1:-1:-1;;;4698:950:7:o;6060:184::-;6130:6;6183:2;6171:9;6162:7;6158:23;6154:32;6151:52;;;6199:1;6196;6189:12;6151:52;-1:-1:-1;6222:16:7;;6060:184;-1:-1:-1;6060:184:7:o;6249:380::-;6328:1;6324:12;;;;6371;;;6392:61;;6446:4;6438:6;6434:17;6424:27;;6392:61;6499:2;6491:6;6488:14;6468:18;6465:38;6462:161;;;6545:10;6540:3;6536:20;6533:1;6526:31;6580:4;6577:1;6570:15;6608:4;6605:1;6598:15;6462:161;;6249:380;;;:::o;7194:249::-;7263:6;7316:2;7304:9;7295:7;7291:23;7287:32;7284:52;;;7332:1;7329;7322:12;7284:52;7364:9;7358:16;7383:30;7407:5;7383:30;:::i;8128:662::-;-1:-1:-1;;;;;8407:15:7;;;8389:34;;8459:15;;8454:2;8439:18;;8432:43;8506:2;8491:18;;8484:34;;;8554:3;8549:2;8534:18;;8527:31;;;8574:19;;8567:35;;;8332:4;8595:6;8645;8369:3;8624:19;;8611:49;8710:1;8704:3;8695:6;8684:9;8680:22;8676:32;8669:43;8780:3;8773:2;8769:7;8764:2;8756:6;8752:15;8748:29;8737:9;8733:45;8729:55;8721:63;;8128:662;;;;;;;;:::o;9145:127::-;9206:10;9201:3;9197:20;9194:1;9187:31;9237:4;9234:1;9227:15;9261:4;9258:1;9251:15;9277:884;9357:6;9410:2;9398:9;9389:7;9385:23;9381:32;9378:52;;;9426:1;9423;9416:12;9378:52;9459:9;9453:16;9488:18;9529:2;9521:6;9518:14;9515:34;;;9545:1;9542;9535:12;9515:34;9583:6;9572:9;9568:22;9558:32;;9628:7;9621:4;9617:2;9613:13;9609:27;9599:55;;9650:1;9647;9640:12;9599:55;9679:2;9673:9;9701:2;9697;9694:10;9691:36;;;9707:18;;:::i;:::-;9782:2;9776:9;9750:2;9836:13;;-1:-1:-1;;9832:22:7;;;9856:2;9828:31;9824:40;9812:53;;;9880:18;;;9900:22;;;9877:46;9874:72;;;9926:18;;:::i;:::-;9966:10;9962:2;9955:22;10001:2;9993:6;9986:18;10041:7;10036:2;10031;10027;10023:11;10019:20;10016:33;10013:53;;;10062:1;10059;10052:12;10013:53;10075:55;10127:2;10122;10114:6;10110:15;10105:2;10101;10097:11;10075:55;:::i;:::-;10149:6;9277:884;-1:-1:-1;;;;;;;9277:884:7:o

Swarm Source

ipfs://5d6bbec668bf6248ac6187a5739646c475750e9a3c31018e4295a61c5821e468
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.