Contract 0x5237E33D805339925aA5ab220F13B386357aa349

 
Ad
Crypto.com
Txn Hash Method
Block
From
To
Value
0x1992a37e09b901260f117c83fc908fdd4df4206e3933e6ee455fbd096df8b15aSet Approval For...132155122021-09-13 5:23:133 days 20 hrs ago0xf42935853fc5429e33c49685e7fe3a89edb02fe3 IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.00148546643 56.397981337
0x190633691319d46a6835a1f535eadd551a928f8af748e94634e9f24366b69bc7Set Approval For...132155102021-09-13 5:23:063 days 20 hrs ago0xf42935853fc5429e33c49685e7fe3a89edb02fe3 IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.002851336521 61.665185708
0x84180f42dd35d9e90a7b583f8c954f072d0f5d4fe4f6718bb17e159c55e8dfe1Set Approval For...132137452021-09-12 22:48:434 days 3 hrs ago0xe1c49beca9cf0489426f53e914f1d98987866ee1 IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.0032367370
0x739c3fa081f4bb8620f9debf1147f98b6fc1963a3dc2a88a93bd03e6d3cde125Transfer From131931312021-09-09 18:24:307 days 7 hrs ago0x8dae33dd01702dd19604a702fe2094a9a1680c0d IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.003040008061 137.01136027
0x21731c830a43b9f28f8cde103b0bf4fe651854f7120f1d65db37e595a58c62ffSet Approval For...131924872021-09-09 16:06:287 days 9 hrs agoENS Name vagelis.eth IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.007216121883 156.061374235
0x0e1a65cae8f849503343e2665c9c2138c5b5df1cd664dfa746323c6ef8ff74e7Set Approval For...131780312021-09-07 10:07:549 days 15 hrs agoENS Name wit.eth IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.005169554901 111.800750479
0xb31b20c3a674487f8832611a1796684197acd5f7d21510d81af8319a154a9436Safe Transfer Fr...131771132021-09-07 6:47:479 days 19 hrs ago0x4128f4617209c02b02d40a87629ffea3a9918f89 IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.005237304141
0xc7ce2f4559f766ec0c85e006a3817c1fdbfa0622eea2742e7a77f3efdcf1ca37Safe Transfer Fr...131594672021-09-04 13:31:5512 days 12 hrs ago0x9cbe9c01ab8fb1e20c4ef19b6545c111d5bfdb3a IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.005213764771 96.11689351
0x3d546480dcb83c96df2410ca5a19568e166e9667db7d1bf677b17aa4fdae0808Transfer From131435732021-09-02 2:27:2214 days 23 hrs ago0x8dae33dd01702dd19604a702fe2094a9a1680c0d IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.002045491751 92.189100032
0xb5dc3862b7f8d6aaa83ba54e17ee7c0dd6de2cb86476fed79f1b352a5d48e6fcSet Approval For...131397072021-09-01 12:05:4615 days 14 hrs ago0xadca8388e08496d58698880b7b6931da04194b07 IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.003889265411 84.134064758
0x845875472892610e4ae9a961864588713a837ab47a2b150e9f89afe90374c5baTransfer From131229882021-08-29 22:06:5318 days 3 hrs ago0x8dae33dd01702dd19604a702fe2094a9a1680c0d IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.003079315543139.968888355
0x5e7e825e976d11bb82060a55b40d40425c43d7f6722a6702bb02e60dae46369bSet Approval For...131200332021-08-29 11:11:1118 days 14 hrs ago0x6ec54a0af77f1b18269b20f8c46043a285fbfd35 IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.002584402937 55.892275734
0x567e4f5b21fc65cd19e92f126a5616c1a0d9091cecbe75126a40651f75dc7da3Set Approval For...131069852021-08-27 10:34:5720 days 15 hrs ago0x19581e3d411600d93bd34b3428d3ad8d245c9cdd IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.002402478246 51.957833144
0xcb62a868c2a6ee8ebb811d77c514cced2e06a86d11939e2df53e545a07051f44Safe Transfer Fr...131050172021-08-27 3:19:2820 days 22 hrs ago0x52ad8f3c506aa25b954276c5456060dad6f3fd7b IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.004177027404 77.004413467
0xa193687e4367eb6fd67c72df074da3b13c9bdcc06531be82278fcadccd0d28b9Set Approval For...131033942021-08-26 21:13:1521 days 4 hrs ago0x03ee97830e2c23b4a59476603fd51be47f08ad12 IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.00344578202 74.521118983
0x5ff27a2160731ab834250c5ba63e67bf0381960ee150be6ce46a7abaf659c2d3Set Approval For...131032522021-08-26 20:44:3221 days 5 hrs ago0x11c411f661f999c288dfc5278a7170a914c4710a IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.004276806882 92.493498623
0xed3a5bcc263667db6ee2fd2f4a7776839f991d3827f988b56b2c46323f52c29fSet Approval For...130976362021-08-26 0:01:0622 days 2 hrs ago0x5c7767b37f5bed0454a966f3cc54eb84472fea6e IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.002543145 55
0x42fa6b8b348930aff30df66435e7429c42b49e3249dac947105cb1f2a9cb0b9dSafe Transfer Fr...130951282021-08-25 14:44:4922 days 11 hrs agoENS Name sylviaphoebe.eth IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.00526166897
0x428d5bf7daecffa4ecae6477930d0ce5ef3794355b5b35c2754e262fb9fe4dabSet Approval For...130946512021-08-25 12:47:1622 days 13 hrs agoENS Name apemaxi.eth IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.003349143254 72.431135077
0x92a9d4df6ff4ae1994b39e5b1147622806f356f45c992f8c8006e52544bf6353Safe Transfer Fr...130832792021-08-23 18:52:2324 days 7 hrs ago0x993e4732216fe71f70eee3b24fc43fae3663168d IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.003361069735 61.962055449
0x67588ad894017b2ece16b8c5d338282ebd2d1ce58cf382689c8fdd9bbde08f55Set Approval For...130807212021-08-23 9:24:3224 days 16 hrs ago0x1e824fa64c322fbeb346ba3b6a42f72f5f316917 IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.001645448843 35.585735934
0x45f947e480ea5fc3303b6f11dc8c4250b8557e929b3af4baf63d595cae284651Set Approval For...130794452021-08-23 4:32:5624 days 21 hrs ago0xa98425e8df39441e664c88001397402472506fad IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.002605875417 56.356656013
0xc593f49cff23368058e6852ddda7855b3cb93f3bf9544905f9954d8d500173a8Set Approval For...130703812021-08-21 18:55:2126 days 7 hrs ago0x7f70f5fc9537dc90dc97dce7d7d921b5149c0db0 IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.001932072601 41.784480673
0x801a813cd43cafcaba5e51168339086c14c261161a70ff4a48ddf2898d112f94Set Approval For...130686742021-08-21 12:39:4326 days 13 hrs ago0xa2cd656f8461d2c186d69ffb8a4a5c10eff0914d IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.001051104523 22.731990821
0x2a4ed689e19597611b7f3b579f1e59dfa1ce1819ac1b553a59c49c912bc8b5e8Set Approval For...130654422021-08-21 0:26:2527 days 1 hr ago0x44ae88845d1591be8617c1844cfd3ba82e1054bd IN  0x5237e33d805339925aa5ab220f13b386357aa3490 Ether0.001151279135 24.898443649
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BoxVoucher

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-03-10
*/

