Forkchoice Ethereum Mainnet

Address Contract Partially Verified

Address 0xfdd15965c9d1013bde17F4802e26EAEBAc0595FD
Balance 0 ETH
Nonce 1
Code Size 3586 bytes
Indexed Transactions 0 (1 on-chain, 1.3% indexed)
External Etherscan · Sourcify

Contract Bytecode

3586 bytes
0x608060405234801561000f575f80fd5b50600436106100cf575f3560e01c8063bc197c811161007d578063ce606ee011610058578063ce606ee014610207578063f23a6e6114610219578063f72d82cf14610251575f80fd5b8063bc197c8114610160578063bd90df70146101c9578063c63a94c8146101f4575f80fd5b806347fc822f116100ad57806347fc822f14610127578063814785eb1461013a578063880cdc311461014d575f80fd5b806301ffc9a7146100d357806321ff9970146100fb5780632eb4a7ab14610110575b5f80fd5b6100e66100e13660046108e2565b610264565b60405190151581526020015b60405180910390f35b61010e610109366004610921565b6102fc565b005b61011960015481565b6040519081526020016100f2565b61010e610135366004610953565b61034f565b61010e61014836600461096c565b6103d2565b61010e61015b366004610953565b6104b4565b61019861016e366004610acd565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100f2565b6002546101dc906001600160a01b031681565b6040516001600160a01b0390911681526020016100f2565b61010e610202366004610bc4565b610536565b5f546101dc906001600160a01b031681565b610198610227366004610c44565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b61010e61025f366004610c98565b610606565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806102f657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f546001600160a01b0316331461034a5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329027bbb732b960991b60448201526064015b60405180910390fd5b600155565b5f546001600160a01b031633146103985760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329027bbb732b960991b6044820152606401610341565b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f546001600160a01b0316331461041b5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329027bbb732b960991b6044820152606401610341565b6002546040517ff242432a0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038581166024830152604482018590526064820184905260a060848301525f60a48301529091169063f242432a9060c4015f604051808303815f87803b158015610499575f80fd5b505af11580156104ab573d5f803e3d5ffd5b50505050505050565b5f546001600160a01b031633146104fd5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329027bbb732b960991b6044820152606401610341565b5f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f546001600160a01b0316331461057f5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329027bbb732b960991b6044820152606401610341565b6002546040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690632eb2c2d6906105d290309089908990899089908990600401610d37565b5f604051808303815f87803b1580156105e9575f80fd5b505af11580156105fb573d5f803e3d5ffd5b505050505050505050565b6001600160a01b0383165f9081526003602052604090205460ff161561066e5760405162461bcd60e51b815260206004820152600760248201527f436c61696d6564000000000000000000000000000000000000000000000000006044820152606401610341565b6106b361067b85856107ea565b8383808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061084a92505050565b6106ff5760405162461bcd60e51b815260206004820152600760248201527f496e76616c6964000000000000000000000000000000000000000000000000006044820152606401610341565b6001600160a01b038084165f90815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556002541663f242432a3085610756886014610d99565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015260448201526001606482015260a060848201525f60a482015260c4015f604051808303815f87803b1580156107ce575f80fd5b505af11580156107e0573d5f803e3d5ffd5b5050505050505050565b5f828260405160200161082c92919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b60405160208183030381529060405280519060200120905092915050565b5f610858826001548561085f565b9392505050565b5f8261086b8584610874565b14949350505050565b5f81815b84518110156108ae576108a48286838151811061089757610897610db8565b60200260200101516108b6565b9150600101610878565b509392505050565b5f8183106108d0575f828152602084905260409020610858565b5f838152602083905260409020610858565b5f602082840312156108f2575f80fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610858575f80fd5b5f60208284031215610931575f80fd5b5035919050565b80356001600160a01b038116811461094e575f80fd5b919050565b5f60208284031215610963575f80fd5b61085882610938565b5f805f6060848603121561097e575f80fd5b61098784610938565b95602085013595506040909401359392505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156109d9576109d961099c565b604052919050565b5f82601f8301126109f0575f80fd5b813567ffffffffffffffff811115610a0a57610a0a61099c565b8060051b610a1a602082016109b0565b91825260208185018101929081019086841115610a35575f80fd5b6020860192505b83831015610a57578235825260209283019290910190610a3c565b9695505050505050565b5f82601f830112610a70575f80fd5b813567ffffffffffffffff811115610a8a57610a8a61099c565b610a9d6020601f19601f840116016109b0565b818152846020838601011115610ab1575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215610ae1575f80fd5b610aea86610938565b9450610af860208701610938565b9350604086013567ffffffffffffffff811115610b13575f80fd5b610b1f888289016109e1565b935050606086013567ffffffffffffffff811115610b3b575f80fd5b610b47888289016109e1565b925050608086013567ffffffffffffffff811115610b63575f80fd5b610b6f88828901610a61565b9150509295509295909350565b5f8083601f840112610b8c575f80fd5b50813567ffffffffffffffff811115610ba3575f80fd5b6020830191508360208260051b8501011115610bbd575f80fd5b9250929050565b5f805f805f60608688031215610bd8575f80fd5b610be186610938565b9450602086013567ffffffffffffffff811115610bfc575f80fd5b610c0888828901610b7c565b909550935050604086013567ffffffffffffffff811115610c27575f80fd5b610c3388828901610b7c565b969995985093965092949392505050565b5f805f805f60a08688031215610c58575f80fd5b610c6186610938565b9450610c6f60208701610938565b93506040860135925060608601359150608086013567ffffffffffffffff811115610b63575f80fd5b5f805f8060608587031215610cab575f80fd5b84359350610cbb60208601610938565b9250604085013567ffffffffffffffff811115610cd6575f80fd5b610ce287828801610b7c565b95989497509550505050565b8183525f7f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115610d1e575f80fd5b8260051b80836020870137939093016020019392505050565b6001600160a01b03871681526001600160a01b038616602082015260a060408201525f610d6860a083018688610cee565b8281036060840152610d7b818587610cee565b83810360809094019390935250505f81526020019695505050505050565b808201808211156102f657634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffdfea2646970667358221220d0a52faa0db25a1453de62443e8ad50b4c9d76805556d57ece013b19897eaff164736f6c634300081a0033

