Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
OlaAirdrop
Compiler Version
v0.8.27+commit.40a35a09
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-11-28
*/
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.1.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);
}
// File: @openzeppelin/contracts/utils/cryptography/Hashes.sol
// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/Hashes.sol)
pragma solidity ^0.8.20;
/**
* @dev Library of standard hash functions.
*
* _Available since v5.1._
*/
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) {
assembly ("memory-safe") {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol
// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/MerkleProof.sol)
// This file was procedurally generated from scripts/generate/templates/MerkleProof.js.
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.
*
* IMPORTANT: Consider memory side-effects when using custom hashing functions
* that access memory in an unsafe way.
*
* NOTE: This library supports proof verification for merkle trees built using
* custom _commutative_ hashing functions (i.e. `H(a, b) == H(b, a)`). Proving
* leaf inclusion in trees built using non-commutative hashing functions requires
* additional logic that is not supported by this library.
*/
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.
*
* This version handles proofs in memory with the default hashing function.
*/
function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProof(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 leaves & pre-images are assumed to be sorted.
*
* This version handles proofs in memory with the default hashing function.
*/
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 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.
*
* This version handles proofs in memory with a custom hashing function.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bool) {
return processProof(proof, leaf, hasher) == 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 leaves & pre-images are assumed to be sorted.
*
* This version handles proofs in memory with a custom hashing function.
*/
function processProof(
bytes32[] memory proof,
bytes32 leaf,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = hasher(computedHash, proof[i]);
}
return computedHash;
}
/**
* @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.
*
* This version handles proofs in calldata with the default hashing function.
*/
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 leaves & pre-images are assumed to be sorted.
*
* This version handles proofs in calldata with the default hashing function.
*/
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 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.
*
* This version handles proofs in calldata with a custom hashing function.
*/
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bool) {
return processProofCalldata(proof, leaf, hasher) == 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 leaves & pre-images are assumed to be sorted.
*
* This version handles proofs in calldata with a custom hashing function.
*/
function processProofCalldata(
bytes32[] calldata proof,
bytes32 leaf,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = hasher(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}.
*
* This version handles multiproofs in memory with the default hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*
* NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
* The `leaves` must be validated independently. See {processMultiProof}.
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(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.
*
* This version handles multiproofs in memory with the default hashing function.
*
* 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).
*
* NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
* and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
* validating the leaves elsewhere.
*/
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 proofFlagsLen = proofFlags.length;
// Check proof validity.
if (leavesLen + proof.length != proofFlagsLen + 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[](proofFlagsLen);
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 < proofFlagsLen; 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 (proofFlagsLen > 0) {
if (proofPos != proof.length) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[proofFlagsLen - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @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}.
*
* This version handles multiproofs in memory with a custom hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*
* NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
* The `leaves` must be validated independently. See {processMultiProof}.
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bool) {
return processMultiProof(proof, proofFlags, leaves, hasher) == 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.
*
* This version handles multiproofs in memory with a custom hashing function.
*
* 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).
*
* NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
* and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
* validating the leaves elsewhere.
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view 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 proofFlagsLen = proofFlags.length;
// Check proof validity.
if (leavesLen + proof.length != proofFlagsLen + 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[](proofFlagsLen);
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 < proofFlagsLen; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = hasher(a, b);
}
if (proofFlagsLen > 0) {
if (proofPos != proof.length) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[proofFlagsLen - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @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}.
*
* This version handles multiproofs in calldata with the default hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*
* NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
* The `leaves` must be validated independently. See {processMultiProofCalldata}.
*/
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.
*
* This version handles multiproofs in calldata with the default hashing function.
*
* 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).
*
* NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
* and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
* validating the leaves elsewhere.
*/
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 proofFlagsLen = proofFlags.length;
// Check proof validity.
if (leavesLen + proof.length != proofFlagsLen + 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[](proofFlagsLen);
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 < proofFlagsLen; 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 (proofFlagsLen > 0) {
if (proofPos != proof.length) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[proofFlagsLen - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @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}.
*
* This version handles multiproofs in calldata with a custom hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*
* NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
* The `leaves` must be validated independently. See {processMultiProofCalldata}.
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves, hasher) == 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.
*
* This version handles multiproofs in calldata with a custom hashing function.
*
* 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).
*
* NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
* and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
* validating the leaves elsewhere.
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view 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 proofFlagsLen = proofFlags.length;
// Check proof validity.
if (leavesLen + proof.length != proofFlagsLen + 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[](proofFlagsLen);
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 < proofFlagsLen; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = hasher(a, b);
}
if (proofFlagsLen > 0) {
if (proofPos != proof.length) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[proofFlagsLen - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// 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;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
/**
* @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);
}
}
// File: contracts/OlaAirdrop.sol
pragma solidity ^0.8.27;
contract OlaAirdrop is Ownable {
IERC20 public immutable olaToken;
bytes32 public merkleRoot;
mapping(address => uint256) public claimedAmount;
event Claimed(address indexed account, uint256 newClaimAmount, uint256 totalClaimedAmount);
constructor(address _olaToken, bytes32 _merkleRoot, address initialOwner) Ownable(initialOwner) {
olaToken = IERC20(_olaToken);
merkleRoot = _merkleRoot;
}
function claim(uint256 totalAmount, bytes32[] calldata merkleProof) external {
// Verify user's total claimable amount
bytes32 leaf = keccak256(bytes.concat(keccak256(abi.encode(msg.sender, totalAmount))));
require(MerkleProof.verify(merkleProof, merkleRoot, leaf), "Invalid proof");
// Calculate new claimable amount
uint256 alreadyClaimed = claimedAmount[msg.sender];
require(totalAmount > alreadyClaimed, "No new tokens to claim");
uint256 newClaimAmount = totalAmount - alreadyClaimed;
claimedAmount[msg.sender] = totalAmount;
require(olaToken.transfer(msg.sender, newClaimAmount), "Transfer failed");
emit Claimed(msg.sender, newClaimAmount, totalAmount);
}
function updateMerkleRoot(bytes32 _newMerkleRoot) external onlyOwner {
merkleRoot = _newMerkleRoot;
}
function withdrawTokens(address to, uint256 amount) external onlyOwner {
require(olaToken.transfer(to, amount), "Transfer failed");
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_olaToken","type":"address"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"newClaimAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalClaimedAmount","type":"uint256"}],"name":"Claimed","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":[{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"olaToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","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":"_newMerkleRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a060405234801561000f575f5ffd5b5060405161114438038061114483398181016040528101906100319190610247565b805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a2575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009991906102a6565b60405180910390fd5b6100b1816100f560201b60201c565b508273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050816001819055505050506102bf565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101e3826101ba565b9050919050565b6101f3816101d9565b81146101fd575f5ffd5b50565b5f8151905061020e816101ea565b92915050565b5f819050919050565b61022681610214565b8114610230575f5ffd5b50565b5f815190506102418161021d565b92915050565b5f5f5f6060848603121561025e5761025d6101b6565b5b5f61026b86828701610200565b935050602061027c86828701610233565b925050604061028d86828701610200565b9150509250925092565b6102a0816101d9565b82525050565b5f6020820190506102b95f830184610297565b92915050565b608051610e5f6102e55f395f81816101b80152818161044e01526105a50152610e5f5ff3fe608060405234801561000f575f5ffd5b5060043610610091575f3560e01c80634783f0ef116100645780634783f0ef1461011b578063715018a61461013757806385f4404b146101415780638da5cb5b1461015f578063f2fde38b1461017d57610091565b806304e869031461009557806306b091f9146100c55780632eb4a7ab146100e15780632f52ebb7146100ff575b5f5ffd5b6100af60048036038101906100aa91906108c8565b610199565b6040516100bc919061090b565b60405180910390f35b6100df60048036038101906100da919061094e565b6101ae565b005b6100e9610294565b6040516100f691906109a4565b60405180910390f35b61011960048036038101906101149190610a1e565b61029a565b005b61013560048036038101906101309190610aa5565b61057e565b005b61013f610590565b005b6101496105a3565b6040516101569190610b2b565b60405180910390f35b6101676105c7565b6040516101749190610b53565b60405180910390f35b610197600480360381019061019291906108c8565b6105ee565b005b6002602052805f5260405f205f915090505481565b6101b6610672565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610211929190610b6c565b6020604051808303815f875af115801561022d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102519190610bc8565b610290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028790610c4d565b60405180910390fd5b5050565b60015481565b5f33846040516020016102ae929190610b6c565b604051602081830303815290604052805190602001206040516020016102d49190610c8b565b6040516020818303038152906040528051906020012090506103398383808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050600154836106f9565b610378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161036f90610cef565b60405180910390fd5b5f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508085116103fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f290610d57565b60405180910390fd5b5f81866104089190610da2565b90508560025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016104a7929190610b6c565b6020604051808303815f875af11580156104c3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e79190610bc8565b610526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051d90610c4d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a828860405161056e929190610dd5565b60405180910390a2505050505050565b610586610672565b8060018190555050565b610598610672565b6105a15f61070f565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6105f6610672565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610666575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161065d9190610b53565b60405180910390fd5b61066f8161070f565b50565b61067a6107d0565b73ffffffffffffffffffffffffffffffffffffffff166106986105c7565b73ffffffffffffffffffffffffffffffffffffffff16146106f7576106bb6107d0565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016106ee9190610b53565b60405180910390fd5b565b5f8261070585846107d7565b1490509392505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f5f8290505f5f90505b845181101561081d5761080e8286838151811061080157610800610dfc565b5b6020026020010151610828565b915080806001019150506107e1565b508091505092915050565b5f81831061083f5761083a8284610852565b61084a565b6108498383610852565b5b905092915050565b5f825f528160205260405f20905092915050565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6108978261086e565b9050919050565b6108a78161088d565b81146108b1575f5ffd5b50565b5f813590506108c28161089e565b92915050565b5f602082840312156108dd576108dc610866565b5b5f6108ea848285016108b4565b91505092915050565b5f819050919050565b610905816108f3565b82525050565b5f60208201905061091e5f8301846108fc565b92915050565b61092d816108f3565b8114610937575f5ffd5b50565b5f8135905061094881610924565b92915050565b5f5f6040838503121561096457610963610866565b5b5f610971858286016108b4565b92505060206109828582860161093a565b9150509250929050565b5f819050919050565b61099e8161098c565b82525050565b5f6020820190506109b75f830184610995565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126109de576109dd6109bd565b5b8235905067ffffffffffffffff8111156109fb576109fa6109c1565b5b602083019150836020820283011115610a1757610a166109c5565b5b9250929050565b5f5f5f60408486031215610a3557610a34610866565b5b5f610a428682870161093a565b935050602084013567ffffffffffffffff811115610a6357610a6261086a565b5b610a6f868287016109c9565b92509250509250925092565b610a848161098c565b8114610a8e575f5ffd5b50565b5f81359050610a9f81610a7b565b92915050565b5f60208284031215610aba57610ab9610866565b5b5f610ac784828501610a91565b91505092915050565b5f819050919050565b5f610af3610aee610ae98461086e565b610ad0565b61086e565b9050919050565b5f610b0482610ad9565b9050919050565b5f610b1582610afa565b9050919050565b610b2581610b0b565b82525050565b5f602082019050610b3e5f830184610b1c565b92915050565b610b4d8161088d565b82525050565b5f602082019050610b665f830184610b44565b92915050565b5f604082019050610b7f5f830185610b44565b610b8c60208301846108fc565b9392505050565b5f8115159050919050565b610ba781610b93565b8114610bb1575f5ffd5b50565b5f81519050610bc281610b9e565b92915050565b5f60208284031215610bdd57610bdc610866565b5b5f610bea84828501610bb4565b91505092915050565b5f82825260208201905092915050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f610c37600f83610bf3565b9150610c4282610c03565b602082019050919050565b5f6020820190508181035f830152610c6481610c2b565b9050919050565b5f819050919050565b610c85610c808261098c565b610c6b565b82525050565b5f610c968284610c74565b60208201915081905092915050565b7f496e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f610cd9600d83610bf3565b9150610ce482610ca5565b602082019050919050565b5f6020820190508181035f830152610d0681610ccd565b9050919050565b7f4e6f206e657720746f6b656e7320746f20636c61696d000000000000000000005f82015250565b5f610d41601683610bf3565b9150610d4c82610d0d565b602082019050919050565b5f6020820190508181035f830152610d6e81610d35565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610dac826108f3565b9150610db7836108f3565b9250828203905081811115610dcf57610dce610d75565b5b92915050565b5f604082019050610de85f8301856108fc565b610df560208301846108fc565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea26469706673582212209f6191cafbcacddbb1d8c7a2b84f8438a6939705629fd1a5fb5cced13ce4e02b64736f6c634300081b00330000000000000000000000002353f7e7b74c045a5dfbaafee5d21bfd948dc17000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e1064eb4a165c9f14076ce06682ba5b8e3b8f9d
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610091575f3560e01c80634783f0ef116100645780634783f0ef1461011b578063715018a61461013757806385f4404b146101415780638da5cb5b1461015f578063f2fde38b1461017d57610091565b806304e869031461009557806306b091f9146100c55780632eb4a7ab146100e15780632f52ebb7146100ff575b5f5ffd5b6100af60048036038101906100aa91906108c8565b610199565b6040516100bc919061090b565b60405180910390f35b6100df60048036038101906100da919061094e565b6101ae565b005b6100e9610294565b6040516100f691906109a4565b60405180910390f35b61011960048036038101906101149190610a1e565b61029a565b005b61013560048036038101906101309190610aa5565b61057e565b005b61013f610590565b005b6101496105a3565b6040516101569190610b2b565b60405180910390f35b6101676105c7565b6040516101749190610b53565b60405180910390f35b610197600480360381019061019291906108c8565b6105ee565b005b6002602052805f5260405f205f915090505481565b6101b6610672565b7f0000000000000000000000002353f7e7b74c045a5dfbaafee5d21bfd948dc17073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610211929190610b6c565b6020604051808303815f875af115801561022d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102519190610bc8565b610290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028790610c4d565b60405180910390fd5b5050565b60015481565b5f33846040516020016102ae929190610b6c565b604051602081830303815290604052805190602001206040516020016102d49190610c8b565b6040516020818303038152906040528051906020012090506103398383808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050600154836106f9565b610378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161036f90610cef565b60405180910390fd5b5f60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508085116103fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f290610d57565b60405180910390fd5b5f81866104089190610da2565b90508560025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055507f0000000000000000000000002353f7e7b74c045a5dfbaafee5d21bfd948dc17073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016104a7929190610b6c565b6020604051808303815f875af11580156104c3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e79190610bc8565b610526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051d90610c4d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a828860405161056e929190610dd5565b60405180910390a2505050505050565b610586610672565b8060018190555050565b610598610672565b6105a15f61070f565b565b7f0000000000000000000000002353f7e7b74c045a5dfbaafee5d21bfd948dc17081565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6105f6610672565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610666575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161065d9190610b53565b60405180910390fd5b61066f8161070f565b50565b61067a6107d0565b73ffffffffffffffffffffffffffffffffffffffff166106986105c7565b73ffffffffffffffffffffffffffffffffffffffff16146106f7576106bb6107d0565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016106ee9190610b53565b60405180910390fd5b565b5f8261070585846107d7565b1490509392505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f5f8290505f5f90505b845181101561081d5761080e8286838151811061080157610800610dfc565b5b6020026020010151610828565b915080806001019150506107e1565b508091505092915050565b5f81831061083f5761083a8284610852565b61084a565b6108498383610852565b5b905092915050565b5f825f528160205260405f20905092915050565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6108978261086e565b9050919050565b6108a78161088d565b81146108b1575f5ffd5b50565b5f813590506108c28161089e565b92915050565b5f602082840312156108dd576108dc610866565b5b5f6108ea848285016108b4565b91505092915050565b5f819050919050565b610905816108f3565b82525050565b5f60208201905061091e5f8301846108fc565b92915050565b61092d816108f3565b8114610937575f5ffd5b50565b5f8135905061094881610924565b92915050565b5f5f6040838503121561096457610963610866565b5b5f610971858286016108b4565b92505060206109828582860161093a565b9150509250929050565b5f819050919050565b61099e8161098c565b82525050565b5f6020820190506109b75f830184610995565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126109de576109dd6109bd565b5b8235905067ffffffffffffffff8111156109fb576109fa6109c1565b5b602083019150836020820283011115610a1757610a166109c5565b5b9250929050565b5f5f5f60408486031215610a3557610a34610866565b5b5f610a428682870161093a565b935050602084013567ffffffffffffffff811115610a6357610a6261086a565b5b610a6f868287016109c9565b92509250509250925092565b610a848161098c565b8114610a8e575f5ffd5b50565b5f81359050610a9f81610a7b565b92915050565b5f60208284031215610aba57610ab9610866565b5b5f610ac784828501610a91565b91505092915050565b5f819050919050565b5f610af3610aee610ae98461086e565b610ad0565b61086e565b9050919050565b5f610b0482610ad9565b9050919050565b5f610b1582610afa565b9050919050565b610b2581610b0b565b82525050565b5f602082019050610b3e5f830184610b1c565b92915050565b610b4d8161088d565b82525050565b5f602082019050610b665f830184610b44565b92915050565b5f604082019050610b7f5f830185610b44565b610b8c60208301846108fc565b9392505050565b5f8115159050919050565b610ba781610b93565b8114610bb1575f5ffd5b50565b5f81519050610bc281610b9e565b92915050565b5f60208284031215610bdd57610bdc610866565b5b5f610bea84828501610bb4565b91505092915050565b5f82825260208201905092915050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f610c37600f83610bf3565b9150610c4282610c03565b602082019050919050565b5f6020820190508181035f830152610c6481610c2b565b9050919050565b5f819050919050565b610c85610c808261098c565b610c6b565b82525050565b5f610c968284610c74565b60208201915081905092915050565b7f496e76616c69642070726f6f66000000000000000000000000000000000000005f82015250565b5f610cd9600d83610bf3565b9150610ce482610ca5565b602082019050919050565b5f6020820190508181035f830152610d0681610ccd565b9050919050565b7f4e6f206e657720746f6b656e7320746f20636c61696d000000000000000000005f82015250565b5f610d41601683610bf3565b9150610d4c82610d0d565b602082019050919050565b5f6020820190508181035f830152610d6e81610d35565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610dac826108f3565b9150610db7836108f3565b9250828203905081811115610dcf57610dce610d75565b5b92915050565b5f604082019050610de85f8301856108fc565b610df560208301846108fc565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea26469706673582212209f6191cafbcacddbb1d8c7a2b84f8438a6939705629fd1a5fb5cced13ce4e02b64736f6c634300081b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002353f7e7b74c045a5dfbaafee5d21bfd948dc17000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e1064eb4a165c9f14076ce06682ba5b8e3b8f9d
-----Decoded View---------------
Arg [0] : _olaToken (address): 0x2353F7e7b74C045a5dfbaaFeE5d21BFD948dC170
Arg [1] : _merkleRoot (bytes32): 0x0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : initialOwner (address): 0x2E1064eB4A165c9f14076ce06682bA5B8e3B8f9D
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000002353f7e7b74c045a5dfbaafee5d21bfd948dc170
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000002e1064eb4a165c9f14076ce06682ba5b8e3b8f9d
Deployed Bytecode Sourcemap
33116:1503:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33225:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34469:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33193:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33567:771;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34346:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32207:103;;;:::i;:::-;;33154:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31532:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32465:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33225:48;;;;;;;;;;;;;;;;;:::o;34469:147::-;31418:13;:11;:13::i;:::-;34559:8:::1;:17;;;34577:2;34581:6;34559:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34551:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34469:147:::0;;:::o;33193:25::-;;;;:::o;33567:771::-;33704:12;33763:10;33775:11;33752:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33742:46;;;;;;33729:60;;;;;;;;:::i;:::-;;;;;;;;;;;;;33719:71;;;;;;33704:86;;33809:49;33828:11;;33809:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33841:10;;33853:4;33809:18;:49::i;:::-;33801:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;33932:22;33957:13;:25;33971:10;33957:25;;;;;;;;;;;;;;;;33932:50;;34015:14;34001:11;:28;33993:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34077:22;34116:14;34102:11;:28;;;;:::i;:::-;34077:53;;34169:11;34141:13;:25;34155:10;34141:25;;;;;;;;;;;;;;;:39;;;;34201:8;:17;;;34219:10;34231:14;34201:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34193:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34290:10;34282:48;;;34302:14;34318:11;34282:48;;;;;;;:::i;:::-;;;;;;;;33644:694;;;33567:771;;;:::o;34346:115::-;31418:13;:11;:13::i;:::-;34439:14:::1;34426:10;:27;;;;34346:115:::0;:::o;32207:103::-;31418:13;:11;:13::i;:::-;32272:30:::1;32299:1;32272:18;:30::i;:::-;32207:103::o:0;33154:32::-;;;:::o;31532:87::-;31578:7;31605:6;;;;;;;;;;;31598:13;;31532:87;:::o;32465:220::-;31418:13;:11;:13::i;:::-;32570:1:::1;32550:22;;:8;:22;;::::0;32546:93:::1;;32624:1;32596:31;;;;;;;;;;;:::i;:::-;;;;;;;;32546:93;32649:28;32668:8;32649:18;:28::i;:::-;32465:220:::0;:::o;31697:166::-;31768:12;:10;:12::i;:::-;31757:23;;:7;:5;:7::i;:::-;:23;;;31753:103;;31831:12;:10;:12::i;:::-;31804:40;;;;;;;;;;;:::i;:::-;;;;;;;;31753:103;31697:166::o;5940:156::-;6031:4;6084;6055:25;6068:5;6075:4;6055:12;:25::i;:::-;:33;6048:40;;5940:156;;;;;:::o;32845:191::-;32919:16;32938:6;;;;;;;;;;;32919:25;;32964:8;32955:6;;:17;;;;;;;;;;;;;;;;;;33019:8;32988:40;;33009:8;32988:40;;;;;;;;;;;;32908:128;32845:191;:::o;29541:98::-;29594:7;29621:10;29614:17;;29541:98;:::o;6507:314::-;6590:7;6610:20;6633:4;6610:27;;6653:9;6665:1;6653:13;;6648:136;6672:5;:12;6668:1;:16;6648:136;;;6721:51;6749:12;6763:5;6769:1;6763:8;;;;;;;;:::i;:::-;;;;;;;;6721:27;:51::i;:::-;6706:66;;6686:3;;;;;;;6648:136;;;;6801:12;6794:19;;;6507:314;;;;:::o;3444:171::-;3519:7;3550:1;3546;:5;:61;;3582:25;3602:1;3605;3582:19;:25::i;:::-;3546:61;;;3554:25;3574:1;3577;3554:19;:25::i;:::-;3546:61;3539:68;;3444:171;;;;:::o;3740:245::-;3813:13;3892:1;3886:4;3879:15;3921:1;3915:4;3908:15;3962:4;3956;3946:21;3937:30;;3740:245;;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:474::-;1952:6;1960;2009:2;1997:9;1988:7;1984:23;1980:32;1977:119;;;2015:79;;:::i;:::-;1977:119;2135:1;2160:53;2205:7;2196:6;2185:9;2181:22;2160:53;:::i;:::-;2150:63;;2106:117;2262:2;2288:53;2333:7;2324:6;2313:9;2309:22;2288:53;:::i;:::-;2278:63;;2233:118;1884:474;;;;;:::o;2364:77::-;2401:7;2430:5;2419:16;;2364:77;;;:::o;2447:118::-;2534:24;2552:5;2534:24;:::i;:::-;2529:3;2522:37;2447:118;;:::o;2571:222::-;2664:4;2702:2;2691:9;2687:18;2679:26;;2715:71;2783:1;2772:9;2768:17;2759:6;2715:71;:::i;:::-;2571:222;;;;:::o;2799:117::-;2908:1;2905;2898:12;2922:117;3031:1;3028;3021:12;3045:117;3154:1;3151;3144:12;3185:568;3258:8;3268:6;3318:3;3311:4;3303:6;3299:17;3295:27;3285:122;;3326:79;;:::i;:::-;3285:122;3439:6;3426:20;3416:30;;3469:18;3461:6;3458:30;3455:117;;;3491:79;;:::i;:::-;3455:117;3605:4;3597:6;3593:17;3581:29;;3659:3;3651:4;3643:6;3639:17;3629:8;3625:32;3622:41;3619:128;;;3666:79;;:::i;:::-;3619:128;3185:568;;;;;:::o;3759:704::-;3854:6;3862;3870;3919:2;3907:9;3898:7;3894:23;3890:32;3887:119;;;3925:79;;:::i;:::-;3887:119;4045:1;4070:53;4115:7;4106:6;4095:9;4091:22;4070:53;:::i;:::-;4060:63;;4016:117;4200:2;4189:9;4185:18;4172:32;4231:18;4223:6;4220:30;4217:117;;;4253:79;;:::i;:::-;4217:117;4366:80;4438:7;4429:6;4418:9;4414:22;4366:80;:::i;:::-;4348:98;;;;4143:313;3759:704;;;;;:::o;4469:122::-;4542:24;4560:5;4542:24;:::i;:::-;4535:5;4532:35;4522:63;;4581:1;4578;4571:12;4522:63;4469:122;:::o;4597:139::-;4643:5;4681:6;4668:20;4659:29;;4697:33;4724:5;4697:33;:::i;:::-;4597:139;;;;:::o;4742:329::-;4801:6;4850:2;4838:9;4829:7;4825:23;4821:32;4818:119;;;4856:79;;:::i;:::-;4818:119;4976:1;5001:53;5046:7;5037:6;5026:9;5022:22;5001:53;:::i;:::-;4991:63;;4947:117;4742:329;;;;:::o;5077:60::-;5105:3;5126:5;5119:12;;5077:60;;;:::o;5143:142::-;5193:9;5226:53;5244:34;5253:24;5271:5;5253:24;:::i;:::-;5244:34;:::i;:::-;5226:53;:::i;:::-;5213:66;;5143:142;;;:::o;5291:126::-;5341:9;5374:37;5405:5;5374:37;:::i;:::-;5361:50;;5291:126;;;:::o;5423:139::-;5486:9;5519:37;5550:5;5519:37;:::i;:::-;5506:50;;5423:139;;;:::o;5568:157::-;5668:50;5712:5;5668:50;:::i;:::-;5663:3;5656:63;5568:157;;:::o;5731:248::-;5837:4;5875:2;5864:9;5860:18;5852:26;;5888:84;5969:1;5958:9;5954:17;5945:6;5888:84;:::i;:::-;5731:248;;;;:::o;5985:118::-;6072:24;6090:5;6072:24;:::i;:::-;6067:3;6060:37;5985:118;;:::o;6109:222::-;6202:4;6240:2;6229:9;6225:18;6217:26;;6253:71;6321:1;6310:9;6306:17;6297:6;6253:71;:::i;:::-;6109:222;;;;:::o;6337:332::-;6458:4;6496:2;6485:9;6481:18;6473:26;;6509:71;6577:1;6566:9;6562:17;6553:6;6509:71;:::i;:::-;6590:72;6658:2;6647:9;6643:18;6634:6;6590:72;:::i;:::-;6337:332;;;;;:::o;6675:90::-;6709:7;6752:5;6745:13;6738:21;6727:32;;6675:90;;;:::o;6771:116::-;6841:21;6856:5;6841:21;:::i;:::-;6834:5;6831:32;6821:60;;6877:1;6874;6867:12;6821:60;6771:116;:::o;6893:137::-;6947:5;6978:6;6972:13;6963:22;;6994:30;7018:5;6994:30;:::i;:::-;6893:137;;;;:::o;7036:345::-;7103:6;7152:2;7140:9;7131:7;7127:23;7123:32;7120:119;;;7158:79;;:::i;:::-;7120:119;7278:1;7303:61;7356:7;7347:6;7336:9;7332:22;7303:61;:::i;:::-;7293:71;;7249:125;7036:345;;;;:::o;7387:169::-;7471:11;7505:6;7500:3;7493:19;7545:4;7540:3;7536:14;7521:29;;7387:169;;;;:::o;7562:165::-;7702:17;7698:1;7690:6;7686:14;7679:41;7562:165;:::o;7733:366::-;7875:3;7896:67;7960:2;7955:3;7896:67;:::i;:::-;7889:74;;7972:93;8061:3;7972:93;:::i;:::-;8090:2;8085:3;8081:12;8074:19;;7733:366;;;:::o;8105:419::-;8271:4;8309:2;8298:9;8294:18;8286:26;;8358:9;8352:4;8348:20;8344:1;8333:9;8329:17;8322:47;8386:131;8512:4;8386:131;:::i;:::-;8378:139;;8105:419;;;:::o;8530:79::-;8569:7;8598:5;8587:16;;8530:79;;;:::o;8615:157::-;8720:45;8740:24;8758:5;8740:24;:::i;:::-;8720:45;:::i;:::-;8715:3;8708:58;8615:157;;:::o;8778:256::-;8890:3;8905:75;8976:3;8967:6;8905:75;:::i;:::-;9005:2;9000:3;8996:12;8989:19;;9025:3;9018:10;;8778:256;;;;:::o;9040:163::-;9180:15;9176:1;9168:6;9164:14;9157:39;9040:163;:::o;9209:366::-;9351:3;9372:67;9436:2;9431:3;9372:67;:::i;:::-;9365:74;;9448:93;9537:3;9448:93;:::i;:::-;9566:2;9561:3;9557:12;9550:19;;9209:366;;;:::o;9581:419::-;9747:4;9785:2;9774:9;9770:18;9762:26;;9834:9;9828:4;9824:20;9820:1;9809:9;9805:17;9798:47;9862:131;9988:4;9862:131;:::i;:::-;9854:139;;9581:419;;;:::o;10006:172::-;10146:24;10142:1;10134:6;10130:14;10123:48;10006:172;:::o;10184:366::-;10326:3;10347:67;10411:2;10406:3;10347:67;:::i;:::-;10340:74;;10423:93;10512:3;10423:93;:::i;:::-;10541:2;10536:3;10532:12;10525:19;;10184:366;;;:::o;10556:419::-;10722:4;10760:2;10749:9;10745:18;10737:26;;10809:9;10803:4;10799:20;10795:1;10784:9;10780:17;10773:47;10837:131;10963:4;10837:131;:::i;:::-;10829:139;;10556:419;;;:::o;10981:180::-;11029:77;11026:1;11019:88;11126:4;11123:1;11116:15;11150:4;11147:1;11140:15;11167:194;11207:4;11227:20;11245:1;11227:20;:::i;:::-;11222:25;;11261:20;11279:1;11261:20;:::i;:::-;11256:25;;11305:1;11302;11298:9;11290:17;;11329:1;11323:4;11320:11;11317:37;;;11334:18;;:::i;:::-;11317:37;11167:194;;;;:::o;11367:332::-;11488:4;11526:2;11515:9;11511:18;11503:26;;11539:71;11607:1;11596:9;11592:17;11583:6;11539:71;:::i;:::-;11620:72;11688:2;11677:9;11673:18;11664:6;11620:72;:::i;:::-;11367:332;;;;;:::o;11705:180::-;11753:77;11750:1;11743:88;11850:4;11847:1;11840:15;11874:4;11871:1;11864:15
Swarm Source
ipfs://9f6191cafbcacddbb1d8c7a2b84f8438a6939705629fd1a5fb5cced13ce4e02b
Loading...
Loading
Loading...
Loading
Net Worth in USD
$138.01
Net Worth in ETH
0.064625
Token Allocations
OLA
100.00%
Multichain Portfolio | 33 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.