Token EXR Training Pass

Overview ERC721

Total Supply:
0 EXRTP

Holders:
515 addresses
Balance
1 EXRTP
0x44e4728747a27966c1f86dc894a2dcc45723770b
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

One thing all great Racers have in common is a dedication to their training. Without the blood, the oil, and the sweat, there can be no victory. All Racers must first complete their training before they can compete for glory.


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

Contract Source Code Verified (Exact Match)

Contract Name:
TrainingPassERC721

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 6 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 2 of 6 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 3 of 6 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 4 of 6 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 5 of 6 : SoulboundERC721.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.15;

import {IERC721} from "openzeppelin-contracts/token/ERC721/IERC721.sol";

import {IERC721Metadata} from "openzeppelin-contracts/token/ERC721/extensions/IERC721Metadata.sol";
import {IERC165} from "openzeppelin-contracts/utils/introspection/IERC165.sol";
import {ERC165} from "openzeppelin-contracts/utils/introspection/ERC165.sol";

/// @title  A custom ERC-721 implementation for soulbound tokens
/// @author RaceDev
/// @notice An ERC-721 token that cannot be transferred, or sold
/// @dev    Heavily inspired by Solmate's ERC721 and Party DAO's CrowdfundNFT
abstract contract SoulBoundERC721 is ERC165, IERC721, IERC721Metadata {
    string private _name;

    string private _symbol;

    mapping(uint256 => address) internal _owners;

    /*//////////////////////////////////////////////
                        E R R O R S
    //////////////////////////////////////////////*/

    error SoulBound();

    error AlreadyBurnedError(address owner, uint256 tokenId);

    error InvalidTokenError(uint256 tokenId);

    error AlreadyMintedError(address owner, uint256 tokenId);

    /*//////////////////////////////////////////////
                    M O D I F I E R S
    //////////////////////////////////////////////*/

    modifier soulBound() {
        revert SoulBound();
        _; // Compiler requires this.
    }

    /*//////////////////////////////////////////////
                C O N S T R U C T O R
    //////////////////////////////////////////////*/
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /*//////////////////////////////////////////////
                    M E T A D A T A
    //////////////////////////////////////////////*/

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /*//////////////////////////////////////////////
                        E R C 7 2 1
    //////////////////////////////////////////////*/

    /// @notice Returns the user's balance
    /// @dev    Can only be 1 or 0.
    function balanceOf(address owner) external view returns (uint256 numTokens) {
        return _doesTokenExistFor(owner) ? 1 : 0;
    }

    /// @notice Returns the owner of a given ID
    function ownerOf(uint256 tokenId) public view returns (address owner) {
        owner = _owners[tokenId];
        if (owner == address(0)) {
            revert InvalidTokenError(tokenId);
        }
    }

    /*//////////////////////////////////////////////
                   S O U L   B O N D I N G
    //////////////////////////////////////////////*/

    /// @notice NB: Don't call. Token is Soulbound - this will fail.
    function transferFrom(
        address,
        address,
        uint256
    ) external soulBound {}

    /// @notice NB: Don't call. Token is Soulbound - this will fail.
    function safeTransferFrom(
        address,
        address,
        uint256
    ) external soulBound {}

    /// @notice NB: Don't call. Token is Soulbound - this will fail.
    function safeTransferFrom(
        address,
        address,
        uint256,
        bytes calldata
    ) external soulBound {}

    /// @notice NB: Don't call. Token is Soulbound - this will fail.
    function approve(address, uint256) external soulBound {}

    /// @notice NB: Don't call. Token is Soulbound - this will fail.
    function setApprovalForAll(address, bool) external soulBound {}

    /// @notice NB: Don't call. Token is Soulbound - this will fail.
    function getApproved(uint256) external pure returns (address) {
        return address(0);
    }

    /// @notice This is a soulbound NFT and cannot be transferred.
    ///         Attempting to call this function will always return false.
    function isApprovedForAll(address, address) external pure returns (bool) {
        return false;
    }

    /*//////////////////////////////////////////////
                    C O M P L I A N C E
    //////////////////////////////////////////////*/
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /*//////////////////////////////////////////////
                    I N T E R N A L
    //////////////////////////////////////////////*/

    /// @dev    No need to increment a tokenId, as each owner address
    ///         will generate a unique tokenId.
    function _mint(address owner) internal returns (uint256 tokenId) {
        tokenId = _addressToTokenId(owner);

        if (_owners[tokenId] != owner) {
            _owners[tokenId] = owner;
            emit Transfer(address(0), owner, tokenId);
        } else {
            revert AlreadyMintedError(owner, tokenId);
        }
    }

    function _burn(address owner) internal {
        uint256 tokenId = _addressToTokenId(owner);
        if (_owners[tokenId] == owner) {
            delete _owners[tokenId];
            emit Transfer(owner, address(0), tokenId);
            return;
        }
        revert AlreadyBurnedError(owner, tokenId);
    }

    /*//////////////////////////////////////////////
                        U T I L S
    //////////////////////////////////////////////*/

    function _doesTokenExistFor(address owner) internal view returns (bool) {
        return _owners[_addressToTokenId(owner)] != address(0);
    }

    function _addressToTokenId(address user) internal pure returns (uint256 tokenId) {
        tokenId = uint256(uint160(user));
    }
}

