Contract 0x0465005056044881d04b574e44acca6a5f455b7a

Contract Overview

Balance:
0 FTM
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xa86d0c66a059a28413a198ab191b46d0356473f994c37c97a4eaa0d0d7be4efeBurn82943442022-03-08 8:00:50377 days 8 hrs ago0x2386f25c4be58b87465a57e94cb04da5edd53606 IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.019964617387
0x5f48def70783fcd2acb6f9a35f0670e334dacc4038079ff49859c47e7816865aBurn82941912022-03-08 7:51:11377 days 8 hrs ago0x2386f25c4be58b87465a57e94cb04da5edd53606 IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.025028676909
0x5d2803c4d1f772eb9e153b316e663abc7d04f37be20c47750aebeb861752c65aBurn82940502022-03-08 7:43:47377 days 8 hrs ago0x2386f25c4be58b87465a57e94cb04da5edd53606 IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.023140042826
0x35e96cc32885364df1644434dbb6d3faef6229515998e2f21ecdd1b7dc4c79f2Burn82939542022-03-08 7:37:07377 days 8 hrs ago0x95298790beb442f204e3864c5bd4073905185108 IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.016685784606
0xc25971f190de91d516de65b5c7101caa44e47423e8d5b6bd2ebabf2761eaa9beSafe Transfer Fr...82747002022-03-07 3:42:53378 days 12 hrs ago0x2386f25c4be58b87465a57e94cb04da5edd53606 IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.016240953025
0x00394b05d0cad1f1764b448762e332c61b7bc51338ed046fb80b775f1acd9ef2Set Approval For...82746072022-03-07 3:36:39378 days 12 hrs ago0x95298790beb442f204e3864c5bd4073905185108 IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.005530192615
0xb1697970eab452426b9acc6deb2a6078d61a2eb932984a518196682dd7abcb9bSet Approval For...82745932022-03-07 3:35:42378 days 12 hrs ago0x95298790beb442f204e3864c5bd4073905185108 IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.009698488543
0xa01b6b390644d16425c3d3d6a63292226f45eded6233eb7dffa8e813df6daf7fMint Batch82405222022-03-04 6:55:42381 days 9 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.162892364536
0x706ec17ef4acf86ba3431900e7e05da93a64f3d637ff643179fbcdb49a25827cMint Batch82405212022-03-04 6:55:34381 days 9 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.162892364536
0xa0b285dd6164b0c7f65b6d3899bd5e898e1f14be47049911a82424991d0655ebMint82405172022-03-04 6:55:14381 days 9 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.046564705859
0xc5509b0310bd0c4a74f90b6e0269f5fa86ec57ab36c2052d2fa2e78aa975e51fMint82405132022-03-04 6:54:23381 days 9 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.045976664111
0x1a7164fdb64d29b729fbafbc3d2cabf4b85c48d69a4c555ddd6fdf2c10805d92Set Approval For...82356362022-03-03 13:10:32382 days 2 hrs ago0x951c9476efbbe57d389712845cb73d8874399891 IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.00934902
0x68d917e7cf77b414491f700be448ca7886d01a0fd299cd78dffe2bdb0b475b7eMint82334612022-03-03 7:29:56382 days 8 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.0448985025
0x242e870e611c52fa5f697f736c26d99969b6353e8a62bfbf34e194e412ec5908Mint82334602022-03-03 7:29:52382 days 8 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.0448985025
0x63a44cd45c30238630f74e30294d194938d3357032f26dbc9a849e25047aafe2Mint82334592022-03-03 7:29:51382 days 8 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.0448985025
0xccb1c7a22b703f82b3f9ab50b47374525e274869df9fdbb9b6320fe6322fc8d5Mint82334582022-03-03 7:29:43382 days 8 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.0448985025
0xe805910c674fea01d04b46dbb31feababa12263fa55a11d12c7415071746e21fMint82334572022-03-03 7:29:38382 days 8 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.0448985025
0x10d9a153a41aef421d217193551e8fb92b56a18ea7ba3093183502a0cf4dd24cMint82334562022-03-03 7:29:36382 days 8 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.0448985025
0xf15461e30b15cebb51057c3295c5a92a2a31cc94f9d2c5fbd3d84d3b7b52c485Mint82334552022-03-03 7:29:30382 days 8 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.0448985025
0xa510943c18590a22917aab5dcfae5262db3635980ddfcec3278d40e4af7e8bffMint82334542022-03-03 7:29:24382 days 8 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.0448985025
0xfea0d6fb7fad67409d6069a06476c0dd856cdf5ba0cef903b9339e0407e1a060Mint82334532022-03-03 7:29:19382 days 8 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.0448985025
0x52936b9033622ae2c7064374d867b825f856b4eca00dc8f4e295402ccb967c0bMint82334522022-03-03 7:29:14382 days 8 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.0443315025
0xb79b5e6a14f5b53270451e375b520129f051fd2a702d2b5c14e68f5f6e6e124dMint82334512022-03-03 7:29:10382 days 8 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.0443315025
0xa33c75b729f948a140e5aaef29a85291563c091d2e0f5a56e881eab07cf713e5Set Approval For...82268352022-03-02 4:33:51383 days 11 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.00935145
0x4e85d870426b3e7ffb415f9a6b601171dc5f56c97371200e9354f4c44c1e2b75Mint82243142022-03-01 17:32:30383 days 22 hrs ago0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d IN  0x0465005056044881d04b574e44acca6a5f455b7a0 FTM0.0448985025
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0xc769f827afc113f79d8f957787bd9ef3e89b85a741a48038639d2892001c0a8882243072022-03-01 17:30:04383 days 22 hrs ago 0x505aa5e9720ad06672a6a71f16ad4e0628fd4f8d  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FittiNft

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2022-03-04
*/

// Sources flattened with hardhat v2.9.0 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// 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/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

// 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/ERC721/[email protected]

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

pragma solidity ^0.8.0;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}


// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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 contracts/FittiNft.sol

pragma solidity ^0.8.0;




