Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 19674832 | 255 days ago | IN | 0.0004 ETH | 0.00054413 | ||||
Open Claims | 19674813 | 255 days ago | IN | 0 ETH | 0.00039163 | ||||
Claim | 19674803 | 255 days ago | IN | 0.01 ETH | 0.00040287 | ||||
Claim | 19674792 | 255 days ago | IN | 0 ETH | 0.00034642 | ||||
Claim | 19674773 | 255 days ago | IN | 0 ETH | 0.00030953 | ||||
Claim | 19674767 | 255 days ago | IN | 0 ETH | 0.00031366 | ||||
Claim | 19674767 | 255 days ago | IN | 0 ETH | 0.00031366 | ||||
Claim | 19674760 | 255 days ago | IN | 0 ETH | 0.00031901 | ||||
Claim | 19674757 | 255 days ago | IN | 0 ETH | 0.00033639 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GenesisClaim
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.24; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import { PausableUpgradeable } from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { IGenesisStake } from "./IGenesisStake.sol"; contract GenesisClaim is OwnableUpgradeable, PausableUpgradeable { /** * @notice Emitted when rewards are set for an account. * @param account The account that received rewards. * @param amount The amount of rewards received. */ event RewardsSet(address indexed account, uint256 amount); /** * @notice Emitted when an account claims rewards. * @param account The account that claimed rewards. * @param amount The amount of rewards claimed. */ event Claimed(address indexed account, uint256 amount); /** * @notice Emitted when the GenesisStake contract is set. * @param newGenesisStake The new GenesisStake contract address. * @param prevGenesisStake The previous GenesisStake contract address. */ event GenesisStakeChanged(address indexed newGenesisStake, address indexed prevGenesisStake); /** * @notice Emitted when the Clique signer address is changed. * @param newClique The new Clique signer address. * @param prevClique The previous Clique signer address. */ event CliqueChanged(address indexed newClique, address indexed prevClique); /** * @notice Emitted when the Clique fee is changed. * @param newCliqueFee The new Clique fee. * @param prevCliqueFee The previous Clique fee. */ event CliqueFeeChanged(uint256 newCliqueFee, uint256 prevCliqueFee); /** * @notice Emitted when claims are opened. */ event ClaimsOpened(); /** * @notice Emitted when claims are closed. */ event ClaimsClosed(); /** * @notice The token contract address. */ IERC20 public immutable token; /** * @notice The Clique signer address. */ address public clique; /** * @notice The GenesisStake contract address. */ IGenesisStake public genesisStake; /** * @notice True if claims are open, false otherwise. */ bool public isOpen; /** * @notice Timestamp at which claims were opened. */ uint256 public openedAt; /** * @notice Clique fee */ uint256 public cliqueFee; /** * @notice Rewards for each account. */ mapping(address => uint256) public rewards; /** * @notice True if rewards have been set for an account, false otherwise. */ mapping(address => bool) public rewardsSet; /** * @notice Restrict calls to the Clique address. */ modifier onlyClique() { require(msg.sender == clique, "GenesisClaim: only clique"); _; } /** * @notice Restrict calls to when claims are open. */ modifier whenOpen() { require(isOpen, "GenesisClaim: not open"); _; } constructor(address token_) { token = IERC20(token_); _disableInitializers(); } /** * @notice Initialize the contract. * @param owner_ The owner of the contract. * @param genesisStake_ The GenesisStake contract address. */ function initialize(address owner_, address genesisStake_, address clique_, uint256 cliqueFee_, bool isOpen_) external initializer { __Ownable_init(); __Pausable_init(); _transferOwnership(owner_); _setGenesisStake(genesisStake_); _setClique(clique_); _setCliqueFee(cliqueFee_); if (isOpen_) _openClaims(); } /** * @notice Set the rewards for `account`. * @param account The account to set rewards for. * @param amount The amount of rewards to set. */ function setRewards(address account, uint256 amount) external onlyClique whenNotPaused { _setRewards(account, amount); } /** * @notice Set rewards for multiple accounts. * @param accounts The accounts to set rewards for. * @param amounts The amounts of rewards to set. */ function batchSetRewards(address[] calldata accounts, uint256[] calldata amounts) external onlyClique whenNotPaused { require(accounts.length == amounts.length, "GenesisClaim: length mismatch"); for (uint256 i = 0; i < accounts.length; i++) { _setRewards(accounts[i], amounts[i]); } } function _setRewards(address account, uint256 amount) internal { require(amount > 0, "GenesisClaim: amount must be > 0"); require(!rewardsSet[account], "GenesisClaim: already set"); require(account != address(0), "GenesisClaim: no zero address"); rewards[account] = amount; rewardsSet[account] = true; emit RewardsSet(account, amount); } /** * @notice Reset rewards for `accounts`. * @param accounts The accounts to reset rewards for. */ function resetRewards(address[] calldata accounts) external onlyOwner { for (uint256 i = 0; i < accounts.length; i++) { // this check is included to avoid resetting rewards for accounts that have already claimed require(rewards[accounts[i]] > 0, "GenesisClaim: no rewards"); rewards[accounts[i]] = 0; rewardsSet[accounts[i]] = false; } } /** * @notice Return true if `account` has rewards, false otherwise. * @param account The account to check. */ function hasRewards(address account) external view returns (bool) { return rewards[account] > 0; } /** * @notice Claim all rewards for the caller. */ function claim() external payable whenNotPaused whenOpen { require(msg.value >= cliqueFee, "GenesisClaim: insufficient fee"); uint256 amount = _markClaimed(msg.sender); IERC20(token).transfer(msg.sender, amount); emit Claimed(msg.sender, amount); } /** * @notice Claim all rewards for the caller, and stake them on behalf of the caller. */ function claimAndStake() external payable whenNotPaused whenOpen { require(msg.value >= cliqueFee, "GenesisClaim: insufficient fee"); uint256 amount = _markClaimed(msg.sender); genesisStake.stakeFor(msg.sender, amount); emit Claimed(msg.sender, amount); } /** * @notice Mark rewards as claimed for `account`. Returns the amount claimed. * @param account The account claiming rewards. */ function _markClaimed(address account) internal returns (uint256) { uint256 amount = rewards[account]; require(amount > 0, "GenesisClaim: no rewards"); rewards[account] = 0; return amount; } /** * @notice Open claims. * @dev Just sets openedAt timestamp. */ function openClaims() external onlyOwner { _openClaims(); } /** * @notice Pause the contract. */ function pause() external onlyOwner { _pause(); } /** * @notice Unpause the contract. */ function unpause() external onlyOwner { _unpause(); } /** * @notice Withdraw all unclaimed tokens to the `withdrawTo` address, and close claims. */ function withdrawAndClose(address withdrawTo) external onlyOwner whenOpen { require(block.timestamp >= openedAt + 45 days, "GenesisClaim: not 45 days"); isOpen = false; token.transfer(withdrawTo, token.balanceOf(address(this))); emit ClaimsClosed(); } /** * @notice Withdraw clique fees to the `withdrawTo` address. */ function withdrawFees(address payable withdrawTo) external onlyClique whenNotPaused { (bool success,) = withdrawTo.call{ value: address(this).balance }(""); require(success, "GenesisClaim: withdrawal failed"); } /** * @notice Set the GenesisStake contract address. * @param genesisStake_ The new GenesisStake contract address. */ function setGenesisStake(address genesisStake_) external onlyOwner { _setGenesisStake(genesisStake_); } /** * @notice Set the Clique address. * @param clique_ The new Clique address. */ function setClique(address clique_) external onlyOwner { _setClique(clique_); } /** * @notice Set the GenesisStake contract address. * @param genesisStake_ The new GenesisStake contract address. */ function _setGenesisStake(address genesisStake_) internal { require(genesisStake_ != address(0), "GenesisClaim: no zero address"); address prevGenesisStake = address(genesisStake); genesisStake = IGenesisStake(genesisStake_); // Approve new GenesisStake contract to transfer tokens. token.approve(genesisStake_, type(uint256).max); // Revoke approval from previous GenesisStake contract. if (prevGenesisStake != address(0)) token.approve(prevGenesisStake, 0); emit GenesisStakeChanged(genesisStake_, prevGenesisStake); } /** * @notice Set the Clique address. * @param clique_ The new Clique address. */ function _setClique(address clique_) internal { require(clique_ != address(0), "GenesisClaim: no zero address"); emit CliqueChanged(clique_, clique); clique = clique_; } /** * @notice Set the Clique fee. * @param cliqueFee_ The new Clique fee. */ function _setCliqueFee(uint256 cliqueFee_) internal { emit CliqueFeeChanged(cliqueFee, cliqueFee_); cliqueFee = cliqueFee_; } /** * @notice Open claims. */ function _openClaims() internal { require(!isOpen, "GenesisClaim: already open"); isOpen = true; openedAt = block.timestamp; emit ClaimsOpened(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import {Initializable} from "../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// 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: GPL-3.0-only pragma solidity 0.8.24; interface IGenesisStake { /** * @notice Stake `amount` tokens. * @param amount The amount of tokens to stake. */ function stake(uint256 amount) external; /** * @notice Stake `amount` tokens for `recipient`, paid by the caller. * @param recipient The recipient to stake tokens for. * @param amount The amount of tokens to stake. */ function stakeFor(address recipient, uint256 amount) external; /** * @notice Unstake your entire balance, starting the unbonding period. */ function unstake() external; /** * @notice Withdraw your entire balance after the unbonding period. */ function withdraw() external; /** * @notice Returns timestamp at which `account` can withdraw. * Reverts if the account has not staked & unstaked. */ function canWithdrawAt(address account) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } 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; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
{ "remappings": [ "forge-std/=node_modules/forge-std/src/", "ds-test/=node_modules/ds-test/src/", "src/=src/", "@openzeppelin/=node_modules/@openzeppelin/" ], "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
[{"inputs":[{"internalType":"address","name":"token_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[],"name":"ClaimsClosed","type":"event"},{"anonymous":false,"inputs":[],"name":"ClaimsOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newClique","type":"address"},{"indexed":true,"internalType":"address","name":"prevClique","type":"address"}],"name":"CliqueChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newCliqueFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"prevCliqueFee","type":"uint256"}],"name":"CliqueFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newGenesisStake","type":"address"},{"indexed":true,"internalType":"address","name":"prevGenesisStake","type":"address"}],"name":"GenesisStakeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchSetRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimAndStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"clique","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cliqueFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisStake","outputs":[{"internalType":"contract IGenesisStake","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"hasRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"genesisStake_","type":"address"},{"internalType":"address","name":"clique_","type":"address"},{"internalType":"uint256","name":"cliqueFee_","type":"uint256"},{"internalType":"bool","name":"isOpen_","type":"bool"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openClaims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"resetRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardsSet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"clique_","type":"address"}],"name":"setClique","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"genesisStake_","type":"address"}],"name":"setGenesisStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"withdrawTo","type":"address"}],"name":"withdrawAndClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawTo","type":"address"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162001af838038062001af8833981016040819052620000349162000113565b6001600160a01b0381166080526200004b62000052565b5062000145565b600054610100900460ff1615620000bf5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000111576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012657600080fd5b81516001600160a01b03811681146200013e57600080fd5b9392505050565b60805161197b6200017d600039600081816104ad0152818161058a0152818161084f01528181610f6a015261100d015261197b6000f3fe6080604052600436106101815760003560e01c80637ba0eaad116100d1578063ad233e871161008a578063eaf2c1fb11610064578063eaf2c1fb14610445578063eea39f791461045b578063f2fde38b1461047b578063fc0c546a1461049b57600080fd5b8063ad233e87146103e5578063b8afd6f614610405578063cb1a4fc01461043d57600080fd5b80637ba0eaad1461030e57806380c15aaa1461032e5780638456cb591461034e5780638b091372146103635780638da5cb5b1461039357806399695211146103c557600080fd5b806347535d7b1161013e5780635e29d11a116101185780635e29d11a146102a45780636983e74d146102c4578063715018a6146102e45780637a6ae541146102f957600080fd5b806347535d7b146102535780634e71d92d146102845780635c975abb1461028c57600080fd5b8063026f4aa21461018657806305f72153146101a85780630700037d146101c8578063164e68de1461020857806338930203146102285780633f4ba83a1461023e575b600080fd5b34801561019257600080fd5b506101a66101a1366004611629565b6104cf565b005b3480156101b457600080fd5b506101a66101c3366004611629565b6106a3565b3480156101d457600080fd5b506101f56101e3366004611629565b609b6020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561021457600080fd5b506101a6610223366004611629565b6106b7565b34801561023457600080fd5b506101f560995481565b34801561024a57600080fd5b506101a6610790565b34801561025f57600080fd5b5060985461027490600160a01b900460ff1681565b60405190151581526020016101ff565b6101a66107a2565b34801561029857600080fd5b5060655460ff16610274565b3480156102b057600080fd5b506101a66102bf366004611699565b6108fe565b3480156102d057600080fd5b506101a66102df3660046116db565b610a5a565b3480156102f057600080fd5b506101a6610b3d565b34801561030557600080fd5b506101a6610b4f565b34801561031a57600080fd5b506101a6610329366004611629565b610b5f565b34801561033a57600080fd5b506101a6610349366004611747565b610b70565b34801561035a57600080fd5b506101a6610bac565b34801561036f57600080fd5b5061027461037e366004611629565b609c6020526000908152604090205460ff1681565b34801561039f57600080fd5b506033546001600160a01b03165b6040516001600160a01b0390911681526020016101ff565b3480156103d157600080fd5b506097546103ad906001600160a01b031681565b3480156103f157600080fd5b506098546103ad906001600160a01b031681565b34801561041157600080fd5b50610274610420366004611629565b6001600160a01b03166000908152609b6020526040902054151590565b6101a6610bbc565b34801561045157600080fd5b506101f5609a5481565b34801561046757600080fd5b506101a6610476366004611781565b610ce1565b34801561048757600080fd5b506101a6610496366004611629565b610e31565b3480156104a757600080fd5b506103ad7f000000000000000000000000000000000000000000000000000000000000000081565b6104d7610ea7565b609854600160a01b900460ff166105095760405162461bcd60e51b8152600401610500906117e9565b60405180910390fd5b60995461051990623b5380611819565b4210156105685760405162461bcd60e51b815260206004820152601960248201527f47656e65736973436c61696d3a206e6f742034352064617973000000000000006044820152606401610500565b6098805460ff60a01b191690556040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90839083906370a0823190602401602060405180830381865afa1580156105e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106079190611840565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611859565b506040517fe10eee6a2d1dbc76ec9a46f7efcd418e7a520f20dc9118dde72d155901685aef90600090a150565b6106ab610ea7565b6106b481610f01565b50565b6097546001600160a01b031633146106e15760405162461bcd60e51b815260040161050090611876565b6106e96110c0565b6000816001600160a01b03164760405160006040518083038185875af1925050503d8060008114610736576040519150601f19603f3d011682016040523d82523d6000602084013e61073b565b606091505b505090508061078c5760405162461bcd60e51b815260206004820152601f60248201527f47656e65736973436c61696d3a207769746864726177616c206661696c6564006044820152606401610500565b5050565b610798610ea7565b6107a0611106565b565b6107aa6110c0565b609854600160a01b900460ff166107d35760405162461bcd60e51b8152600401610500906117e9565b609a543410156108255760405162461bcd60e51b815260206004820152601e60248201527f47656e65736973436c61696d3a20696e73756666696369656e742066656500006044820152606401610500565b600061083033611158565b60405163a9059cbb60e01b8152336004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156108a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c49190611859565b5060405181815233907fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a906020015b60405180910390a250565b610906610ea7565b60005b81811015610a55576000609b6000858585818110610929576109296118ad565b905060200201602081019061093e9190611629565b6001600160a01b03166001600160a01b0316815260200190815260200160002054116109a75760405162461bcd60e51b815260206004820152601860248201527747656e65736973436c61696d3a206e6f207265776172647360401b6044820152606401610500565b6000609b60008585858181106109bf576109bf6118ad565b90506020020160208101906109d49190611629565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506000609c6000858585818110610a1057610a106118ad565b9050602002016020810190610a259190611629565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610909565b505050565b6097546001600160a01b03163314610a845760405162461bcd60e51b815260040161050090611876565b610a8c6110c0565b828114610adb5760405162461bcd60e51b815260206004820152601d60248201527f47656e65736973436c61696d3a206c656e677468206d69736d617463680000006044820152606401610500565b60005b83811015610b3657610b2e858583818110610afb57610afb6118ad565b9050602002016020810190610b109190611629565b848484818110610b2257610b226118ad565b905060200201356111d7565b600101610ade565b5050505050565b610b45610ea7565b6107a0600061131b565b610b57610ea7565b6107a061136d565b610b67610ea7565b6106b481611409565b6097546001600160a01b03163314610b9a5760405162461bcd60e51b815260040161050090611876565b610ba26110c0565b61078c82826111d7565b610bb4610ea7565b6107a061148c565b610bc46110c0565b609854600160a01b900460ff16610bed5760405162461bcd60e51b8152600401610500906117e9565b609a54341015610c3f5760405162461bcd60e51b815260206004820152601e60248201527f47656e65736973436c61696d3a20696e73756666696369656e742066656500006044820152606401610500565b6000610c4a33611158565b6098546040516305dc812160e31b8152336004820152602481018390529192506001600160a01b031690632ee4090890604401600060405180830381600087803b158015610c9757600080fd5b505af1158015610cab573d6000803e3d6000fd5b50506040518381523392507fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a91506020016108f3565b600054610100900460ff1615808015610d015750600054600160ff909116105b80610d1b5750303b158015610d1b575060005460ff166001145b610d7e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610500565b6000805460ff191660011790558015610da1576000805461ff0019166101001790555b610da96114c9565b610db16114f8565b610dba8661131b565b610dc385610f01565b610dcc84611409565b610dd583611527565b8115610de357610de361136d565b8015610e29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b610e39610ea7565b6001600160a01b038116610e9e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610500565b6106b48161131b565b6033546001600160a01b031633146107a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610500565b6001600160a01b038116610f275760405162461bcd60e51b8152600401610500906118c3565b609880546001600160a01b031981166001600160a01b0384811691821790935560405163095ea7b360e01b815260048101919091526000196024820152908216917f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015610fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd79190611859565b506001600160a01b0381161561107c5760405163095ea7b360e01b81526001600160a01b038281166004830152600060248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015611056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107a9190611859565b505b806001600160a01b0316826001600160a01b03167ff53504094f52924822018309e072ef0cac3bd1f1a29e97d89b5c22f2311d5b0460405160405180910390a35050565b60655460ff16156107a05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610500565b61110e611568565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0381166000908152609b6020526040812054806111b95760405162461bcd60e51b815260206004820152601860248201527747656e65736973436c61696d3a206e6f207265776172647360401b6044820152606401610500565b6001600160a01b039092166000908152609b60205260408120555090565b600081116112275760405162461bcd60e51b815260206004820181905260248201527f47656e65736973436c61696d3a20616d6f756e74206d757374206265203e20306044820152606401610500565b6001600160a01b0382166000908152609c602052604090205460ff16156112905760405162461bcd60e51b815260206004820152601960248201527f47656e65736973436c61696d3a20616c726561647920736574000000000000006044820152606401610500565b6001600160a01b0382166112b65760405162461bcd60e51b8152600401610500906118c3565b6001600160a01b0382166000818152609b60209081526040808320859055609c825291829020805460ff1916600117905590518381527f4de45f6c76bbeb7a14efbe2f206ee9fb4e77a38116455071d1440020ff9e668d910160405180910390a25050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b609854600160a01b900460ff16156113c75760405162461bcd60e51b815260206004820152601a60248201527f47656e65736973436c61696d3a20616c7265616479206f70656e0000000000006044820152606401610500565b6098805460ff60a01b1916600160a01b179055426099556040517f95e16d3028fd61e822243bbb1266caad765710eae7087fad07c278251f7261c790600090a1565b6001600160a01b03811661142f5760405162461bcd60e51b8152600401610500906118c3565b6097546040516001600160a01b03918216918316907fec8a79cd46002f6dac5b781ad34a9e049fa874a5fad233d8c31417da39658bd090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b6114946110c0565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861113b3390565b600054610100900460ff166114f05760405162461bcd60e51b8152600401610500906118fa565b6107a06115b1565b600054610100900460ff1661151f5760405162461bcd60e51b8152600401610500906118fa565b6107a06115e1565b609a5460408051918252602082018390527f6a0ad56357709e2589a1c4a4a6745ba183f8b46681742c8244ffb735ff1d25ec910160405180910390a1609a55565b60655460ff166107a05760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610500565b600054610100900460ff166115d85760405162461bcd60e51b8152600401610500906118fa565b6107a03361131b565b600054610100900460ff166116085760405162461bcd60e51b8152600401610500906118fa565b6065805460ff19169055565b6001600160a01b03811681146106b457600080fd5b60006020828403121561163b57600080fd5b813561164681611614565b9392505050565b60008083601f84011261165f57600080fd5b50813567ffffffffffffffff81111561167757600080fd5b6020830191508360208260051b850101111561169257600080fd5b9250929050565b600080602083850312156116ac57600080fd5b823567ffffffffffffffff8111156116c357600080fd5b6116cf8582860161164d565b90969095509350505050565b600080600080604085870312156116f157600080fd5b843567ffffffffffffffff8082111561170957600080fd5b6117158883890161164d565b9096509450602087013591508082111561172e57600080fd5b5061173b8782880161164d565b95989497509550505050565b6000806040838503121561175a57600080fd5b823561176581611614565b946020939093013593505050565b80151581146106b457600080fd5b600080600080600060a0868803121561179957600080fd5b85356117a481611614565b945060208601356117b481611614565b935060408601356117c481611614565b92506060860135915060808601356117db81611773565b809150509295509295909350565b60208082526016908201527523b2b732b9b4b9a1b630b4b69d103737ba1037b832b760511b604082015260600190565b8082018082111561183a57634e487b7160e01b600052601160045260246000fd5b92915050565b60006020828403121561185257600080fd5b5051919050565b60006020828403121561186b57600080fd5b815161164681611773565b60208082526019908201527f47656e65736973436c61696d3a206f6e6c7920636c6971756500000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6020808252601d908201527f47656e65736973436c61696d3a206e6f207a65726f2061646472657373000000604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea264697066735822122090e883f2c75a3b54d2047335b2b4c9847d412faf260d0544f23cceb2f22fae4564736f6c6343000818003300000000000000000000000036e66fbbce51e4cd5bd3c62b637eb411b18949d4
Deployed Bytecode
0x6080604052600436106101815760003560e01c80637ba0eaad116100d1578063ad233e871161008a578063eaf2c1fb11610064578063eaf2c1fb14610445578063eea39f791461045b578063f2fde38b1461047b578063fc0c546a1461049b57600080fd5b8063ad233e87146103e5578063b8afd6f614610405578063cb1a4fc01461043d57600080fd5b80637ba0eaad1461030e57806380c15aaa1461032e5780638456cb591461034e5780638b091372146103635780638da5cb5b1461039357806399695211146103c557600080fd5b806347535d7b1161013e5780635e29d11a116101185780635e29d11a146102a45780636983e74d146102c4578063715018a6146102e45780637a6ae541146102f957600080fd5b806347535d7b146102535780634e71d92d146102845780635c975abb1461028c57600080fd5b8063026f4aa21461018657806305f72153146101a85780630700037d146101c8578063164e68de1461020857806338930203146102285780633f4ba83a1461023e575b600080fd5b34801561019257600080fd5b506101a66101a1366004611629565b6104cf565b005b3480156101b457600080fd5b506101a66101c3366004611629565b6106a3565b3480156101d457600080fd5b506101f56101e3366004611629565b609b6020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561021457600080fd5b506101a6610223366004611629565b6106b7565b34801561023457600080fd5b506101f560995481565b34801561024a57600080fd5b506101a6610790565b34801561025f57600080fd5b5060985461027490600160a01b900460ff1681565b60405190151581526020016101ff565b6101a66107a2565b34801561029857600080fd5b5060655460ff16610274565b3480156102b057600080fd5b506101a66102bf366004611699565b6108fe565b3480156102d057600080fd5b506101a66102df3660046116db565b610a5a565b3480156102f057600080fd5b506101a6610b3d565b34801561030557600080fd5b506101a6610b4f565b34801561031a57600080fd5b506101a6610329366004611629565b610b5f565b34801561033a57600080fd5b506101a6610349366004611747565b610b70565b34801561035a57600080fd5b506101a6610bac565b34801561036f57600080fd5b5061027461037e366004611629565b609c6020526000908152604090205460ff1681565b34801561039f57600080fd5b506033546001600160a01b03165b6040516001600160a01b0390911681526020016101ff565b3480156103d157600080fd5b506097546103ad906001600160a01b031681565b3480156103f157600080fd5b506098546103ad906001600160a01b031681565b34801561041157600080fd5b50610274610420366004611629565b6001600160a01b03166000908152609b6020526040902054151590565b6101a6610bbc565b34801561045157600080fd5b506101f5609a5481565b34801561046757600080fd5b506101a6610476366004611781565b610ce1565b34801561048757600080fd5b506101a6610496366004611629565b610e31565b3480156104a757600080fd5b506103ad7f00000000000000000000000036e66fbbce51e4cd5bd3c62b637eb411b18949d481565b6104d7610ea7565b609854600160a01b900460ff166105095760405162461bcd60e51b8152600401610500906117e9565b60405180910390fd5b60995461051990623b5380611819565b4210156105685760405162461bcd60e51b815260206004820152601960248201527f47656e65736973436c61696d3a206e6f742034352064617973000000000000006044820152606401610500565b6098805460ff60a01b191690556040516370a0823160e01b81523060048201527f00000000000000000000000036e66fbbce51e4cd5bd3c62b637eb411b18949d46001600160a01b03169063a9059cbb90839083906370a0823190602401602060405180830381865afa1580156105e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106079190611840565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611859565b506040517fe10eee6a2d1dbc76ec9a46f7efcd418e7a520f20dc9118dde72d155901685aef90600090a150565b6106ab610ea7565b6106b481610f01565b50565b6097546001600160a01b031633146106e15760405162461bcd60e51b815260040161050090611876565b6106e96110c0565b6000816001600160a01b03164760405160006040518083038185875af1925050503d8060008114610736576040519150601f19603f3d011682016040523d82523d6000602084013e61073b565b606091505b505090508061078c5760405162461bcd60e51b815260206004820152601f60248201527f47656e65736973436c61696d3a207769746864726177616c206661696c6564006044820152606401610500565b5050565b610798610ea7565b6107a0611106565b565b6107aa6110c0565b609854600160a01b900460ff166107d35760405162461bcd60e51b8152600401610500906117e9565b609a543410156108255760405162461bcd60e51b815260206004820152601e60248201527f47656e65736973436c61696d3a20696e73756666696369656e742066656500006044820152606401610500565b600061083033611158565b60405163a9059cbb60e01b8152336004820152602481018290529091507f00000000000000000000000036e66fbbce51e4cd5bd3c62b637eb411b18949d46001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156108a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c49190611859565b5060405181815233907fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a906020015b60405180910390a250565b610906610ea7565b60005b81811015610a55576000609b6000858585818110610929576109296118ad565b905060200201602081019061093e9190611629565b6001600160a01b03166001600160a01b0316815260200190815260200160002054116109a75760405162461bcd60e51b815260206004820152601860248201527747656e65736973436c61696d3a206e6f207265776172647360401b6044820152606401610500565b6000609b60008585858181106109bf576109bf6118ad565b90506020020160208101906109d49190611629565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506000609c6000858585818110610a1057610a106118ad565b9050602002016020810190610a259190611629565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610909565b505050565b6097546001600160a01b03163314610a845760405162461bcd60e51b815260040161050090611876565b610a8c6110c0565b828114610adb5760405162461bcd60e51b815260206004820152601d60248201527f47656e65736973436c61696d3a206c656e677468206d69736d617463680000006044820152606401610500565b60005b83811015610b3657610b2e858583818110610afb57610afb6118ad565b9050602002016020810190610b109190611629565b848484818110610b2257610b226118ad565b905060200201356111d7565b600101610ade565b5050505050565b610b45610ea7565b6107a0600061131b565b610b57610ea7565b6107a061136d565b610b67610ea7565b6106b481611409565b6097546001600160a01b03163314610b9a5760405162461bcd60e51b815260040161050090611876565b610ba26110c0565b61078c82826111d7565b610bb4610ea7565b6107a061148c565b610bc46110c0565b609854600160a01b900460ff16610bed5760405162461bcd60e51b8152600401610500906117e9565b609a54341015610c3f5760405162461bcd60e51b815260206004820152601e60248201527f47656e65736973436c61696d3a20696e73756666696369656e742066656500006044820152606401610500565b6000610c4a33611158565b6098546040516305dc812160e31b8152336004820152602481018390529192506001600160a01b031690632ee4090890604401600060405180830381600087803b158015610c9757600080fd5b505af1158015610cab573d6000803e3d6000fd5b50506040518381523392507fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a91506020016108f3565b600054610100900460ff1615808015610d015750600054600160ff909116105b80610d1b5750303b158015610d1b575060005460ff166001145b610d7e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610500565b6000805460ff191660011790558015610da1576000805461ff0019166101001790555b610da96114c9565b610db16114f8565b610dba8661131b565b610dc385610f01565b610dcc84611409565b610dd583611527565b8115610de357610de361136d565b8015610e29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b610e39610ea7565b6001600160a01b038116610e9e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610500565b6106b48161131b565b6033546001600160a01b031633146107a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610500565b6001600160a01b038116610f275760405162461bcd60e51b8152600401610500906118c3565b609880546001600160a01b031981166001600160a01b0384811691821790935560405163095ea7b360e01b815260048101919091526000196024820152908216917f00000000000000000000000036e66fbbce51e4cd5bd3c62b637eb411b18949d4169063095ea7b3906044016020604051808303816000875af1158015610fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd79190611859565b506001600160a01b0381161561107c5760405163095ea7b360e01b81526001600160a01b038281166004830152600060248301527f00000000000000000000000036e66fbbce51e4cd5bd3c62b637eb411b18949d4169063095ea7b3906044016020604051808303816000875af1158015611056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107a9190611859565b505b806001600160a01b0316826001600160a01b03167ff53504094f52924822018309e072ef0cac3bd1f1a29e97d89b5c22f2311d5b0460405160405180910390a35050565b60655460ff16156107a05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610500565b61110e611568565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0381166000908152609b6020526040812054806111b95760405162461bcd60e51b815260206004820152601860248201527747656e65736973436c61696d3a206e6f207265776172647360401b6044820152606401610500565b6001600160a01b039092166000908152609b60205260408120555090565b600081116112275760405162461bcd60e51b815260206004820181905260248201527f47656e65736973436c61696d3a20616d6f756e74206d757374206265203e20306044820152606401610500565b6001600160a01b0382166000908152609c602052604090205460ff16156112905760405162461bcd60e51b815260206004820152601960248201527f47656e65736973436c61696d3a20616c726561647920736574000000000000006044820152606401610500565b6001600160a01b0382166112b65760405162461bcd60e51b8152600401610500906118c3565b6001600160a01b0382166000818152609b60209081526040808320859055609c825291829020805460ff1916600117905590518381527f4de45f6c76bbeb7a14efbe2f206ee9fb4e77a38116455071d1440020ff9e668d910160405180910390a25050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b609854600160a01b900460ff16156113c75760405162461bcd60e51b815260206004820152601a60248201527f47656e65736973436c61696d3a20616c7265616479206f70656e0000000000006044820152606401610500565b6098805460ff60a01b1916600160a01b179055426099556040517f95e16d3028fd61e822243bbb1266caad765710eae7087fad07c278251f7261c790600090a1565b6001600160a01b03811661142f5760405162461bcd60e51b8152600401610500906118c3565b6097546040516001600160a01b03918216918316907fec8a79cd46002f6dac5b781ad34a9e049fa874a5fad233d8c31417da39658bd090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b6114946110c0565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861113b3390565b600054610100900460ff166114f05760405162461bcd60e51b8152600401610500906118fa565b6107a06115b1565b600054610100900460ff1661151f5760405162461bcd60e51b8152600401610500906118fa565b6107a06115e1565b609a5460408051918252602082018390527f6a0ad56357709e2589a1c4a4a6745ba183f8b46681742c8244ffb735ff1d25ec910160405180910390a1609a55565b60655460ff166107a05760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610500565b600054610100900460ff166115d85760405162461bcd60e51b8152600401610500906118fa565b6107a03361131b565b600054610100900460ff166116085760405162461bcd60e51b8152600401610500906118fa565b6065805460ff19169055565b6001600160a01b03811681146106b457600080fd5b60006020828403121561163b57600080fd5b813561164681611614565b9392505050565b60008083601f84011261165f57600080fd5b50813567ffffffffffffffff81111561167757600080fd5b6020830191508360208260051b850101111561169257600080fd5b9250929050565b600080602083850312156116ac57600080fd5b823567ffffffffffffffff8111156116c357600080fd5b6116cf8582860161164d565b90969095509350505050565b600080600080604085870312156116f157600080fd5b843567ffffffffffffffff8082111561170957600080fd5b6117158883890161164d565b9096509450602087013591508082111561172e57600080fd5b5061173b8782880161164d565b95989497509550505050565b6000806040838503121561175a57600080fd5b823561176581611614565b946020939093013593505050565b80151581146106b457600080fd5b600080600080600060a0868803121561179957600080fd5b85356117a481611614565b945060208601356117b481611614565b935060408601356117c481611614565b92506060860135915060808601356117db81611773565b809150509295509295909350565b60208082526016908201527523b2b732b9b4b9a1b630b4b69d103737ba1037b832b760511b604082015260600190565b8082018082111561183a57634e487b7160e01b600052601160045260246000fd5b92915050565b60006020828403121561185257600080fd5b5051919050565b60006020828403121561186b57600080fd5b815161164681611773565b60208082526019908201527f47656e65736973436c61696d3a206f6e6c7920636c6971756500000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6020808252601d908201527f47656e65736973436c61696d3a206e6f207a65726f2061646472657373000000604082015260600190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b60608201526080019056fea264697066735822122090e883f2c75a3b54d2047335b2b4c9847d412faf260d0544f23cceb2f22fae4564736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000036e66fbbce51e4cd5bd3c62b637eb411b18949d4
-----Decoded View---------------
Arg [0] : token_ (address): 0x36E66fbBce51e4cD5bd3C62B637Eb411b18949D4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000036e66fbbce51e4cd5bd3c62b637eb411b18949d4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.