Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 27 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Mint Relay | 17608973 | 972 days ago | IN | 0.04 ETH | 0.0009284 | ||||
| Mint Relay | 17572840 | 977 days ago | IN | 0.02 ETH | 0.00339437 | ||||
| Mint Relay | 17465302 | 992 days ago | IN | 0.08 ETH | 0.00136168 | ||||
| Mint Relay | 17387948 | 1003 days ago | IN | 0.02 ETH | 0.00402215 | ||||
| Mint Relay | 17384894 | 1004 days ago | IN | 0.04 ETH | 0.0022932 | ||||
| Mint Relay | 17384696 | 1004 days ago | IN | 0.02 ETH | 0.00232178 | ||||
| Mint Relay | 17384009 | 1004 days ago | IN | 0.02 ETH | 0.0049225 | ||||
| Mint Relay | 17381285 | 1004 days ago | IN | 0.02 ETH | 0.00257694 | ||||
| Mint Relay | 17379549 | 1004 days ago | IN | 0.02 ETH | 0.00370248 | ||||
| Mint Relay | 17378952 | 1005 days ago | IN | 0.02 ETH | 0.00295504 | ||||
| Mint Relay | 17374507 | 1005 days ago | IN | 0.04 ETH | 0.00241724 | ||||
| Mint Relay | 17372926 | 1005 days ago | IN | 0.02 ETH | 0.00512358 | ||||
| Mint Relay | 17372860 | 1005 days ago | IN | 0.04 ETH | 0.00538661 | ||||
| Mint Relay | 17372594 | 1005 days ago | IN | 0.06 ETH | 0.00443509 | ||||
| Set Presale End ... | 17372284 | 1005 days ago | IN | 0 ETH | 0.00172913 | ||||
| Mint Relay | 17342497 | 1010 days ago | IN | 0.02 ETH | 0.00217676 | ||||
| Mint Relay | 17342306 | 1010 days ago | IN | 0.06 ETH | 0.00264757 | ||||
| Mint Relay | 17330411 | 1011 days ago | IN | 0.06 ETH | 0.00721007 | ||||
| Mint Relay | 17328008 | 1012 days ago | IN | 0.08 ETH | 0.00309144 | ||||
| Mint Relay | 17326118 | 1012 days ago | IN | 0.02 ETH | 0.00227655 | ||||
| Mint Relay | 17325001 | 1012 days ago | IN | 0.04 ETH | 0.0040105 | ||||
| Mint Relay | 17324156 | 1012 days ago | IN | 0.02 ETH | 0.00485137 | ||||
| Mint Relay | 17322919 | 1012 days ago | IN | 0.02 ETH | 0.00573794 | ||||
| Mint Relay | 17322872 | 1012 days ago | IN | 0.02 ETH | 0.00774887 | ||||
| Mint Relay | 17322825 | 1012 days ago | IN | 0.04 ETH | 0.00773721 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Mint | 17608973 | 972 days ago | 0.04 ETH | ||||
| Mint | 17572840 | 977 days ago | 0.02 ETH | ||||
| Mint | 17465302 | 992 days ago | 0.08 ETH | ||||
| Mint | 17387948 | 1003 days ago | 0.02 ETH | ||||
| Mint | 17384894 | 1004 days ago | 0.04 ETH | ||||
| Mint | 17384696 | 1004 days ago | 0.02 ETH | ||||
| Mint | 17384009 | 1004 days ago | 0.02 ETH | ||||
| Mint | 17381285 | 1004 days ago | 0.02 ETH | ||||
| Mint | 17379549 | 1004 days ago | 0.02 ETH | ||||
| Mint | 17378952 | 1005 days ago | 0.02 ETH | ||||
| Mint | 17374507 | 1005 days ago | 0.04 ETH | ||||
| Mint | 17372926 | 1005 days ago | 0.02 ETH | ||||
| Mint | 17372860 | 1005 days ago | 0.04 ETH | ||||
| Mint | 17372594 | 1005 days ago | 0.06 ETH | ||||
| Mint | 17342497 | 1010 days ago | 0.02 ETH | ||||
| Mint | 17342306 | 1010 days ago | 0.06 ETH | ||||
| Mint | 17330411 | 1011 days ago | 0.06 ETH | ||||
| Mint | 17328008 | 1012 days ago | 0.08 ETH | ||||
| Mint | 17326118 | 1012 days ago | 0.02 ETH | ||||
| Mint | 17325001 | 1012 days ago | 0.04 ETH | ||||
| Mint | 17324156 | 1012 days ago | 0.02 ETH | ||||
| Mint | 17322919 | 1012 days ago | 0.02 ETH | ||||
| Mint | 17322872 | 1012 days ago | 0.02 ETH | ||||
| Mint | 17322825 | 1012 days ago | 0.04 ETH | ||||
| Mint | 17322805 | 1012 days ago | 0.02 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Relayer
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
error Relayer__InvalidCall();
interface IWhoIsWho {
function mint(address, uint256) external payable;
}
contract Relayer {
uint256 public mintPrice = 0.02 ether;
uint256 public presaleStartDate = 1684854000;
uint256 public presaleEndDate = 1685131200;
address public owner;
address public immutable whoIsWhoContract;
modifier onlyOwner() {
if (msg.sender != owner) {
revert Relayer__InvalidCall();
}
_;
}
constructor(address _whoIsWhoContract) {
whoIsWhoContract = _whoIsWhoContract;
owner = msg.sender;
}
function mintRelay(uint256 _mintAmount) external payable {
if (
_mintAmount == 0 ||
_mintAmount * mintPrice > msg.value ||
block.timestamp < presaleStartDate ||
block.timestamp > presaleEndDate
) {
revert Relayer__InvalidCall();
}
IWhoIsWho(whoIsWhoContract).mint{value: msg.value}(address(msg.sender), _mintAmount);
}
function setMintPrice(uint256 _mintPrice) external onlyOwner {
mintPrice = _mintPrice;
}
function setPresaleStartDate(uint256 _presaleStartDate) external onlyOwner {
presaleStartDate = _presaleStartDate;
}
function setPresaleEndDate(uint256 _presaleEndDate) external onlyOwner {
presaleEndDate = _presaleEndDate;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @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 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}
*
* _Available since v4.7._
*/
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.
*
* _Available since v4.4._
*/
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}
*
* _Available since v4.7._
*/
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.
*
* _Available since v4.7._
*/
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.
*
* _Available since v4.7._
*/
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).
*
* _Available since v4.7._
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild 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 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// 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 for 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) {
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.
*
* _Available since v4.7._
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild 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 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// 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 for 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) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
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)
}
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_whoIsWhoContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Relayer__InvalidCall","type":"error"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintRelay","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleEndDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleEndDate","type":"uint256"}],"name":"setPresaleEndDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleStartDate","type":"uint256"}],"name":"setPresaleStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whoIsWhoContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60a060405266470de4df82000060005563646cd4f06001556364710fc060025534801561002b57600080fd5b5060405161045d38038061045d83398101604081905261004a9161006d565b6001600160a01b0316608052600380546001600160a01b0319163317905561009d565b60006020828403121561007f57600080fd5b81516001600160a01b038116811461009657600080fd5b9392505050565b60805161039f6100be6000396000818160b2015261022c015261039f6000f3fe6080604052600436106100865760003560e01c806380a3a7831161005957806380a3a783146101355780638da5cb5b1461014b5780639a2e27f81461016b578063d39a840a14610181578063f4a0a528146101a157600080fd5b80630ec38e431461008b5780633562f8b7146100a057806342e0f792146100f15780636817c76c14610111575b600080fd5b61009e610099366004610325565b6101c1565b005b3480156100ac57600080fd5b506100d47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100fd57600080fd5b5061009e61010c366004610325565b610295565b34801561011d57600080fd5b5061012760005481565b6040519081526020016100e8565b34801561014157600080fd5b5061012760015481565b34801561015757600080fd5b506003546100d4906001600160a01b031681565b34801561017757600080fd5b5061012760025481565b34801561018d57600080fd5b5061009e61019c366004610325565b6102c5565b3480156101ad57600080fd5b5061009e6101bc366004610325565b6102f5565b8015806101da575034600054826101d8919061033e565b115b806101e6575060015442105b806101f2575060025442115b156102105760405163590272cd60e11b815260040160405180910390fd5b6040516340c10f1960e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f199034906044016000604051808303818588803b15801561027957600080fd5b505af115801561028d573d6000803e3d6000fd5b505050505050565b6003546001600160a01b031633146102c05760405163590272cd60e11b815260040160405180910390fd5b600155565b6003546001600160a01b031633146102f05760405163590272cd60e11b815260040160405180910390fd5b600255565b6003546001600160a01b031633146103205760405163590272cd60e11b815260040160405180910390fd5b600055565b60006020828403121561033757600080fd5b5035919050565b808202811582820484141761036357634e487b7160e01b600052601160045260246000fd5b9291505056fea2646970667358221220dcdc90aa0b8e44350d8cc78529460c1db18cada032a1717744649a3555eca1c364736f6c634300081200330000000000000000000000008f07ab2b4fea713c110e820cfa5d8fe02daa3d74
Deployed Bytecode
0x6080604052600436106100865760003560e01c806380a3a7831161005957806380a3a783146101355780638da5cb5b1461014b5780639a2e27f81461016b578063d39a840a14610181578063f4a0a528146101a157600080fd5b80630ec38e431461008b5780633562f8b7146100a057806342e0f792146100f15780636817c76c14610111575b600080fd5b61009e610099366004610325565b6101c1565b005b3480156100ac57600080fd5b506100d47f0000000000000000000000008f07ab2b4fea713c110e820cfa5d8fe02daa3d7481565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100fd57600080fd5b5061009e61010c366004610325565b610295565b34801561011d57600080fd5b5061012760005481565b6040519081526020016100e8565b34801561014157600080fd5b5061012760015481565b34801561015757600080fd5b506003546100d4906001600160a01b031681565b34801561017757600080fd5b5061012760025481565b34801561018d57600080fd5b5061009e61019c366004610325565b6102c5565b3480156101ad57600080fd5b5061009e6101bc366004610325565b6102f5565b8015806101da575034600054826101d8919061033e565b115b806101e6575060015442105b806101f2575060025442115b156102105760405163590272cd60e11b815260040160405180910390fd5b6040516340c10f1960e01b8152336004820152602481018290527f0000000000000000000000008f07ab2b4fea713c110e820cfa5d8fe02daa3d746001600160a01b0316906340c10f199034906044016000604051808303818588803b15801561027957600080fd5b505af115801561028d573d6000803e3d6000fd5b505050505050565b6003546001600160a01b031633146102c05760405163590272cd60e11b815260040160405180910390fd5b600155565b6003546001600160a01b031633146102f05760405163590272cd60e11b815260040160405180910390fd5b600255565b6003546001600160a01b031633146103205760405163590272cd60e11b815260040160405180910390fd5b600055565b60006020828403121561033757600080fd5b5035919050565b808202811582820484141761036357634e487b7160e01b600052601160045260246000fd5b9291505056fea2646970667358221220dcdc90aa0b8e44350d8cc78529460c1db18cada032a1717744649a3555eca1c364736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008f07ab2b4fea713c110e820cfa5d8fe02daa3d74
-----Decoded View---------------
Arg [0] : _whoIsWhoContract (address): 0x8F07AB2B4fEA713c110E820CFA5d8fE02dAa3D74
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000008f07ab2b4fea713c110e820cfa5d8fe02daa3d74
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.