Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 125 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Remaini... | 19049374 | 171 days ago | IN | 0 ETH | 0.00074402 | ||||
Set Claim Allowe... | 19049370 | 171 days ago | IN | 0 ETH | 0.00059769 | ||||
Claim | 18963879 | 183 days ago | IN | 0 ETH | 0.00233551 | ||||
Claim | 18957740 | 183 days ago | IN | 0 ETH | 0.00284546 | ||||
Claim | 18952132 | 184 days ago | IN | 0 ETH | 0.00155723 | ||||
Claim | 18949050 | 185 days ago | IN | 0 ETH | 0.00211316 | ||||
Claim | 18948961 | 185 days ago | IN | 0 ETH | 0.00282671 | ||||
Claim | 18941710 | 186 days ago | IN | 0 ETH | 0.003116 | ||||
Claim | 18934560 | 187 days ago | IN | 0 ETH | 0.00208644 | ||||
Claim | 18913927 | 190 days ago | IN | 0 ETH | 0.00140479 | ||||
Claim | 18904985 | 191 days ago | IN | 0 ETH | 0.00117721 | ||||
Claim | 18893692 | 192 days ago | IN | 0 ETH | 0.00184142 | ||||
Claim | 18886003 | 194 days ago | IN | 0 ETH | 0.00219719 | ||||
Claim | 18843638 | 200 days ago | IN | 0 ETH | 0.003054 | ||||
Claim | 18833753 | 201 days ago | IN | 0 ETH | 0.00375444 | ||||
Claim | 18820331 | 203 days ago | IN | 0 ETH | 0.00498475 | ||||
Claim | 18728898 | 216 days ago | IN | 0 ETH | 0.00581523 | ||||
Claim | 18696131 | 220 days ago | IN | 0 ETH | 0.00285219 | ||||
Claim | 18654726 | 226 days ago | IN | 0 ETH | 0.00194872 | ||||
Claim | 18526637 | 244 days ago | IN | 0 ETH | 0.00207605 | ||||
Claim | 18509963 | 246 days ago | IN | 0 ETH | 0.00149666 | ||||
Claim | 18466398 | 252 days ago | IN | 0 ETH | 0.00267269 | ||||
Claim | 18458869 | 253 days ago | IN | 0 ETH | 0.00129611 | ||||
Claim | 18456152 | 254 days ago | IN | 0 ETH | 0.0018738 | ||||
Claim | 18433683 | 257 days ago | IN | 0 ETH | 0.00177839 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ShillingTokenClaimsV2
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: CC0 // Copyright (c) 2022 unReal Accelerator, LLC (https://unrealaccelerator.io) pragma solidity ^0.8.19; /** * @title ShillingTokenClaimsV2 * @dev A contract for managing claims of Shilling tokens from staking contracts. * @author [email protected] */ import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./crypto/AllowedEvaluator.sol"; import "./interfaces/IStakingForClaims.sol"; contract ShillingTokenClaimsV2 is ReentrancyGuard, Ownable, AllowedEvaluator { IERC20 public tokenContract; // ERC20 token contract for Shilling tokens IStakingForClaims public stakingCOKContract; // Staking contract for COK tokens IStakingForClaims public stakingHCOKContract; // Staking contract for HCOK tokens uint256 public ethPerThreeShillings = 0.22 ether; // Default eth amount for 3 shilling // mapping to track claimed amounts per address mapping(address => bool) public addressClaimed; ///////// Security address public administrator; // Address with administrative privileges bool public claimAllowed; // Used to control claim events bool public purchaseAllowed; // Used to control shilling purchase events ///////// Errors error NotAuthorized(); // Error thrown when caller is not authorized error NoBalanceToWithdraw(); // Error thrown when attempting to withdraw with no balance error ClaimNotAllowed(); // Error thrown with attempting to claim but claiming is not allowed error ClaimNotValid(); // Error thrown with attempting to claim but claiming is not allowed error InvalidNumberOfTokens(); error PurchaseNotAllowed(); error AddressAlreadyClaimed(); error InsufficientTokens(); error IncorrectAmountOfETH(); ///////// Events event ClaimAllowed(bool indexed state); event PurchaseAllowed(bool indexed state); event Claimed(address indexed user, uint256 amount); event ClaimsPurchased( address indexed user, uint256 amount, uint256 totalEth ); ///////// Modifiers /** * @dev Modifier to check for authorized roles (Owner or Administrator) */ modifier onlyAuthorized() { validateAuthorized(); _; } function validateAuthorized() private view { if (_msgSender() != owner() && _msgSender() != administrator) revert NotAuthorized(); } /** * @dev Constructor to initialize the contract with required addresses. * @param tokenContract_ Address of the Shilling token contract. * @param stakingCOKContract_ Address of the staking contract for COK tokens. * @param stakingHCOKContract_ Address of the staking contract for HCOK tokens. * @param administrator_ Address with administrative privileges. */ constructor( address tokenContract_, address stakingCOKContract_, address stakingHCOKContract_, address administrator_ ) { tokenContract = IERC20(tokenContract_); stakingCOKContract = IStakingForClaims(stakingCOKContract_); stakingHCOKContract = IStakingForClaims(stakingHCOKContract_); administrator = administrator_; } /** * @dev Fallback function to receive Ether. * This function is payable and allows the contract to receive ETH. */ receive() external payable {} /** * @dev Get the current supply of Shilling tokens held by the contract. * @return The balance of Shilling tokens held by the contract. */ function shillingSupply() external view returns (uint256) { return uint256(tokenContract.balanceOf(address(this))); } /** * @dev Calculates the total number of allowed claims. * @param account The address of the account to check allowed claims for. * @return The number of allowed claims. */ function allowedClaims(address account) public view returns (uint256) { return (allowedClaimsWithCOK(account) + allowedClaimsWithHCOK(account)); } /** * @dev Calculates the number of allowed claims based on the staked COK balance. * @param account The address of the account to check allowed claims for. * @return The number of allowed claims. Each staked COK token grants 1 claim, rounded down to the nearest multiple of 3. */ function allowedClaimsWithCOK( address account ) public view returns (uint256) { uint256 balance = stakingCOKContract.balanceOf(account); // 1 claim per staked COK; but only in multiples of 3 uint256 claims = (balance / 3) * 3; return claims; } /** * @dev Get the number of allowed claims for an account using the stakingHCOKContract. * @param account The address of the account to check allowed claims for. * @return The number of allowed claims based on the staked HCOK balance. */ function allowedClaimsWithHCOK( address account ) public view returns (uint256) { return (stakingHCOKContract.balanceOf(account) * 9); } function claim( uint256 index, uint256 amount, bytes32[] calldata merkleProof ) external nonReentrant { if ( !AllowedEvaluator._validateMerkleProof( index, _msgSender(), amount, merkleProof ) ) revert ClaimNotValid(); // Ensure the address has not already claimed if (addressClaimed[_msgSender()]) revert AddressAlreadyClaimed(); // Ensure claiming is allowed if (!claimAllowed) revert ClaimNotAllowed(); // Calculate the balance of the contract's token holdings uint256 balance = uint256(tokenContract.balanceOf(address(this))); // Calculate the reward to be transferred to the account in wei uint256 rewardWei = amount * 10 ** 18; // Ensure the contract has sufficient tokens to cover the reward if (rewardWei > balance) revert InsufficientTokens(); // Transfer the reward tokens to the account tokenContract.transfer(_msgSender(), rewardWei); // Set that the address has made their claims addressClaimed[_msgSender()] = true; // Emit a Claimed event to indicate a successful claim emit Claimed(_msgSender(), amount); } /** * @dev Allows an account to purchase rewards using ETH. * The function checks if claiming is allowed, calculates the number of claims that can be purchased, * verifies that the number of claims is a multiple of 3, calculates the total ETH required, * transfers the ETH to the contract, and emits a `ClaimsPurchased` event. * This function is non-reentrant. * @notice Only addresses can purchase claims in multiples of 3. * @notice Emits a `ClaimsPurchased` event upon successful purchase. * @param numberOfShillings The number of claims to purchase (must be a multiple of 3). */ function claimWithEth( uint256 numberOfShillings ) external payable nonReentrant { // Ensure claiming is allowed if (!purchaseAllowed) revert PurchaseNotAllowed(); // Verify that the number of claims is a multiple of 3 if (numberOfShillings % 3 != 0 || numberOfShillings == 0) revert InvalidNumberOfTokens(); // Calculate the total ETH required for the claims uint256 totalEthRequired = (numberOfShillings / 3) * ethPerThreeShillings; // Ensure the sent ETH matches the required amount if (msg.value != totalEthRequired) revert IncorrectAmountOfETH(); // Calculate the balance of the contract's token holdings uint256 balance = uint256(tokenContract.balanceOf(address(this))); uint256 numberOfShillingsWei = numberOfShillings * 10 ** 18; // Ensure the contract has sufficient tokens to cover the reward if (int256(numberOfShillingsWei) - int256(balance) > 0) revert InsufficientTokens(); // Transfer the Shillings to the account tokenContract.transfer(_msgSender(), uint256(numberOfShillingsWei)); // Emit a ClaimsPurchased event to indicate a successful purchase emit ClaimsPurchased( _msgSender(), numberOfShillingsWei, totalEthRequired ); } /** * @dev Sets the merkle root for claiming verification * Only authorized addresses can call this function. */ function setMerkleRoot(bytes32 _merkleRoot) external onlyAuthorized { AllowedEvaluator._setAllowedMerkleRoot(_merkleRoot); } /** * @dev Gets the merkle root for claiming verification * Only authorized addresses can call this function. */ function merkleRoot() external view returns (bytes32) { return AllowedEvaluator._allowedMerkleRoot; } /** * @dev Activate/disable claiming * Only authorized addresses can call this function. */ function setClaimAllowed(bool claimAllowed_) external onlyAuthorized { claimAllowed = claimAllowed_; emit ClaimAllowed(claimAllowed); } /** * @dev Activate/disable purchasing * Only authorized addresses can call this function. */ function setPurchaseAllowed(bool purchaseAllowed_) external onlyAuthorized { purchaseAllowed = purchaseAllowed_; emit PurchaseAllowed(purchaseAllowed); } /** * @dev Set/update the token contract address * Only authorized addresses can call this function. */ function setTokenContract(address tokenContract_) external onlyAuthorized { tokenContract = IERC20(tokenContract_); } /** * @dev Set/update the COK contract address * Only authorized addresses can call this function. */ function setStakingCOKContract( address stakingCOKContract_ ) external onlyAuthorized { stakingCOKContract = IStakingForClaims(stakingCOKContract_); } /** * @dev Set/update the HCOK contract address * Only authorized addresses can call this function. */ function setStakingHCOKContract( address stakingHCOKContract_ ) external onlyAuthorized { stakingHCOKContract = IStakingForClaims(stakingHCOKContract_); } /** * @dev Set/update the eth required to claim 3 shillings * Amount must be in wei * Only authorized addresses can call this function. */ function setEthPerThreeShillings( uint256 ethPerThreeShillings_ ) external onlyAuthorized { ethPerThreeShillings = ethPerThreeShillings_; } /** * @dev Admin function to withdraw unclaimed Shilling tokens after the claiming period. * Only authorized addresses can call this function. */ function withdrawRemainingToken() external onlyAuthorized { uint256 amount = tokenContract.balanceOf(address(this)); tokenContract.transfer(owner(), amount); delete amount; } /** * @dev Admin function to withdraw ETH from the contract. * Only authorized addresses can call this function. */ function withdraw() external onlyAuthorized { uint256 balance = address(this).balance; if (balance <= 0) revert NoBalanceToWithdraw(); address payable ownerAddress = payable(owner()); ownerAddress.transfer(balance); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../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. * * By default, the owner account will be the one that deploys the contract. 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; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @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 { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _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 v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` 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 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function 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. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); 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. * * _Available since v4.7._ */ 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. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: CC0 // Copyright (c) 2022 unReal Accelerator, LLC (https://unrealaccelerator.io) pragma solidity ^0.8.19; /// @author: [email protected] /// @title: AllowedEvaluator /// @notice Merkle Proof for allow list implementations with amount import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; contract AllowedEvaluator { bytes32 internal _allowedMerkleRoot; function _setAllowedMerkleRoot(bytes32 allowedMerkleRoot_) internal { _allowedMerkleRoot = allowedMerkleRoot_; } function _validateMerkleProof( uint256 index, address account, uint256 amount, bytes32[] calldata merkleProof ) internal view returns (bool) { return MerkleProof.verify( merkleProof, _allowedMerkleRoot, keccak256(abi.encodePacked(index, account, amount)) ); } }
// SPDX-License-Identifier: CC0 // Copyright (c) 2022 unReal Accelerator, LLC (https://unrealaccelerator.io) pragma solidity ^0.8.9; /// @title IStakingForClaims /// @author [email protected] /// @notice Interface for getting count of claims interface IStakingForClaims { function balanceOf(address account) external view returns (uint256); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"tokenContract_","type":"address"},{"internalType":"address","name":"stakingCOKContract_","type":"address"},{"internalType":"address","name":"stakingHCOKContract_","type":"address"},{"internalType":"address","name":"administrator_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressAlreadyClaimed","type":"error"},{"inputs":[],"name":"ClaimNotAllowed","type":"error"},{"inputs":[],"name":"ClaimNotValid","type":"error"},{"inputs":[],"name":"IncorrectAmountOfETH","type":"error"},{"inputs":[],"name":"InsufficientTokens","type":"error"},{"inputs":[],"name":"InvalidNumberOfTokens","type":"error"},{"inputs":[],"name":"NoBalanceToWithdraw","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[],"name":"PurchaseNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"state","type":"bool"}],"name":"ClaimAllowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalEth","type":"uint256"}],"name":"ClaimsPurchased","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"state","type":"bool"}],"name":"PurchaseAllowed","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"administrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"allowedClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"allowedClaimsWithCOK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"allowedClaimsWithHCOK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfShillings","type":"uint256"}],"name":"claimWithEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ethPerThreeShillings","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"purchaseAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"claimAllowed_","type":"bool"}],"name":"setClaimAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethPerThreeShillings_","type":"uint256"}],"name":"setEthPerThreeShillings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"purchaseAllowed_","type":"bool"}],"name":"setPurchaseAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakingCOKContract_","type":"address"}],"name":"setStakingCOKContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakingHCOKContract_","type":"address"}],"name":"setStakingHCOKContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract_","type":"address"}],"name":"setTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shillingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingCOKContract","outputs":[{"internalType":"contract IStakingForClaims","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingHCOKContract","outputs":[{"internalType":"contract IStakingForClaims","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenContract","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawRemainingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405267030d98d59a9600006006553480156200001d57600080fd5b506040516200147e3803806200147e833981016040819052620000409162000113565b60016000556200005033620000a4565b600380546001600160a01b039586166001600160a01b031991821617909155600480549486169482169490941790935560058054928516928416929092179091556008805491909316911617905562000170565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516001600160a01b03811681146200010e57600080fd5b919050565b600080600080608085870312156200012a57600080fd5b6200013585620000f6565b93506200014560208601620000f6565b92506200015560408601620000f6565b91506200016560608601620000f6565b905092959194509250565b6112fe80620001806000396000f3fe6080604052600436106101a05760003560e01c8063715018a6116100ec57806398b15b141161008a578063bbcd5bbe11610064578063bbcd5bbe1461048b578063c7748a56146104ab578063f2fde38b146104cb578063f53d0a8e146104eb57600080fd5b806398b15b141461042b578063a15d2eb51461044b578063ae0b51df1461046b57600080fd5b80637cb64759116100c65780637cb64759146103ac578063872f0b97146103cc5780638da5cb5b146103ed5780638e84c4811461040b57600080fd5b8063715018a614610352578063772dc32f146103675780637c480cb41461039757600080fd5b80633ccfd60b1161015957806353756fcd1161013357806353756fcd146102d257806355a373d6146102f25780635e95fa5f1461031257806360813ecc1461033257600080fd5b80633ccfd60b1461027757806348b259d81461028c5780634a9e7b06146102a157600080fd5b80630a0ad2ee146101ac57806310ca4602146101e9578063148caeff1461020b5780631cb4ba1c1461021e5780631d7f3a6f146102425780632eb4a7ab1461026257600080fd5b366101a757005b600080fd5b3480156101b857600080fd5b506004546101cc906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101f557600080fd5b506102096102043660046110ce565b61050b565b005b6102096102193660046110ce565b610518565b34801561022a57600080fd5b5061023460065481565b6040519081526020016101e0565b34801561024e57600080fd5b5061020961025d3660046110e7565b61073a565b34801561026e57600080fd5b50600254610234565b34801561028357600080fd5b50610209610764565b34801561029857600080fd5b506102346107dd565b3480156102ad57600080fd5b506008546102c290600160a81b900460ff1681565b60405190151581526020016101e0565b3480156102de57600080fd5b506005546101cc906001600160a01b031681565b3480156102fe57600080fd5b506003546101cc906001600160a01b031681565b34801561031e57600080fd5b5061020961032d3660046110e7565b61084f565b34801561033e57600080fd5b5061023461034d3660046110e7565b610879565b34801561035e57600080fd5b5061020961089d565b34801561037357600080fd5b506102c26103823660046110e7565b60076020526000908152604090205460ff1681565b3480156103a357600080fd5b506102096108b1565b3480156103b857600080fd5b506102096103c73660046110ce565b6109c1565b3480156103d857600080fd5b506008546102c290600160a01b900460ff1681565b3480156103f957600080fd5b506001546001600160a01b03166101cc565b34801561041757600080fd5b5061020961042636600461111e565b6109d2565b34801561043757600080fd5b506102346104463660046110e7565b610a2d565b34801561045757600080fd5b5061020961046636600461111e565b610ac3565b34801561047757600080fd5b5061020961048636600461113b565b610b1e565b34801561049757600080fd5b506102096104a63660046110e7565b610d35565b3480156104b757600080fd5b506102346104c63660046110e7565b610d5f565b3480156104d757600080fd5b506102096104e63660046110e7565b610dd9565b3480156104f757600080fd5b506008546101cc906001600160a01b031681565b610513610e54565b600655565b610520610ea1565b600854600160a81b900460ff1661054a57604051631273539560e11b815260040160405180910390fd5b6105556003826111d4565b151580610560575080155b1561057e5760405163f9656ec560e01b815260040160405180910390fd5b60065460009061058f6003846111fe565b6105999190611212565b90508034146105bb57604051637acf210760e01b815260040160405180910390fd5b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610604573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106289190611229565b9050600061063e84670de0b6b3a7640000611212565b9050600061064c8383611242565b131561066b576040516378dbf0af60e11b815260040160405180910390fd5b6003546001600160a01b031663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156106ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ee9190611269565b50604080518281526020810185905233917fc361eef0fa83dd20457a0f7a3405e6d792963dba55605fc7352dbe8fecbcb25b910160405180910390a25050506107376001600055565b50565b610742610e54565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b61076c610e54565b478061078b5760405163177b02e160e31b815260040160405180910390fd5b600061079f6001546001600160a01b031690565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f193505050501580156107d8573d6000803e3d6000fd5b505050565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610826573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084a9190611229565b905090565b610857610e54565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b600061088482610d5f565b61088d83610a2d565b6108979190611286565b92915050565b6108a5610efa565b6108af6000610f54565b565b6108b9610e54565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610902573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109269190611229565b6003549091506001600160a01b031663a9059cbb61094c6001546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bd9190611269565b5050565b6109c9610e54565b61073781600255565b6109da610e54565b6008805460ff60a01b1916600160a01b8315158102919091179182905560405160ff91909204161515907f537add66694b98f4d1ae0608692047d7c9845ac45e52add2e46703d4cae307fd90600090a250565b600480546040516370a0823160e01b81526001600160a01b0384811693820193909352600092839216906370a0823190602401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa19190611229565b90506000610ab06003836111fe565b610abb906003611212565b949350505050565b610acb610e54565b6008805460ff60a81b1916600160a81b8315158102919091179182905560405160ff91909204161515907f85861a9c1ee0320186c0686b9f41089b402036f09543d8388650fa76b8e8e08490600090a250565b610b26610ea1565b610b338433858585610fa6565b610b5057604051635bf4b0cf60e01b815260040160405180910390fd5b3360009081526007602052604090205460ff1615610b8157604051635986e84960e01b815260040160405180910390fd5b600854600160a01b900460ff16610bab576040516326831c8760e21b815260040160405180910390fd5b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c189190611229565b90506000610c2e85670de0b6b3a7640000611212565b905081811115610c51576040516378dbf0af60e11b815260040160405180910390fd5b6003546001600160a01b031663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd49190611269565b5033600081815260076020908152604091829020805460ff1916600117905590518781527fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a910160405180910390a25050610d2f6001600055565b50505050565b610d3d610e54565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6005546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a0823190602401602060405180830381865afa158015610daa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dce9190611229565b610897906009611212565b610de1610efa565b6001600160a01b038116610e4b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61073781610f54565b6001546001600160a01b03163314801590610e8357506008546001600160a01b0316336001600160a01b031614155b156108af5760405163ea8e4eb560e01b815260040160405180910390fd5b600260005403610ef35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e42565b6002600055565b6001546001600160a01b031633146108af5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e42565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061102f8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060025460408051602081018d90526bffffffffffffffffffffffff1960608d901b1691810191909152605481018a9052909250607401905060405160208183030381529060405280519060200120611039565b9695505050505050565b600082611046858461104f565b14949350505050565b600081815b8451811015611094576110808286838151811061107357611073611299565b602002602001015161109c565b91508061108c816112af565b915050611054565b509392505050565b60008183106110b85760008281526020849052604090206110c7565b60008381526020839052604090205b9392505050565b6000602082840312156110e057600080fd5b5035919050565b6000602082840312156110f957600080fd5b81356001600160a01b03811681146110c757600080fd5b801515811461073757600080fd5b60006020828403121561113057600080fd5b81356110c781611110565b6000806000806060858703121561115157600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561117757600080fd5b818701915087601f83011261118b57600080fd5b81358181111561119a57600080fd5b8860208260051b85010111156111af57600080fd5b95989497505060200194505050565b634e487b7160e01b600052601260045260246000fd5b6000826111e3576111e36111be565b500690565b634e487b7160e01b600052601160045260246000fd5b60008261120d5761120d6111be565b500490565b8082028115828204841417610897576108976111e8565b60006020828403121561123b57600080fd5b5051919050565b8181036000831280158383131683831282161715611262576112626111e8565b5092915050565b60006020828403121561127b57600080fd5b81516110c781611110565b80820180821115610897576108976111e8565b634e487b7160e01b600052603260045260246000fd5b6000600182016112c1576112c16111e8565b506001019056fea264697066735822122020c6d734b8c99313783657b3948dd6d22266f397eadbb4fdb7f88e84e12058cd64736f6c63430008130033000000000000000000000000257ec7c98b375d71499ee24d65e08c605a69533a000000000000000000000000e19632693ec9ef5bb9ade9327b50ffca850e9f07000000000000000000000000955a1ad927dad15a9092557ccb7856ca6aee164d00000000000000000000000000795f917a5e77f7c33f5acc6d0970f7c300095e
Deployed Bytecode
0x6080604052600436106101a05760003560e01c8063715018a6116100ec57806398b15b141161008a578063bbcd5bbe11610064578063bbcd5bbe1461048b578063c7748a56146104ab578063f2fde38b146104cb578063f53d0a8e146104eb57600080fd5b806398b15b141461042b578063a15d2eb51461044b578063ae0b51df1461046b57600080fd5b80637cb64759116100c65780637cb64759146103ac578063872f0b97146103cc5780638da5cb5b146103ed5780638e84c4811461040b57600080fd5b8063715018a614610352578063772dc32f146103675780637c480cb41461039757600080fd5b80633ccfd60b1161015957806353756fcd1161013357806353756fcd146102d257806355a373d6146102f25780635e95fa5f1461031257806360813ecc1461033257600080fd5b80633ccfd60b1461027757806348b259d81461028c5780634a9e7b06146102a157600080fd5b80630a0ad2ee146101ac57806310ca4602146101e9578063148caeff1461020b5780631cb4ba1c1461021e5780631d7f3a6f146102425780632eb4a7ab1461026257600080fd5b366101a757005b600080fd5b3480156101b857600080fd5b506004546101cc906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101f557600080fd5b506102096102043660046110ce565b61050b565b005b6102096102193660046110ce565b610518565b34801561022a57600080fd5b5061023460065481565b6040519081526020016101e0565b34801561024e57600080fd5b5061020961025d3660046110e7565b61073a565b34801561026e57600080fd5b50600254610234565b34801561028357600080fd5b50610209610764565b34801561029857600080fd5b506102346107dd565b3480156102ad57600080fd5b506008546102c290600160a81b900460ff1681565b60405190151581526020016101e0565b3480156102de57600080fd5b506005546101cc906001600160a01b031681565b3480156102fe57600080fd5b506003546101cc906001600160a01b031681565b34801561031e57600080fd5b5061020961032d3660046110e7565b61084f565b34801561033e57600080fd5b5061023461034d3660046110e7565b610879565b34801561035e57600080fd5b5061020961089d565b34801561037357600080fd5b506102c26103823660046110e7565b60076020526000908152604090205460ff1681565b3480156103a357600080fd5b506102096108b1565b3480156103b857600080fd5b506102096103c73660046110ce565b6109c1565b3480156103d857600080fd5b506008546102c290600160a01b900460ff1681565b3480156103f957600080fd5b506001546001600160a01b03166101cc565b34801561041757600080fd5b5061020961042636600461111e565b6109d2565b34801561043757600080fd5b506102346104463660046110e7565b610a2d565b34801561045757600080fd5b5061020961046636600461111e565b610ac3565b34801561047757600080fd5b5061020961048636600461113b565b610b1e565b34801561049757600080fd5b506102096104a63660046110e7565b610d35565b3480156104b757600080fd5b506102346104c63660046110e7565b610d5f565b3480156104d757600080fd5b506102096104e63660046110e7565b610dd9565b3480156104f757600080fd5b506008546101cc906001600160a01b031681565b610513610e54565b600655565b610520610ea1565b600854600160a81b900460ff1661054a57604051631273539560e11b815260040160405180910390fd5b6105556003826111d4565b151580610560575080155b1561057e5760405163f9656ec560e01b815260040160405180910390fd5b60065460009061058f6003846111fe565b6105999190611212565b90508034146105bb57604051637acf210760e01b815260040160405180910390fd5b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610604573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106289190611229565b9050600061063e84670de0b6b3a7640000611212565b9050600061064c8383611242565b131561066b576040516378dbf0af60e11b815260040160405180910390fd5b6003546001600160a01b031663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156106ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ee9190611269565b50604080518281526020810185905233917fc361eef0fa83dd20457a0f7a3405e6d792963dba55605fc7352dbe8fecbcb25b910160405180910390a25050506107376001600055565b50565b610742610e54565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b61076c610e54565b478061078b5760405163177b02e160e31b815260040160405180910390fd5b600061079f6001546001600160a01b031690565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f193505050501580156107d8573d6000803e3d6000fd5b505050565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610826573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084a9190611229565b905090565b610857610e54565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b600061088482610d5f565b61088d83610a2d565b6108979190611286565b92915050565b6108a5610efa565b6108af6000610f54565b565b6108b9610e54565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610902573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109269190611229565b6003549091506001600160a01b031663a9059cbb61094c6001546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bd9190611269565b5050565b6109c9610e54565b61073781600255565b6109da610e54565b6008805460ff60a01b1916600160a01b8315158102919091179182905560405160ff91909204161515907f537add66694b98f4d1ae0608692047d7c9845ac45e52add2e46703d4cae307fd90600090a250565b600480546040516370a0823160e01b81526001600160a01b0384811693820193909352600092839216906370a0823190602401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa19190611229565b90506000610ab06003836111fe565b610abb906003611212565b949350505050565b610acb610e54565b6008805460ff60a81b1916600160a81b8315158102919091179182905560405160ff91909204161515907f85861a9c1ee0320186c0686b9f41089b402036f09543d8388650fa76b8e8e08490600090a250565b610b26610ea1565b610b338433858585610fa6565b610b5057604051635bf4b0cf60e01b815260040160405180910390fd5b3360009081526007602052604090205460ff1615610b8157604051635986e84960e01b815260040160405180910390fd5b600854600160a01b900460ff16610bab576040516326831c8760e21b815260040160405180910390fd5b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c189190611229565b90506000610c2e85670de0b6b3a7640000611212565b905081811115610c51576040516378dbf0af60e11b815260040160405180910390fd5b6003546001600160a01b031663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd49190611269565b5033600081815260076020908152604091829020805460ff1916600117905590518781527fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a910160405180910390a25050610d2f6001600055565b50505050565b610d3d610e54565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6005546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a0823190602401602060405180830381865afa158015610daa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dce9190611229565b610897906009611212565b610de1610efa565b6001600160a01b038116610e4b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61073781610f54565b6001546001600160a01b03163314801590610e8357506008546001600160a01b0316336001600160a01b031614155b156108af5760405163ea8e4eb560e01b815260040160405180910390fd5b600260005403610ef35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610e42565b6002600055565b6001546001600160a01b031633146108af5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e42565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061102f8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060025460408051602081018d90526bffffffffffffffffffffffff1960608d901b1691810191909152605481018a9052909250607401905060405160208183030381529060405280519060200120611039565b9695505050505050565b600082611046858461104f565b14949350505050565b600081815b8451811015611094576110808286838151811061107357611073611299565b602002602001015161109c565b91508061108c816112af565b915050611054565b509392505050565b60008183106110b85760008281526020849052604090206110c7565b60008381526020839052604090205b9392505050565b6000602082840312156110e057600080fd5b5035919050565b6000602082840312156110f957600080fd5b81356001600160a01b03811681146110c757600080fd5b801515811461073757600080fd5b60006020828403121561113057600080fd5b81356110c781611110565b6000806000806060858703121561115157600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561117757600080fd5b818701915087601f83011261118b57600080fd5b81358181111561119a57600080fd5b8860208260051b85010111156111af57600080fd5b95989497505060200194505050565b634e487b7160e01b600052601260045260246000fd5b6000826111e3576111e36111be565b500690565b634e487b7160e01b600052601160045260246000fd5b60008261120d5761120d6111be565b500490565b8082028115828204841417610897576108976111e8565b60006020828403121561123b57600080fd5b5051919050565b8181036000831280158383131683831282161715611262576112626111e8565b5092915050565b60006020828403121561127b57600080fd5b81516110c781611110565b80820180821115610897576108976111e8565b634e487b7160e01b600052603260045260246000fd5b6000600182016112c1576112c16111e8565b506001019056fea264697066735822122020c6d734b8c99313783657b3948dd6d22266f397eadbb4fdb7f88e84e12058cd64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000257ec7c98b375d71499ee24d65e08c605a69533a000000000000000000000000e19632693ec9ef5bb9ade9327b50ffca850e9f07000000000000000000000000955a1ad927dad15a9092557ccb7856ca6aee164d00000000000000000000000000795f917a5e77f7c33f5acc6d0970f7c300095e
-----Decoded View---------------
Arg [0] : tokenContract_ (address): 0x257eC7C98b375d71499Ee24D65e08c605A69533a
Arg [1] : stakingCOKContract_ (address): 0xE19632693eC9eF5bb9ade9327b50FfCa850E9f07
Arg [2] : stakingHCOKContract_ (address): 0x955A1AD927daD15a9092557CCb7856CA6AEe164d
Arg [3] : administrator_ (address): 0x00795f917A5e77f7c33f5Acc6d0970f7C300095E
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000257ec7c98b375d71499ee24d65e08c605a69533a
Arg [1] : 000000000000000000000000e19632693ec9ef5bb9ade9327b50ffca850e9f07
Arg [2] : 000000000000000000000000955a1ad927dad15a9092557ccb7856ca6aee164d
Arg [3] : 00000000000000000000000000795f917a5e77f7c33f5acc6d0970f7c300095e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.