Source Code
Latest 25 from a total of 4,880 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Push New Root | 391698292 | 97 days ago | IN | 0 ETH | 0.00000052 | ||||
| Push New Root | 387200497 | 110 days ago | IN | 0 ETH | 0.00000052 | ||||
| Claim | 384614865 | 117 days ago | IN | 0 ETH | 0.00000112 | ||||
| Push New Root | 383148074 | 121 days ago | IN | 0 ETH | 0.00000053 | ||||
| Push New Root | 383133615 | 121 days ago | IN | 0 ETH | 0.00000082 | ||||
| Push New Root | 383119155 | 121 days ago | IN | 0 ETH | 0.00000061 | ||||
| Push New Root | 383104704 | 121 days ago | IN | 0 ETH | 0.00000067 | ||||
| Push New Root | 383090256 | 122 days ago | IN | 0 ETH | 0.00000059 | ||||
| Push New Root | 383075815 | 122 days ago | IN | 0 ETH | 0.00000053 | ||||
| Push New Root | 383061365 | 122 days ago | IN | 0 ETH | 0.00000205 | ||||
| Push New Root | 383046904 | 122 days ago | IN | 0 ETH | 0.00000187 | ||||
| Push New Root | 383032458 | 122 days ago | IN | 0 ETH | 0.00000135 | ||||
| Push New Root | 383018003 | 122 days ago | IN | 0 ETH | 0.00000122 | ||||
| Push New Root | 383003546 | 122 days ago | IN | 0 ETH | 0.00000138 | ||||
| Push New Root | 382989096 | 122 days ago | IN | 0 ETH | 0.00000343 | ||||
| Push New Root | 382974640 | 122 days ago | IN | 0 ETH | 0.00000098 | ||||
| Push New Root | 382960188 | 122 days ago | IN | 0 ETH | 0.00000197 | ||||
| Push New Root | 382945748 | 122 days ago | IN | 0 ETH | 0.00002585 | ||||
| Push New Root | 382931315 | 122 days ago | IN | 0 ETH | 0.00001037 | ||||
| Push New Root | 382916834 | 122 days ago | IN | 0 ETH | 0.00000186 | ||||
| Push New Root | 382902357 | 122 days ago | IN | 0 ETH | 0.00000207 | ||||
| Push New Root | 382887922 | 122 days ago | IN | 0 ETH | 0.00000413 | ||||
| Push New Root | 382873480 | 122 days ago | IN | 0 ETH | 0.00000333 | ||||
| Push New Root | 382859035 | 122 days ago | IN | 0 ETH | 0.00000079 | ||||
| Push New Root | 382844563 | 122 days ago | IN | 0 ETH | 0.00000054 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RamsesClaimer
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {Claimer} from "src/common/Claimer.sol";
contract RamsesClaimer is Claimer {
constructor(address keeper, address initialOwner) Claimer("Ramses Claimer", keeper, initialOwner) {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {Governable} from "./Governable.sol";
import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
/**
* @title Claimer
* @author JonesDAO
* @notice Claim incentives for a given token using merkle-trees.
*/
abstract contract Claimer is Governable {
/// @notice Farm description
string public farm;
address public keeper;
bool public paused;
/// @dev Each root data is hashed using cummulative sum accrued for a given user
/// we use cumulative sum to avoid storing multiple roots for each user, meaning that the user just needs to claim once
/// Merkle-Tree format: keccak256(abi.encodePacked(account, amounts))
bytes32[] public roots;
/// @notice claimed[account] is the amount of tokens claimed by the account in total
mapping(address => mapping(address => uint256)) public claimed;
mapping(address => mapping(bytes32 => bool)) public claimedRoots;
event Claimed(address indexed account, bytes32 root, address[] tokens, uint256[] amounts);
event NewRoot(bytes32 root, uint256 timestamp);
constructor(string memory _farm, address _keeper, address _owner) Governable(_owner) {
farm = _farm;
keeper = _keeper;
}
function claim(address[] memory tokens, uint256[] memory amounts, bytes32[] calldata merkleProof) external {
require(!paused, "Claimer: Contract is paused");
require(!claimedRoots[msg.sender][roots[roots.length - 1]], "Claimer: Already claimed");
uint256 length = tokens.length;
bytes32 leaf = keccak256(bytes.concat(keccak256(abi.encode(msg.sender, tokens, amounts))));
require(MerkleProof.verify(merkleProof, roots[roots.length - 1], leaf), "Claimer: Invalid proof");
for (uint256 i = 0; i < length; i++) {
uint256 claimed_ = claimed[msg.sender][tokens[i]];
if (claimed_ == amounts[i]) {
continue;
}
uint256 toClaim = amounts[i] - claimed_;
claimed[msg.sender][tokens[i]] = amounts[i];
IERC20(tokens[i]).transfer(msg.sender, toClaim);
}
claimedRoots[msg.sender][roots[roots.length - 1]] = true;
emit Claimed(msg.sender, roots[roots.length - 1], tokens, amounts);
}
function pushNewRoot(bytes32 root) external {
require(msg.sender == keeper, "Claimer: Only keeper can push new root");
roots.push(root);
emit NewRoot(root, block.timestamp);
}
function updateKeeper(address _newKeeper) external onlyGovernor {
keeper = _newKeeper;
}
function updatePause(bool _paused) external onlyGovernor {
paused = _paused;
}
function saveErc20(address _token, address _to, uint256 _amount) external onlyGovernor {
IERC20(_token).transfer(_to, _amount);
}
function saveEth(address _to, uint256 _amount) external onlyGovernor {
payable(_to).transfer(_amount);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {AccessControl} from "openzeppelin-contracts/access/AccessControl.sol";
abstract contract Governable is AccessControl {
bytes32 public constant GOVERNOR = bytes32("GOVERNOR");
constructor(address _governor) {
_grantRole(GOVERNOR, _governor);
}
modifier onlyGovernor() {
_onlyGovernor();
_;
}
function updateGovernor(address _newGovernor) external onlyGovernor {
_revokeRole(GOVERNOR, msg.sender);
_grantRole(GOVERNOR, _newGovernor);
emit GovernorUpdated(msg.sender, _newGovernor);
}
function _onlyGovernor() private view {
if (!hasRole(GOVERNOR, msg.sender)) {
revert CallerIsNotGovernor();
}
}
event GovernorUpdated(address _oldGovernor, address _newGovernor);
error CallerIsNotGovernor();
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.20;
/**
* @dev These functions deal with verification of Merkle Tree proofs.
*
* The tree and the proofs can be generated using our
* https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
* You will find a quickstart guide in the readme.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the Merkle tree could be reinterpreted as a leaf value.
* OpenZeppelin's JavaScript library generates Merkle trees that are safe
* against this attack out of the box.
*/
library MerkleProof {
/**
*@dev The multiproof provided is not valid.
*/
error MerkleProofInvalidMultiproof();
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Calldata version of {verify}
*/
function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Calldata version of {multiProofVerify}
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
* proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
* leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
* respectively.
*
* CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
* is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
* tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the Merkle tree.
uint256 leavesLen = leaves.length;
uint256 proofLen = proof.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
if (leavesLen + proofLen != totalHashes + 1) {
revert MerkleProofInvalidMultiproof();
}
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
if (proofPos != proofLen) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Calldata version of {processMultiProof}.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the Merkle tree.
uint256 leavesLen = leaves.length;
uint256 proofLen = proof.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
if (leavesLen + proofLen != totalHashes + 1) {
revert MerkleProofInvalidMultiproof();
}
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
if (proofPos != proofLen) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Sorts the pair (a, b) and hashes the result.
*/
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
/**
* @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.
*/
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)
pragma solidity ^0.8.20;
import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {ERC165} from "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with an {AccessControlUnauthorizedAccount} error including the required role.
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
* is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
* is missing `role`.
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
/**
* @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)
pragma solidity ^0.8.20;
/**
* @dev External interface of AccessControl declared to support ERC-165 detection.
*/
interface IAccessControl {
/**
* @dev The `account` is missing a role.
*/
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
/**
* @dev The caller of a function is not the expected one.
*
* NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
*/
error AccessControlBadConfirmation();
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*/
function renounceRole(bytes32 role, address callerConfirmation) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"remappings": [
"forge-std/=lib/forge-std/src/",
"solmate/=lib/solmate/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"keeper","type":"address"},{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"CallerIsNotGovernor","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldGovernor","type":"address"},{"indexed":false,"internalType":"address","name":"_newGovernor","type":"address"}],"name":"GovernorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"NewRoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOVERNOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"claimedRoots","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"farm","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"pushNewRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"roots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"saveErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"saveEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newGovernor","type":"address"}],"name":"updateGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newKeeper","type":"address"}],"name":"updateKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"updatePause","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604051620016743803806200167483398101604081905262000034916200017c565b60408051808201909152600e81526d2930b6b9b2b99021b630b4b6b2b960911b6020820152828280620000736723a7ab22a92727a960c11b82620000b0565b506001905062000084848262000259565b5050600280546001600160a01b0319166001600160a01b03929092169190911790555062000325915050565b6000828152602081815260408083206001600160a01b038516845290915281205460ff1662000155576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200010c3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000159565b5060005b92915050565b80516001600160a01b03811681146200017757600080fd5b919050565b600080604083850312156200019057600080fd5b6200019b836200015f565b9150620001ab602084016200015f565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001df57607f821691505b6020821081036200020057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200025457600081815260208120601f850160051c810160208610156200022f5750805b601f850160051c820191505b8181101562000250578281556001016200023b565b5050505b505050565b81516001600160401b03811115620002755762000275620001b4565b6200028d81620002868454620001ca565b8462000206565b602080601f831160018114620002c55760008415620002ac5750858301515b600019600386901b1c1916600185901b17855562000250565b600085815260208120601f198616915b82811015620002f657888601518255948401946001909101908401620002d5565b5085821015620003155787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61133f80620003356000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806362f384ad116100b8578063977902171161007c57806397790217146102c3578063a217fddf146102d6578063aced1661146102de578063c2b40ae414610309578063d547741f1461031c578063f8974de01461032f57600080fd5b806362f384ad146102655780636ab62d71146102785780636dc0ae221461028b5780637380838e1461029d57806391d14854146102b057600080fd5b80632d992cca116100ff5780632d992cca146101e85780632f2ff15d1461021657806336568abe1461022957806336e9332d1461023c5780635c975abb1461025157600080fd5b806301ffc9a71461013c5780630c9cbf0e146101645780632246e42a1461019d578063248a9ca3146101b257806327726e7d146101d5575b600080fd5b61014f61014a366004610dd5565b610342565b60405190151581526020015b60405180910390f35b61018f610172366004610e1b565b600460209081526000928352604080842090915290825290205481565b60405190815260200161015b565b6101b06101ab366004610e4e565b610379565b005b61018f6101c0366004610e4e565b60009081526020819052604090206001015490565b6101b06101e3366004610e67565b610458565b61014f6101f6366004610e67565b600560209081526000928352604080842090915290825290205460ff1681565b6101b0610224366004610e91565b61049b565b6101b0610237366004610e91565b6104c6565b6102446104f9565b60405161015b9190610eb4565b60025461014f90600160a01b900460ff1681565b6101b0610273366004610f02565b610587565b6101b061028636600461103f565b6105f9565b61018f6723a7ab22a92727a960c11b81565b6101b06102ab366004611126565b610a8b565b61014f6102be366004610e91565b610b06565b6101b06102d1366004610f02565b610b2f565b61018f600081565b6002546102f1906001600160a01b031681565b6040516001600160a01b03909116815260200161015b565b61018f610317366004610e4e565b610b59565b6101b061032a366004610e91565b610b7a565b6101b061033d366004611170565b610b9f565b60006001600160e01b03198216637965db0b60e01b148061037357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002546001600160a01b031633146103e75760405162461bcd60e51b815260206004820152602660248201527f436c61696d65723a204f6e6c79206b65657065722063616e2070757368206e656044820152651dc81c9bdbdd60d21b60648201526084015b60405180910390fd5b600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01819055604080518281524260208201527faffc5b905926b85bf04bb4f746e2198ab02fac2b2804a634be6adcc004cfd7da91015b60405180910390a150565b610460610bc5565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610496573d6000803e3d6000fd5b505050565b6000828152602081905260409020600101546104b681610bf9565b6104c08383610c06565b50505050565b6001600160a01b03811633146104ef5760405163334bd91960e11b815260040160405180910390fd5b6104968282610c98565b600180546105069061118d565b80601f01602080910402602001604051908101604052809291908181526020018280546105329061118d565b801561057f5780601f106105545761010080835404028352916020019161057f565b820191906000526020600020905b81548152906001019060200180831161056257829003601f168201915b505050505081565b61058f610bc5565b6105a46723a7ab22a92727a960c11b33610c98565b506105ba6723a7ab22a92727a960c11b82610c06565b50604080513381526001600160a01b03831660208201527f5af6a85e864342d4f108c43dd574d98480c91f1de0ac2a9f66d826dee49bd9bb910161044d565b600254600160a01b900460ff16156106535760405162461bcd60e51b815260206004820152601b60248201527f436c61696d65723a20436f6e747261637420697320706175736564000000000060448201526064016103de565b33600090815260056020526040812060038054919291610675906001906111dd565b81548110610685576106856111f0565b6000918252602080832090910154835282019290925260400190205460ff16156106f15760405162461bcd60e51b815260206004820152601860248201527f436c61696d65723a20416c726561647920636c61696d6564000000000000000060448201526064016103de565b835160405160009061070b9033908890889060200161127a565b60408051601f19818403018152828252805160209182012090830152016040516020818303038152906040528051906020012090506107a9848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506003805490925061078891506001906111dd565b81548110610798576107986111f0565b906000526020600020015483610d03565b6107ee5760405162461bcd60e51b815260206004820152601660248201527521b630b4b6b2b91d1024b73b30b634b210383937b7b360511b60448201526064016103de565b60005b828110156109bc57336000908152600460205260408120885182908a908590811061081e5761081e6111f0565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054905086828151811061085b5761085b6111f0565b6020026020010151810361086f57506109aa565b600081888481518110610884576108846111f0565b602002602001015161089691906111dd565b90508783815181106108aa576108aa6111f0565b602002602001015160046000336001600160a01b03166001600160a01b0316815260200190815260200160002060008b86815181106108eb576108eb6111f0565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550888381518110610929576109296111f0565b602090810291909101015160405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610982573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a691906112ba565b5050505b806109b4816112d7565b9150506107f1565b503360009081526005602052604081206003805460019391906109e09085906111dd565b815481106109f0576109f06111f0565b60009182526020808320919091015483528201929092526040019020805460ff19169115159190911790556003805433917fce5b206e950b0ec0ec11f61a000f2c25940db678fde81f139de9e64468590fbb91610a4f906001906111dd565b81548110610a5f57610a5f6111f0565b90600052602060002001548888604051610a7b939291906112f0565b60405180910390a2505050505050565b610a93610bc5565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015610ae2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c091906112ba565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610b37610bc5565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60038181548110610b6957600080fd5b600091825260209091200154905081565b600082815260208190526040902060010154610b9581610bf9565b6104c08383610c98565b610ba7610bc5565b60028054911515600160a01b0260ff60a01b19909216919091179055565b610bda6723a7ab22a92727a960c11b33610b06565b610bf7576040516303fa15f960e11b815260040160405180910390fd5b565b610c038133610d19565b50565b6000610c128383610b06565b610c90576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610c483390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610373565b506000610373565b6000610ca48383610b06565b15610c90576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610373565b600082610d108584610d56565b14949350505050565b610d238282610b06565b610d525760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016103de565b5050565b600081815b8451811015610d9b57610d8782868381518110610d7a57610d7a6111f0565b6020026020010151610da3565b915080610d93816112d7565b915050610d5b565b509392505050565b6000818310610dbf576000828152602084905260409020610dce565b60008381526020839052604090205b9392505050565b600060208284031215610de757600080fd5b81356001600160e01b031981168114610dce57600080fd5b80356001600160a01b0381168114610e1657600080fd5b919050565b60008060408385031215610e2e57600080fd5b610e3783610dff565b9150610e4560208401610dff565b90509250929050565b600060208284031215610e6057600080fd5b5035919050565b60008060408385031215610e7a57600080fd5b610e8383610dff565b946020939093013593505050565b60008060408385031215610ea457600080fd5b82359150610e4560208401610dff565b600060208083528351808285015260005b81811015610ee157858101830151858201604001528201610ec5565b506000604082860101526040601f19601f8301168501019250505092915050565b600060208284031215610f1457600080fd5b610dce82610dff565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610f5c57610f5c610f1d565b604052919050565b600067ffffffffffffffff821115610f7e57610f7e610f1d565b5060051b60200190565b600082601f830112610f9957600080fd5b81356020610fae610fa983610f64565b610f33565b82815260059290921b84018101918181019086841115610fcd57600080fd5b8286015b84811015610fe85780358352918301918301610fd1565b509695505050505050565b60008083601f84011261100557600080fd5b50813567ffffffffffffffff81111561101d57600080fd5b6020830191508360208260051b850101111561103857600080fd5b9250929050565b6000806000806060858703121561105557600080fd5b843567ffffffffffffffff8082111561106d57600080fd5b818701915087601f83011261108157600080fd5b81356020611091610fa983610f64565b82815260059290921b8401810191818101908b8411156110b057600080fd5b948201945b838610156110d5576110c686610dff565b825294820194908201906110b5565b985050880135925050808211156110eb57600080fd5b6110f788838901610f88565b9450604087013591508082111561110d57600080fd5b5061111a87828801610ff3565b95989497509550505050565b60008060006060848603121561113b57600080fd5b61114484610dff565b925061115260208501610dff565b9150604084013590509250925092565b8015158114610c0357600080fd5b60006020828403121561118257600080fd5b8135610dce81611162565b600181811c908216806111a157607f821691505b6020821081036111c157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610373576103736111c7565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b8381101561123f5781516001600160a01b03168752958201959082019060010161121a565b509495945050505050565b600081518084526020808501945080840160005b8381101561123f5781518752958201959082019060010161125e565b6001600160a01b038416815260606020820181905260009061129e90830185611206565b82810360408401526112b0818561124a565b9695505050505050565b6000602082840312156112cc57600080fd5b8151610dce81611162565b6000600182016112e9576112e96111c7565b5060010190565b83815260606020820152600061129e606083018561120656fea2646970667358221220558029c0d8a053caf8ee6bcbdfa2067ce97ebadf5080d97d59b551b2fb3766c564736f6c63430008140033000000000000000000000000785177e9a02fe80fc27890aecd5d196b6f704e9b0000000000000000000000004817ca4df701d554d78aa3d142b62c162c682ee1
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c806362f384ad116100b8578063977902171161007c57806397790217146102c3578063a217fddf146102d6578063aced1661146102de578063c2b40ae414610309578063d547741f1461031c578063f8974de01461032f57600080fd5b806362f384ad146102655780636ab62d71146102785780636dc0ae221461028b5780637380838e1461029d57806391d14854146102b057600080fd5b80632d992cca116100ff5780632d992cca146101e85780632f2ff15d1461021657806336568abe1461022957806336e9332d1461023c5780635c975abb1461025157600080fd5b806301ffc9a71461013c5780630c9cbf0e146101645780632246e42a1461019d578063248a9ca3146101b257806327726e7d146101d5575b600080fd5b61014f61014a366004610dd5565b610342565b60405190151581526020015b60405180910390f35b61018f610172366004610e1b565b600460209081526000928352604080842090915290825290205481565b60405190815260200161015b565b6101b06101ab366004610e4e565b610379565b005b61018f6101c0366004610e4e565b60009081526020819052604090206001015490565b6101b06101e3366004610e67565b610458565b61014f6101f6366004610e67565b600560209081526000928352604080842090915290825290205460ff1681565b6101b0610224366004610e91565b61049b565b6101b0610237366004610e91565b6104c6565b6102446104f9565b60405161015b9190610eb4565b60025461014f90600160a01b900460ff1681565b6101b0610273366004610f02565b610587565b6101b061028636600461103f565b6105f9565b61018f6723a7ab22a92727a960c11b81565b6101b06102ab366004611126565b610a8b565b61014f6102be366004610e91565b610b06565b6101b06102d1366004610f02565b610b2f565b61018f600081565b6002546102f1906001600160a01b031681565b6040516001600160a01b03909116815260200161015b565b61018f610317366004610e4e565b610b59565b6101b061032a366004610e91565b610b7a565b6101b061033d366004611170565b610b9f565b60006001600160e01b03198216637965db0b60e01b148061037357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002546001600160a01b031633146103e75760405162461bcd60e51b815260206004820152602660248201527f436c61696d65723a204f6e6c79206b65657065722063616e2070757368206e656044820152651dc81c9bdbdd60d21b60648201526084015b60405180910390fd5b600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01819055604080518281524260208201527faffc5b905926b85bf04bb4f746e2198ab02fac2b2804a634be6adcc004cfd7da91015b60405180910390a150565b610460610bc5565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610496573d6000803e3d6000fd5b505050565b6000828152602081905260409020600101546104b681610bf9565b6104c08383610c06565b50505050565b6001600160a01b03811633146104ef5760405163334bd91960e11b815260040160405180910390fd5b6104968282610c98565b600180546105069061118d565b80601f01602080910402602001604051908101604052809291908181526020018280546105329061118d565b801561057f5780601f106105545761010080835404028352916020019161057f565b820191906000526020600020905b81548152906001019060200180831161056257829003601f168201915b505050505081565b61058f610bc5565b6105a46723a7ab22a92727a960c11b33610c98565b506105ba6723a7ab22a92727a960c11b82610c06565b50604080513381526001600160a01b03831660208201527f5af6a85e864342d4f108c43dd574d98480c91f1de0ac2a9f66d826dee49bd9bb910161044d565b600254600160a01b900460ff16156106535760405162461bcd60e51b815260206004820152601b60248201527f436c61696d65723a20436f6e747261637420697320706175736564000000000060448201526064016103de565b33600090815260056020526040812060038054919291610675906001906111dd565b81548110610685576106856111f0565b6000918252602080832090910154835282019290925260400190205460ff16156106f15760405162461bcd60e51b815260206004820152601860248201527f436c61696d65723a20416c726561647920636c61696d6564000000000000000060448201526064016103de565b835160405160009061070b9033908890889060200161127a565b60408051601f19818403018152828252805160209182012090830152016040516020818303038152906040528051906020012090506107a9848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506003805490925061078891506001906111dd565b81548110610798576107986111f0565b906000526020600020015483610d03565b6107ee5760405162461bcd60e51b815260206004820152601660248201527521b630b4b6b2b91d1024b73b30b634b210383937b7b360511b60448201526064016103de565b60005b828110156109bc57336000908152600460205260408120885182908a908590811061081e5761081e6111f0565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054905086828151811061085b5761085b6111f0565b6020026020010151810361086f57506109aa565b600081888481518110610884576108846111f0565b602002602001015161089691906111dd565b90508783815181106108aa576108aa6111f0565b602002602001015160046000336001600160a01b03166001600160a01b0316815260200190815260200160002060008b86815181106108eb576108eb6111f0565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550888381518110610929576109296111f0565b602090810291909101015160405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610982573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a691906112ba565b5050505b806109b4816112d7565b9150506107f1565b503360009081526005602052604081206003805460019391906109e09085906111dd565b815481106109f0576109f06111f0565b60009182526020808320919091015483528201929092526040019020805460ff19169115159190911790556003805433917fce5b206e950b0ec0ec11f61a000f2c25940db678fde81f139de9e64468590fbb91610a4f906001906111dd565b81548110610a5f57610a5f6111f0565b90600052602060002001548888604051610a7b939291906112f0565b60405180910390a2505050505050565b610a93610bc5565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015610ae2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c091906112ba565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610b37610bc5565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60038181548110610b6957600080fd5b600091825260209091200154905081565b600082815260208190526040902060010154610b9581610bf9565b6104c08383610c98565b610ba7610bc5565b60028054911515600160a01b0260ff60a01b19909216919091179055565b610bda6723a7ab22a92727a960c11b33610b06565b610bf7576040516303fa15f960e11b815260040160405180910390fd5b565b610c038133610d19565b50565b6000610c128383610b06565b610c90576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610c483390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610373565b506000610373565b6000610ca48383610b06565b15610c90576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610373565b600082610d108584610d56565b14949350505050565b610d238282610b06565b610d525760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016103de565b5050565b600081815b8451811015610d9b57610d8782868381518110610d7a57610d7a6111f0565b6020026020010151610da3565b915080610d93816112d7565b915050610d5b565b509392505050565b6000818310610dbf576000828152602084905260409020610dce565b60008381526020839052604090205b9392505050565b600060208284031215610de757600080fd5b81356001600160e01b031981168114610dce57600080fd5b80356001600160a01b0381168114610e1657600080fd5b919050565b60008060408385031215610e2e57600080fd5b610e3783610dff565b9150610e4560208401610dff565b90509250929050565b600060208284031215610e6057600080fd5b5035919050565b60008060408385031215610e7a57600080fd5b610e8383610dff565b946020939093013593505050565b60008060408385031215610ea457600080fd5b82359150610e4560208401610dff565b600060208083528351808285015260005b81811015610ee157858101830151858201604001528201610ec5565b506000604082860101526040601f19601f8301168501019250505092915050565b600060208284031215610f1457600080fd5b610dce82610dff565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610f5c57610f5c610f1d565b604052919050565b600067ffffffffffffffff821115610f7e57610f7e610f1d565b5060051b60200190565b600082601f830112610f9957600080fd5b81356020610fae610fa983610f64565b610f33565b82815260059290921b84018101918181019086841115610fcd57600080fd5b8286015b84811015610fe85780358352918301918301610fd1565b509695505050505050565b60008083601f84011261100557600080fd5b50813567ffffffffffffffff81111561101d57600080fd5b6020830191508360208260051b850101111561103857600080fd5b9250929050565b6000806000806060858703121561105557600080fd5b843567ffffffffffffffff8082111561106d57600080fd5b818701915087601f83011261108157600080fd5b81356020611091610fa983610f64565b82815260059290921b8401810191818101908b8411156110b057600080fd5b948201945b838610156110d5576110c686610dff565b825294820194908201906110b5565b985050880135925050808211156110eb57600080fd5b6110f788838901610f88565b9450604087013591508082111561110d57600080fd5b5061111a87828801610ff3565b95989497509550505050565b60008060006060848603121561113b57600080fd5b61114484610dff565b925061115260208501610dff565b9150604084013590509250925092565b8015158114610c0357600080fd5b60006020828403121561118257600080fd5b8135610dce81611162565b600181811c908216806111a157607f821691505b6020821081036111c157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610373576103736111c7565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b8381101561123f5781516001600160a01b03168752958201959082019060010161121a565b509495945050505050565b600081518084526020808501945080840160005b8381101561123f5781518752958201959082019060010161125e565b6001600160a01b038416815260606020820181905260009061129e90830185611206565b82810360408401526112b0818561124a565b9695505050505050565b6000602082840312156112cc57600080fd5b8151610dce81611162565b6000600182016112e9576112e96111c7565b5060010190565b83815260606020820152600061129e606083018561120656fea2646970667358221220558029c0d8a053caf8ee6bcbdfa2067ce97ebadf5080d97d59b551b2fb3766c564736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000785177e9a02fe80fc27890aecd5d196b6f704e9b0000000000000000000000004817ca4df701d554d78aa3d142b62c162c682ee1
-----Decoded View---------------
Arg [0] : keeper (address): 0x785177E9A02fe80fC27890AeCd5d196b6F704e9b
Arg [1] : initialOwner (address): 0x4817cA4DF701d554D78Aa3d142b62C162C682ee1
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000785177e9a02fe80fc27890aecd5d196b6f704e9b
Arg [1] : 0000000000000000000000004817ca4df701d554d78aa3d142b62c162c682ee1
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$8,699.46
Net Worth in ETH
3.031322
Token Allocations
AIRENA
63.00%
CAKE
25.94%
WBTC
4.03%
Others
7.03%
Multichain Portfolio | 35 Chains
Loading...
Loading
Loading...
Loading
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.