ETH Price: $3,414.86 (+0.98%)
Gas: 4 Gwei

Token

Space Riders Inventory (SRI)
 

Overview

Max Total Supply

2,563 SRI

Holders

1,034

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Null: 0x000...000
0x0000000000000000000000000000000000000000
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:
SpaceRidersInventory

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-21
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol

// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/math/Math.sol

// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Strings.sol

// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol

// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionCallWithValue(
                target,
                data,
                0,
                "Address: low-level call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

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

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage)
        private
        pure
    {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// 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: @openzeppelin/contracts/utils/introspection/ERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

/**
 * @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: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 value
    );

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(
        address indexed account,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        external
        view
        returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            account != address(0),
            "ERC1155: address zero is not a valid owner"
        );
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(
            accounts.length == ids.length,
            "ERC1155: accounts and ids length mismatch"
        );

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(
            fromBalance >= amount,
            "ERC1155: insufficient balance for transfer"
        );
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: insufficient balance for transfer"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            from,
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            id,
            amount,
            data
        );
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(
            operator,
            address(0),
            to,
            ids,
            amounts,
            data
        );
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(
                fromBalance >= amount,
                "ERC1155: burn amount exceeds balance"
            );
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155Received(
                    operator,
                    from,
                    id,
                    amount,
                    data
                )
            returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try
                IERC1155Receiver(to).onERC1155BatchReceived(
                    operator,
                    from,
                    ids,
                    amounts,
                    data
                )
            returns (bytes4 response) {
                if (
                    response != IERC1155Receiver.onERC1155BatchReceived.selector
                ) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element)
        private
        pure
        returns (uint256[] memory)
    {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(
                    supply >= amount,
                    "ERC1155: burn amount exceeds totalSupply"
                );
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

// File: contracts/SpaceRidersInventory.sol

pragma solidity >=0.8.12 <0.9.0;

error NotAllowed();
error TokenDoesntExist();

contract SpaceRidersInventory is
    ERC1155,
    Ownable,
    ERC1155Supply,
    ReentrancyGuard
{
    using Strings for uint256;

    string public name = "Space Riders Inventory";
    string public symbol = "SRI";
    string public baseURI;
    address public boardsContract;

    constructor(address _boardsContract, string memory _baseURI) ERC1155("") {
        setBoardsContract(_boardsContract);
        setBaseURI(_baseURI);
    }

    function uri(uint256 _tokenTypeId)
        public
        view
        override
        returns (string memory)
    {
        if (exists(_tokenTypeId) == false) revert TokenDoesntExist();
        return
            string(
                abi.encodePacked(
                    baseURI,
                    Strings.toString(_tokenTypeId),
                    ".json"
                )
            );
    }

    function getReward(address _to, uint256 _tokenTypeId)
        external
        nonReentrant
    {
        if (msg.sender != address(boardsContract)) revert NotAllowed();
        _mint(_to, _tokenTypeId, 1, "");
    }

    function setBaseURI(string memory _baseURI) public onlyOwner {
        baseURI = _baseURI;
    }

    function setBoardsContract(address _contract) public onlyOwner {
        boardsContract = _contract;
    }

    function mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public onlyOwner {
        _mint(account, id, amount, data);
    }

    function mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public onlyOwner {
        _mintBatch(to, ids, amounts, data);
    }

    // The following functions are overrides required by Solidity.
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal override(ERC1155, ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_boardsContract","type":"address"},{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"NotAllowed","type":"error"},{"inputs":[],"name":"TokenDoesntExist","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boardsContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenTypeId","type":"uint256"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintBatch","outputs":[],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setBoardsContract","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":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenTypeId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60c0604052601660809081527f53706163652052696465727320496e76656e746f72790000000000000000000060a0526006906200003e908262000290565b5060408051808201909152600381526253524960e81b602082015260079062000068908262000290565b503480156200007657600080fd5b506040516200250a3803806200250a83398101604081905262000099916200035c565b604080516020810190915260008152620000b381620000e2565b50620000bf33620000f4565b6001600555620000cf8262000146565b620000da8162000172565b505062000452565b6002620000f0828262000290565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001506200018a565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6200017c6200018a565b6008620000f0828262000290565b6003546001600160a01b03163314620001e95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200021657607f821691505b6020821081036200023757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028b57600081815260208120601f850160051c81016020861015620002665750805b601f850160051c820191505b81811015620002875782815560010162000272565b5050505b505050565b81516001600160401b03811115620002ac57620002ac620001eb565b620002c481620002bd845462000201565b846200023d565b602080601f831160018114620002fc5760008415620002e35750858301515b600019600386901b1c1916600185901b17855562000287565b600085815260208120601f198616915b828110156200032d578886015182559484019460019091019084016200030c565b50858210156200034c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080604083850312156200037057600080fd5b82516001600160a01b03811681146200038857600080fd5b602084810151919350906001600160401b0380821115620003a857600080fd5b818601915086601f830112620003bd57600080fd5b815181811115620003d257620003d2620001eb565b604051601f8201601f19908116603f01168101908382118183101715620003fd57620003fd620001eb565b8160405282815289868487010111156200041657600080fd5b600093505b828410156200043a57848401860151818501870152928501926200041b565b60008684830101528096505050505050509250929050565b6120a880620004626000396000f3fe608060405234801561001057600080fd5b50600436106101415760003560e01c80636c0360eb116100b8578063a22cb4651161007c578063a22cb465146102ae578063bd85b039146102c1578063e985e9c5146102e1578063f242432a1461031d578063f2fde38b14610330578063f474c8ce1461034357600080fd5b80636c0360eb14610272578063715018a61461027a578063731133e9146102825780638da5cb5b1461029557806395d89b41146102a657600080fd5b80631f7fdffa1161010a5780631f7fdffa146101e25780632eb2c2d6146101f757806332ffbd7d1461020a5780634e1273f41461021d5780634f558e791461023d57806355f804b31461025f57600080fd5b8062fdd58e1461014657806301ffc9a71461016c5780630357dcd91461018f57806306fdde03146101ba5780630e89341c146101cf575b600080fd5b6101596101543660046114e0565b610356565b6040519081526020015b60405180910390f35b61017f61017a366004611520565b6103ef565b6040519015158152602001610163565b6009546101a2906001600160a01b031681565b6040516001600160a01b039091168152602001610163565b6101c261043f565b6040516101639190611594565b6101c26101dd3660046115a7565b6104cd565b6101f56101f0366004611713565b610533565b005b6101f56102053660046117ab565b61054d565b6101f5610218366004611854565b610599565b61023061022b36600461186f565b6105c3565b6040516101639190611974565b61017f61024b3660046115a7565b600090815260046020526040902054151590565b6101f561026d366004611987565b6106ec565b6101c2610704565b6101f5610711565b6101f56102903660046119d7565b610725565b6003546001600160a01b03166101a2565b6101c2610739565b6101f56102bc366004611a2b565b610746565b6101596102cf3660046115a7565b60009081526004602052604090205490565b61017f6102ef366004611a67565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101f561032b366004611a9a565b610751565b6101f561033e366004611854565b610796565b6101f56103513660046114e0565b61080f565b60006001600160a01b0383166103c65760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061042057506001600160e01b031982166303a24d0760e21b145b806103e957506301ffc9a760e01b6001600160e01b03198316146103e9565b6006805461044c90611afe565b80601f016020809104026020016040519081016040528092919081815260200182805461047890611afe565b80156104c55780601f1061049a576101008083540402835291602001916104c5565b820191906000526020600020905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b600081815260046020526040812054606091901515900361050157604051631d6fa32560e31b815260040160405180910390fd5b600861050c83610868565b60405160200161051d929190611b38565b6040516020818303038152906040529050919050565b61053b6108fa565b61054784848484610954565b50505050565b6001600160a01b038516331480610569575061056985336102ef565b6105855760405162461bcd60e51b81526004016103bd90611bcf565b6105928585858585610aae565b5050505050565b6105a16108fa565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b606081518351146106285760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016103bd565b600083516001600160401b03811115610643576106436115c0565b60405190808252806020026020018201604052801561066c578160200160208202803683370190505b50905060005b84518110156106e4576106b785828151811061069057610690611c1d565b60200260200101518583815181106106aa576106aa611c1d565b6020026020010151610356565b8282815181106106c9576106c9611c1d565b60209081029190910101526106dd81611c49565b9050610672565b509392505050565b6106f46108fa565b60086107008282611cad565b5050565b6008805461044c90611afe565b6107196108fa565b6107236000610c58565b565b61072d6108fa565b61054784848484610caa565b6007805461044c90611afe565b610700338383610d93565b6001600160a01b03851633148061076d575061076d85336102ef565b6107895760405162461bcd60e51b81526004016103bd90611bcf565b6105928585858585610e73565b61079e6108fa565b6001600160a01b0381166108035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103bd565b61080c81610c58565b50565b610817610fab565b6009546001600160a01b0316331461084257604051631eb49d6d60e11b815260040160405180910390fd5b61085e8282600160405180602001604052806000815250610caa565b6107006001600555565b6060600061087583611004565b60010190506000816001600160401b03811115610894576108946115c0565b6040519080825280601f01601f1916602001820160405280156108be576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846108c857509392505050565b6003546001600160a01b031633146107235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103bd565b6001600160a01b03841661097a5760405162461bcd60e51b81526004016103bd90611d6c565b815183511461099b5760405162461bcd60e51b81526004016103bd90611dad565b336109ab816000878787876110dc565b60005b8451811015610a46578381815181106109c9576109c9611c1d565b60200260200101516000808784815181106109e6576109e6611c1d565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254610a2e9190611df5565b90915550819050610a3e81611c49565b9150506109ae565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610a97929190611e08565b60405180910390a4610592816000878787876110ea565b8151835114610acf5760405162461bcd60e51b81526004016103bd90611dad565b6001600160a01b038416610af55760405162461bcd60e51b81526004016103bd90611e36565b33610b048187878787876110dc565b60005b8451811015610bea576000858281518110610b2457610b24611c1d565b602002602001015190506000858381518110610b4257610b42611c1d565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610b925760405162461bcd60e51b81526004016103bd90611e7b565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610bcf908490611df5565b9250508190555050505080610be390611c49565b9050610b07565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610c3a929190611e08565b60405180910390a4610c508187878787876110ea565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416610cd05760405162461bcd60e51b81526004016103bd90611d6c565b336000610cdc85611245565b90506000610ce985611245565b9050610cfa836000898585896110dc565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290610d2a908490611df5565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610d8a83600089898989611290565b50505050505050565b816001600160a01b0316836001600160a01b031603610e065760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016103bd565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416610e995760405162461bcd60e51b81526004016103bd90611e36565b336000610ea585611245565b90506000610eb285611245565b9050610ec28389898585896110dc565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015610f035760405162461bcd60e51b81526004016103bd90611e7b565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290610f40908490611df5565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610fa0848a8a8a8a8a611290565b505050505050505050565b600260055403610ffd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103bd565b6002600555565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106110435772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061106f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061108d57662386f26fc10000830492506010015b6305f5e10083106110a5576305f5e100830492506008015b61271083106110b957612710830492506004015b606483106110cb576064830492506002015b600a83106103e95760010192915050565b610c5086868686868661134b565b6001600160a01b0384163b15610c505760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061112e9089908990889088908890600401611ec5565b6020604051808303816000875af1925050508015611169575060408051601f3d908101601f1916820190925261116691810190611f23565b60015b61121557611175611f40565b806308c379a0036111ae5750611189611f5c565b8061119457506111b0565b8060405162461bcd60e51b81526004016103bd9190611594565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016103bd565b6001600160e01b0319811663bc197c8160e01b14610d8a5760405162461bcd60e51b81526004016103bd90611fe5565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061127f5761127f611c1d565b602090810291909101015292915050565b6001600160a01b0384163b15610c505760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906112d4908990899088908890889060040161202d565b6020604051808303816000875af192505050801561130f575060408051601f3d908101601f1916820190925261130c91810190611f23565b60015b61131b57611175611f40565b6001600160e01b0319811663f23a6e6160e01b14610d8a5760405162461bcd60e51b81526004016103bd90611fe5565b6001600160a01b0385166113d25760005b83518110156113d05782818151811061137757611377611c1d565b60200260200101516004600086848151811061139557611395611c1d565b6020026020010151815260200190815260200160002060008282546113ba9190611df5565b909155506113c9905081611c49565b905061135c565b505b6001600160a01b038416610c505760005b8351811015610d8a57600084828151811061140057611400611c1d565b60200260200101519050600084838151811061141e5761141e611c1d565b60200260200101519050600060046000848152602001908152602001600020549050818110156114a15760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b60648201526084016103bd565b600092835260046020526040909220910390556114bd81611c49565b90506113e3565b80356001600160a01b03811681146114db57600080fd5b919050565b600080604083850312156114f357600080fd5b6114fc836114c4565b946020939093013593505050565b6001600160e01b03198116811461080c57600080fd5b60006020828403121561153257600080fd5b813561153d8161150a565b9392505050565b60005b8381101561155f578181015183820152602001611547565b50506000910152565b60008151808452611580816020860160208601611544565b601f01601f19169290920160200192915050565b60208152600061153d6020830184611568565b6000602082840312156115b957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156115fb576115fb6115c0565b6040525050565b60006001600160401b0382111561161b5761161b6115c0565b5060051b60200190565b600082601f83011261163657600080fd5b8135602061164382611602565b60405161165082826115d6565b83815260059390931b850182019282810191508684111561167057600080fd5b8286015b8481101561168b5780358352918301918301611674565b509695505050505050565b60006001600160401b038311156116af576116af6115c0565b6040516116c6601f8501601f1916602001826115d6565b8091508381528484840111156116db57600080fd5b83836020830137600060208583010152509392505050565b600082601f83011261170457600080fd5b61153d83833560208501611696565b6000806000806080858703121561172957600080fd5b611732856114c4565b935060208501356001600160401b038082111561174e57600080fd5b61175a88838901611625565b9450604087013591508082111561177057600080fd5b61177c88838901611625565b9350606087013591508082111561179257600080fd5b5061179f878288016116f3565b91505092959194509250565b600080600080600060a086880312156117c357600080fd5b6117cc866114c4565b94506117da602087016114c4565b935060408601356001600160401b03808211156117f657600080fd5b61180289838a01611625565b9450606088013591508082111561181857600080fd5b61182489838a01611625565b9350608088013591508082111561183a57600080fd5b50611847888289016116f3565b9150509295509295909350565b60006020828403121561186657600080fd5b61153d826114c4565b6000806040838503121561188257600080fd5b82356001600160401b038082111561189957600080fd5b818501915085601f8301126118ad57600080fd5b813560206118ba82611602565b6040516118c782826115d6565b83815260059390931b85018201928281019150898411156118e757600080fd5b948201945b8386101561190c576118fd866114c4565b825294820194908201906118ec565b9650508601359250508082111561192257600080fd5b5061192f85828601611625565b9150509250929050565b600081518084526020808501945080840160005b838110156119695781518752958201959082019060010161194d565b509495945050505050565b60208152600061153d6020830184611939565b60006020828403121561199957600080fd5b81356001600160401b038111156119af57600080fd5b8201601f810184136119c057600080fd5b6119cf84823560208401611696565b949350505050565b600080600080608085870312156119ed57600080fd5b6119f6856114c4565b9350602085013592506040850135915060608501356001600160401b03811115611a1f57600080fd5b61179f878288016116f3565b60008060408385031215611a3e57600080fd5b611a47836114c4565b915060208301358015158114611a5c57600080fd5b809150509250929050565b60008060408385031215611a7a57600080fd5b611a83836114c4565b9150611a91602084016114c4565b90509250929050565b600080600080600060a08688031215611ab257600080fd5b611abb866114c4565b9450611ac9602087016114c4565b9350604086013592506060860135915060808601356001600160401b03811115611af257600080fd5b611847888289016116f3565b600181811c90821680611b1257607f821691505b602082108103611b3257634e487b7160e01b600052602260045260246000fd5b50919050565b6000808454611b4681611afe565b60018281168015611b5e5760018114611b7357611ba2565b60ff1984168752821515830287019450611ba2565b8860005260208060002060005b85811015611b995781548a820152908401908201611b80565b50505082870194505b505050508351611bb6818360208801611544565b64173539b7b760d91b9101908152600501949350505050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611c5b57611c5b611c33565b5060010190565b601f821115611ca857600081815260208120601f850160051c81016020861015611c895750805b601f850160051c820191505b81811015610c5057828155600101611c95565b505050565b81516001600160401b03811115611cc657611cc66115c0565b611cda81611cd48454611afe565b84611c62565b602080601f831160018114611d0f5760008415611cf75750858301515b600019600386901b1c1916600185901b178555610c50565b600085815260208120601f198616915b82811015611d3e57888601518255948401946001909101908401611d1f565b5085821015611d5c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b808201808211156103e9576103e9611c33565b604081526000611e1b6040830185611939565b8281036020840152611e2d8185611939565b95945050505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090611ef190830186611939565b8281036060840152611f038186611939565b90508281036080840152611f178185611568565b98975050505050505050565b600060208284031215611f3557600080fd5b815161153d8161150a565b600060033d1115611f595760046000803e5060005160e01c5b90565b600060443d1015611f6a5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715611f9957505050505090565b8285019150815181811115611fb15750505050505090565b843d8701016020828501011115611fcb5750505050505090565b611fda602082860101876115d6565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061206790830184611568565b97965050505050505056fea2646970667358221220f057e430a59accefdd983f5c221cbc9ff2578a0170e1176689831396bdbeacea64736f6c634300081100330000000000000000000000004623900e6d0495cca743665dce8fd815b0433e5b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6170692e73706163657269646572732e78797a2f726577617264732f6d657461646174612f00000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101415760003560e01c80636c0360eb116100b8578063a22cb4651161007c578063a22cb465146102ae578063bd85b039146102c1578063e985e9c5146102e1578063f242432a1461031d578063f2fde38b14610330578063f474c8ce1461034357600080fd5b80636c0360eb14610272578063715018a61461027a578063731133e9146102825780638da5cb5b1461029557806395d89b41146102a657600080fd5b80631f7fdffa1161010a5780631f7fdffa146101e25780632eb2c2d6146101f757806332ffbd7d1461020a5780634e1273f41461021d5780634f558e791461023d57806355f804b31461025f57600080fd5b8062fdd58e1461014657806301ffc9a71461016c5780630357dcd91461018f57806306fdde03146101ba5780630e89341c146101cf575b600080fd5b6101596101543660046114e0565b610356565b6040519081526020015b60405180910390f35b61017f61017a366004611520565b6103ef565b6040519015158152602001610163565b6009546101a2906001600160a01b031681565b6040516001600160a01b039091168152602001610163565b6101c261043f565b6040516101639190611594565b6101c26101dd3660046115a7565b6104cd565b6101f56101f0366004611713565b610533565b005b6101f56102053660046117ab565b61054d565b6101f5610218366004611854565b610599565b61023061022b36600461186f565b6105c3565b6040516101639190611974565b61017f61024b3660046115a7565b600090815260046020526040902054151590565b6101f561026d366004611987565b6106ec565b6101c2610704565b6101f5610711565b6101f56102903660046119d7565b610725565b6003546001600160a01b03166101a2565b6101c2610739565b6101f56102bc366004611a2b565b610746565b6101596102cf3660046115a7565b60009081526004602052604090205490565b61017f6102ef366004611a67565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101f561032b366004611a9a565b610751565b6101f561033e366004611854565b610796565b6101f56103513660046114e0565b61080f565b60006001600160a01b0383166103c65760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061042057506001600160e01b031982166303a24d0760e21b145b806103e957506301ffc9a760e01b6001600160e01b03198316146103e9565b6006805461044c90611afe565b80601f016020809104026020016040519081016040528092919081815260200182805461047890611afe565b80156104c55780601f1061049a576101008083540402835291602001916104c5565b820191906000526020600020905b8154815290600101906020018083116104a857829003601f168201915b505050505081565b600081815260046020526040812054606091901515900361050157604051631d6fa32560e31b815260040160405180910390fd5b600861050c83610868565b60405160200161051d929190611b38565b6040516020818303038152906040529050919050565b61053b6108fa565b61054784848484610954565b50505050565b6001600160a01b038516331480610569575061056985336102ef565b6105855760405162461bcd60e51b81526004016103bd90611bcf565b6105928585858585610aae565b5050505050565b6105a16108fa565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b606081518351146106285760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016103bd565b600083516001600160401b03811115610643576106436115c0565b60405190808252806020026020018201604052801561066c578160200160208202803683370190505b50905060005b84518110156106e4576106b785828151811061069057610690611c1d565b60200260200101518583815181106106aa576106aa611c1d565b6020026020010151610356565b8282815181106106c9576106c9611c1d565b60209081029190910101526106dd81611c49565b9050610672565b509392505050565b6106f46108fa565b60086107008282611cad565b5050565b6008805461044c90611afe565b6107196108fa565b6107236000610c58565b565b61072d6108fa565b61054784848484610caa565b6007805461044c90611afe565b610700338383610d93565b6001600160a01b03851633148061076d575061076d85336102ef565b6107895760405162461bcd60e51b81526004016103bd90611bcf565b6105928585858585610e73565b61079e6108fa565b6001600160a01b0381166108035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103bd565b61080c81610c58565b50565b610817610fab565b6009546001600160a01b0316331461084257604051631eb49d6d60e11b815260040160405180910390fd5b61085e8282600160405180602001604052806000815250610caa565b6107006001600555565b6060600061087583611004565b60010190506000816001600160401b03811115610894576108946115c0565b6040519080825280601f01601f1916602001820160405280156108be576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846108c857509392505050565b6003546001600160a01b031633146107235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103bd565b6001600160a01b03841661097a5760405162461bcd60e51b81526004016103bd90611d6c565b815183511461099b5760405162461bcd60e51b81526004016103bd90611dad565b336109ab816000878787876110dc565b60005b8451811015610a46578381815181106109c9576109c9611c1d565b60200260200101516000808784815181106109e6576109e6611c1d565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254610a2e9190611df5565b90915550819050610a3e81611c49565b9150506109ae565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610a97929190611e08565b60405180910390a4610592816000878787876110ea565b8151835114610acf5760405162461bcd60e51b81526004016103bd90611dad565b6001600160a01b038416610af55760405162461bcd60e51b81526004016103bd90611e36565b33610b048187878787876110dc565b60005b8451811015610bea576000858281518110610b2457610b24611c1d565b602002602001015190506000858381518110610b4257610b42611c1d565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610b925760405162461bcd60e51b81526004016103bd90611e7b565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610bcf908490611df5565b9250508190555050505080610be390611c49565b9050610b07565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610c3a929190611e08565b60405180910390a4610c508187878787876110ea565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416610cd05760405162461bcd60e51b81526004016103bd90611d6c565b336000610cdc85611245565b90506000610ce985611245565b9050610cfa836000898585896110dc565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290610d2a908490611df5565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610d8a83600089898989611290565b50505050505050565b816001600160a01b0316836001600160a01b031603610e065760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016103bd565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416610e995760405162461bcd60e51b81526004016103bd90611e36565b336000610ea585611245565b90506000610eb285611245565b9050610ec28389898585896110dc565b6000868152602081815260408083206001600160a01b038c16845290915290205485811015610f035760405162461bcd60e51b81526004016103bd90611e7b565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290610f40908490611df5565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610fa0848a8a8a8a8a611290565b505050505050505050565b600260055403610ffd5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103bd565b6002600555565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106110435772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061106f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061108d57662386f26fc10000830492506010015b6305f5e10083106110a5576305f5e100830492506008015b61271083106110b957612710830492506004015b606483106110cb576064830492506002015b600a83106103e95760010192915050565b610c5086868686868661134b565b6001600160a01b0384163b15610c505760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061112e9089908990889088908890600401611ec5565b6020604051808303816000875af1925050508015611169575060408051601f3d908101601f1916820190925261116691810190611f23565b60015b61121557611175611f40565b806308c379a0036111ae5750611189611f5c565b8061119457506111b0565b8060405162461bcd60e51b81526004016103bd9190611594565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016103bd565b6001600160e01b0319811663bc197c8160e01b14610d8a5760405162461bcd60e51b81526004016103bd90611fe5565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061127f5761127f611c1d565b602090810291909101015292915050565b6001600160a01b0384163b15610c505760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906112d4908990899088908890889060040161202d565b6020604051808303816000875af192505050801561130f575060408051601f3d908101601f1916820190925261130c91810190611f23565b60015b61131b57611175611f40565b6001600160e01b0319811663f23a6e6160e01b14610d8a5760405162461bcd60e51b81526004016103bd90611fe5565b6001600160a01b0385166113d25760005b83518110156113d05782818151811061137757611377611c1d565b60200260200101516004600086848151811061139557611395611c1d565b6020026020010151815260200190815260200160002060008282546113ba9190611df5565b909155506113c9905081611c49565b905061135c565b505b6001600160a01b038416610c505760005b8351811015610d8a57600084828151811061140057611400611c1d565b60200260200101519050600084838151811061141e5761141e611c1d565b60200260200101519050600060046000848152602001908152602001600020549050818110156114a15760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b60648201526084016103bd565b600092835260046020526040909220910390556114bd81611c49565b90506113e3565b80356001600160a01b03811681146114db57600080fd5b919050565b600080604083850312156114f357600080fd5b6114fc836114c4565b946020939093013593505050565b6001600160e01b03198116811461080c57600080fd5b60006020828403121561153257600080fd5b813561153d8161150a565b9392505050565b60005b8381101561155f578181015183820152602001611547565b50506000910152565b60008151808452611580816020860160208601611544565b601f01601f19169290920160200192915050565b60208152600061153d6020830184611568565b6000602082840312156115b957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156115fb576115fb6115c0565b6040525050565b60006001600160401b0382111561161b5761161b6115c0565b5060051b60200190565b600082601f83011261163657600080fd5b8135602061164382611602565b60405161165082826115d6565b83815260059390931b850182019282810191508684111561167057600080fd5b8286015b8481101561168b5780358352918301918301611674565b509695505050505050565b60006001600160401b038311156116af576116af6115c0565b6040516116c6601f8501601f1916602001826115d6565b8091508381528484840111156116db57600080fd5b83836020830137600060208583010152509392505050565b600082601f83011261170457600080fd5b61153d83833560208501611696565b6000806000806080858703121561172957600080fd5b611732856114c4565b935060208501356001600160401b038082111561174e57600080fd5b61175a88838901611625565b9450604087013591508082111561177057600080fd5b61177c88838901611625565b9350606087013591508082111561179257600080fd5b5061179f878288016116f3565b91505092959194509250565b600080600080600060a086880312156117c357600080fd5b6117cc866114c4565b94506117da602087016114c4565b935060408601356001600160401b03808211156117f657600080fd5b61180289838a01611625565b9450606088013591508082111561181857600080fd5b61182489838a01611625565b9350608088013591508082111561183a57600080fd5b50611847888289016116f3565b9150509295509295909350565b60006020828403121561186657600080fd5b61153d826114c4565b6000806040838503121561188257600080fd5b82356001600160401b038082111561189957600080fd5b818501915085601f8301126118ad57600080fd5b813560206118ba82611602565b6040516118c782826115d6565b83815260059390931b85018201928281019150898411156118e757600080fd5b948201945b8386101561190c576118fd866114c4565b825294820194908201906118ec565b9650508601359250508082111561192257600080fd5b5061192f85828601611625565b9150509250929050565b600081518084526020808501945080840160005b838110156119695781518752958201959082019060010161194d565b509495945050505050565b60208152600061153d6020830184611939565b60006020828403121561199957600080fd5b81356001600160401b038111156119af57600080fd5b8201601f810184136119c057600080fd5b6119cf84823560208401611696565b949350505050565b600080600080608085870312156119ed57600080fd5b6119f6856114c4565b9350602085013592506040850135915060608501356001600160401b03811115611a1f57600080fd5b61179f878288016116f3565b60008060408385031215611a3e57600080fd5b611a47836114c4565b915060208301358015158114611a5c57600080fd5b809150509250929050565b60008060408385031215611a7a57600080fd5b611a83836114c4565b9150611a91602084016114c4565b90509250929050565b600080600080600060a08688031215611ab257600080fd5b611abb866114c4565b9450611ac9602087016114c4565b9350604086013592506060860135915060808601356001600160401b03811115611af257600080fd5b611847888289016116f3565b600181811c90821680611b1257607f821691505b602082108103611b3257634e487b7160e01b600052602260045260246000fd5b50919050565b6000808454611b4681611afe565b60018281168015611b5e5760018114611b7357611ba2565b60ff1984168752821515830287019450611ba2565b8860005260208060002060005b85811015611b995781548a820152908401908201611b80565b50505082870194505b505050508351611bb6818360208801611544565b64173539b7b760d91b9101908152600501949350505050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611c5b57611c5b611c33565b5060010190565b601f821115611ca857600081815260208120601f850160051c81016020861015611c895750805b601f850160051c820191505b81811015610c5057828155600101611c95565b505050565b81516001600160401b03811115611cc657611cc66115c0565b611cda81611cd48454611afe565b84611c62565b602080601f831160018114611d0f5760008415611cf75750858301515b600019600386901b1c1916600185901b178555610c50565b600085815260208120601f198616915b82811015611d3e57888601518255948401946001909101908401611d1f565b5085821015611d5c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b808201808211156103e9576103e9611c33565b604081526000611e1b6040830185611939565b8281036020840152611e2d8185611939565b95945050505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090611ef190830186611939565b8281036060840152611f038186611939565b90508281036080840152611f178185611568565b98975050505050505050565b600060208284031215611f3557600080fd5b815161153d8161150a565b600060033d1115611f595760046000803e5060005160e01c5b90565b600060443d1015611f6a5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715611f9957505050505090565b8285019150815181811115611fb15750505050505090565b843d8701016020828501011115611fcb5750505050505090565b611fda602082860101876115d6565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061206790830184611568565b97965050505050505056fea2646970667358221220f057e430a59accefdd983f5c221cbc9ff2578a0170e1176689831396bdbeacea64736f6c63430008110033

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

0000000000000000000000004623900e6d0495cca743665dce8fd815b0433e5b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6170692e73706163657269646572732e78797a2f726577617264732f6d657461646174612f00000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _boardsContract (address): 0x4623900e6d0495cCa743665DCE8FD815b0433E5B
Arg [1] : _baseURI (string): https://api.spaceriders.xyz/rewards/metadata/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000004623900e6d0495cca743665dce8fd815b0433e5b
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 000000000000000000000000000000000000000000000000000000000000002d
Arg [3] : 68747470733a2f2f6170692e73706163657269646572732e78797a2f72657761
Arg [4] : 7264732f6d657461646174612f00000000000000000000000000000000000000


Deployed Bytecode Sourcemap

62971:2157:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44103:317;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;44103:317:0;;;;;;;;43076:360;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;43076:360:0;1019:187:1;63230:29:0;;;;;-1:-1:-1;;;;;63230:29:0;;;;;;-1:-1:-1;;;;;1375:32:1;;;1357:51;;1345:2;1330:18;63230:29:0;1211:203:1;63115:45:0;;;:::i;:::-;;;;;;;:::i;63433:419::-;;;;;;:::i;:::-;;:::i;64509:211::-;;;;;;:::i;:::-;;:::i;:::-;;46252:438;;;;;;:::i;:::-;;:::i;64196:108::-;;;;;;:::i;:::-;;:::i;44586:561::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;61642:122::-;;;;;;:::i;:::-;61699:4;61520:16;;;:12;:16;;;;;;-1:-1:-1;;;61642:122:0;64090:98;;;;;;:::i;:::-;;:::i;63202:21::-;;;:::i;21263:103::-;;;:::i;64312:189::-;;;;;;:::i;:::-;;:::i;20615:87::-;20688:6;;-1:-1:-1;;;;;20688:6:0;20615:87;;63167:28;;;:::i;45220:187::-;;;;;;:::i;:::-;;:::i;61431:113::-;;;;;;:::i;:::-;61493:7;61520:16;;;:12;:16;;;;;;;61431:113;45479:218;;;;;;:::i;:::-;-1:-1:-1;;;;;45652:27:0;;;45623:4;45652:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;45479:218;45769:406;;;;;;:::i;:::-;;:::i;21521:238::-;;;;;;:::i;:::-;;:::i;63860:222::-;;;;;;:::i;:::-;;:::i;44103:317::-;44234:7;-1:-1:-1;;;;;44281:21:0;;44259:113;;;;-1:-1:-1;;;44259:113:0;;10713:2:1;44259:113:0;;;10695:21:1;10752:2;10732:18;;;10725:30;10791:34;10771:18;;;10764:62;-1:-1:-1;;;10842:18:1;;;10835:40;10892:19;;44259:113:0;;;;;;;;;-1:-1:-1;44390:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;44390:22:0;;;;;;;;;;44103:317;;;;;:::o;43076:360::-;43223:4;-1:-1:-1;;;;;;43265:41:0;;-1:-1:-1;;;43265:41:0;;:110;;-1:-1:-1;;;;;;;43323:52:0;;-1:-1:-1;;;43323:52:0;43265:110;:163;;;-1:-1:-1;;;;;;;;;;34352:40:0;;;43392:36;34193:207;63115:45;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63433:419::-;61699:4;61520:16;;;:12;:16;;;;;;63534:13;;-1:-1:-1;;;63569:29:0;;63565:60;;63607:18;;-1:-1:-1;;;63607:18:0;;;;;;;;;;;63565:60;63720:7;63750:30;63767:12;63750:16;:30::i;:::-;63681:148;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63636:208;;63433:419;;;:::o;64509:211::-;20501:13;:11;:13::i;:::-;64678:34:::1;64689:2;64693:3;64698:7;64707:4;64678:10;:34::i;:::-;64509:211:::0;;;;:::o;46252:438::-;-1:-1:-1;;;;;46485:20:0;;19225:10;46485:20;;:60;;-1:-1:-1;46509:36:0;46526:4;19225:10;45479:218;:::i;46509:36::-;46463:156;;;;-1:-1:-1;;;46463:156:0;;;;;;;:::i;:::-;46630:52;46653:4;46659:2;46663:3;46668:7;46677:4;46630:22;:52::i;:::-;46252:438;;;;;:::o;64196:108::-;20501:13;:11;:13::i;:::-;64270:14:::1;:26:::0;;-1:-1:-1;;;;;;64270:26:0::1;-1:-1:-1::0;;;;;64270:26:0;;;::::1;::::0;;;::::1;::::0;;64196:108::o;44586:561::-;44742:16;44817:3;:10;44798:8;:15;:29;44776:120;;;;-1:-1:-1;;;44776:120:0;;13242:2:1;44776:120:0;;;13224:21:1;13281:2;13261:18;;;13254:30;13320:34;13300:18;;;13293:62;-1:-1:-1;;;13371:18:1;;;13364:39;13420:19;;44776:120:0;13040:405:1;44776:120:0;44909:30;44956:8;:15;-1:-1:-1;;;;;44942:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44942:30:0;;44909:63;;44990:9;44985:122;45009:8;:15;45005:1;:19;44985:122;;;45065:30;45075:8;45084:1;45075:11;;;;;;;;:::i;:::-;;;;;;;45088:3;45092:1;45088:6;;;;;;;;:::i;:::-;;;;;;;45065:9;:30::i;:::-;45046:13;45060:1;45046:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;45026:3;;;:::i;:::-;;;44985:122;;;-1:-1:-1;45126:13:0;44586:561;-1:-1:-1;;;44586:561:0:o;64090:98::-;20501:13;:11;:13::i;:::-;64162:7:::1;:18;64172:8:::0;64162:7;:18:::1;:::i;:::-;;64090:98:::0;:::o;63202:21::-;;;;;;;:::i;21263:103::-;20501:13;:11;:13::i;:::-;21328:30:::1;21355:1;21328:18;:30::i;:::-;21263:103::o:0;64312:189::-;20501:13;:11;:13::i;:::-;64461:32:::1;64467:7;64476:2;64480:6;64488:4;64461:5;:32::i;63167:28::-:0;;;;;;;:::i;45220:187::-;45347:52;19225:10;45380:8;45390;45347:18;:52::i;45769:406::-;-1:-1:-1;;;;;45977:20:0;;19225:10;45977:20;;:60;;-1:-1:-1;46001:36:0;46018:4;19225:10;45479:218;:::i;46001:36::-;45955:156;;;;-1:-1:-1;;;45955:156:0;;;;;;;:::i;:::-;46122:45;46140:4;46146:2;46150;46154:6;46162:4;46122:17;:45::i;21521:238::-;20501:13;:11;:13::i;:::-;-1:-1:-1;;;;;21624:22:0;::::1;21602:110;;;::::0;-1:-1:-1;;;21602:110:0;;16134:2:1;21602:110:0::1;::::0;::::1;16116:21:1::0;16173:2;16153:18;;;16146:30;16212:34;16192:18;;;16185:62;-1:-1:-1;;;16263:18:1;;;16256:36;16309:19;;21602:110:0::1;15932:402:1::0;21602:110:0::1;21723:28;21742:8;21723:18;:28::i;:::-;21521:238:::0;:::o;63860:222::-;2378:21;:19;:21::i;:::-;63996:14:::1;::::0;-1:-1:-1;;;;;63996:14:0::1;63974:10;:37;63970:62;;64020:12;;-1:-1:-1::0;;;64020:12:0::1;;;;;;;;;;;63970:62;64043:31;64049:3;64054:12;64068:1;64043:31;;;;;;;;;;;::::0;:5:::1;:31::i;:::-;2422:20:::0;1816:1;2942:7;:22;2759:213;16542:716;16598:13;16649:14;16666:17;16677:5;16666:10;:17::i;:::-;16686:1;16666:21;16649:38;;16702:20;16736:6;-1:-1:-1;;;;;16725:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16725:18:0;-1:-1:-1;16702:41:0;-1:-1:-1;16867:28:0;;;16883:2;16867:28;16924:288;-1:-1:-1;;16956:5:0;-1:-1:-1;;;17093:2:0;17082:14;;17077:30;16956:5;17064:44;17154:2;17145:11;;;-1:-1:-1;17175:21:0;16924:288;17175:21;-1:-1:-1;17233:6:0;16542:716;-1:-1:-1;;;16542:716:0:o;20780:132::-;20688:6;;-1:-1:-1;;;;;20688:6:0;19225:10;20844:23;20836:68;;;;-1:-1:-1;;;20836:68:0;;16673:2:1;20836:68:0;;;16655:21:1;;;16692:18;;;16685:30;16751:34;16731:18;;;16724:62;16803:18;;20836:68:0;16471:356:1;52383:939:0;-1:-1:-1;;;;;52561:16:0;;52553:62;;;;-1:-1:-1;;;52553:62:0;;;;;;;:::i;:::-;52662:7;:14;52648:3;:10;:28;52626:118;;;;-1:-1:-1;;;52626:118:0;;;;;;;:::i;:::-;19225:10;52801:66;19225:10;52757:16;52844:2;52848:3;52853:7;52862:4;52801:20;:66::i;:::-;52885:9;52880:103;52904:3;:10;52900:1;:14;52880:103;;;52961:7;52969:1;52961:10;;;;;;;;:::i;:::-;;;;;;;52936:9;:17;52946:3;52950:1;52946:6;;;;;;;;:::i;:::-;;;;;;;52936:17;;;;;;;;;;;:21;52954:2;-1:-1:-1;;;;;52936:21:0;-1:-1:-1;;;;;52936:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;52916:3:0;;-1:-1:-1;52916:3:0;;;:::i;:::-;;;;52880:103;;;;53036:2;-1:-1:-1;;;;;53000:53:0;53032:1;-1:-1:-1;;;;;53000:53:0;53014:8;-1:-1:-1;;;;;53000:53:0;;53040:3;53045:7;53000:53;;;;;;;:::i;:::-;;;;;;;;53144:170;53194:8;53225:1;53242:2;53259:3;53277:7;53299:4;53144:35;:170::i;48523:1321::-;48764:7;:14;48750:3;:10;:28;48728:118;;;;-1:-1:-1;;;48728:118:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48865:16:0;;48857:66;;;;-1:-1:-1;;;48857:66:0;;;;;;;:::i;:::-;19225:10;48980:60;19225:10;49011:4;49017:2;49021:3;49026:7;49035:4;48980:20;:60::i;:::-;49058:9;49053:470;49077:3;:10;49073:1;:14;49053:470;;;49109:10;49122:3;49126:1;49122:6;;;;;;;;:::i;:::-;;;;;;;49109:19;;49143:14;49160:7;49168:1;49160:10;;;;;;;;:::i;:::-;;;;;;;;;;;;49187:19;49209:13;;;;;;;;;;-1:-1:-1;;;;;49209:19:0;;;;;;;;;;;;49160:10;;-1:-1:-1;49269:21:0;;;;49243:125;;;;-1:-1:-1;;;49243:125:0;;;;;;;:::i;:::-;49412:9;:13;;;;;;;;;;;-1:-1:-1;;;;;49412:19:0;;;;;;;;;;49434:20;;;49412:42;;49484:17;;;;;;;:27;;49434:20;;49412:9;49484:27;;49434:20;;49484:27;:::i;:::-;;;;;;;;49094:429;;;49089:3;;;;:::i;:::-;;;49053:470;;;;49570:2;-1:-1:-1;;;;;49540:47:0;49564:4;-1:-1:-1;;;;;49540:47:0;49554:8;-1:-1:-1;;;;;49540:47:0;;49574:3;49579:7;49540:47;;;;;;;:::i;:::-;;;;;;;;49672:164;49722:8;49745:4;49764:2;49781:3;49799:7;49821:4;49672:35;:164::i;:::-;48717:1127;48523:1321;;;;;:::o;21919:191::-;22012:6;;;-1:-1:-1;;;;;22029:17:0;;;-1:-1:-1;;;;;;22029:17:0;;;;;;;22062:40;;22012:6;;;22029:17;22012:6;;22062:40;;21993:16;;22062:40;21982:128;21919:191;:::o;51162:818::-;-1:-1:-1;;;;;51315:16:0;;51307:62;;;;-1:-1:-1;;;51307:62:0;;;;;;;:::i;:::-;19225:10;51382:16;51447:21;51465:2;51447:17;:21::i;:::-;51424:44;;51479:24;51506:25;51524:6;51506:17;:25::i;:::-;51479:52;;51544:66;51565:8;51583:1;51587:2;51591:3;51596:7;51605:4;51544:20;:66::i;:::-;51623:9;:13;;;;;;;;;;;-1:-1:-1;;;;;51623:17:0;;;;;;;;;:27;;51644:6;;51623:9;:27;;51644:6;;51623:27;:::i;:::-;;;;-1:-1:-1;;51666:52:0;;;19234:25:1;;;19290:2;19275:18;;19268:34;;;-1:-1:-1;;;;;51666:52:0;;;;51699:1;;51666:52;;;;;;19207:18:1;51666:52:0;;;;;;;51809:163;51854:8;51885:1;51902:2;51919;51936:6;51957:4;51809:30;:163::i;:::-;51296:684;;;51162:818;;;;:::o;55876:331::-;56031:8;-1:-1:-1;;;;;56022:17:0;:5;-1:-1:-1;;;;;56022:17:0;;56014:71;;;;-1:-1:-1;;;56014:71:0;;19515:2:1;56014:71:0;;;19497:21:1;19554:2;19534:18;;;19527:30;19593:34;19573:18;;;19566:62;-1:-1:-1;;;19644:18:1;;;19637:39;19693:19;;56014:71:0;19313:405:1;56014:71:0;-1:-1:-1;;;;;56096:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;56096:46:0;;;;;;;;;;56158:41;;1159::1;;;56158::0;;1132:18:1;56158:41:0;;;;;;;55876:331;;;:::o;47154:1011::-;-1:-1:-1;;;;;47342:16:0;;47334:66;;;;-1:-1:-1;;;47334:66:0;;;;;;;:::i;:::-;19225:10;47413:16;47478:21;47496:2;47478:17;:21::i;:::-;47455:44;;47510:24;47537:25;47555:6;47537:17;:25::i;:::-;47510:52;;47575:60;47596:8;47606:4;47612:2;47616:3;47621:7;47630:4;47575:20;:60::i;:::-;47648:19;47670:13;;;;;;;;;;;-1:-1:-1;;;;;47670:19:0;;;;;;;;;;47722:21;;;;47700:113;;;;-1:-1:-1;;;47700:113:0;;;;;;;:::i;:::-;47849:9;:13;;;;;;;;;;;-1:-1:-1;;;;;47849:19:0;;;;;;;;;;47871:20;;;47849:42;;47913:17;;;;;;;:27;;47871:20;;47849:9;47913:27;;47871:20;;47913:27;:::i;:::-;;;;-1:-1:-1;;47958:46:0;;;19234:25:1;;;19290:2;19275:18;;19268:34;;;-1:-1:-1;;;;;47958:46:0;;;;;;;;;;;;;;19207:18:1;47958:46:0;;;;;;;48089:68;48120:8;48130:4;48136:2;48140;48144:6;48152:4;48089:30;:68::i;:::-;47323:842;;;;47154:1011;;;;;:::o;2458:293::-;1860:1;2592:7;;:19;2584:63;;;;-1:-1:-1;;;2584:63:0;;19925:2:1;2584:63:0;;;19907:21:1;19964:2;19944:18;;;19937:30;20003:33;19983:18;;;19976:61;20054:18;;2584:63:0;19723:355:1;2584:63:0;1860:1;2725:7;:18;2458:293::o;13280:922::-;13333:7;;-1:-1:-1;;;13411:15:0;;13407:102;;-1:-1:-1;;;13447:15:0;;;-1:-1:-1;13491:2:0;13481:12;13407:102;13536:6;13527:5;:15;13523:102;;13572:6;13563:15;;;-1:-1:-1;13607:2:0;13597:12;13523:102;13652:6;13643:5;:15;13639:102;;13688:6;13679:15;;;-1:-1:-1;13723:2:0;13713:12;13639:102;13768:5;13759;:14;13755:99;;13803:5;13794:14;;;-1:-1:-1;13837:1:0;13827:11;13755:99;13881:5;13872;:14;13868:99;;13916:5;13907:14;;;-1:-1:-1;13950:1:0;13940:11;13868:99;13994:5;13985;:14;13981:99;;14029:5;14020:14;;;-1:-1:-1;14063:1:0;14053:11;13981:99;14107:5;14098;:14;14094:66;;14143:1;14133:11;14188:6;13280:922;-1:-1:-1;;13280:922:0:o;64796:329::-;65051:66;65078:8;65088:4;65094:2;65098:3;65103:7;65112:4;65051:26;:66::i;59475:975::-;-1:-1:-1;;;;;59715:13:0;;23643:19;:23;59711:732;;59768:203;;-1:-1:-1;;;59768:203:0;;-1:-1:-1;;;;;59768:43:0;;;;;:203;;59834:8;;59865:4;;59892:3;;59918:7;;59948:4;;59768:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59768:203:0;;;;;;;;-1:-1:-1;;59768:203:0;;;;;;;;;;;;:::i;:::-;;;59747:685;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;60305:6;60298:14;;-1:-1:-1;;;60298:14:0;;;;;;;;:::i;59747:685::-;;;60354:62;;-1:-1:-1;;;60354:62:0;;22231:2:1;60354:62:0;;;22213:21:1;22270:2;22250:18;;;22243:30;22309:34;22289:18;;;22282:62;-1:-1:-1;;;22360:18:1;;;22353:50;22420:19;;60354:62:0;22029:416:1;59747:685:0;-1:-1:-1;;;;;;60056:60:0;;-1:-1:-1;;;60056:60:0;60030:199;;60159:50;;-1:-1:-1;;;60159:50:0;;;;;;;:::i;60458:230::-;60610:16;;;60624:1;60610:16;;;;;;;;;60551;;60585:22;;60610:16;;;;;;;;;;;;-1:-1:-1;60610:16:0;60585:41;;60648:7;60637:5;60643:1;60637:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;60675:5;60458:230;-1:-1:-1;;60458:230:0:o;58569:898::-;-1:-1:-1;;;;;58784:13:0;;23643:19;:23;58780:680;;58837:196;;-1:-1:-1;;;58837:196:0;;-1:-1:-1;;;;;58837:38:0;;;;;:196;;58898:8;;58929:4;;58956:2;;58981:6;;59010:4;;58837:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58837:196:0;;;;;;;;-1:-1:-1;;58837:196:0;;;;;;;;;;;;:::i;:::-;;;58816:633;;;;:::i;:::-;-1:-1:-1;;;;;;59096:55:0;;-1:-1:-1;;;59096:55:0;59092:154;;59176:50;;-1:-1:-1;;;59176:50:0;;;;;;;:::i;61839:992::-;-1:-1:-1;;;;;62161:18:0;;62157:160;;62201:9;62196:110;62220:3;:10;62216:1;:14;62196:110;;;62280:7;62288:1;62280:10;;;;;;;;:::i;:::-;;;;;;;62256:12;:20;62269:3;62273:1;62269:6;;;;;;;;:::i;:::-;;;;;;;62256:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;62232:3:0;;-1:-1:-1;62232:3:0;;:::i;:::-;;;62196:110;;;;62157:160;-1:-1:-1;;;;;62333:16:0;;62329:495;;62371:9;62366:447;62390:3;:10;62386:1;:14;62366:447;;;62426:10;62439:3;62443:1;62439:6;;;;;;;;:::i;:::-;;;;;;;62426:19;;62464:14;62481:7;62489:1;62481:10;;;;;;;;:::i;:::-;;;;;;;62464:27;;62510:14;62527:12;:16;62540:2;62527:16;;;;;;;;;;;;62510:33;;62602:6;62592;:16;;62562:130;;;;-1:-1:-1;;;62562:130:0;;23627:2:1;62562:130:0;;;23609:21:1;23666:2;23646:18;;;23639:30;23705:34;23685:18;;;23678:62;-1:-1:-1;;;23756:18:1;;;23749:38;23804:19;;62562:130:0;23425:404:1;62562:130:0;62744:16;;;;:12;:16;;;;;;62763:15;;62744:34;;62402:3;;;:::i;:::-;;;62366:447;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;:::-;1003:5;769:245;-1:-1:-1;;;769:245:1:o;1419:250::-;1504:1;1514:113;1528:6;1525:1;1522:13;1514:113;;;1604:11;;;1598:18;1585:11;;;1578:39;1550:2;1543:10;1514:113;;;-1:-1:-1;;1661:1:1;1643:16;;1636:27;1419:250::o;1674:271::-;1716:3;1754:5;1748:12;1781:6;1776:3;1769:19;1797:76;1866:6;1859:4;1854:3;1850:14;1843:4;1836:5;1832:16;1797:76;:::i;:::-;1927:2;1906:15;-1:-1:-1;;1902:29:1;1893:39;;;;1934:4;1889:50;;1674:271;-1:-1:-1;;1674:271:1:o;1950:220::-;2099:2;2088:9;2081:21;2062:4;2119:45;2160:2;2149:9;2145:18;2137:6;2119:45;:::i;2175:180::-;2234:6;2287:2;2275:9;2266:7;2262:23;2258:32;2255:52;;;2303:1;2300;2293:12;2255:52;-1:-1:-1;2326:23:1;;2175:180;-1:-1:-1;2175:180:1:o;2360:127::-;2421:10;2416:3;2412:20;2409:1;2402:31;2452:4;2449:1;2442:15;2476:4;2473:1;2466:15;2492:249;2602:2;2583:13;;-1:-1:-1;;2579:27:1;2567:40;;-1:-1:-1;;;;;2622:34:1;;2658:22;;;2619:62;2616:88;;;2684:18;;:::i;:::-;2720:2;2713:22;-1:-1:-1;;2492:249:1:o;2746:183::-;2806:4;-1:-1:-1;;;;;2831:6:1;2828:30;2825:56;;;2861:18;;:::i;:::-;-1:-1:-1;2906:1:1;2902:14;2918:4;2898:25;;2746:183::o;2934:724::-;2988:5;3041:3;3034:4;3026:6;3022:17;3018:27;3008:55;;3059:1;3056;3049:12;3008:55;3095:6;3082:20;3121:4;3144:43;3184:2;3144:43;:::i;:::-;3216:2;3210:9;3228:31;3256:2;3248:6;3228:31;:::i;:::-;3294:18;;;3386:1;3382:10;;;;3370:23;;3366:32;;;3328:15;;;;-1:-1:-1;3410:15:1;;;3407:35;;;3438:1;3435;3428:12;3407:35;3474:2;3466:6;3462:15;3486:142;3502:6;3497:3;3494:15;3486:142;;;3568:17;;3556:30;;3606:12;;;;3519;;3486:142;;;-1:-1:-1;3646:6:1;2934:724;-1:-1:-1;;;;;;2934:724:1:o;3663:468::-;3727:5;-1:-1:-1;;;;;3753:6:1;3750:30;3747:56;;;3783:18;;:::i;:::-;3832:2;3826:9;3844:69;3901:2;3880:15;;-1:-1:-1;;3876:29:1;3907:4;3872:40;3826:9;3844:69;:::i;:::-;3931:6;3922:15;;3961:6;3953;3946:22;4001:3;3992:6;3987:3;3983:16;3980:25;3977:45;;;4018:1;4015;4008:12;3977:45;4068:6;4063:3;4056:4;4048:6;4044:17;4031:44;4123:1;4116:4;4107:6;4099;4095:19;4091:30;4084:41;;3663:468;;;;;:::o;4136:220::-;4178:5;4231:3;4224:4;4216:6;4212:17;4208:27;4198:55;;4249:1;4246;4239:12;4198:55;4271:79;4346:3;4337:6;4324:20;4317:4;4309:6;4305:17;4271:79;:::i;4361:868::-;4506:6;4514;4522;4530;4583:3;4571:9;4562:7;4558:23;4554:33;4551:53;;;4600:1;4597;4590:12;4551:53;4623:29;4642:9;4623:29;:::i;:::-;4613:39;;4703:2;4692:9;4688:18;4675:32;-1:-1:-1;;;;;4767:2:1;4759:6;4756:14;4753:34;;;4783:1;4780;4773:12;4753:34;4806:61;4859:7;4850:6;4839:9;4835:22;4806:61;:::i;:::-;4796:71;;4920:2;4909:9;4905:18;4892:32;4876:48;;4949:2;4939:8;4936:16;4933:36;;;4965:1;4962;4955:12;4933:36;4988:63;5043:7;5032:8;5021:9;5017:24;4988:63;:::i;:::-;4978:73;;5104:2;5093:9;5089:18;5076:32;5060:48;;5133:2;5123:8;5120:16;5117:36;;;5149:1;5146;5139:12;5117:36;;5172:51;5215:7;5204:8;5193:9;5189:24;5172:51;:::i;:::-;5162:61;;;4361:868;;;;;;;:::o;5234:943::-;5388:6;5396;5404;5412;5420;5473:3;5461:9;5452:7;5448:23;5444:33;5441:53;;;5490:1;5487;5480:12;5441:53;5513:29;5532:9;5513:29;:::i;:::-;5503:39;;5561:38;5595:2;5584:9;5580:18;5561:38;:::i;:::-;5551:48;;5650:2;5639:9;5635:18;5622:32;-1:-1:-1;;;;;5714:2:1;5706:6;5703:14;5700:34;;;5730:1;5727;5720:12;5700:34;5753:61;5806:7;5797:6;5786:9;5782:22;5753:61;:::i;:::-;5743:71;;5867:2;5856:9;5852:18;5839:32;5823:48;;5896:2;5886:8;5883:16;5880:36;;;5912:1;5909;5902:12;5880:36;5935:63;5990:7;5979:8;5968:9;5964:24;5935:63;:::i;:::-;5925:73;;6051:3;6040:9;6036:19;6023:33;6007:49;;6081:2;6071:8;6068:16;6065:36;;;6097:1;6094;6087:12;6065:36;;6120:51;6163:7;6152:8;6141:9;6137:24;6120:51;:::i;:::-;6110:61;;;5234:943;;;;;;;;:::o;6182:186::-;6241:6;6294:2;6282:9;6273:7;6269:23;6265:32;6262:52;;;6310:1;6307;6300:12;6262:52;6333:29;6352:9;6333:29;:::i;6373:1208::-;6491:6;6499;6552:2;6540:9;6531:7;6527:23;6523:32;6520:52;;;6568:1;6565;6558:12;6520:52;6608:9;6595:23;-1:-1:-1;;;;;6678:2:1;6670:6;6667:14;6664:34;;;6694:1;6691;6684:12;6664:34;6732:6;6721:9;6717:22;6707:32;;6777:7;6770:4;6766:2;6762:13;6758:27;6748:55;;6799:1;6796;6789:12;6748:55;6835:2;6822:16;6857:4;6880:43;6920:2;6880:43;:::i;:::-;6952:2;6946:9;6964:31;6992:2;6984:6;6964:31;:::i;:::-;7030:18;;;7118:1;7114:10;;;;7106:19;;7102:28;;;7064:15;;;;-1:-1:-1;7142:19:1;;;7139:39;;;7174:1;7171;7164:12;7139:39;7198:11;;;;7218:148;7234:6;7229:3;7226:15;7218:148;;;7300:23;7319:3;7300:23;:::i;:::-;7288:36;;7251:12;;;;7344;;;;7218:148;;;7385:6;-1:-1:-1;;7429:18:1;;7416:32;;-1:-1:-1;;7460:16:1;;;7457:36;;;7489:1;7486;7479:12;7457:36;;7512:63;7567:7;7556:8;7545:9;7541:24;7512:63;:::i;:::-;7502:73;;;6373:1208;;;;;:::o;7586:435::-;7639:3;7677:5;7671:12;7704:6;7699:3;7692:19;7730:4;7759:2;7754:3;7750:12;7743:19;;7796:2;7789:5;7785:14;7817:1;7827:169;7841:6;7838:1;7835:13;7827:169;;;7902:13;;7890:26;;7936:12;;;;7971:15;;;;7863:1;7856:9;7827:169;;;-1:-1:-1;8012:3:1;;7586:435;-1:-1:-1;;;;;7586:435:1:o;8026:261::-;8205:2;8194:9;8187:21;8168:4;8225:56;8277:2;8266:9;8262:18;8254:6;8225:56;:::i;8292:450::-;8361:6;8414:2;8402:9;8393:7;8389:23;8385:32;8382:52;;;8430:1;8427;8420:12;8382:52;8470:9;8457:23;-1:-1:-1;;;;;8495:6:1;8492:30;8489:50;;;8535:1;8532;8525:12;8489:50;8558:22;;8611:4;8603:13;;8599:27;-1:-1:-1;8589:55:1;;8640:1;8637;8630:12;8589:55;8663:73;8728:7;8723:2;8710:16;8705:2;8701;8697:11;8663:73;:::i;:::-;8653:83;8292:450;-1:-1:-1;;;;8292:450:1:o;8747:531::-;8842:6;8850;8858;8866;8919:3;8907:9;8898:7;8894:23;8890:33;8887:53;;;8936:1;8933;8926:12;8887:53;8959:29;8978:9;8959:29;:::i;:::-;8949:39;;9035:2;9024:9;9020:18;9007:32;8997:42;;9086:2;9075:9;9071:18;9058:32;9048:42;;9141:2;9130:9;9126:18;9113:32;-1:-1:-1;;;;;9160:6:1;9157:30;9154:50;;;9200:1;9197;9190:12;9154:50;9223:49;9264:7;9255:6;9244:9;9240:22;9223:49;:::i;9283:347::-;9348:6;9356;9409:2;9397:9;9388:7;9384:23;9380:32;9377:52;;;9425:1;9422;9415:12;9377:52;9448:29;9467:9;9448:29;:::i;:::-;9438:39;;9527:2;9516:9;9512:18;9499:32;9574:5;9567:13;9560:21;9553:5;9550:32;9540:60;;9596:1;9593;9586:12;9540:60;9619:5;9609:15;;;9283:347;;;;;:::o;9635:260::-;9703:6;9711;9764:2;9752:9;9743:7;9739:23;9735:32;9732:52;;;9780:1;9777;9770:12;9732:52;9803:29;9822:9;9803:29;:::i;:::-;9793:39;;9851:38;9885:2;9874:9;9870:18;9851:38;:::i;:::-;9841:48;;9635:260;;;;;:::o;9900:606::-;10004:6;10012;10020;10028;10036;10089:3;10077:9;10068:7;10064:23;10060:33;10057:53;;;10106:1;10103;10096:12;10057:53;10129:29;10148:9;10129:29;:::i;:::-;10119:39;;10177:38;10211:2;10200:9;10196:18;10177:38;:::i;:::-;10167:48;;10262:2;10251:9;10247:18;10234:32;10224:42;;10313:2;10302:9;10298:18;10285:32;10275:42;;10368:3;10357:9;10353:19;10340:33;-1:-1:-1;;;;;10388:6:1;10385:30;10382:50;;;10428:1;10425;10418:12;10382:50;10451:49;10492:7;10483:6;10472:9;10468:22;10451:49;:::i;10922:380::-;11001:1;10997:12;;;;11044;;;11065:61;;11119:4;11111:6;11107:17;11097:27;;11065:61;11172:2;11164:6;11161:14;11141:18;11138:38;11135:161;;11218:10;11213:3;11209:20;11206:1;11199:31;11253:4;11250:1;11243:15;11281:4;11278:1;11271:15;11135:161;;10922:380;;;:::o;11433:1187::-;11710:3;11739:1;11772:6;11766:13;11802:36;11828:9;11802:36;:::i;:::-;11857:1;11874:18;;;11901:133;;;;12048:1;12043:356;;;;11867:532;;11901:133;-1:-1:-1;;11934:24:1;;11922:37;;12007:14;;12000:22;11988:35;;11979:45;;;-1:-1:-1;11901:133:1;;12043:356;12074:6;12071:1;12064:17;12104:4;12149:2;12146:1;12136:16;12174:1;12188:165;12202:6;12199:1;12196:13;12188:165;;;12280:14;;12267:11;;;12260:35;12323:16;;;;12217:10;;12188:165;;;12192:3;;;12382:6;12377:3;12373:16;12366:23;;11867:532;;;;;12430:6;12424:13;12446:68;12505:8;12500:3;12493:4;12485:6;12481:17;12446:68;:::i;:::-;-1:-1:-1;;;12536:18:1;;12563:22;;;12612:1;12601:13;;11433:1187;-1:-1:-1;;;;11433:1187:1:o;12625:410::-;12827:2;12809:21;;;12866:2;12846:18;;;12839:30;12905:34;12900:2;12885:18;;12878:62;-1:-1:-1;;;12971:2:1;12956:18;;12949:44;13025:3;13010:19;;12625:410::o;13450:127::-;13511:10;13506:3;13502:20;13499:1;13492:31;13542:4;13539:1;13532:15;13566:4;13563:1;13556:15;13582:127;13643:10;13638:3;13634:20;13631:1;13624:31;13674:4;13671:1;13664:15;13698:4;13695:1;13688:15;13714:135;13753:3;13774:17;;;13771:43;;13794:18;;:::i;:::-;-1:-1:-1;13841:1:1;13830:13;;13714:135::o;13854:545::-;13956:2;13951:3;13948:11;13945:448;;;13992:1;14017:5;14013:2;14006:17;14062:4;14058:2;14048:19;14132:2;14120:10;14116:19;14113:1;14109:27;14103:4;14099:38;14168:4;14156:10;14153:20;14150:47;;;-1:-1:-1;14191:4:1;14150:47;14246:2;14241:3;14237:12;14234:1;14230:20;14224:4;14220:31;14210:41;;14301:82;14319:2;14312:5;14309:13;14301:82;;;14364:17;;;14345:1;14334:13;14301:82;;13945:448;13854:545;;;:::o;14575:1352::-;14701:3;14695:10;-1:-1:-1;;;;;14720:6:1;14717:30;14714:56;;;14750:18;;:::i;:::-;14779:97;14869:6;14829:38;14861:4;14855:11;14829:38;:::i;:::-;14823:4;14779:97;:::i;:::-;14931:4;;14995:2;14984:14;;15012:1;15007:663;;;;15714:1;15731:6;15728:89;;;-1:-1:-1;15783:19:1;;;15777:26;15728:89;-1:-1:-1;;14532:1:1;14528:11;;;14524:24;14520:29;14510:40;14556:1;14552:11;;;14507:57;15830:81;;14977:944;;15007:663;11380:1;11373:14;;;11417:4;11404:18;;-1:-1:-1;;15043:20:1;;;15161:236;15175:7;15172:1;15169:14;15161:236;;;15264:19;;;15258:26;15243:42;;15356:27;;;;15324:1;15312:14;;;;15191:19;;15161:236;;;15165:3;15425:6;15416:7;15413:19;15410:201;;;15486:19;;;15480:26;-1:-1:-1;;15569:1:1;15565:14;;;15581:3;15561:24;15557:37;15553:42;15538:58;15523:74;;15410:201;-1:-1:-1;;;;;15657:1:1;15641:14;;;15637:22;15624:36;;-1:-1:-1;14575:1352:1:o;16832:397::-;17034:2;17016:21;;;17073:2;17053:18;;;17046:30;17112:34;17107:2;17092:18;;17085:62;-1:-1:-1;;;17178:2:1;17163:18;;17156:31;17219:3;17204:19;;16832:397::o;17234:404::-;17436:2;17418:21;;;17475:2;17455:18;;;17448:30;17514:34;17509:2;17494:18;;17487:62;-1:-1:-1;;;17580:2:1;17565:18;;17558:38;17628:3;17613:19;;17234:404::o;17643:125::-;17708:9;;;17729:10;;;17726:36;;;17742:18;;:::i;17773:465::-;18030:2;18019:9;18012:21;17993:4;18056:56;18108:2;18097:9;18093:18;18085:6;18056:56;:::i;:::-;18160:9;18152:6;18148:22;18143:2;18132:9;18128:18;18121:50;18188:44;18225:6;18217;18188:44;:::i;:::-;18180:52;17773:465;-1:-1:-1;;;;;17773:465:1:o;18243:401::-;18445:2;18427:21;;;18484:2;18464:18;;;18457:30;18523:34;18518:2;18503:18;;18496:62;-1:-1:-1;;;18589:2:1;18574:18;;18567:35;18634:3;18619:19;;18243:401::o;18649:406::-;18851:2;18833:21;;;18890:2;18870:18;;;18863:30;18929:34;18924:2;18909:18;;18902:62;-1:-1:-1;;;18995:2:1;18980:18;;18973:40;19045:3;19030:19;;18649:406::o;20083:827::-;-1:-1:-1;;;;;20480:15:1;;;20462:34;;20532:15;;20527:2;20512:18;;20505:43;20442:3;20579:2;20564:18;;20557:31;;;20405:4;;20611:57;;20648:19;;20640:6;20611:57;:::i;:::-;20716:9;20708:6;20704:22;20699:2;20688:9;20684:18;20677:50;20750:44;20787:6;20779;20750:44;:::i;:::-;20736:58;;20843:9;20835:6;20831:22;20825:3;20814:9;20810:19;20803:51;20871:33;20897:6;20889;20871:33;:::i;:::-;20863:41;20083:827;-1:-1:-1;;;;;;;;20083:827:1:o;20915:249::-;20984:6;21037:2;21025:9;21016:7;21012:23;21008:32;21005:52;;;21053:1;21050;21043:12;21005:52;21085:9;21079:16;21104:30;21128:5;21104:30;:::i;21169:179::-;21204:3;21246:1;21228:16;21225:23;21222:120;;;21292:1;21289;21286;21271:23;-1:-1:-1;21329:1:1;21323:8;21318:3;21314:18;21222:120;21169:179;:::o;21353:671::-;21392:3;21434:4;21416:16;21413:26;21410:39;;;21353:671;:::o;21410:39::-;21476:2;21470:9;-1:-1:-1;;21541:16:1;21537:25;;21534:1;21470:9;21513:50;21592:4;21586:11;21616:16;-1:-1:-1;;;;;21722:2:1;21715:4;21707:6;21703:17;21700:25;21695:2;21687:6;21684:14;21681:45;21678:58;;;21729:5;;;;;21353:671;:::o;21678:58::-;21766:6;21760:4;21756:17;21745:28;;21802:3;21796:10;21829:2;21821:6;21818:14;21815:27;;;21835:5;;;;;;21353:671;:::o;21815:27::-;21919:2;21900:16;21894:4;21890:27;21886:36;21879:4;21870:6;21865:3;21861:16;21857:27;21854:69;21851:82;;;21926:5;;;;;;21353:671;:::o;21851:82::-;21942:57;21993:4;21984:6;21976;21972:19;21968:30;21962:4;21942:57;:::i;:::-;-1:-1:-1;22015:3:1;;21353:671;-1:-1:-1;;;;;21353:671:1:o;22450:404::-;22652:2;22634:21;;;22691:2;22671:18;;;22664:30;22730:34;22725:2;22710:18;;22703:62;-1:-1:-1;;;22796:2:1;22781:18;;22774:38;22844:3;22829:19;;22450:404::o;22859:561::-;-1:-1:-1;;;;;23156:15:1;;;23138:34;;23208:15;;23203:2;23188:18;;23181:43;23255:2;23240:18;;23233:34;;;23298:2;23283:18;;23276:34;;;23118:3;23341;23326:19;;23319:32;;;23081:4;;23368:46;;23394:19;;23386:6;23368:46;:::i;:::-;23360:54;22859:561;-1:-1:-1;;;;;;;22859:561:1:o

Swarm Source

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