File 6 of 6 : TrainingPassERC721.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.15;

import {SoulBoundERC721} from "./SoulboundERC721.sol";

/// @title  A Soulbound Training Pass ERC721 for the EXR ecosystem
/// @author RacerDev
/// @notice The Training Pass is a utility NFT and can only be airdropped to someone
///         who holds at least one Pilot, one Racecraft, and one Booster
/// @dev    Users cannot mint for themselves - passes can only be airdropped by an authorized user
/// @dev    Tokens cannot be sold or transferred, but can be burned by the user
/// @dev    All tokens in this contract share the `sharedUri` as the `tokenURI`
/// @dev    Token IDs are not sequential and are derived from each user's address, therefore unique

contract TrainingPassERC721 is SoulBoundERC721 {
    // the metadata uri shared by every token
    string private sharedUri;

    // the contract owner, ie. super admin
    address private immutable owner;

    // stores authorized users (capable of airdropping/minting)
    mapping(address => bool) private _authorized;

    // keeps track of which tokens (by user) have been burned
    mapping(address => bool) private _burned;

    /*//////////////////////////////////////////////
                        E R R O R S
    //////////////////////////////////////////////*/

    error NotAuthorized();

    error OnlyOwner();

    error NotTokenOwner();

    error TokenAlreadyBurned();

    /*//////////////////////////////////////////////
                    M O D I F I E R S
    //////////////////////////////////////////////*/

    modifier onlyOwner() {
        if (msg.sender != owner) {
            revert OnlyOwner();
        }
        _;
    }

    modifier onlyAuthorized() {
        if (!_authorized[msg.sender]) revert NotAuthorized();
        _;
    }

    /*//////////////////////////////////////////////
                C O N S T R U C T O R
    //////////////////////////////////////////////*/

    constructor(
        string memory name_,
        string memory symbol_,
        string memory uri_
    ) SoulBoundERC721(name_, symbol_) {
        owner = msg.sender;
        sharedUri = uri_;
    }

    /*//////////////////////////////////////////////
                C O N V E N I E N C E
    //////////////////////////////////////////////*/

    /// @notice convenience function to check if an address is an authorized user
    function isAuthorizedUser(address user) external view returns (bool) {
        return _authorized[user];
    }

    function hasUserBurnedToken(address user) external view returns (bool) {
        return _burned[user];
    }

    /*//////////////////////////////////////////////
                    M E T A D A T A
    //////////////////////////////////////////////*/

    /// @notice Returns the metadata URI for a given token ID
    /// @dev    All tokens return the same `sharedUri`
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        if (_owners[tokenId] == address(0)) {
            revert InvalidTokenError(tokenId);
        }
        return sharedUri;
    }

    /*//////////////////////////////////////////////
                U S E R   F U N C T I O N S
    //////////////////////////////////////////////*/

    /// @notice Burns the soulbound token. Cannot be reclaimed once burned.
    /// @dev    Marks the token as burned in `_burned` so it cannot be reminted.
    function burn() external {
        uint256 id = _addressToTokenId(msg.sender);
        if (msg.sender != _owners[id]) revert NotTokenOwner();
        _burned[msg.sender] = true;
        _burn(msg.sender);
    }

    /*//////////////////////////////////////////////
                    A U T H O R I Z E D
    //////////////////////////////////////////////*/

    /// @notice Airdrops a token to a user.
    /// @dev    Can only be minted/airdroped by an authorized user.
    function airdrop(address user) external onlyAuthorized returns (uint256 tokenId) {
        if (_burned[user]) {
            revert TokenAlreadyBurned();
        }
        tokenId = _mint(user);
    }

    /*//////////////////////////////////////////////
                        O W N E R
    //////////////////////////////////////////////*/

    /// @notice Adds an authorized user to the contract.
    /// @dev    Only authorized users can mint/airdrop tokens.
    function addAuthorizedUser(address user) external onlyOwner {
        _authorized[user] = true;
    }

    /// @notice Removes an authorized user from the contract.
    function removeAuthorizedUser(address user) external onlyOwner {
        _authorized[user] = false;
    }

    /// @notice Updates the metadata URI
    function updateURI(string memory newUri_) external onlyOwner {
        sharedUri = newUri_;
    }
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "metadata": {
    "bytecodeHash": "none"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"uri_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"AlreadyBurnedError","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"AlreadyMintedError","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"InvalidTokenError","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[],"name":"NotTokenOwner","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[],"name":"SoulBound","type":"error"},{"inputs":[],"name":"TokenAlreadyBurned","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"addAuthorizedUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"airdrop","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"hasUserBurnedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isAuthorizedUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"removeAuthorizedUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri_","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b506040516200148e3803806200148e83398101604081905262000034916200013f565b828260006200004483826200025f565b5060016200005382826200025f565b5050336080525060036200006882826200025f565b505050506200032b565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200009a57600080fd5b81516001600160401b0380821115620000b757620000b762000072565b604051601f8301601f19908116603f01168101908282118183101715620000e257620000e262000072565b81604052838152602092508683858801011115620000ff57600080fd5b600091505b8382101562000123578582018301518183018401529082019062000104565b83821115620001355760008385830101525b9695505050505050565b6000806000606084860312156200015557600080fd5b83516001600160401b03808211156200016d57600080fd5b6200017b8783880162000088565b945060208601519150808211156200019257600080fd5b620001a08783880162000088565b93506040860151915080821115620001b757600080fd5b50620001c68682870162000088565b9150509250925092565b600181811c90821680620001e557607f821691505b6020821081036200020657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200025a57600081815260208120601f850160051c81016020861015620002355750805b601f850160051c820191505b81811015620002565782815560010162000241565b5050505b505050565b81516001600160401b038111156200027b576200027b62000072565b62000293816200028c8454620001d0565b846200020c565b602080601f831160018114620002cb5760008415620002b25750858301515b600019600386901b1c1916600185901b17855562000256565b600085815260208120601f198616915b82811015620002fc57888601518255948401946001909101908401620002db565b50858210156200031b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6080516111396200035560003960008181610512015281816107ce015261089801526111396000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c80636352211e116100cd578063b88d4fde11610081578063c87b56dd11610066578063c87b56dd146102ef578063e985e9c514610302578063ec17e13a1461031857600080fd5b8063b88d4fde146102ce578063c30f4a5a146102dc57600080fd5b806389fabc80116100b257806389fabc80146102a557806395d89b41146102b8578063a22cb465146102c057600080fd5b80636352211e1461027f57806370a082311461029257600080fd5b806321860a051161012457806336f5fa511161010957806336f5fa511461023e57806342842e0e1461023057806344df8e701461027757600080fd5b806321860a051461020f57806323b872dd1461023057600080fd5b8063081812fc11610155578063081812fc146101ae578063095ea7b3146101e7578063177d2a74146101fc57600080fd5b806301ffc9a71461017157806306fdde0314610199575b600080fd5b61018461017f366004610bee565b610351565b60405190151581526020015b60405180910390f35b6101a1610436565b6040516101909190610c37565b6101c26101bc366004610caa565b50600090565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610190565b6101fa6101f5366004610ce7565b6104c8565b005b6101fa61020a366004610d11565b6104fa565b61022261021d366004610d11565b6105b8565b604051908152602001610190565b6101fa6101f5366004610d2c565b61018461024c366004610d11565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205460ff1690565b6101fa61066a565b6101c261028d366004610caa565b61070c565b6102226102a0366004610d11565b610775565b6101fa6102b3366004610d11565b6107b6565b6101a1610871565b6101fa6101f5366004610d68565b6101fa6101f5366004610da4565b6101fa6102ea366004610e6e565b610880565b6101a16102fd366004610caa565b6108ff565b610184610310366004610f3d565b600092915050565b610184610326366004610d11565b73ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205460ff1690565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806103e457507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061043057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606000805461044590610f70565b80601f016020809104026020016040519081016040528092919081815260200182805461047190610f70565b80156104be5780601f10610493576101008083540402835291602001916104be565b820191906000526020600020905b8154815290600101906020018083116104a157829003601f168201915b5050505050905090565b6040517f24cf071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610569576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b3360009081526004602052604081205460ff16610601576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604090205460ff1615610661576040517f8af5f39600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610430826109f2565b3360008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1681146106c8576040517f59dc379f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561070990610af2565b50565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610770576040517f557fc64e000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff8082166000908152600260205260408120549091166107aa5760006107ad565b60015b60ff1692915050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610825576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60606001805461044590610f70565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146108ef576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036108fb8282611012565b5050565b60008181526002602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16610960576040517f557fc64e00000000000000000000000000000000000000000000000000000000815260048101839052602401610767565b6003805461096d90610f70565b80601f016020809104026020016040519081016040528092919081815260200182805461099990610f70565b80156109e65780601f106109bb576101008083540402835291602001916109e6565b820191906000526020600020905b8154815290600101906020018083116109c957829003601f168201915b50505050509050919050565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600260205260409020549091168114610aa15760008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4919050565b6040517fc343b42b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260248101829052604401610767565b73ffffffffffffffffffffffffffffffffffffffff818116600081815260026020526040902054909116819003610b9d5760008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182919073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6040517f16bf921900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260248101829052604401610767565b600060208284031215610c0057600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c3057600080fd5b9392505050565b600060208083528351808285015260005b81811015610c6457858101830151858201604001528201610c48565b81811115610c76576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215610cbc57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461077057600080fd5b60008060408385031215610cfa57600080fd5b610d0383610cc3565b946020939093013593505050565b600060208284031215610d2357600080fd5b610c3082610cc3565b600080600060608486031215610d4157600080fd5b610d4a84610cc3565b9250610d5860208501610cc3565b9150604084013590509250925092565b60008060408385031215610d7b57600080fd5b610d8483610cc3565b915060208301358015158114610d9957600080fd5b809150509250929050565b600080600080600060808688031215610dbc57600080fd5b610dc586610cc3565b9450610dd360208701610cc3565b935060408601359250606086013567ffffffffffffffff80821115610df757600080fd5b818801915088601f830112610e0b57600080fd5b813581811115610e1a57600080fd5b896020828501011115610e2c57600080fd5b9699959850939650602001949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215610e8057600080fd5b813567ffffffffffffffff80821115610e9857600080fd5b818401915084601f830112610eac57600080fd5b813581811115610ebe57610ebe610e3f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610f0457610f04610e3f565b81604052828152876020848701011115610f1d57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60008060408385031215610f5057600080fd5b610f5983610cc3565b9150610f6760208401610cc3565b90509250929050565b600181811c90821680610f8457607f821691505b602082108103610fbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561100d57600081815260208120601f850160051c81016020861015610fea5750805b601f850160051c820191505b8181101561100957828155600101610ff6565b5050505b505050565b815167ffffffffffffffff81111561102c5761102c610e3f565b6110408161103a8454610f70565b84610fc3565b602080601f831160018114611093576000841561105d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611009565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156110e0578886015182559484019460019091019084016110c1565b508582101561111c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c634300080f000a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001145585220547261696e696e67205061737300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054558525450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e68747470733a2f2f6578722e6d7970696e6174612e636c6f75642f697066732f516d5041356f3553624542725a4c4e7154723243396144455743384165454e4258636a4733546a4d507643715169000000000000000000000000000000000000

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001145585220547261696e696e67205061737300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054558525450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e68747470733a2f2f6578722e6d7970696e6174612e636c6f75642f697066732f516d5041356f3553624542725a4c4e7154723243396144455743384165454e4258636a4733546a4d507643715169000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): EXR Training Pass
Arg [1] : symbol_ (string): EXRTP
Arg [2] : uri_ (string): https://exr.mypinata.cloud/ipfs/QmPA5o5SbEBrZLNqTr2C9aDEWC8AeENBXcjG3TjMPvCqQi

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [4] : 45585220547261696e696e672050617373000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 4558525450000000000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000004e
Arg [8] : 68747470733a2f2f6578722e6d7970696e6174612e636c6f75642f697066732f
Arg [9] : 516d5041356f3553624542725a4c4e7154723243396144455743384165454e42
Arg [10] : 58636a4733546a4d507643715169000000000000000000000000000000000000


Loading