Verified Source Code Partial Match

Compiler: v0.8.26+commit.8a97fa7a EVM: cancun Optimization: Yes (2000 runs)
MerkleDropComic2_2.sol 88 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";

interface IERC1155 {
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

contract MerkleClaim is ERC1155Holder {
    address public contractOwner;
    bytes32 public merkleRoot;
    address public targetContract;

    mapping (address => bool) claimed;

    constructor(bytes32 root) {
        merkleRoot = root;
        targetContract = 0x43EdD2A55dfA0953f31692Ffa18A95A38f2F7E05;
        contractOwner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == contractOwner, "Not the Owner");
        _;
    }

    // Update merkle root
    function updateRoot(bytes32 newRoot) external onlyOwner {
        merkleRoot = newRoot;
    }

    // Update Owner
    function updateOwner(address newOwner) external onlyOwner {
        contractOwner = newOwner;
    }

    // Update the target contract
    function setTargetContract(address newContract) external onlyOwner {
        targetContract = newContract;
    }

    // Transfer out tokens from the contract
    function transferOut(address receiver, uint256 id, uint256 amount) external onlyOwner {
        IERC1155(targetContract).safeTransferFrom(address(this), receiver, id, amount, "");
    }
    // Batch transfer out tokens from the contract
    function batchTransferOut(address receiver, uint256[] calldata ids, uint256[] calldata amounts) external onlyOwner {
        IERC1155(targetContract).safeBatchTransferFrom(address(this), receiver, ids, amounts, "");
    }

    /////
    // Merkle Tree Claim section
    /////
    function claim(uint256 tier, address claimer, bytes32[] calldata proof) external {
        require (!claimed[claimer], "Claimed");
        require(_verify(_leaf(tier, claimer), proof), "Invalid");

        claimed[claimer] = true;

        // Transfer to claimer
        IERC1155(targetContract).safeTransferFrom(address(this), claimer, tier + 20, 1, "");       
    }

    function _leaf(uint256 tier, address claimer) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(tier, claimer));
    }

    function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool) {
        return MerkleProof.verify(proof, merkleRoot, leaf);
    }

}
ERC1155Holder.sol 42 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/utils/ERC1155Holder.sol)

pragma solidity ^0.8.20;

import {IERC165, ERC165} from "../../../utils/introspection/ERC165.sol";
import {IERC1155Receiver} from "../IERC1155Receiver.sol";

/**
 * @dev Simple implementation of `IERC1155Receiver` that will allow a contract to hold ERC-1155 tokens.
 *
 * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be
 * stuck.
 */
abstract contract ERC1155Holder is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }

    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}
MerkleProof.sol 232 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.20;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the Merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates Merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     *@dev The multiproof provided is not valid.
     */
    error MerkleProofInvalidMultiproof();

    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     */
    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the Merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proofLen != totalHashes + 1) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            if (proofPos != proofLen) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the Merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proofLen != totalHashes + 1) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            if (proofPos != proofLen) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Sorts the pair (a, b) and hashes the result.
     */
    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    /**
     * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.
     */
    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}
IERC1155Receiver.sol 59 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.20;

import {IERC165} from "../../utils/introspection/IERC165.sol";

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

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

pragma solidity ^0.8.20;

import {IERC165} from "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
IERC165.sol 25 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * 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[ERC 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);
}

Read Contract

contractOwner 0xce606ee0 → address
merkleRoot 0x2eb4a7ab → bytes32
supportsInterface 0x01ffc9a7 → bool
targetContract 0xbd90df70 → address

Write Contract 8 functions

These functions modify contract state and require a wallet transaction to execute.

batchTransferOut 0xc63a94c8
address receiver
uint256[] ids
uint256[] amounts
claim 0xf72d82cf
uint256 tier
address claimer
bytes32[] proof
onERC1155BatchReceived 0xbc197c81
address
address
uint256[]
uint256[]
bytes
returns: bytes4
onERC1155Received 0xf23a6e61
address
address
uint256
uint256
bytes
returns: bytes4
setTargetContract 0x47fc822f
address newContract
transferOut 0x814785eb
address receiver
uint256 id
uint256 amount
updateOwner 0x880cdc31
address newOwner
updateRoot 0x21ff9970
bytes32 newRoot

Recent Transactions

This address has 1 on-chain transactions, but only 1.3% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →