Address Contract Partially Verified
Address
0xfdd15965c9d1013bde17F4802e26EAEBAc0595FD
Balance
0 ETH
Nonce
1
Code Size
3586 bytes
Creator
0xd8931CF0...8616 at tx 0x323495dd...f0b5e3
Indexed Transactions
0 (1 on-chain, 1.3% indexed)
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 →