contract FittiNft is
    ERC721Enumerable,
    ERC721URIStorage,
    ERC721Burnable,
    Ownable
{
    uint256 public counter;

    constructor(string memory name, string memory symbol)
        ERC721(name, symbol)
    {}

    function mint(address receiver, string memory uri) public onlyOwner {
        require(bytes(uri).length > 0, "FittiNft: uri is invalid");

        uint256 id = ++counter;

        _mint(receiver, id);

        _setTokenURI(id, uri);
    }

    function mintBatch(address[] memory receivers, string[] memory uris)
        public
        onlyOwner
    {
        uint256 lengthUrl = uris.length;
        uint256 lengthReceiver = receivers.length;

        require(
            lengthUrl == lengthReceiver,
            "FittiNft: array params is invalid"
        );
        require(lengthUrl > 0, "FittiNft: array length is invalid");

        uint256 id = counter;

        for (uint256 i = 0; i < lengthUrl; i++) {
            require(bytes(uris[i]).length > 0, "FittiNft: uri is invalid");

            id++;

            _mint(receivers[i], id);

            _setTokenURI(id, uris[i]);
        }

        counter = id;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function _burn(uint256 tokenId)
        internal
        virtual
        override(ERC721, ERC721URIStorage)
    {
        super._burn(tokenId);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"counter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","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":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620025813803806200258183398101604081905262000034916200023b565b8151829082906200004d906000906020850190620000de565b50805162000063906001906020840190620000de565b505050620000806200007a6200008860201b60201c565b6200008c565b5050620002f8565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000ec90620002a5565b90600052602060002090601f0160209004810192826200011057600085556200015b565b82601f106200012b57805160ff19168380011785556200015b565b828001600101855582156200015b579182015b828111156200015b5782518255916020019190600101906200013e565b50620001699291506200016d565b5090565b5b808211156200016957600081556001016200016e565b600082601f8301126200019657600080fd5b81516001600160401b0380821115620001b357620001b3620002e2565b604051601f8301601f19908116603f01168101908282118183101715620001de57620001de620002e2565b81604052838152602092508683858801011115620001fb57600080fd5b600091505b838210156200021f578582018301518183018401529082019062000200565b83821115620002315760008385830101525b9695505050505050565b600080604083850312156200024f57600080fd5b82516001600160401b03808211156200026757600080fd5b620002758683870162000184565b935060208501519150808211156200028c57600080fd5b506200029b8582860162000184565b9150509250929050565b600181811c90821680620002ba57607f821691505b60208210811415620002dc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61227980620003086000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80636352211e116100c3578063a22cb4651161007c578063a22cb465146102a3578063b88d4fde146102b6578063c87b56dd146102c9578063d0def521146102dc578063e985e9c5146102ef578063f2fde38b1461032b57600080fd5b80636352211e1461024957806370a082311461025c578063715018a61461026f5780638da5cb5b14610277578063924cff6d1461028857806395d89b411461029b57600080fd5b806323b872dd1161011557806323b872dd146101e15780632f745c59146101f457806342842e0e1461020757806342966c681461021a5780634f6ccce71461022d57806361bc221a1461024057600080fd5b806301ffc9a71461015257806306fdde031461017a578063081812fc1461018f578063095ea7b3146101ba57806318160ddd146101cf575b600080fd5b610165610160366004611ebb565b61033e565b60405190151581526020015b60405180910390f35b61018261034f565b6040516101719190611fa6565b6101a261019d366004611ef5565b6103e1565b6040516001600160a01b039091168152602001610171565b6101cd6101c8366004611dd4565b61046e565b005b6008545b604051908152602001610171565b6101cd6101ef366004611c92565b610584565b6101d3610202366004611dd4565b6105b6565b6101cd610215366004611c92565b61064c565b6101cd610228366004611ef5565b610667565b6101d361023b366004611ef5565b6106e1565b6101d3600c5481565b6101a2610257366004611ef5565b610774565b6101d361026a366004611c44565b6107eb565b6101cd610872565b600b546001600160a01b03166101a2565b6101cd610296366004611dfe565b6108a8565b610182610a6b565b6101cd6102b1366004611d4a565b610a7a565b6101cd6102c4366004611cce565b610a89565b6101826102d7366004611ef5565b610ac1565b6101cd6102ea366004611d86565b610acc565b6101656102fd366004611c5f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101cd610339366004611c44565b610b6e565b600061034982610c06565b92915050565b60606000805461035e90612155565b80601f016020809104026020016040519081016040528092919081815260200182805461038a90612155565b80156103d75780601f106103ac576101008083540402835291602001916103d7565b820191906000526020600020905b8154815290600101906020018083116103ba57829003601f168201915b5050505050905090565b60006103ec82610c2b565b6104525760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061047982610774565b9050806001600160a01b0316836001600160a01b031614156104e75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610449565b336001600160a01b0382161480610503575061050381336102fd565b6105755760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610449565b61057f8383610c48565b505050565b61058f335b82610cb6565b6105ab5760405162461bcd60e51b815260040161044990612040565b61057f838383610da0565b60006105c1836107eb565b82106106235760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610449565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61057f83838360405180602001604052806000815250610a89565b61067033610589565b6106d55760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610449565b6106de81610f47565b50565b60006106ec60085490565b821061074f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610449565b6008828154811061076257610762612201565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806103495760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610449565b60006001600160a01b0382166108565760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610449565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b0316331461089c5760405162461bcd60e51b81526004016104499061200b565b6108a66000610f50565b565b600b546001600160a01b031633146108d25760405162461bcd60e51b81526004016104499061200b565b8051825180821461092f5760405162461bcd60e51b815260206004820152602160248201527f46697474694e66743a20617272617920706172616d7320697320696e76616c696044820152601960fa1b6064820152608401610449565b600082116109895760405162461bcd60e51b815260206004820152602160248201527f46697474694e66743a206172726179206c656e67746820697320696e76616c696044820152601960fa1b6064820152608401610449565b600c5460005b83811015610a615760008582815181106109ab576109ab612201565b602002602001015151116109fc5760405162461bcd60e51b8152602060048201526018602482015277119a5d1d1a53999d0e881d5c9a481a5cc81a5b9d985b1a5960421b6044820152606401610449565b81610a0681612190565b925050610a2c868281518110610a1e57610a1e612201565b602002602001015183610fa2565b610a4f82868381518110610a4257610a42612201565b60200260200101516110e1565b80610a5981612190565b91505061098f565b50600c5550505050565b60606001805461035e90612155565b610a8533838361116c565b5050565b610a933383610cb6565b610aaf5760405162461bcd60e51b815260040161044990612040565b610abb8484848461123b565b50505050565b60606103498261126e565b600b546001600160a01b03163314610af65760405162461bcd60e51b81526004016104499061200b565b6000815111610b425760405162461bcd60e51b8152602060048201526018602482015277119a5d1d1a53999d0e881d5c9a481a5cc81a5b9d985b1a5960421b6044820152606401610449565b6000600c60008154610b5390612190565b91829055509050610b648382610fa2565b61057f81836110e1565b600b546001600160a01b03163314610b985760405162461bcd60e51b81526004016104499061200b565b6001600160a01b038116610bfd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610449565b6106de81610f50565b60006001600160e01b0319821663780e9d6360e01b14806103495750610349826113dd565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610c7d82610774565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610cc182610c2b565b610d225760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610449565b6000610d2d83610774565b9050806001600160a01b0316846001600160a01b03161480610d685750836001600160a01b0316610d5d846103e1565b6001600160a01b0316145b80610d9857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316610db382610774565b6001600160a01b031614610e175760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610449565b6001600160a01b038216610e795760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610449565b610e8483838361142d565b610e8f600082610c48565b6001600160a01b0383166000908152600360205260408120805460019290610eb8908490612112565b90915550506001600160a01b0382166000908152600360205260408120805460019290610ee69084906120e6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6106de81611438565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216610ff85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610449565b61100181610c2b565b1561104e5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610449565b61105a6000838361142d565b6001600160a01b03821660009081526003602052604081208054600192906110839084906120e6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6110ea82610c2b565b61114d5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610449565b6000828152600a60209081526040909120825161057f92840190611a4a565b816001600160a01b0316836001600160a01b031614156111ce5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610449565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611246848484610da0565b61125284848484611478565b610abb5760405162461bcd60e51b815260040161044990611fb9565b606061127982610c2b565b6112df5760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610449565b6000828152600a6020526040812080546112f890612155565b80601f016020809104026020016040519081016040528092919081815260200182805461132490612155565b80156113715780601f1061134657610100808354040283529160200191611371565b820191906000526020600020905b81548152906001019060200180831161135457829003601f168201915b50505050509050600061138f60408051602081019091526000815290565b90508051600014156113a2575092915050565b8151156113d45780826040516020016113bc929190611f3a565b60405160208183030381529060405292505050919050565b610d9884611585565b60006001600160e01b031982166380ac58cd60e01b148061140e57506001600160e01b03198216635b5e139f60e01b145b8061034957506301ffc9a760e01b6001600160e01b0319831614610349565b61057f83838361165d565b61144181611715565b6000818152600a60205260409020805461145a90612155565b1590506106de576000818152600a602052604081206106de91611ace565b60006001600160a01b0384163b1561157a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906114bc903390899088908890600401611f69565b602060405180830381600087803b1580156114d657600080fd5b505af1925050508015611506575060408051601f3d908101601f1916820190925261150391810190611ed8565b60015b611560573d808015611534576040519150601f19603f3d011682016040523d82523d6000602084013e611539565b606091505b5080516115585760405162461bcd60e51b815260040161044990611fb9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610d98565b506001949350505050565b606061159082610c2b565b6115f45760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610449565b600061160b60408051602081019091526000815290565b9050600081511161162b5760405180602001604052806000815250611656565b80611635846117bc565b604051602001611646929190611f3a565b6040516020818303038152906040525b9392505050565b6001600160a01b0383166116b8576116b381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6116db565b816001600160a01b0316836001600160a01b0316146116db576116db83826118ba565b6001600160a01b0382166116f25761057f81611957565b826001600160a01b0316826001600160a01b03161461057f5761057f8282611a06565b600061172082610774565b905061172e8160008461142d565b611739600083610c48565b6001600160a01b0381166000908152600360205260408120805460019290611762908490612112565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6060816117e05750506040805180820190915260018152600360fc1b602082015290565b8160005b811561180a57806117f481612190565b91506118039050600a836120fe565b91506117e4565b60008167ffffffffffffffff81111561182557611825612217565b6040519080825280601f01601f19166020018201604052801561184f576020820181803683370190505b5090505b8415610d9857611864600183612112565b9150611871600a866121ab565b61187c9060306120e6565b60f81b81838151811061189157611891612201565b60200101906001600160f81b031916908160001a9053506118b3600a866120fe565b9450611853565b600060016118c7846107eb565b6118d19190612112565b600083815260076020526040902054909150808214611924576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061196990600190612112565b6000838152600960205260408120546008805493945090928490811061199157611991612201565b9060005260206000200154905080600883815481106119b2576119b2612201565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806119ea576119ea6121eb565b6001900381819060005260206000200160009055905550505050565b6000611a11836107eb565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054611a5690612155565b90600052602060002090601f016020900481019282611a785760008555611abe565b82601f10611a9157805160ff1916838001178555611abe565b82800160010185558215611abe579182015b82811115611abe578251825591602001919060010190611aa3565b50611aca929150611b04565b5090565b508054611ada90612155565b6000825580601f10611aea575050565b601f0160209004906000526020600020908101906106de91905b5b80821115611aca5760008155600101611b05565b600067ffffffffffffffff831115611b3357611b33612217565b611b46601f8401601f1916602001612091565b9050828152838383011115611b5a57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611b8857600080fd5b919050565b600082601f830112611b9e57600080fd5b81356020611bb3611bae836120c2565b612091565b80838252828201915082860187848660051b8901011115611bd357600080fd5b6000805b86811015611c1657823567ffffffffffffffff811115611bf5578283fd5b611c038b88838d0101611c24565b8652509385019391850191600101611bd7565b509198975050505050505050565b600082601f830112611c3557600080fd5b61165683833560208501611b19565b600060208284031215611c5657600080fd5b61165682611b71565b60008060408385031215611c7257600080fd5b611c7b83611b71565b9150611c8960208401611b71565b90509250929050565b600080600060608486031215611ca757600080fd5b611cb084611b71565b9250611cbe60208501611b71565b9150604084013590509250925092565b60008060008060808587031215611ce457600080fd5b611ced85611b71565b9350611cfb60208601611b71565b925060408501359150606085013567ffffffffffffffff811115611d1e57600080fd5b8501601f81018713611d2f57600080fd5b611d3e87823560208401611b19565b91505092959194509250565b60008060408385031215611d5d57600080fd5b611d6683611b71565b915060208301358015158114611d7b57600080fd5b809150509250929050565b60008060408385031215611d9957600080fd5b611da283611b71565b9150602083013567ffffffffffffffff811115611dbe57600080fd5b611dca85828601611c24565b9150509250929050565b60008060408385031215611de757600080fd5b611df083611b71565b946020939093013593505050565b60008060408385031215611e1157600080fd5b823567ffffffffffffffff80821115611e2957600080fd5b818501915085601f830112611e3d57600080fd5b81356020611e4d611bae836120c2565b8083825282820191508286018a848660051b8901011115611e6d57600080fd5b600096505b84871015611e9757611e8381611b71565b835260019690960195918301918301611e72565b5096505086013592505080821115611eae57600080fd5b50611dca85828601611b8d565b600060208284031215611ecd57600080fd5b81356116568161222d565b600060208284031215611eea57600080fd5b81516116568161222d565b600060208284031215611f0757600080fd5b5035919050565b60008151808452611f26816020860160208601612129565b601f01601f19169290920160200192915050565b60008351611f4c818460208801612129565b835190830190611f60818360208801612129565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f9c90830184611f0e565b9695505050505050565b6020815260006116566020830184611f0e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156120ba576120ba612217565b604052919050565b600067ffffffffffffffff8211156120dc576120dc612217565b5060051b60200190565b600082198211156120f9576120f96121bf565b500190565b60008261210d5761210d6121d5565b500490565b600082821015612124576121246121bf565b500390565b60005b8381101561214457818101518382015260200161212c565b83811115610abb5750506000910152565b600181811c9082168061216957607f821691505b6020821081141561218a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156121a4576121a46121bf565b5060010190565b6000826121ba576121ba6121d5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146106de57600080fdfea2646970667358221220606256b94ecd3b563157be02109d329ec4f82a4e8f80c4df2d56295be7b04b3d64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005466974746900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034649540000000000000000000000000000000000000000000000000000000000

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005466974746900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034649540000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Fitti
Arg [1] : symbol (string): FIT

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [3] : 4669747469000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 4649540000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

48485:2054:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50307:229;;;;;;:::i;:::-;;:::i;:::-;;;7625:14:1;;7618:22;7600:41;;7588:2;7573:18;50307:229:0;;;;;;;;22665:100;;;:::i;:::-;;;;;;;:::i;24224:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6923:32:1;;;6905:51;;6893:2;6878:18;24224:221:0;6759:203:1;23747:411:0;;;;;;:::i;:::-;;:::i;:::-;;37573:113;37661:10;:17;37573:113;;;17632:25:1;;;17620:2;17605:18;37573:113:0;17486:177:1;24974:339:0;;;;;;:::i;:::-;;:::i;37241:256::-;;;;;;:::i;:::-;;:::i;25384:185::-;;;;;;:::i;:::-;;:::i;45630:245::-;;;;;;:::i;:::-;;:::i;37763:233::-;;;;;;:::i;:::-;;:::i;48594:22::-;;;;;;22359:239;;;;;;:::i;:::-;;:::i;22089:208::-;;;;;;:::i;:::-;;:::i;47599:103::-;;;:::i;46948:87::-;47021:6;;-1:-1:-1;;;;;47021:6:0;46948:87;;48978:706;;;;;;:::i;:::-;;:::i;22834:104::-;;;:::i;24517:155::-;;;;;;:::i;:::-;;:::i;25640:328::-;;;;;;:::i;:::-;;:::i;49692:213::-;;;;;;:::i;:::-;;:::i;48724:246::-;;;;;;:::i;:::-;;:::i;24743:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24864:25:0;;;24840:4;24864:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24743:164;47857:201;;;;;;:::i;:::-;;:::i;50307:229::-;50463:4;50492:36;50516:11;50492:23;:36::i;:::-;50485:43;50307:229;-1:-1:-1;;50307:229:0:o;22665:100::-;22719:13;22752:5;22745:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22665:100;:::o;24224:221::-;24300:7;24328:16;24336:7;24328;:16::i;:::-;24320:73;;;;-1:-1:-1;;;24320:73:0;;14093:2:1;24320:73:0;;;14075:21:1;14132:2;14112:18;;;14105:30;14171:34;14151:18;;;14144:62;-1:-1:-1;;;14222:18:1;;;14215:42;14274:19;;24320:73:0;;;;;;;;;-1:-1:-1;24413:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24413:24:0;;24224:221::o;23747:411::-;23828:13;23844:23;23859:7;23844:14;:23::i;:::-;23828:39;;23892:5;-1:-1:-1;;;;;23886:11:0;:2;-1:-1:-1;;;;;23886:11:0;;;23878:57;;;;-1:-1:-1;;;23878:57:0;;15636:2:1;23878:57:0;;;15618:21:1;15675:2;15655:18;;;15648:30;15714:34;15694:18;;;15687:62;-1:-1:-1;;;15765:18:1;;;15758:31;15806:19;;23878:57:0;15434:397:1;23878:57:0;17012:10;-1:-1:-1;;;;;23970:21:0;;;;:62;;-1:-1:-1;23995:37:0;24012:5;17012:10;24743:164;:::i;23995:37::-;23948:168;;;;-1:-1:-1;;;23948:168:0;;11251:2:1;23948:168:0;;;11233:21:1;11290:2;11270:18;;;11263:30;11329:34;11309:18;;;11302:62;11400:26;11380:18;;;11373:54;11444:19;;23948:168:0;11049:420:1;23948:168:0;24129:21;24138:2;24142:7;24129:8;:21::i;:::-;23817:341;23747:411;;:::o;24974:339::-;25169:41;17012:10;25188:12;25202:7;25169:18;:41::i;:::-;25161:103;;;;-1:-1:-1;;;25161:103:0;;;;;;;:::i;:::-;25277:28;25287:4;25293:2;25297:7;25277:9;:28::i;37241:256::-;37338:7;37374:23;37391:5;37374:16;:23::i;:::-;37366:5;:31;37358:87;;;;-1:-1:-1;;;37358:87:0;;8078:2:1;37358:87:0;;;8060:21:1;8117:2;8097:18;;;8090:30;8156:34;8136:18;;;8129:62;-1:-1:-1;;;8207:18:1;;;8200:41;8258:19;;37358:87:0;7876:407:1;37358:87:0;-1:-1:-1;;;;;;37463:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37241:256::o;25384:185::-;25522:39;25539:4;25545:2;25549:7;25522:39;;;;;;;;;;;;:16;:39::i;45630:245::-;45748:41;17012:10;45767:12;16932:98;45748:41;45740:102;;;;-1:-1:-1;;;45740:102:0;;17271:2:1;45740:102:0;;;17253:21:1;17310:2;17290:18;;;17283:30;17349:34;17329:18;;;17322:62;-1:-1:-1;;;17400:18:1;;;17393:46;17456:19;;45740:102:0;17069:412:1;45740:102:0;45853:14;45859:7;45853:5;:14::i;:::-;45630:245;:::o;37763:233::-;37838:7;37874:30;37661:10;:17;;37573:113;37874:30;37866:5;:38;37858:95;;;;-1:-1:-1;;;37858:95:0;;16858:2:1;37858:95:0;;;16840:21:1;16897:2;16877:18;;;16870:30;16936:34;16916:18;;;16909:62;-1:-1:-1;;;16987:18:1;;;16980:42;17039:19;;37858:95:0;16656:408:1;37858:95:0;37971:10;37982:5;37971:17;;;;;;;;:::i;:::-;;;;;;;;;37964:24;;37763:233;;;:::o;22359:239::-;22431:7;22467:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22467:16:0;22502:19;22494:73;;;;-1:-1:-1;;;22494:73:0;;12087:2:1;22494:73:0;;;12069:21:1;12126:2;12106:18;;;12099:30;12165:34;12145:18;;;12138:62;-1:-1:-1;;;12216:18:1;;;12209:39;12265:19;;22494:73:0;11885:405:1;22089:208:0;22161:7;-1:-1:-1;;;;;22189:19:0;;22181:74;;;;-1:-1:-1;;;22181:74:0;;11676:2:1;22181:74:0;;;11658:21:1;11715:2;11695:18;;;11688:30;11754:34;11734:18;;;11727:62;-1:-1:-1;;;11805:18:1;;;11798:40;11855:19;;22181:74:0;11474:406:1;22181:74:0;-1:-1:-1;;;;;;22273:16:0;;;;;:9;:16;;;;;;;22089:208::o;47599:103::-;47021:6;;-1:-1:-1;;;;;47021:6:0;17012:10;47168:23;47160:68;;;;-1:-1:-1;;;47160:68:0;;;;;;;:::i;:::-;47664:30:::1;47691:1;47664:18;:30::i;:::-;47599:103::o:0;48978:706::-;47021:6;;-1:-1:-1;;;;;47021:6:0;17012:10;47168:23;47160:68;;;;-1:-1:-1;;;47160:68:0;;;;;;;:::i;:::-;49118:11;;49165:16;;49216:27;;::::1;49194:110;;;::::0;-1:-1:-1;;;49194:110:0;;12912:2:1;49194:110:0::1;::::0;::::1;12894:21:1::0;12951:2;12931:18;;;12924:30;12990:34;12970:18;;;12963:62;-1:-1:-1;;;13041:18:1;;;13034:31;13082:19;;49194:110:0::1;12710:397:1::0;49194:110:0::1;49335:1;49323:9;:13;49315:59;;;::::0;-1:-1:-1;;;49315:59:0;;16038:2:1;49315:59:0::1;::::0;::::1;16020:21:1::0;16077:2;16057:18;;;16050:30;16116:34;16096:18;;;16089:62;-1:-1:-1;;;16167:18:1;;;16160:31;16208:19;;49315:59:0::1;15836:397:1::0;49315:59:0::1;49400:7;::::0;49387:10:::1;49420:232;49444:9;49440:1;:13;49420:232;;;49507:1;49489:4;49494:1;49489:7;;;;;;;;:::i;:::-;;;;;;;49483:21;:25;49475:62;;;::::0;-1:-1:-1;;;49475:62:0;;14506:2:1;49475:62:0::1;::::0;::::1;14488:21:1::0;14545:2;14525:18;;;14518:30;-1:-1:-1;;;14564:18:1;;;14557:54;14628:18;;49475:62:0::1;14304:348:1::0;49475:62:0::1;49554:4:::0;::::1;::::0;::::1;:::i;:::-;;;;49575:23;49581:9;49591:1;49581:12;;;;;;;;:::i;:::-;;;;;;;49595:2;49575:5;:23::i;:::-;49615:25;49628:2;49632:4;49637:1;49632:7;;;;;;;;:::i;:::-;;;;;;;49615:12;:25::i;:::-;49455:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49420:232;;;-1:-1:-1::0;49664:7:0::1;:12:::0;-1:-1:-1;;;;48978:706:0:o;22834:104::-;22890:13;22923:7;22916:14;;;;;:::i;24517:155::-;24612:52;17012:10;24645:8;24655;24612:18;:52::i;:::-;24517:155;;:::o;25640:328::-;25815:41;17012:10;25848:7;25815:18;:41::i;:::-;25807:103;;;;-1:-1:-1;;;25807:103:0;;;;;;;:::i;:::-;25921:39;25935:4;25941:2;25945:7;25954:5;25921:13;:39::i;:::-;25640:328;;;;:::o;49692:213::-;49836:13;49874:23;49889:7;49874:14;:23::i;48724:246::-;47021:6;;-1:-1:-1;;;;;47021:6:0;17012:10;47168:23;47160:68;;;;-1:-1:-1;;;47160:68:0;;;;;;;:::i;:::-;48831:1:::1;48817:3;48811:17;:21;48803:58;;;::::0;-1:-1:-1;;;48803:58:0;;14506:2:1;48803:58:0::1;::::0;::::1;14488:21:1::0;14545:2;14525:18;;;14518:30;-1:-1:-1;;;14564:18:1;;;14557:54;14628:18;;48803:58:0::1;14304:348:1::0;48803:58:0::1;48874:10;48889:7;;48887:9;;;;;:::i;:::-;::::0;;;;-1:-1:-1;48887:9:0;-1:-1:-1;48909:19:0::1;48915:8:::0;48887:9;48909:5:::1;:19::i;:::-;48941:21;48954:2;48958:3;48941:12;:21::i;47857:201::-:0;47021:6;;-1:-1:-1;;;;;47021:6:0;17012:10;47168:23;47160:68;;;;-1:-1:-1;;;47160:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47946:22:0;::::1;47938:73;;;::::0;-1:-1:-1;;;47938:73:0;;8909:2:1;47938:73:0::1;::::0;::::1;8891:21:1::0;8948:2;8928:18;;;8921:30;8987:34;8967:18;;;8960:62;-1:-1:-1;;;9038:18:1;;;9031:36;9084:19;;47938:73:0::1;8707:402:1::0;47938:73:0::1;48022:28;48041:8;48022:18;:28::i;36933:224::-:0;37035:4;-1:-1:-1;;;;;;37059:50:0;;-1:-1:-1;;;37059:50:0;;:90;;;37113:36;37137:11;37113:23;:36::i;27478:127::-;27543:4;27567:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27567:16:0;:30;;;27478:127::o;31624:174::-;31699:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31699:29:0;-1:-1:-1;;;;;31699:29:0;;;;;;;;:24;;31753:23;31699:24;31753:14;:23::i;:::-;-1:-1:-1;;;;;31744:46:0;;;;;;;;;;;31624:174;;:::o;27772:348::-;27865:4;27890:16;27898:7;27890;:16::i;:::-;27882:73;;;;-1:-1:-1;;;27882:73:0;;10838:2:1;27882:73:0;;;10820:21:1;10877:2;10857:18;;;10850:30;10916:34;10896:18;;;10889:62;-1:-1:-1;;;10967:18:1;;;10960:42;11019:19;;27882:73:0;10636:408:1;27882:73:0;27966:13;27982:23;27997:7;27982:14;:23::i;:::-;27966:39;;28035:5;-1:-1:-1;;;;;28024:16:0;:7;-1:-1:-1;;;;;28024:16:0;;:51;;;;28068:7;-1:-1:-1;;;;;28044:31:0;:20;28056:7;28044:11;:20::i;:::-;-1:-1:-1;;;;;28044:31:0;;28024:51;:87;;;-1:-1:-1;;;;;;24864:25:0;;;24840:4;24864:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28079:32;28016:96;27772:348;-1:-1:-1;;;;27772:348:0:o;30881:625::-;31040:4;-1:-1:-1;;;;;31013:31:0;:23;31028:7;31013:14;:23::i;:::-;-1:-1:-1;;;;;31013:31:0;;31005:81;;;;-1:-1:-1;;;31005:81:0;;9316:2:1;31005:81:0;;;9298:21:1;9355:2;9335:18;;;9328:30;9394:34;9374:18;;;9367:62;-1:-1:-1;;;9445:18:1;;;9438:35;9490:19;;31005:81:0;9114:401:1;31005:81:0;-1:-1:-1;;;;;31105:16:0;;31097:65;;;;-1:-1:-1;;;31097:65:0;;10079:2:1;31097:65:0;;;10061:21:1;10118:2;10098:18;;;10091:30;10157:34;10137:18;;;10130:62;-1:-1:-1;;;10208:18:1;;;10201:34;10252:19;;31097:65:0;9877:400:1;31097:65:0;31175:39;31196:4;31202:2;31206:7;31175:20;:39::i;:::-;31279:29;31296:1;31300:7;31279:8;:29::i;:::-;-1:-1:-1;;;;;31321:15:0;;;;;;:9;:15;;;;;:20;;31340:1;;31321:15;:20;;31340:1;;31321:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31352:13:0;;;;;;:9;:13;;;;;:18;;31369:1;;31352:13;:18;;31369:1;;31352:18;:::i;:::-;;;;-1:-1:-1;;31381:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31381:21:0;-1:-1:-1;;;;;31381:21:0;;;;;;;;;31420:27;;31381:16;;31420:27;;;;;;;23817:341;23747:411;;:::o;49913:155::-;50040:20;50052:7;50040:11;:20::i;48218:191::-;48311:6;;;-1:-1:-1;;;;;48328:17:0;;;-1:-1:-1;;;;;;48328:17:0;;;;;;;48361:40;;48311:6;;;48328:17;48311:6;;48361:40;;48292:16;;48361:40;48281:128;48218:191;:::o;29456:439::-;-1:-1:-1;;;;;29536:16:0;;29528:61;;;;-1:-1:-1;;;29528:61:0;;13314:2:1;29528:61:0;;;13296:21:1;;;13333:18;;;13326:30;13392:34;13372:18;;;13365:62;13444:18;;29528:61:0;13112:356:1;29528:61:0;29609:16;29617:7;29609;:16::i;:::-;29608:17;29600:58;;;;-1:-1:-1;;;29600:58:0;;9722:2:1;29600:58:0;;;9704:21:1;9761:2;9741:18;;;9734:30;9800;9780:18;;;9773:58;9848:18;;29600:58:0;9520:352:1;29600:58:0;29671:45;29700:1;29704:2;29708:7;29671:20;:45::i;:::-;-1:-1:-1;;;;;29729:13:0;;;;;;:9;:13;;;;;:18;;29746:1;;29729:13;:18;;29746:1;;29729:18;:::i;:::-;;;;-1:-1:-1;;29758:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29758:21:0;-1:-1:-1;;;;;29758:21:0;;;;;;;;29797:33;;29758:16;;;29797:33;;29758:16;;29797:33;24517:155;;:::o;44431:217::-;44531:16;44539:7;44531;:16::i;:::-;44523:75;;;;-1:-1:-1;;;44523:75:0;;12497:2:1;44523:75:0;;;12479:21:1;12536:2;12516:18;;;12509:30;12575:34;12555:18;;;12548:62;-1:-1:-1;;;12626:18:1;;;12619:44;12680:19;;44523:75:0;12295:410:1;44523:75:0;44609:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;31940:315::-;32095:8;-1:-1:-1;;;;;32086:17:0;:5;-1:-1:-1;;;;;32086:17:0;;;32078:55;;;;-1:-1:-1;;;32078:55:0;;10484:2:1;32078:55:0;;;10466:21:1;10523:2;10503:18;;;10496:30;10562:27;10542:18;;;10535:55;10607:18;;32078:55:0;10282:349:1;32078:55:0;-1:-1:-1;;;;;32144:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32144:46:0;;;;;;;;;;32206:41;;7600::1;;;32206::0;;7573:18:1;32206:41:0;;;;;;;31940:315;;;:::o;26850:::-;27007:28;27017:4;27023:2;27027:7;27007:9;:28::i;:::-;27054:48;27077:4;27083:2;27087:7;27096:5;27054:22;:48::i;:::-;27046:111;;;;-1:-1:-1;;;27046:111:0;;;;;;;:::i;43596:679::-;43669:13;43703:16;43711:7;43703;:16::i;:::-;43695:78;;;;-1:-1:-1;;;43695:78:0;;13675:2:1;43695:78:0;;;13657:21:1;13714:2;13694:18;;;13687:30;13753:34;13733:18;;;13726:62;-1:-1:-1;;;13804:18:1;;;13797:47;13861:19;;43695:78:0;13473:413:1;43695:78:0;43786:23;43812:19;;;:10;:19;;;;;43786:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43842:18;43863:10;23668:9;;;;;;;;;-1:-1:-1;23668:9:0;;;23591:94;43863:10;43842:31;;43955:4;43949:18;43971:1;43949:23;43945:72;;;-1:-1:-1;43996:9:0;43596:679;-1:-1:-1;;43596:679:0:o;43945:72::-;44121:23;;:27;44117:108;;44196:4;44202:9;44179:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44165:48;;;;43596:679;;;:::o;44117:108::-;44244:23;44259:7;44244:14;:23::i;21720:305::-;21822:4;-1:-1:-1;;;;;;21859:40:0;;-1:-1:-1;;;21859:40:0;;:105;;-1:-1:-1;;;;;;;21916:48:0;;-1:-1:-1;;;21916:48:0;21859:105;:158;;;-1:-1:-1;;;;;;;;;;20254:40:0;;;21981:36;20145:157;50076:223;50246:45;50273:4;50279:2;50283:7;50246:26;:45::i;44877:206::-;44946:20;44958:7;44946:11;:20::i;:::-;44989:19;;;;:10;:19;;;;;44983:33;;;;;:::i;:::-;:38;;-1:-1:-1;44979:97:0;;45045:19;;;;:10;:19;;;;;45038:26;;;:::i;32820:799::-;32975:4;-1:-1:-1;;;;;32996:13:0;;9272:19;:23;32992:620;;33032:72;;-1:-1:-1;;;33032:72:0;;-1:-1:-1;;;;;33032:36:0;;;;;:72;;17012:10;;33083:4;;33089:7;;33098:5;;33032:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33032:72:0;;;;;;;;-1:-1:-1;;33032:72:0;;;;;;;;;;;;:::i;:::-;;;33028:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33274:13:0;;33270:272;;33317:60;;-1:-1:-1;;;33317:60:0;;;;;;;:::i;33270:272::-;33492:6;33486:13;33477:6;33473:2;33469:15;33462:38;33028:529;-1:-1:-1;;;;;;33155:51:0;-1:-1:-1;;;33155:51:0;;-1:-1:-1;33148:58:0;;32992:620;-1:-1:-1;33596:4:0;32820:799;;;;;;:::o;23009:334::-;23082:13;23116:16;23124:7;23116;:16::i;:::-;23108:76;;;;-1:-1:-1;;;23108:76:0;;15220:2:1;23108:76:0;;;15202:21:1;15259:2;15239:18;;;15232:30;15298:34;15278:18;;;15271:62;-1:-1:-1;;;15349:18:1;;;15342:45;15404:19;;23108:76:0;15018:411:1;23108:76:0;23197:21;23221:10;23668:9;;;;;;;;;-1:-1:-1;23668:9:0;;;23591:94;23221:10;23197:34;;23273:1;23255:7;23249:21;:25;:86;;;;;;;;;;;;;;;;;23301:7;23310:18;:7;:16;:18::i;:::-;23284:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23249:86;23242:93;23009:334;-1:-1:-1;;;23009:334:0:o;38609:589::-;-1:-1:-1;;;;;38815:18:0;;38811:187;;38850:40;38882:7;40025:10;:17;;39998:24;;;;:15;:24;;;;;:44;;;40053:24;;;;;;;;;;;;39921:164;38850:40;38811:187;;;38920:2;-1:-1:-1;;;;;38912:10:0;:4;-1:-1:-1;;;;;38912:10:0;;38908:90;;38939:47;38972:4;38978:7;38939:32;:47::i;:::-;-1:-1:-1;;;;;39012:16:0;;39008:183;;39045:45;39082:7;39045:36;:45::i;39008:183::-;39118:4;-1:-1:-1;;;;;39112:10:0;:2;-1:-1:-1;;;;;39112:10:0;;39108:83;;39139:40;39167:2;39171:7;39139:27;:40::i;30124:420::-;30184:13;30200:23;30215:7;30200:14;:23::i;:::-;30184:39;;30236:48;30257:5;30272:1;30276:7;30236:20;:48::i;:::-;30325:29;30342:1;30346:7;30325:8;:29::i;:::-;-1:-1:-1;;;;;30367:16:0;;;;;;:9;:16;;;;;:21;;30387:1;;30367:16;:21;;30387:1;;30367:21;:::i;:::-;;;;-1:-1:-1;;30406:16:0;;;;:7;:16;;;;;;30399:23;;-1:-1:-1;;;;;;30399:23:0;;;30440:36;30414:7;;30406:16;-1:-1:-1;;;;;30440:36:0;;;;;30406:16;;30440:36;24517:155;;:::o;17517:723::-;17573:13;17794:10;17790:53;;-1:-1:-1;;17821:10:0;;;;;;;;;;;;-1:-1:-1;;;17821:10:0;;;;;17517:723::o;17790:53::-;17868:5;17853:12;17909:78;17916:9;;17909:78;;17942:8;;;;:::i;:::-;;-1:-1:-1;17965:10:0;;-1:-1:-1;17973:2:0;17965:10;;:::i;:::-;;;17909:78;;;17997:19;18029:6;18019:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18019:17:0;;17997:39;;18047:154;18054:10;;18047:154;;18081:11;18091:1;18081:11;;:::i;:::-;;-1:-1:-1;18150:10:0;18158:2;18150:5;:10;:::i;:::-;18137:24;;:2;:24;:::i;:::-;18124:39;;18107:6;18114;18107:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18107:56:0;;;;;;;;-1:-1:-1;18178:11:0;18187:2;18178:11;;:::i;:::-;;;18047:154;;40712:988;40978:22;41028:1;41003:22;41020:4;41003:16;:22::i;:::-;:26;;;;:::i;:::-;41040:18;41061:26;;;:17;:26;;;;;;40978:51;;-1:-1:-1;41194:28:0;;;41190:328;;-1:-1:-1;;;;;41261:18:0;;41239:19;41261:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41312:30;;;;;;:44;;;41429:30;;:17;:30;;;;;:43;;;41190:328;-1:-1:-1;41614:26:0;;;;:17;:26;;;;;;;;41607:33;;;-1:-1:-1;;;;;41658:18:0;;;;;:12;:18;;;;;:34;;;;;;;41651:41;40712:988::o;41995:1079::-;42273:10;:17;42248:22;;42273:21;;42293:1;;42273:21;:::i;:::-;42305:18;42326:24;;;:15;:24;;;;;;42699:10;:26;;42248:46;;-1:-1:-1;42326:24:0;;42248:46;;42699:26;;;;;;:::i;:::-;;;;;;;;;42677:48;;42763:11;42738:10;42749;42738:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;42843:28;;;:15;:28;;;;;;;:41;;;43015:24;;;;;43008:31;43050:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42066:1008;;;41995:1079;:::o;39499:221::-;39584:14;39601:20;39618:2;39601:16;:20::i;:::-;-1:-1:-1;;;;;39632:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39677:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39499:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:856::-;656:5;709:3;702:4;694:6;690:17;686:27;676:55;;727:1;724;717:12;676:55;763:6;750:20;789:4;813:60;829:43;869:2;829:43;:::i;:::-;813:60;:::i;:::-;895:3;919:2;914:3;907:15;947:2;942:3;938:12;931:19;;982:2;974:6;970:15;1034:3;1029:2;1023;1020:1;1016:10;1008:6;1004:23;1000:32;997:41;994:61;;;1051:1;1048;1041:12;994:61;1073:1;1094;1104:326;1120:2;1115:3;1112:11;1104:326;;;1201:3;1188:17;1237:18;1224:11;1221:35;1218:55;;;1269:1;1266;1259:12;1218:55;1298:57;1351:3;1346:2;1332:11;1324:6;1320:24;1316:33;1298:57;:::i;:::-;1286:70;;-1:-1:-1;1376:12:1;;;;1408;;;;1142:1;1133:11;1104:326;;;-1:-1:-1;1448:5:1;;603:856;-1:-1:-1;;;;;;;;603:856:1:o;1464:221::-;1507:5;1560:3;1553:4;1545:6;1541:17;1537:27;1527:55;;1578:1;1575;1568:12;1527:55;1600:79;1675:3;1666:6;1653:20;1646:4;1638:6;1634:17;1600:79;:::i;1690:186::-;1749:6;1802:2;1790:9;1781:7;1777:23;1773:32;1770:52;;;1818:1;1815;1808:12;1770:52;1841:29;1860:9;1841:29;:::i;1881:260::-;1949:6;1957;2010:2;1998:9;1989:7;1985:23;1981:32;1978:52;;;2026:1;2023;2016:12;1978:52;2049:29;2068:9;2049:29;:::i;:::-;2039:39;;2097:38;2131:2;2120:9;2116:18;2097:38;:::i;:::-;2087:48;;1881:260;;;;;:::o;2146:328::-;2223:6;2231;2239;2292:2;2280:9;2271:7;2267:23;2263:32;2260:52;;;2308:1;2305;2298:12;2260:52;2331:29;2350:9;2331:29;:::i;:::-;2321:39;;2379:38;2413:2;2402:9;2398:18;2379:38;:::i;:::-;2369:48;;2464:2;2453:9;2449:18;2436:32;2426:42;;2146:328;;;;;:::o;2479:666::-;2574:6;2582;2590;2598;2651:3;2639:9;2630:7;2626:23;2622:33;2619:53;;;2668:1;2665;2658:12;2619:53;2691:29;2710:9;2691:29;:::i;:::-;2681:39;;2739:38;2773:2;2762:9;2758:18;2739:38;:::i;:::-;2729:48;;2824:2;2813:9;2809:18;2796:32;2786:42;;2879:2;2868:9;2864:18;2851:32;2906:18;2898:6;2895:30;2892:50;;;2938:1;2935;2928:12;2892:50;2961:22;;3014:4;3006:13;;3002:27;-1:-1:-1;2992:55:1;;3043:1;3040;3033:12;2992:55;3066:73;3131:7;3126:2;3113:16;3108:2;3104;3100:11;3066:73;:::i;:::-;3056:83;;;2479:666;;;;;;;:::o;3150:347::-;3215:6;3223;3276:2;3264:9;3255:7;3251:23;3247:32;3244:52;;;3292:1;3289;3282:12;3244:52;3315:29;3334:9;3315:29;:::i;:::-;3305:39;;3394:2;3383:9;3379:18;3366:32;3441:5;3434:13;3427:21;3420:5;3417:32;3407:60;;3463:1;3460;3453:12;3407:60;3486:5;3476:15;;;3150:347;;;;;:::o;3502:396::-;3580:6;3588;3641:2;3629:9;3620:7;3616:23;3612:32;3609:52;;;3657:1;3654;3647:12;3609:52;3680:29;3699:9;3680:29;:::i;:::-;3670:39;;3760:2;3749:9;3745:18;3732:32;3787:18;3779:6;3776:30;3773:50;;;3819:1;3816;3809:12;3773:50;3842;3884:7;3875:6;3864:9;3860:22;3842:50;:::i;:::-;3832:60;;;3502:396;;;;;:::o;3903:254::-;3971:6;3979;4032:2;4020:9;4011:7;4007:23;4003:32;4000:52;;;4048:1;4045;4038:12;4000:52;4071:29;4090:9;4071:29;:::i;:::-;4061:39;4147:2;4132:18;;;;4119:32;;-1:-1:-1;;;3903:254:1:o;4162:1166::-;4290:6;4298;4351:2;4339:9;4330:7;4326:23;4322:32;4319:52;;;4367:1;4364;4357:12;4319:52;4407:9;4394:23;4436:18;4477:2;4469:6;4466:14;4463:34;;;4493:1;4490;4483:12;4463:34;4531:6;4520:9;4516:22;4506:32;;4576:7;4569:4;4565:2;4561:13;4557:27;4547:55;;4598:1;4595;4588:12;4547:55;4634:2;4621:16;4656:4;4680:60;4696:43;4736:2;4696:43;:::i;4680:60::-;4762:3;4786:2;4781:3;4774:15;4814:2;4809:3;4805:12;4798:19;;4845:2;4841;4837:11;4893:7;4888:2;4882;4879:1;4875:10;4871:2;4867:19;4863:28;4860:41;4857:61;;;4914:1;4911;4904:12;4857:61;4936:1;4927:10;;4946:169;4960:2;4957:1;4954:9;4946:169;;;5017:23;5036:3;5017:23;:::i;:::-;5005:36;;4978:1;4971:9;;;;;5061:12;;;;5093;;4946:169;;;-1:-1:-1;5134:5:1;-1:-1:-1;;5177:18:1;;5164:32;;-1:-1:-1;;5208:16:1;;;5205:36;;;5237:1;5234;5227:12;5205:36;;5260:62;5314:7;5303:8;5292:9;5288:24;5260:62;:::i;5333:245::-;5391:6;5444:2;5432:9;5423:7;5419:23;5415:32;5412:52;;;5460:1;5457;5450:12;5412:52;5499:9;5486:23;5518:30;5542:5;5518:30;:::i;5583:249::-;5652:6;5705:2;5693:9;5684:7;5680:23;5676:32;5673:52;;;5721:1;5718;5711:12;5673:52;5753:9;5747:16;5772:30;5796:5;5772:30;:::i;5837:180::-;5896:6;5949:2;5937:9;5928:7;5924:23;5920:32;5917:52;;;5965:1;5962;5955:12;5917:52;-1:-1:-1;5988:23:1;;5837:180;-1:-1:-1;5837:180:1:o;6022:257::-;6063:3;6101:5;6095:12;6128:6;6123:3;6116:19;6144:63;6200:6;6193:4;6188:3;6184:14;6177:4;6170:5;6166:16;6144:63;:::i;:::-;6261:2;6240:15;-1:-1:-1;;6236:29:1;6227:39;;;;6268:4;6223:50;;6022:257;-1:-1:-1;;6022:257:1:o;6284:470::-;6463:3;6501:6;6495:13;6517:53;6563:6;6558:3;6551:4;6543:6;6539:17;6517:53;:::i;:::-;6633:13;;6592:16;;;;6655:57;6633:13;6592:16;6689:4;6677:17;;6655:57;:::i;:::-;6728:20;;6284:470;-1:-1:-1;;;;6284:470:1:o;6967:488::-;-1:-1:-1;;;;;7236:15:1;;;7218:34;;7288:15;;7283:2;7268:18;;7261:43;7335:2;7320:18;;7313:34;;;7383:3;7378:2;7363:18;;7356:31;;;7161:4;;7404:45;;7429:19;;7421:6;7404:45;:::i;:::-;7396:53;6967:488;-1:-1:-1;;;;;;6967:488:1:o;7652:219::-;7801:2;7790:9;7783:21;7764:4;7821:44;7861:2;7850:9;7846:18;7838:6;7821:44;:::i;8288:414::-;8490:2;8472:21;;;8529:2;8509:18;;;8502:30;8568:34;8563:2;8548:18;;8541:62;-1:-1:-1;;;8634:2:1;8619:18;;8612:48;8692:3;8677:19;;8288:414::o;14657:356::-;14859:2;14841:21;;;14878:18;;;14871:30;14937:34;14932:2;14917:18;;14910:62;15004:2;14989:18;;14657:356::o;16238:413::-;16440:2;16422:21;;;16479:2;16459:18;;;16452:30;16518:34;16513:2;16498:18;;16491:62;-1:-1:-1;;;16584:2:1;16569:18;;16562:47;16641:3;16626:19;;16238:413::o;17668:275::-;17739:2;17733:9;17804:2;17785:13;;-1:-1:-1;;17781:27:1;17769:40;;17839:18;17824:34;;17860:22;;;17821:62;17818:88;;;17886:18;;:::i;:::-;17922:2;17915:22;17668:275;;-1:-1:-1;17668:275:1:o;17948:183::-;18008:4;18041:18;18033:6;18030:30;18027:56;;;18063:18;;:::i;:::-;-1:-1:-1;18108:1:1;18104:14;18120:4;18100:25;;17948:183::o;18136:128::-;18176:3;18207:1;18203:6;18200:1;18197:13;18194:39;;;18213:18;;:::i;:::-;-1:-1:-1;18249:9:1;;18136:128::o;18269:120::-;18309:1;18335;18325:35;;18340:18;;:::i;:::-;-1:-1:-1;18374:9:1;;18269:120::o;18394:125::-;18434:4;18462:1;18459;18456:8;18453:34;;;18467:18;;:::i;:::-;-1:-1:-1;18504:9:1;;18394:125::o;18524:258::-;18596:1;18606:113;18620:6;18617:1;18614:13;18606:113;;;18696:11;;;18690:18;18677:11;;;18670:39;18642:2;18635:10;18606:113;;;18737:6;18734:1;18731:13;18728:48;;;-1:-1:-1;;18772:1:1;18754:16;;18747:27;18524:258::o;18787:380::-;18866:1;18862:12;;;;18909;;;18930:61;;18984:4;18976:6;18972:17;18962:27;;18930:61;19037:2;19029:6;19026:14;19006:18;19003:38;19000:161;;;19083:10;19078:3;19074:20;19071:1;19064:31;19118:4;19115:1;19108:15;19146:4;19143:1;19136:15;19000:161;;18787:380;;;:::o;19172:135::-;19211:3;-1:-1:-1;;19232:17:1;;19229:43;;;19252:18;;:::i;:::-;-1:-1:-1;19299:1:1;19288:13;;19172:135::o;19312:112::-;19344:1;19370;19360:35;;19375:18;;:::i;:::-;-1:-1:-1;19409:9:1;;19312:112::o;19429:127::-;19490:10;19485:3;19481:20;19478:1;19471:31;19521:4;19518:1;19511:15;19545:4;19542:1;19535:15;19561:127;19622:10;19617:3;19613:20;19610:1;19603:31;19653:4;19650:1;19643:15;19677:4;19674:1;19667:15;19693:127;19754:10;19749:3;19745:20;19742:1;19735:31;19785:4;19782:1;19775:15;19809:4;19806:1;19799:15;19825:127;19886:10;19881:3;19877:20;19874:1;19867:31;19917:4;19914:1;19907:15;19941:4;19938:1;19931:15;19957:127;20018:10;20013:3;20009:20;20006:1;19999:31;20049:4;20046:1;20039:15;20073:4;20070:1;20063:15;20089:131;-1:-1:-1;;;;;;20163:32:1;;20153:43;;20143:71;;20210:1;20207;20200:12

Swarm Source

ipfs://606256b94ecd3b563157be02109d329ec4f82a4e8f80c4df2d56295be7b04b3d
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading