More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 20,658 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 56222226 | 3 hrs ago | IN | 0 AVAX | 0.00028516 | ||||
Claim | 56219971 | 4 hrs ago | IN | 0 AVAX | 0.00028488 | ||||
Claim | 56218908 | 4 hrs ago | IN | 0 AVAX | 0.00028277 | ||||
Claim | 56218046 | 5 hrs ago | IN | 0 AVAX | 0.00023382 | ||||
Claim | 56213820 | 7 hrs ago | IN | 0 AVAX | 0.00018269 | ||||
Claim | 56213737 | 7 hrs ago | IN | 0 AVAX | 0.0002849 | ||||
Claim | 56212194 | 8 hrs ago | IN | 0 AVAX | 0.00028508 | ||||
Claim | 56207699 | 10 hrs ago | IN | 0 AVAX | 0.00028503 | ||||
Claim | 56206146 | 11 hrs ago | IN | 0 AVAX | 0.00018251 | ||||
Claim | 56205792 | 11 hrs ago | IN | 0 AVAX | 0.00028499 | ||||
Claim | 56195003 | 16 hrs ago | IN | 0 AVAX | 0.00028508 | ||||
Claim | 56194784 | 16 hrs ago | IN | 0 AVAX | 0.00023136 | ||||
Claim | 56194243 | 17 hrs ago | IN | 0 AVAX | 0.00018232 | ||||
Claim | 56193098 | 17 hrs ago | IN | 0 AVAX | 0.00023139 | ||||
Claim | 56188230 | 20 hrs ago | IN | 0 AVAX | 0.00018239 | ||||
Claim | 56188181 | 20 hrs ago | IN | 0 AVAX | 0.00028502 | ||||
Claim | 56186834 | 20 hrs ago | IN | 0 AVAX | 0.00023139 | ||||
Claim | 56184121 | 22 hrs ago | IN | 0 AVAX | 0.00028514 | ||||
Claim | 56183926 | 22 hrs ago | IN | 0 AVAX | 0.00023379 | ||||
Claim | 56183308 | 22 hrs ago | IN | 0 AVAX | 0.00018246 | ||||
Claim | 56181873 | 23 hrs ago | IN | 0 AVAX | 0.0002851 | ||||
Claim | 56178625 | 25 hrs ago | IN | 0 AVAX | 0.00028496 | ||||
Claim | 56170176 | 29 hrs ago | IN | 0 AVAX | 0.00028248 | ||||
Claim | 56169369 | 29 hrs ago | IN | 0 AVAX | 0.00018002 | ||||
Claim | 56165472 | 31 hrs ago | IN | 0 AVAX | 0.00018243 |
Loading...
Loading
Contract Name:
ArenaAirdropVesting
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.20; import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract ArenaAirdropVesting is Ownable { bytes32 public _root; address public immutable ARENA_TOKEN_ADDRESS; mapping(address => uint) public airdropClaimed; error AlreadyClaimed(); error ProofVerificationFailed(address claimant, uint256 amount); event MerkleRootUpdated(bytes32 indexed newRoot); event AirdropClaimed(address indexed claimant, uint256 amount); constructor(bytes32 firstRoot, address admin, address arenaTokenAddress) Ownable(admin) { require (arenaTokenAddress != address(0), "Invalid address"); ARENA_TOKEN_ADDRESS = arenaTokenAddress; _root = firstRoot; emit MerkleRootUpdated(_root); } function updateMerkleRoot(bytes32 newRoot) external onlyOwner { _root = newRoot; emit MerkleRootUpdated(newRoot); } function claim( bytes32[] calldata proof, uint256 amount ) external { uint256 alreadyClaimed = airdropClaimed[msg.sender]; if (alreadyClaimed >= amount) { revert AlreadyClaimed(); } verify(proof, msg.sender, amount); airdropClaimed[msg.sender] = amount; IERC20(ARENA_TOKEN_ADDRESS).transfer(msg.sender, amount - alreadyClaimed); emit AirdropClaimed(msg.sender, amount - alreadyClaimed); } function verify( bytes32[] memory proof, address addr, uint256 amount ) internal view { bytes32 leaf = keccak256( bytes.concat(keccak256(abi.encode(addr, amount))) ); if (!MerkleProof.verify(proof, _root, leaf)) { revert ProofVerificationFailed(addr, amount); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.20; import {Hashes} from "./Hashes.sol"; /** * @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 = Hashes.commutativeKeccak256(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 = Hashes.commutativeKeccak256(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] = Hashes.commutativeKeccak256(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] = Hashes.commutativeKeccak256(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]; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @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. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library of standard hash functions. */ library Hashes { /** * @dev Commutative Keccak256 hash of a sorted pair of bytes32. Frequently used when working with merkle proofs. * * NOTE: Equivalent to the `standardNodeHash` in our https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. */ function commutativeKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32) { return a < b ? _efficientKeccak256(a, b) : _efficientKeccak256(b, a); } /** * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory. */ function _efficientKeccak256(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
{ "remappings": [ "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/" ], "optimizer": { "enabled": true, "runs": 20000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"bytes32","name":"firstRoot","type":"bytes32"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"arenaTokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"claimant","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProofVerificationFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AirdropClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"newRoot","type":"bytes32"}],"name":"MerkleRootUpdated","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"},{"inputs":[],"name":"ARENA_TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"airdropClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claim","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a03461014957601f610a0d38819003918201601f19168301916001600160401b0383118484101761014e57808492606094604052833981010312610149578051610058604061005160208501610164565b9301610164565b6001600160a01b03928316801561013057600080546001600160a01b0319811683178255604051919591929082167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08780a38216156100fc5750608052806001557f90004c04698bc3322499a575ed3752dd4abf33e0a7294c06a787a0fe01bea9416040519280a26108949081610179823960805181818161034601526105780152f35b62461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b604051631e4fbdf760e01b815260006004820152602490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036101495756fe608060408181526004908136101561001657600080fd5b600092833560e01c9081633b439351146103cf575080634783f0ef1461036a57806356e20671146102fb578063715018a61461025c5780638da5cb5b1461020b578063c61b5862146101ca578063d1b6dd30146101665763f2fde38b1461007c57600080fd5b346101625760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101625781359173ffffffffffffffffffffffffffffffffffffffff9182841680940361015e576100d6610761565b831561012f5750508254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b908460249251917f1e4fbdf7000000000000000000000000000000000000000000000000000000008352820152fd5b8480fd5b8280fd5b5090346101625760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610162573573ffffffffffffffffffffffffffffffffffffffff811680910361016257828291602094526002845220549051908152f35b83823461020757817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610207576020906001549051908152f35b5080fd5b83823461020757817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102075773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b83346102f857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f857610293610761565b8073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b80fd5b83823461020757817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610207576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5050346102075760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020757356103a4610761565b806001557f90004c04698bc3322499a575ed3752dd4abf33e0a7294c06a787a0fe01bea9418280a280f35b919290503461075d57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261075d57803567ffffffffffffffff91828211610608573660238301121561060857818101359280841161075957600584811b91602490818487010136811161075557823596338c5260209860028a528b8d20549a898c101561072e57506104698a8d519801886107b2565b86528301888087015b83831061071e5750508a51338a8201908152602081018a9052925090506104c38160408401037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826107b2565b51902089518881019182528881529091818b01908111828210176106f3578a52519020926001918291825495948c945b61065a575b50505050500361061d578261055e9133885260028252838789205561051d8685610822565b87517fa9059cbb0000000000000000000000000000000000000000000000000000000081523392810192835260208301919091529283918291604090910190565b03818973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af18015610613576105dc575b507f650e45f04ef8a0c267b2f78d983913f69ae3a353b2b32de5429307522be0ab55926105d191610822565b92519283523392a280f35b8281813d831161060c575b6105f181836107b2565b8101031261060857518015150361015e57386105a5565b8580fd5b503d6105e7565b85513d88823e3d90fd5b84517fa8f9a76300000000000000000000000000000000000000000000000000000000815233918101918252602082019290925281906040010390fd5b909192939482518610156106ed5785821b83018a015190818110156106e0578d5289528a8c205b947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106b557840193929190836104f3565b838d60118a7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b908d5289528a8c20610681565b946104f8565b838c6041897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b82358152918101918a9101610472565b807f646cf558000000000000000000000000000000000000000000000000000000008a9252fd5b8a80fd5b8680fd5b8380fd5b73ffffffffffffffffffffffffffffffffffffffff60005416330361078257565b60246040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176107f357604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9190820391821161082f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212202a0b3ed28c758c98d2b9f5f8b46d0757620fb583efb024f7b017b3044830b89d64736f6c634300081400334099504cbe85d84f352132566b4ad90a7234af14d811c3a1a39ee98e01299266000000000000000000000000ea5a3814a611a42fdf0f2e20c5c81ab595bad521000000000000000000000000b8d7710f7d8349a506b75dd184f05777c82dad0c
Deployed Bytecode
0x608060408181526004908136101561001657600080fd5b600092833560e01c9081633b439351146103cf575080634783f0ef1461036a57806356e20671146102fb578063715018a61461025c5780638da5cb5b1461020b578063c61b5862146101ca578063d1b6dd30146101665763f2fde38b1461007c57600080fd5b346101625760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101625781359173ffffffffffffffffffffffffffffffffffffffff9182841680940361015e576100d6610761565b831561012f5750508254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b908460249251917f1e4fbdf7000000000000000000000000000000000000000000000000000000008352820152fd5b8480fd5b8280fd5b5090346101625760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610162573573ffffffffffffffffffffffffffffffffffffffff811680910361016257828291602094526002845220549051908152f35b83823461020757817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610207576020906001549051908152f35b5080fd5b83823461020757817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102075773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b83346102f857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102f857610293610761565b8073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b80fd5b83823461020757817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610207576020905173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b8d7710f7d8349a506b75dd184f05777c82dad0c168152f35b5050346102075760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261020757356103a4610761565b806001557f90004c04698bc3322499a575ed3752dd4abf33e0a7294c06a787a0fe01bea9418280a280f35b919290503461075d57827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261075d57803567ffffffffffffffff91828211610608573660238301121561060857818101359280841161075957600584811b91602490818487010136811161075557823596338c5260209860028a528b8d20549a898c101561072e57506104698a8d519801886107b2565b86528301888087015b83831061071e5750508a51338a8201908152602081018a9052925090506104c38160408401037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826107b2565b51902089518881019182528881529091818b01908111828210176106f3578a52519020926001918291825495948c945b61065a575b50505050500361061d578261055e9133885260028252838789205561051d8685610822565b87517fa9059cbb0000000000000000000000000000000000000000000000000000000081523392810192835260208301919091529283918291604090910190565b03818973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b8d7710f7d8349a506b75dd184f05777c82dad0c165af18015610613576105dc575b507f650e45f04ef8a0c267b2f78d983913f69ae3a353b2b32de5429307522be0ab55926105d191610822565b92519283523392a280f35b8281813d831161060c575b6105f181836107b2565b8101031261060857518015150361015e57386105a5565b8580fd5b503d6105e7565b85513d88823e3d90fd5b84517fa8f9a76300000000000000000000000000000000000000000000000000000000815233918101918252602082019290925281906040010390fd5b909192939482518610156106ed5785821b83018a015190818110156106e0578d5289528a8c205b947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106b557840193929190836104f3565b838d60118a7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b908d5289528a8c20610681565b946104f8565b838c6041897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b82358152918101918a9101610472565b807f646cf558000000000000000000000000000000000000000000000000000000008a9252fd5b8a80fd5b8680fd5b8380fd5b73ffffffffffffffffffffffffffffffffffffffff60005416330361078257565b60246040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176107f357604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9190820391821161082f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212202a0b3ed28c758c98d2b9f5f8b46d0757620fb583efb024f7b017b3044830b89d64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
4099504cbe85d84f352132566b4ad90a7234af14d811c3a1a39ee98e01299266000000000000000000000000ea5a3814a611a42fdf0f2e20c5c81ab595bad521000000000000000000000000b8d7710f7d8349a506b75dd184f05777c82dad0c
-----Decoded View---------------
Arg [0] : firstRoot (bytes32): 0x4099504cbe85d84f352132566b4ad90a7234af14d811c3a1a39ee98e01299266
Arg [1] : admin (address): 0xEA5A3814a611a42FdF0f2e20c5C81AB595baD521
Arg [2] : arenaTokenAddress (address): 0xB8d7710f7d8349A506b75dD184F05777c82dAd0C
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 4099504cbe85d84f352132566b4ad90a7234af14d811c3a1a39ee98e01299266
Arg [1] : 000000000000000000000000ea5a3814a611a42fdf0f2e20c5c81ab595bad521
Arg [2] : 000000000000000000000000b8d7710f7d8349a506b75dd184f05777c82dad0c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 29 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
AVAX | 100.00% | $0.005012 | 111,804,367.1419 | $560,361.25 |
[ 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.