// SPDX-License-Identifier: NONE

pragma solidity 0.6.12;



// Part: OpenZeppelin/[email protected]/Address

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// Part: OpenZeppelin/[email protected]/Context

/*
 * @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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// Part: OpenZeppelin/[email protected]/IERC165

/**
 * @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);
}

// Part: OpenZeppelin/[email protected]/SafeMath

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// Part: OpenZeppelin/[email protected]/ERC165

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// Part: OpenZeppelin/[email protected]/IERC1155

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

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

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

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

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

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

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

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

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

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

// Part: OpenZeppelin/[email protected]/IERC1155Receiver

/**
 * _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {

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

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

// Part: OpenZeppelin/[email protected]/Ownable

/**
 * @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.
 */
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 () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// Part: OpenZeppelin/[email protected]/IERC1155MetadataURI

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

// Part: ERC1155

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

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

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

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

    /*
     *     bytes4(keccak256('balanceOf(address,uint256)')) == 0x00fdd58e
     *     bytes4(keccak256('balanceOfBatch(address[],uint256[])')) == 0x4e1273f4
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,uint256,bytes)')) == 0xf242432a
     *     bytes4(keccak256('safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)')) == 0x2eb2c2d6
     *
     *     => 0x00fdd58e ^ 0x4e1273f4 ^ 0xa22cb465 ^
     *        0xe985e9c5 ^ 0xf242432a ^ 0x2eb2c2d6 == 0xd9b67a26
     */
    bytes4 private constant _INTERFACE_ID_ERC1155 = 0xd9b67a26;

    /*
     *     bytes4(keccak256('uri(uint256)')) == 0x0e89341c
     */
    bytes4 private constant _INTERFACE_ID_ERC1155_METADATA_URI = 0x0e89341c;

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

        // register the supported interfaces to conform to ERC1155 via ERC165
        _registerInterface(_INTERFACE_ID_ERC1155);

        // register the supported interfaces to conform to ERC1155MetadataURI via ERC165
        _registerInterface(_INTERFACE_ID_ERC1155_METADATA_URI);
    }

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

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

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

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

        for (uint256 i = 0; i < accounts.length; ++i) {
            require(accounts[i] != address(0), "ERC1155: batch balance query for the zero address");
            batchBalances[i] = _balances[ids[i]][accounts[i]];
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][from] = _balances[id][from].sub(amount, "ERC1155: insufficient balance for transfer");
        _balances[id][to] = _balances[id][to].add(amount);

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

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

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        public
        virtual
        override
    {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );

        address operator = _msgSender();

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

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

            _balances[id][from] = _balances[id][from].sub(
                amount,
                "ERC1155: insufficient balance for transfer"
            );
            _balances[id][to] = _balances[id][to].add(amount);
        }

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][account] = _balances[id][account].add(amount);
        emit TransferSingle(operator, address(0), account, id, amount);

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        _balances[id][account] = _balances[id][account].sub(
            amount,
            "ERC1155: burn amount exceeds balance"
        );

        emit TransferSingle(operator, account, address(0), id, amount);
    }

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

        address operator = _msgSender();

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

        for (uint i = 0; i < ids.length; i++) {
            _balances[ids[i]][account] = _balances[ids[i]][account].sub(
                amounts[i],
                "ERC1155: burn amount exceeds balance"
            );
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

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

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

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

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

        return array;
    }
}

// File: BoxVoucher.sol

contract BoxVoucher is ERC1155("some uri"), Ownable {
	using SafeMath for uint256;

	mapping(address => bool) public authorisedCallers;
	mapping(uint256 => uint256) public _supplies;
	mapping(uint256 => bool) public locked;
	mapping(uint256 => string) public uris;

	modifier authorised() {
		require(authorisedCallers[msg.sender] || msg.sender == owner(), "BoxVoucher: Not authorised caller");
		_;
	}

    function uri(uint256 _id) external override view returns (string memory) {
        return uris[_id];
    }

	function setUri(uint256 _id, string memory _uri) external authorised {
		uris[_id] = _uri;
	}

	function setCaller(address _caller, bool _value) external onlyOwner {
		authorisedCallers[_caller] = _value;
	}

	function setLock(uint256 _id, bool _lock) external authorised {
		locked[_id] = _lock;
	}

	function mintFor(address _to, uint256 _id, uint256 _amount) external authorised {
		_mint(_to, _id, _amount, "");
		_supplies[_id] = _supplies[_id].add(_amount);
	}

	function burnFrom(address _from, uint256 _id, uint256 _amount) external authorised {
		_burn(_from, _id, _amount);
		_supplies[_id] = _supplies[_id].sub(_amount);
	}

	function totalSupply(uint256 _id) external view returns(uint256) {
		return _supplies[_id];
	}

	function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
        public
        virtual
        override
    {
		require(!locked[id], "BoxVoucher: voucher ID is locked");
        super.safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        public
        virtual
        override
    {
		for (uint256 i = 0; i < ids.length; i++)
			require(!locked[ids[i]], "BoxVoucher: voucher ID is locked");
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
	}
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_supplies","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorisedCallers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bool","name":"_lock","type":"bool"}],"name":"setLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setUri","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":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uris","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604080518082019091526008815267736f6d652075726960c01b6020820152620000436301ffc9a760e01b620000d3565b6200004e8162000158565b62000060636cdb3d1360e11b620000d3565b620000726303a24d0760e21b620000d3565b5060006200007f62000171565b600480546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000211565b6001600160e01b0319808216141562000133576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b80516200016d90600390602084019062000175565b5050565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001b857805160ff1916838001178555620001e8565b82800160010185558215620001e8579182015b82811115620001e8578251825591602001919060010190620001cb565b50620001f6929150620001fa565b5090565b5b80821115620001f65760008155600101620001fb565b61240b80620002216000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c8063782f08ae116100b8578063aab68bdb1161007c578063aab68bdb14610766578063b45a3c0e14610798578063bd85b039146107b5578063e985e9c5146107d2578063f242432a14610800578063f2fde38b146108c957610136565b8063782f08ae146106155780638da5cb5b146106c0578063944fd180146106e45780639cae6eae1461070a578063a22cb4651461073857610136565b8063175e9523116100ff578063175e9523146102975780632eb2c2d6146102b457806347e1413f146104755780634e1273f41461049a578063715018a61461060d57610136565b8062fdd58e1461013b57806301ffc9a7146101795780630e89341c146101b4578063124d91e5146102465780631253c5461461027a575b600080fd5b6101676004803603604081101561015157600080fd5b506001600160a01b0381351690602001356108ef565b60408051918252519081900360200190f35b6101a06004803603602081101561018f57600080fd5b50356001600160e01b03191661095e565b604080519115158252519081900360200190f35b6101d1600480360360208110156101ca57600080fd5b503561097d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561020b5781810151838201526020016101f3565b50505050905090810190601f1680156102385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102786004803603606081101561025c57600080fd5b506001600160a01b038135169060208101359060400135610a1e565b005b6101d16004803603602081101561029057600080fd5b5035610aca565b610167600480360360208110156102ad57600080fd5b5035610b65565b610278600480360360a08110156102ca57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156102fd57600080fd5b82018360208201111561030f57600080fd5b803590602001918460208302840111600160201b8311171561033057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561037f57600080fd5b82018360208201111561039157600080fd5b803590602001918460208302840111600160201b831117156103b257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561040157600080fd5b82018360208201111561041357600080fd5b803590602001918460018302840111600160201b8311171561043457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610b77945050505050565b6102786004803603604081101561048b57600080fd5b50803590602001351515610c20565b6105bd600480360360408110156104b057600080fd5b810190602081018135600160201b8111156104ca57600080fd5b8201836020820111156104dc57600080fd5b803590602001918460208302840111600160201b831117156104fd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561054c57600080fd5b82018360208201111561055e57600080fd5b803590602001918460208302840111600160201b8311171561057f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610cb1945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156105f95781810151838201526020016105e1565b505050509050019250505060405180910390f35b610278610e2f565b6102786004803603604081101561062b57600080fd5b81359190810190604081016020820135600160201b81111561064c57600080fd5b82018360208201111561065e57600080fd5b803590602001918460018302840111600160201b8311171561067f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610ee3945050505050565b6106c8610f78565b604080516001600160a01b039092168252519081900360200190f35b6101a0600480360360208110156106fa57600080fd5b50356001600160a01b0316610f88565b6102786004803603604081101561072057600080fd5b506001600160a01b0381351690602001351515610f9d565b6102786004803603604081101561074e57600080fd5b506001600160a01b0381351690602001351515611032565b6102786004803603606081101561077c57600080fd5b506001600160a01b038135169060208101359060400135611121565b6101a0600480360360208110156107ae57600080fd5b50356111c6565b610167600480360360208110156107cb57600080fd5b50356111db565b6101a0600480360360408110156107e857600080fd5b506001600160a01b03813581169160200135166111ed565b610278600480360360a081101561081657600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561085557600080fd5b82018360208201111561086757600080fd5b803590602001918460018302840111600160201b8311171561088857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061121b945050505050565b610278600480360360208110156108df57600080fd5b50356001600160a01b031661128c565b60006001600160a01b0383166109365760405162461bcd60e51b815260040180806020018281038252602b8152602001806121c8602b913960400191505060405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b6001600160e01b03191660009081526020819052604090205460ff1690565b60008181526008602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610a125780601f106109e757610100808354040283529160200191610a12565b820191906000526020600020905b8154815290600101906020018083116109f557829003601f168201915b50505050509050919050565b3360009081526005602052604090205460ff1680610a545750610a3f610f78565b6001600160a01b0316336001600160a01b0316145b610a8f5760405162461bcd60e51b81526004018080602001828103825260218152602001806121a76021913960400191505060405180910390fd5b610a9a838383611397565b600082815260066020526040902054610ab390826114ca565b600092835260066020526040909220919091555050565b60086020908152600091825260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610b5d5780601f10610b3257610100808354040283529160200191610b5d565b820191906000526020600020905b815481529060010190602001808311610b4057829003601f168201915b505050505081565b60066020526000908152604090205481565b60005b8351811015610c0b5760076000858381518110610b9357fe5b60209081029190910181015182528101919091526040016000205460ff1615610c03576040805162461bcd60e51b815260206004820181905260248201527f426f78566f75636865723a20766f7563686572204944206973206c6f636b6564604482015290519081900360640190fd5b600101610b7a565b50610c198585858585611513565b5050505050565b3360009081526005602052604090205460ff1680610c565750610c41610f78565b6001600160a01b0316336001600160a01b0316145b610c915760405162461bcd60e51b81526004018080602001828103825260218152602001806121a76021913960400191505060405180910390fd5b600091825260076020526040909120805460ff1916911515919091179055565b60608151835114610cf35760405162461bcd60e51b81526004018080602001828103825260298152602001806123646029913960400191505060405180910390fd5b6060835167ffffffffffffffff81118015610d0d57600080fd5b50604051908082528060200260200182016040528015610d37578160200160208202803683370190505b50905060005b8451811015610e275760006001600160a01b0316858281518110610d5d57fe5b60200260200101516001600160a01b03161415610dab5760405162461bcd60e51b81526004018080602001828103825260318152602001806121f36031913960400191505060405180910390fd5b60016000858381518110610dbb57fe5b602002602001015181526020019081526020016000206000868381518110610ddf57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110610e1457fe5b6020908102919091010152600101610d3d565b509392505050565b610e37611811565b6004546001600160a01b03908116911614610e99576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6004546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600480546001600160a01b0319169055565b3360009081526005602052604090205460ff1680610f195750610f04610f78565b6001600160a01b0316336001600160a01b0316145b610f545760405162461bcd60e51b81526004018080602001828103825260218152602001806121a76021913960400191505060405180910390fd5b60008281526008602090815260409091208251610f739284019061200c565b505050565b6004546001600160a01b03165b90565b60056020526000908152604090205460ff1681565b610fa5611811565b6004546001600160a01b03908116911614611007576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b816001600160a01b0316611044611811565b6001600160a01b0316141561108a5760405162461bcd60e51b815260040180806020018281038252602981526020018061233b6029913960400191505060405180910390fd5b8060026000611097611811565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556110db611811565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b3360009081526005602052604090205460ff16806111575750611142610f78565b6001600160a01b0316336001600160a01b0316145b6111925760405162461bcd60e51b81526004018080602001828103825260218152602001806121a76021913960400191505060405180910390fd5b6111ad83838360405180602001604052806000815250611815565b600082815260066020526040902054610ab39082611925565b60076020526000908152604090205460ff1681565b60009081526006602052604090205490565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b60008381526007602052604090205460ff161561127f576040805162461bcd60e51b815260206004820181905260248201527f426f78566f75636865723a20766f7563686572204944206973206c6f636b6564604482015290519081900360640190fd5b610c19858585858561197f565b611294611811565b6004546001600160a01b039081169116146112f6576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661133b5760405162461bcd60e51b81526004018080602001828103825260268152602001806122246026913960400191505060405180910390fd5b6004546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166113dc5760405162461bcd60e51b81526004018080602001828103825260238152602001806122ee6023913960400191505060405180910390fd5b60006113e6611811565b9050611416818560006113f887611b3b565b61140187611b3b565b60405180602001604052806000815250611809565b61145d8260405180606001604052806024815260200161224a6024913960008681526001602090815260408083206001600160a01b038b1684529091529020549190611b7f565b60008481526001602090815260408083206001600160a01b03808a16808652918452828520959095558151888152928301879052815193949093908616927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6292908290030190a450505050565b600061150c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b7f565b9392505050565b81518351146115535760405162461bcd60e51b815260040180806020018281038252602881526020018061238d6028913960400191505060405180910390fd5b6001600160a01b0384166115985760405162461bcd60e51b81526004018080602001828103825260258152602001806122976025913960400191505060405180910390fd5b6115a0611811565b6001600160a01b0316856001600160a01b031614806115cb57506115cb856115c6611811565b6111ed565b6116065760405162461bcd60e51b81526004018080602001828103825260328152602001806122bc6032913960400191505060405180910390fd5b6000611610611811565b9050611620818787878787611809565b60005b845181101561172157600085828151811061163a57fe5b60200260200101519050600085838151811061165257fe5b602002602001015190506116bf816040518060600160405280602a8152602001612311602a91396001600086815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611b7f9092919063ffffffff16565b60008381526001602090815260408083206001600160a01b038e811685529252808320939093558a16815220546116f69082611925565b60009283526001602081815260408086206001600160a01b038d168752909152909320555001611623565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156117a757818101518382015260200161178f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117e65781810151838201526020016117ce565b5050505090500194505050505060405180910390a4611809818787878787611c16565b505050505050565b3390565b6001600160a01b03841661185a5760405162461bcd60e51b81526004018080602001828103825260218152602001806123b56021913960400191505060405180910390fd5b6000611864611811565b90506118858160008761187688611b3b565b61187f88611b3b565b87611809565b60008481526001602090815260408083206001600160a01b03891684529091529020546118b29084611925565b60008581526001602090815260408083206001600160a01b03808b16808652918452828520959095558151898152928301889052815190948616927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6292908290030190a4610c1981600087878787611e95565b60008282018381101561150c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0384166119c45760405162461bcd60e51b81526004018080602001828103825260258152602001806122976025913960400191505060405180910390fd5b6119cc611811565b6001600160a01b0316856001600160a01b031614806119f257506119f2856115c6611811565b611a2d5760405162461bcd60e51b815260040180806020018281038252602981526020018061226e6029913960400191505060405180910390fd5b6000611a37611811565b9050611a4881878761187688611b3b565b611a8f836040518060600160405280602a8152602001612311602a913960008781526001602090815260408083206001600160a01b038d1684529091529020549190611b7f565b60008581526001602090815260408083206001600160a01b038b81168552925280832093909355871681522054611ac69084611925565b60008581526001602090815260408083206001600160a01b03808b168086529184529382902094909455805188815291820187905280518a8416938616927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6292908290030190a4611809818787878787611e95565b604080516001808252818301909252606091829190602080830190803683370190505090508281600081518110611b6e57fe5b602090810291909101015292915050565b60008184841115611c0e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611bd3578181015183820152602001611bbb565b50505050905090810190601f168015611c005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b611c28846001600160a01b0316612006565b1561180957836001600160a01b031663bc197c8187878686866040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015611cb6578181015183820152602001611c9e565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015611cf5578181015183820152602001611cdd565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015611d31578181015183820152602001611d19565b50505050905090810190601f168015611d5e5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015611d8357600080fd5b505af1925050508015611da857506040513d6020811015611da357600080fd5b505160015b611e3d57611db46120a5565b80611dbf5750611e06565b60405162461bcd60e51b8152602060048201818152835160248401528351849391928392604401919085019080838360008315611bd3578181015183820152602001611bbb565b60405162461bcd60e51b815260040180806020018281038252603481526020018061214b6034913960400191505060405180910390fd5b6001600160e01b0319811663bc197c8160e01b14611e8c5760405162461bcd60e51b815260040180806020018281038252602881526020018061217f6028913960400191505060405180910390fd5b50505050505050565b611ea7846001600160a01b0316612006565b1561180957836001600160a01b031663f23a6e6187878686866040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f36578181015183820152602001611f1e565b50505050905090810190601f168015611f635780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015611f8657600080fd5b505af1925050508015611fab57506040513d6020811015611fa657600080fd5b505160015b611fb757611db46120a5565b6001600160e01b0319811663f23a6e6160e01b14611e8c5760405162461bcd60e51b815260040180806020018281038252602881526020018061217f6028913960400191505060405180910390fd5b3b151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061204d57805160ff191683800117855561207a565b8280016001018555821561207a579182015b8281111561207a57825182559160200191906001019061205f565b5061208692915061208a565b5090565b5b80821115612086576000815560010161208b565b60e01c90565b600060443d10156120b557610f85565b600481823e6308c379a06120c9825161209f565b146120d357610f85565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156121035750505050610f85565b8284019250825191508082111561211d5750505050610f85565b503d8301602082840101111561213557505050610f85565b601f01601f191681016020016040529150509056fe455243313135353a207472616e7366657220746f206e6f6e2045524331313535526563656976657220696d706c656d656e746572455243313135353a204552433131353552656365697665722072656a656374656420746f6b656e73426f78566f75636865723a204e6f7420617574686f72697365642063616c6c6572455243313135353a2062616c616e636520717565727920666f7220746865207a65726f2061646472657373455243313135353a2062617463682062616c616e636520717565727920666f7220746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373455243313135353a206275726e20616d6f756e7420657863656564732062616c616e6365455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243313135353a207472616e7366657220746f20746865207a65726f2061646472657373455243313135353a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564455243313135353a206275726e2066726f6d20746865207a65726f2061646472657373455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e73666572455243313135353a2073657474696e6720617070726f76616c2073746174757320666f722073656c66455243313135353a206163636f756e747320616e6420696473206c656e677468206d69736d61746368455243313135353a2069647320616e6420616d6f756e7473206c656e677468206d69736d61746368455243313135353a206d696e7420746f20746865207a65726f2061646472657373a2646970667358221220463b77476c70e69734a6192acb333e0708216fecd670beec71ee6ae87e3ffd1964736f6c634300060c0033

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.