Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
7.903330603715662585 ETH
Eth Value
$25,009.78 (@ $3,164.46/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 10 from a total of 10 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 18064497 | 324 days ago | IN | 1.14 ETH | 0.00041213 | ||||
Transfer | 18064490 | 324 days ago | IN | 1.14276181 ETH | 0.00038344 | ||||
Transfer | 18006947 | 332 days ago | IN | 0.069 ETH | 0.00039213 | ||||
Transfer | 17929100 | 343 days ago | IN | 1.88 ETH | 0.00078379 | ||||
Transfer | 17929078 | 343 days ago | IN | 0.51 ETH | 0.00067884 | ||||
Transfer | 17929055 | 343 days ago | IN | 0.5148634 ETH | 0.00071218 | ||||
Transfer | 17929012 | 343 days ago | IN | 1.89062726 ETH | 0.00054874 | ||||
Transfer | 15956453 | 620 days ago | IN | 3.56 ETH | 0.00028468 | ||||
Transfer Ownersh... | 14847572 | 790 days ago | IN | 0 ETH | 0.00102534 | ||||
0x60806040 | 14847496 | 790 days ago | IN | 0 ETH | 0.04005064 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
19991610 | 54 days ago | 0.50719418 ETH | ||||
19733257 | 90 days ago | 0.59314485 ETH | ||||
19733257 | 90 days ago | 0.50997543 ETH | ||||
19733257 | 90 days ago | 0.60600192 ETH | ||||
19733256 | 90 days ago | 10 ETH | ||||
19574616 | 112 days ago | 0.50117872 ETH | ||||
19529872 | 119 days ago | 0.93243379 ETH | ||||
19529067 | 119 days ago | 0.95056878 ETH | ||||
19520297 | 120 days ago | 0.50132184 ETH | ||||
19519324 | 120 days ago | 0.60116816 ETH | ||||
19519324 | 120 days ago | 1 ETH | ||||
19519324 | 120 days ago | 1 ETH | ||||
19514413 | 121 days ago | 0.81598022 ETH | ||||
19475291 | 126 days ago | 0.50326087 ETH | ||||
19415934 | 135 days ago | 0.5008796 ETH | ||||
19413011 | 135 days ago | 0.51105982 ETH | ||||
19387947 | 139 days ago | 0.58654367 ETH | ||||
19380791 | 140 days ago | 0.50463078 ETH | ||||
19370751 | 141 days ago | 0.50627323 ETH | ||||
19362312 | 142 days ago | 0.54937037 ETH | ||||
19362295 | 142 days ago | 10 ETH | ||||
19327777 | 147 days ago | 0.50641998 ETH | ||||
19277731 | 154 days ago | 0.5021301 ETH | ||||
19261149 | 156 days ago | 0.50150159 ETH | ||||
19235891 | 160 days ago | 0.50624406 ETH |
Loading...
Loading
Contract Name:
GasStationExact
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.6; import "ConfirmedOwner.sol"; import "KeeperCompatibleInterface.sol"; import "Pausable.sol"; import "SafeERC20.sol"; /** * @title The GasStationExact Contract * @author gosuto.eth * @notice Custom implementation of Chainlink's EthBalanceMonitor. Ether * transferred is not limited anymore by topUpAmountWei, and a sweep function * makes it possible to retrieve ERC-20 tokens. */ contract GasStationExact is ConfirmedOwner, Pausable, KeeperCompatibleInterface { // observed limit of 45K + 10k buffer uint256 private constant MIN_GAS_FOR_TRANSFER = 55_000; event FundsAdded(uint256 amountAdded, uint256 newBalance, address sender); event FundsWithdrawn(uint256 amountWithdrawn, address payee); event TopUpSucceeded(address indexed recipient); event TopUpFailed(address indexed recipient); event KeeperRegistryAddressUpdated(address oldAddress, address newAddress); event MinWaitPeriodUpdated(uint256 oldMinWaitPeriod, uint256 newMinWaitPeriod); event ERC20Swept(address indexed token, address payee, uint256 amount); error InvalidWatchList(); error OnlyKeeperRegistry(); error DuplicateAddress(address duplicate); error ZeroAddress(); struct Target { bool isActive; uint96 minBalanceWei; uint96 minTopUpAmountWei; uint56 lastTopUpTimestamp; // enough space for 2 trillion years } address private s_keeperRegistryAddress; uint256 private s_minWaitPeriodSeconds; address[] private s_watchList; mapping(address => Target) internal s_targets; /** * @param keeperRegistryAddress The address of the keeper registry contract * @param minWaitPeriodSeconds The minimum wait period for addresses between funding */ constructor(address keeperRegistryAddress, uint256 minWaitPeriodSeconds) ConfirmedOwner(msg.sender) { setKeeperRegistryAddress(keeperRegistryAddress); setMinWaitPeriodSeconds(minWaitPeriodSeconds); } /** * @notice Sets the list of addresses to watch and their funding parameters * @param addresses the list of addresses to watch * @param minBalancesWei the minimum balances for each address * @param topUpAmountsWei the amount to top up each address */ function setWatchList( address[] calldata addresses, uint96[] calldata minBalancesWei, uint96[] calldata topUpAmountsWei ) external onlyOwner { if (addresses.length != minBalancesWei.length || addresses.length != topUpAmountsWei.length) { revert InvalidWatchList(); } address[] memory oldWatchList = s_watchList; for (uint256 idx = 0; idx < oldWatchList.length; idx++) { s_targets[oldWatchList[idx]].isActive = false; } for (uint256 idx = 0; idx < addresses.length; idx++) { if (s_targets[addresses[idx]].isActive) { revert DuplicateAddress(addresses[idx]); } if (addresses[idx] == address(0)) { revert InvalidWatchList(); } if (topUpAmountsWei[idx] == 0) { revert InvalidWatchList(); } s_targets[addresses[idx]] = Target({ isActive: true, minBalanceWei: minBalancesWei[idx], minTopUpAmountWei: topUpAmountsWei[idx], lastTopUpTimestamp: 0 }); } s_watchList = addresses; } /** * @notice Gets a list of addresses that are under funded * @return list of addresses that are underfunded */ function getUnderfundedAddresses() public view returns (address[] memory) { address[] memory watchList = s_watchList; address[] memory needsFunding = new address[](watchList.length); uint256 count = 0; uint256 minWaitPeriod = s_minWaitPeriodSeconds; uint256 balance = address(this).balance; Target memory target; for (uint256 idx = 0; idx < watchList.length; idx++) { target = s_targets[watchList[idx]]; if (watchList[idx].balance < target.minBalanceWei) { uint256 delta = target.minBalanceWei - watchList[idx].balance; if ( target.lastTopUpTimestamp + minWaitPeriod <= block.timestamp && balance >= delta && delta >= target.minTopUpAmountWei ) { needsFunding[count] = watchList[idx]; count++; balance -= delta; } } } if (count != watchList.length) { assembly { mstore(needsFunding, count) } } return needsFunding; } /** * @notice Send funds to the addresses provided * @param needsFunding the list of addresses to fund (addresses must be pre-approved) */ function topUpExact(address[] memory needsFunding) public whenNotPaused { uint256 minWaitPeriodSeconds = s_minWaitPeriodSeconds; Target memory target; for (uint256 idx = 0; idx < needsFunding.length; idx++) { target = s_targets[needsFunding[idx]]; uint256 delta = target.minBalanceWei - needsFunding[idx].balance; if ( target.isActive && target.lastTopUpTimestamp + minWaitPeriodSeconds <= block.timestamp && delta >= target.minTopUpAmountWei ) { bool success = payable(needsFunding[idx]).send(delta); if (success) { s_targets[needsFunding[idx]].lastTopUpTimestamp = uint56(block.timestamp); emit TopUpSucceeded(needsFunding[idx]); } else { emit TopUpFailed(needsFunding[idx]); } } if (gasleft() < MIN_GAS_FOR_TRANSFER) { return; } } } /** * @notice Get list of addresses that are underfunded and return keeper-compatible payload * @return upkeepNeeded signals if upkeep is needed, performData is an abi encoded list of addresses that need funds */ function checkUpkeep(bytes calldata) external view override whenNotPaused returns (bool upkeepNeeded, bytes memory performData) { address[] memory needsFunding = getUnderfundedAddresses(); upkeepNeeded = needsFunding.length > 0; performData = abi.encode(needsFunding); return (upkeepNeeded, performData); } /** * @notice Called by keeper to send funds to underfunded addresses * @param performData The abi encoded list of addresses to fund */ function performUpkeep(bytes calldata performData) external override onlyKeeperRegistry whenNotPaused { address[] memory needsFunding = abi.decode(performData, (address[])); topUpExact(needsFunding); } /** * @notice Withdraws the contract balance * @param amount The amount of eth (in wei) to withdraw * @param payee The address to pay */ function withdraw(uint256 amount, address payable payee) external onlyOwner { if (payee == address(0)) { revert ZeroAddress(); } emit FundsWithdrawn(amount, payee); payee.transfer(amount); } /** * @notice Sweep the full contract's balance for a given ERC-20 token * @param token The ERC-20 token which needs to be swept * @param payee The address to pay */ function sweep(address token, address payee) external onlyOwner { uint256 balance = IERC20(token).balanceOf(address(this)); emit ERC20Swept(token, payee, balance); SafeERC20.safeTransfer(IERC20(token), payee, balance); } /** * @notice Receive funds */ receive() external payable { emit FundsAdded(msg.value, address(this).balance, msg.sender); } /** * @notice Sets the keeper registry address */ function setKeeperRegistryAddress(address keeperRegistryAddress) public onlyOwner { emit KeeperRegistryAddressUpdated(s_keeperRegistryAddress, keeperRegistryAddress); s_keeperRegistryAddress = keeperRegistryAddress; } /** * @notice Sets the minimum wait period (in seconds) for addresses between funding */ function setMinWaitPeriodSeconds(uint256 period) public onlyOwner { emit MinWaitPeriodUpdated(s_minWaitPeriodSeconds, period); s_minWaitPeriodSeconds = period; } /** * @notice Gets the keeper registry address */ function getKeeperRegistryAddress() external view returns (address keeperRegistryAddress) { return s_keeperRegistryAddress; } /** * @notice Gets the minimum wait period */ function getMinWaitPeriodSeconds() external view returns (uint256) { return s_minWaitPeriodSeconds; } /** * @notice Gets the list of addresses being watched */ function getWatchList() external view returns (address[] memory) { return s_watchList; } /** * @notice Gets configuration information for an address on the watchlist */ function getAccountInfo(address targetAddress) external view returns ( bool isActive, uint96 minBalanceWei, uint96 minTopUpAmountWei, uint56 lastTopUpTimestamp ) { Target memory target = s_targets[targetAddress]; return (target.isActive, target.minBalanceWei, target.minTopUpAmountWei, target.lastTopUpTimestamp); } /** * @notice Pauses the contract, which prevents executing performUpkeep */ function pause() external onlyOwner { _pause(); } /** * @notice Unpauses the contract */ function unpause() external onlyOwner { _unpause(); } modifier onlyKeeperRegistry() { if (msg.sender != s_keeperRegistryAddress) { revert OnlyKeeperRegistry(); } _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "ConfirmedOwnerWithProposal.sol"; /** * @title The ConfirmedOwner contract * @notice A contract with helpers for basic contract ownership. */ contract ConfirmedOwner is ConfirmedOwnerWithProposal { constructor(address newOwner) ConfirmedOwnerWithProposal(newOwner, address(0)) {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "OwnableInterface.sol"; /** * @title The ConfirmedOwner contract * @notice A contract with helpers for basic contract ownership. */ contract ConfirmedOwnerWithProposal is OwnableInterface { address private s_owner; address private s_pendingOwner; event OwnershipTransferRequested(address indexed from, address indexed to); event OwnershipTransferred(address indexed from, address indexed to); constructor(address newOwner, address pendingOwner) { require(newOwner != address(0), "Cannot set owner to zero"); s_owner = newOwner; if (pendingOwner != address(0)) { _transferOwnership(pendingOwner); } } /** * @notice Allows an owner to begin transferring ownership to a new address, * pending. */ function transferOwnership(address to) public override onlyOwner { _transferOwnership(to); } /** * @notice Allows an ownership transfer to be completed by the recipient. */ function acceptOwnership() external override { require(msg.sender == s_pendingOwner, "Must be proposed owner"); address oldOwner = s_owner; s_owner = msg.sender; s_pendingOwner = address(0); emit OwnershipTransferred(oldOwner, msg.sender); } /** * @notice Get the current owner */ function owner() public view override returns (address) { return s_owner; } /** * @notice validate, transfer ownership, and emit relevant events */ function _transferOwnership(address to) private { require(to != msg.sender, "Cannot transfer to self"); s_pendingOwner = to; emit OwnershipTransferRequested(s_owner, to); } /** * @notice validate access */ function _validateOwnership() internal view { require(msg.sender == s_owner, "Only callable by owner"); } /** * @notice Reverts if called by anyone other than the contract owner. */ modifier onlyOwner() { _validateOwnership(); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface OwnableInterface { function owner() external returns (address); function transferOwnership(address recipient) external; function acceptOwnership() external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface KeeperCompatibleInterface { /** * @notice method that is simulated by the keepers to see if any work actually * needs to be performed. This method does does not actually need to be * executable, and since it is only ever simulated it can consume lots of gas. * @dev To ensure that it is never called, you may want to add the * cannotExecute modifier from KeeperBase to your implementation of this * method. * @param checkData specified in the upkeep registration so it is always the * same for a registered upkeep. This can easily be broken down into specific * arguments using `abi.decode`, so multiple upkeeps can be registered on the * same contract and easily differentiated by the contract. * @return upkeepNeeded boolean to indicate whether the keeper should call * performUpkeep or not. * @return performData bytes that the keeper should call performUpkeep with, if * upkeep is needed. If you would like to encode data to decode later, try * `abi.encode`. */ function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData); /** * @notice method that is actually executed by the keepers, via the registry. * The data returned by the checkUpkeep simulation will be passed into * this method to actually be executed. * @dev The input to this method should not be trusted, and the caller of the * method should not even be restricted to any single registry. Anyone should * be able call it, and the input should be validated, there is no guarantee * that the data passed in is the performData returned from checkUpkeep. This * could happen due to malicious keepers, racing keepers, or simply a state * change while the performUpkeep transaction is waiting for confirmation. * Always validate the data passed in. * @param performData is the data which was passed back from the checkData * simulation. If it is encoded, it can easily be decoded into other types by * calling `abi.decode`. This data should not be trusted, and should be * validated against the contract's current state. */ function performUpkeep(bytes calldata performData) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "Context.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 Pausable is Context { /** * @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. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { 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()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "IERC20.sol"; import "Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @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 * ==== * * [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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"keeperRegistryAddress","type":"address"},{"internalType":"uint256","name":"minWaitPeriodSeconds","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"duplicate","type":"address"}],"name":"DuplicateAddress","type":"error"},{"inputs":[],"name":"InvalidWatchList","type":"error"},{"inputs":[],"name":"OnlyKeeperRegistry","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"payee","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Swept","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountAdded","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"FundsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountWithdrawn","type":"uint256"},{"indexed":false,"internalType":"address","name":"payee","type":"address"}],"name":"FundsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"KeeperRegistryAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMinWaitPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMinWaitPeriod","type":"uint256"}],"name":"MinWaitPeriodUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","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":"recipient","type":"address"}],"name":"TopUpFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"TopUpSucceeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"performData","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint96","name":"minBalanceWei","type":"uint96"},{"internalType":"uint96","name":"minTopUpAmountWei","type":"uint96"},{"internalType":"uint56","name":"lastTopUpTimestamp","type":"uint56"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getKeeperRegistryAddress","outputs":[{"internalType":"address","name":"keeperRegistryAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinWaitPeriodSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnderfundedAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWatchList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"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":[{"internalType":"bytes","name":"performData","type":"bytes"}],"name":"performUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"keeperRegistryAddress","type":"address"}],"name":"setKeeperRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setMinWaitPeriodSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint96[]","name":"minBalancesWei","type":"uint96[]"},{"internalType":"uint96[]","name":"topUpAmountsWei","type":"uint96[]"}],"name":"setWatchList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"payee","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"needsFunding","type":"address[]"}],"name":"topUpExact","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"payee","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001f6338038062001f638339810160408190526200003491620002b4565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000ec565b50506001805460ff60a01b1916905550620000d98262000198565b620000e4816200020b565b5050620002f0565b6001600160a01b038116331415620001475760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b620001a262000256565b600254604080516001600160a01b03928316815291831660208301527fb732223055abcde751d7a24272ffc8a3aa571cb72b443969a4199b7ecd59f8b9910160405180910390a1600280546001600160a01b0319166001600160a01b0392909216919091179055565b6200021562000256565b60035460408051918252602082018390527f04330086c73b1fe1e13cd47a61c692e7c4399b5de08ed94b7ab824684af09323910160405180910390a1600355565b6000546001600160a01b03163314620002b25760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000082565b565b60008060408385031215620002c857600080fd5b82516001600160a01b0381168114620002e057600080fd5b6020939093015192949293505050565b611c6380620003006000396000f3fe6080604052600436106101175760003560e01c8063728584b7116100a05780638da5cb5b116100645780638da5cb5b146103d157806394555114146103ef578063b1d52fa01461040f578063b8dc491b1461042f578063f2fde38b1461044f57600080fd5b8063728584b71461029957806379ba5097146102ae5780637b510fe8146102c3578063810623e31461038a5780638456cb59146103bc57600080fd5b80633f85861f116100e75780633f85861f146101e357806341d2052e146102035780634585e33b146102215780635c975abb146102415780636e04ff0d1461026b57600080fd5b8062f714ce146101615780630b67ddce146101835780630d9fbeca146101ae5780633f4ba83a146101ce57600080fd5b3661015c5760408051348152476020820152338183015290517fc6f3fb0fec49e4877342d4625d77a632541f55b7aae0f9d0b34c69b3478706dc9181900360600190a1005b600080fd5b34801561016d57600080fd5b5061018161017c366004611a25565b61046f565b005b34801561018f57600080fd5b5061019861051a565b6040516101a59190611abb565b60405180910390f35b3480156101ba57600080fd5b506101816101c9366004611893565b6107c2565b3480156101da57600080fd5b50610181610abe565b3480156101ef57600080fd5b506101816101fe3660046119f3565b610ad0565b34801561020f57600080fd5b506003546040519081526020016101a5565b34801561022d57600080fd5b5061018161023c366004611981565b610b19565b34801561024d57600080fd5b50600154600160a01b900460ff1660405190151581526020016101a5565b34801561027757600080fd5b5061028b610286366004611981565b610b87565b6040516101a5929190611b08565b3480156102a557600080fd5b50610198610bfa565b3480156102ba57600080fd5b50610181610c5c565b3480156102cf57600080fd5b5061034f6102de3660046117a3565b6001600160a01b03166000908152600560209081526040918290208251608081018452905460ff8116151580835261010082046001600160601b03908116948401859052600160681b830416948301859052600160c81b90910466ffffffffffffff16606090920182905293919291565b6040516101a5949392919093151584526001600160601b0392831660208501529116604083015266ffffffffffffff16606082015260800190565b34801561039657600080fd5b506002546001600160a01b03165b6040516001600160a01b0390911681526020016101a5565b3480156103c857600080fd5b50610181610d06565b3480156103dd57600080fd5b506000546001600160a01b03166103a4565b3480156103fb57600080fd5b5061018161040a3660046117a3565b610d16565b34801561041b57600080fd5b5061018161042a3660046117f9565b610d87565b34801561043b57600080fd5b5061018161044a3660046117c0565b611148565b34801561045b57600080fd5b5061018161046a3660046117a3565b61121f565b610477611230565b6001600160a01b03811661049e5760405163d92e233d60e01b815260040160405180910390fd5b604080518381526001600160a01b03831660208201527f6141b54b56b8a52a8c6f5cd2a857f6117b18ffbf4d46bd3106f300a839cbf5ea910160405180910390a16040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610515573d6000803e3d6000fd5b505050565b60606000600480548060200260200160405190810160405280929190818152602001828054801561057457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610556575b505050505090506000815167ffffffffffffffff81111561059757610597611c02565b6040519080825280602002602001820160405280156105c0578160200160208202803683370190505b50600354604080516080810182526000808252602082018190529181018290526060810182905292935091479060005b86518110156107aa576005600088838151811061060f5761060f611bec565b6020908102919091018101516001600160a01b031682528181019290925260409081016000208151608081018352905460ff81161515825261010081046001600160601b03908116948301859052600160681b82041692820192909252600160c81b90910466ffffffffffffff166060820152885190935088908390811061069957610699611bec565b60200260200101516001600160a01b03163110156107985760008782815181106106c5576106c5611bec565b60200260200101516001600160a01b03163183602001516001600160601b03166106ef9190611b78565b90504285846060015166ffffffffffffff1661070b9190611b60565b111580156107195750808410155b8015610732575082604001516001600160601b03168110155b156107965787828151811061074957610749611bec565b602002602001015187878151811061076357610763611bec565b6001600160a01b03909216602092830291909101909101528561078581611bbb565b965061079390508185611b78565b93505b505b806107a281611bbb565b9150506105f0565b50855184146107b7578385525b509295945050505050565b600154600160a01b900460ff16156107f55760405162461bcd60e51b81526004016107ec90611b36565b60405180910390fd5b6003546040805160808101825260008082526020820181905291810182905260608101829052905b8351811015610ab7576005600085838151811061083c5761083c611bec565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081208251608081018452905460ff81161515825261010081046001600160601b0390811695830195909552600160681b810490941692810192909252600160c81b90920466ffffffffffffff16606082015285519093508590839081106108cb576108cb611bec565b60200260200101516001600160a01b03163183602001516001600160601b03166108f59190611b78565b8351909150801561091e57504284846060015166ffffffffffffff1661091b9190611b60565b11155b8015610937575082604001516001600160601b03168110155b15610a9357600085838151811061095057610950611bec565b60200260200101516001600160a01b03166108fc839081150290604051600060405180830381858888f1935050505090508015610a4157426005600088868151811061099e5761099e611bec565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060000160196101000a81548166ffffffffffffff021916908366ffffffffffffff1602179055508583815181106109ff576109ff611bec565b60200260200101516001600160a01b03167f9eec55c371a49ce19e0a5792787c79b32dcf7d3490aa737436b49c0978ce9ce960405160405180910390a2610a91565b858381518110610a5357610a53611bec565b60200260200101516001600160a01b03167fa9ff7a9b96721b0e16adb7de9db0764fbfd6a4516d4d165f9564e8c3755eb10560405160405180910390a25b505b61d6d85a1015610aa4575050505050565b5080610aaf81611bbb565b91505061081d565b5050505b50565b610ac6611230565b610ace611283565b565b610ad8611230565b60035460408051918252602082018390527f04330086c73b1fe1e13cd47a61c692e7c4399b5de08ed94b7ab824684af09323910160405180910390a1600355565b6002546001600160a01b03163314610b44576040516334e9a00d60e21b815260040160405180910390fd5b600154600160a01b900460ff1615610b6e5760405162461bcd60e51b81526004016107ec90611b36565b6000610b7c82840184611893565b9050610515816107c2565b60006060610b9f60015460ff600160a01b9091041690565b15610bbc5760405162461bcd60e51b81526004016107ec90611b36565b6000610bc661051a565b90506000815111925080604051602001610be09190611abb565b6040516020818303038152906040529150505b9250929050565b60606004805480602002602001604051908101604052809291908181526020018280548015610c5257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c34575b5050505050905090565b6001546001600160a01b03163314610caf5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b60448201526064016107ec565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d0e611230565b610ace611320565b610d1e611230565b600254604080516001600160a01b03928316815291831660208301527fb732223055abcde751d7a24272ffc8a3aa571cb72b443969a4199b7ecd59f8b9910160405180910390a1600280546001600160a01b0319166001600160a01b0392909216919091179055565b610d8f611230565b8483141580610d9e5750848114155b15610dbc57604051631c34ddf360e11b815260040160405180910390fd5b60006004805480602002602001604051908101604052809291908181526020018280548015610e1457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610df6575b5050505050905060005b8151811015610e8357600060056000848481518110610e3f57610e3f611bec565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610e7b81611bbb565b915050610e1e565b5060005b868110156111315760056000898984818110610ea557610ea5611bec565b9050602002016020810190610eba91906117a3565b6001600160a01b0316815260208101919091526040016000205460ff1615610f2857878782818110610eee57610eee611bec565b9050602002016020810190610f0391906117a3565b604051639f2277f360e01b81526001600160a01b0390911660048201526024016107ec565b6000888883818110610f3c57610f3c611bec565b9050602002016020810190610f5191906117a3565b6001600160a01b03161415610f7957604051631c34ddf360e11b815260040160405180910390fd5b838382818110610f8b57610f8b611bec565b9050602002016020810190610fa09190611a4a565b6001600160601b0316610fc657604051631c34ddf360e11b815260040160405180910390fd5b6040518060800160405280600115158152602001878784818110610fec57610fec611bec565b90506020020160208101906110019190611a4a565b6001600160601b0316815260200185858481811061102157611021611bec565b90506020020160208101906110369190611a4a565b6001600160601b03168152602001600066ffffffffffffff16815250600560008a8a8581811061106857611068611bec565b905060200201602081019061107d91906117a3565b6001600160a01b03168152602080820192909252604090810160002083518154938501519285015160609095015166ffffffffffffff16600160c81b026001600160c81b036001600160601b03968716600160681b02166cffffffffffffffffffffffffff96909416610100026cffffffffffffffffffffffff0019921515929092166cffffffffffffffffffffffffff19909516949094171793909316171790558061112981611bbb565b915050610e87565b5061113e600488886116d6565b5050505050505050565b611150611230565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b15801561119257600080fd5b505afa1580156111a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ca9190611a0c565b604080516001600160a01b03858116825260208201849052929350918516917f17ebca81c5f7ed9c553f76ca3f4a03b93af7d9ea1f3348a879306375452ca46f910160405180910390a2610515838383611385565b611227611230565b610abb816113d7565b6000546001600160a01b03163314610ace5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b60448201526064016107ec565b600154600160a01b900460ff166112d35760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107ec565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600154600160a01b900460ff161561134a5760405162461bcd60e51b81526004016107ec90611b36565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113033390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610515908490611481565b6001600160a01b0381163314156114305760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107ec565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006114d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115539092919063ffffffff16565b80519091501561051557808060200190518101906114f4919061195f565b6105155760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107ec565b6060611562848460008561156c565b90505b9392505050565b6060824710156115cd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107ec565b6001600160a01b0385163b6116245760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107ec565b600080866001600160a01b031685876040516116409190611a9f565b60006040518083038185875af1925050503d806000811461167d576040519150601f19603f3d011682016040523d82523d6000602084013e611682565b606091505b509150915061169282828661169d565b979650505050505050565b606083156116ac575081611565565b8251156116bc5782518084602001fd5b8160405162461bcd60e51b81526004016107ec9190611b23565b828054828255906000526020600020908101928215611729579160200282015b828111156117295781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906116f6565b50611735929150611739565b5090565b5b80821115611735576000815560010161173a565b803561175981611c18565b919050565b60008083601f84011261177057600080fd5b50813567ffffffffffffffff81111561178857600080fd5b6020830191508360208260051b8501011115610bf357600080fd5b6000602082840312156117b557600080fd5b813561156581611c18565b600080604083850312156117d357600080fd5b82356117de81611c18565b915060208301356117ee81611c18565b809150509250929050565b6000806000806000806060878903121561181257600080fd5b863567ffffffffffffffff8082111561182a57600080fd5b6118368a838b0161175e565b9098509650602089013591508082111561184f57600080fd5b61185b8a838b0161175e565b9096509450604089013591508082111561187457600080fd5b5061188189828a0161175e565b979a9699509497509295939492505050565b600060208083850312156118a657600080fd5b823567ffffffffffffffff808211156118be57600080fd5b818501915085601f8301126118d257600080fd5b8135818111156118e4576118e4611c02565b8060051b604051601f19603f8301168101818110858211171561190957611909611c02565b604052828152858101935084860182860187018a101561192857600080fd5b600095505b838610156119525761193e8161174e565b85526001959095019493860193860161192d565b5098975050505050505050565b60006020828403121561197157600080fd5b8151801515811461156557600080fd5b6000806020838503121561199457600080fd5b823567ffffffffffffffff808211156119ac57600080fd5b818501915085601f8301126119c057600080fd5b8135818111156119cf57600080fd5b8660208285010111156119e157600080fd5b60209290920196919550909350505050565b600060208284031215611a0557600080fd5b5035919050565b600060208284031215611a1e57600080fd5b5051919050565b60008060408385031215611a3857600080fd5b8235915060208301356117ee81611c18565b600060208284031215611a5c57600080fd5b81356001600160601b038116811461156557600080fd5b60008151808452611a8b816020860160208601611b8f565b601f01601f19169290920160200192915050565b60008251611ab1818460208701611b8f565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b81811015611afc5783516001600160a01b031683529284019291840191600101611ad7565b50909695505050505050565b82151581526040602082015260006115626040830184611a73565b6020815260006115656020830184611a73565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60008219821115611b7357611b73611bd6565b500190565b600082821015611b8a57611b8a611bd6565b500390565b60005b83811015611baa578181015183820152602001611b92565b83811115610ab75750506000910152565b6000600019821415611bcf57611bcf611bd6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610abb57600080fdfea2646970667358221220e5e8427ef7c8cf49214ba9ffffc7dda43eda8c282423f2df90c4fb4ccd3a714064736f6c634300080600330000000000000000000000007b3ec232b08bd7b4b3305be0c044d907b2df960b0000000000000000000000000000000000000000000000000000000000015180
Deployed Bytecode
0x6080604052600436106101175760003560e01c8063728584b7116100a05780638da5cb5b116100645780638da5cb5b146103d157806394555114146103ef578063b1d52fa01461040f578063b8dc491b1461042f578063f2fde38b1461044f57600080fd5b8063728584b71461029957806379ba5097146102ae5780637b510fe8146102c3578063810623e31461038a5780638456cb59146103bc57600080fd5b80633f85861f116100e75780633f85861f146101e357806341d2052e146102035780634585e33b146102215780635c975abb146102415780636e04ff0d1461026b57600080fd5b8062f714ce146101615780630b67ddce146101835780630d9fbeca146101ae5780633f4ba83a146101ce57600080fd5b3661015c5760408051348152476020820152338183015290517fc6f3fb0fec49e4877342d4625d77a632541f55b7aae0f9d0b34c69b3478706dc9181900360600190a1005b600080fd5b34801561016d57600080fd5b5061018161017c366004611a25565b61046f565b005b34801561018f57600080fd5b5061019861051a565b6040516101a59190611abb565b60405180910390f35b3480156101ba57600080fd5b506101816101c9366004611893565b6107c2565b3480156101da57600080fd5b50610181610abe565b3480156101ef57600080fd5b506101816101fe3660046119f3565b610ad0565b34801561020f57600080fd5b506003546040519081526020016101a5565b34801561022d57600080fd5b5061018161023c366004611981565b610b19565b34801561024d57600080fd5b50600154600160a01b900460ff1660405190151581526020016101a5565b34801561027757600080fd5b5061028b610286366004611981565b610b87565b6040516101a5929190611b08565b3480156102a557600080fd5b50610198610bfa565b3480156102ba57600080fd5b50610181610c5c565b3480156102cf57600080fd5b5061034f6102de3660046117a3565b6001600160a01b03166000908152600560209081526040918290208251608081018452905460ff8116151580835261010082046001600160601b03908116948401859052600160681b830416948301859052600160c81b90910466ffffffffffffff16606090920182905293919291565b6040516101a5949392919093151584526001600160601b0392831660208501529116604083015266ffffffffffffff16606082015260800190565b34801561039657600080fd5b506002546001600160a01b03165b6040516001600160a01b0390911681526020016101a5565b3480156103c857600080fd5b50610181610d06565b3480156103dd57600080fd5b506000546001600160a01b03166103a4565b3480156103fb57600080fd5b5061018161040a3660046117a3565b610d16565b34801561041b57600080fd5b5061018161042a3660046117f9565b610d87565b34801561043b57600080fd5b5061018161044a3660046117c0565b611148565b34801561045b57600080fd5b5061018161046a3660046117a3565b61121f565b610477611230565b6001600160a01b03811661049e5760405163d92e233d60e01b815260040160405180910390fd5b604080518381526001600160a01b03831660208201527f6141b54b56b8a52a8c6f5cd2a857f6117b18ffbf4d46bd3106f300a839cbf5ea910160405180910390a16040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610515573d6000803e3d6000fd5b505050565b60606000600480548060200260200160405190810160405280929190818152602001828054801561057457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610556575b505050505090506000815167ffffffffffffffff81111561059757610597611c02565b6040519080825280602002602001820160405280156105c0578160200160208202803683370190505b50600354604080516080810182526000808252602082018190529181018290526060810182905292935091479060005b86518110156107aa576005600088838151811061060f5761060f611bec565b6020908102919091018101516001600160a01b031682528181019290925260409081016000208151608081018352905460ff81161515825261010081046001600160601b03908116948301859052600160681b82041692820192909252600160c81b90910466ffffffffffffff166060820152885190935088908390811061069957610699611bec565b60200260200101516001600160a01b03163110156107985760008782815181106106c5576106c5611bec565b60200260200101516001600160a01b03163183602001516001600160601b03166106ef9190611b78565b90504285846060015166ffffffffffffff1661070b9190611b60565b111580156107195750808410155b8015610732575082604001516001600160601b03168110155b156107965787828151811061074957610749611bec565b602002602001015187878151811061076357610763611bec565b6001600160a01b03909216602092830291909101909101528561078581611bbb565b965061079390508185611b78565b93505b505b806107a281611bbb565b9150506105f0565b50855184146107b7578385525b509295945050505050565b600154600160a01b900460ff16156107f55760405162461bcd60e51b81526004016107ec90611b36565b60405180910390fd5b6003546040805160808101825260008082526020820181905291810182905260608101829052905b8351811015610ab7576005600085838151811061083c5761083c611bec565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081208251608081018452905460ff81161515825261010081046001600160601b0390811695830195909552600160681b810490941692810192909252600160c81b90920466ffffffffffffff16606082015285519093508590839081106108cb576108cb611bec565b60200260200101516001600160a01b03163183602001516001600160601b03166108f59190611b78565b8351909150801561091e57504284846060015166ffffffffffffff1661091b9190611b60565b11155b8015610937575082604001516001600160601b03168110155b15610a9357600085838151811061095057610950611bec565b60200260200101516001600160a01b03166108fc839081150290604051600060405180830381858888f1935050505090508015610a4157426005600088868151811061099e5761099e611bec565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060000160196101000a81548166ffffffffffffff021916908366ffffffffffffff1602179055508583815181106109ff576109ff611bec565b60200260200101516001600160a01b03167f9eec55c371a49ce19e0a5792787c79b32dcf7d3490aa737436b49c0978ce9ce960405160405180910390a2610a91565b858381518110610a5357610a53611bec565b60200260200101516001600160a01b03167fa9ff7a9b96721b0e16adb7de9db0764fbfd6a4516d4d165f9564e8c3755eb10560405160405180910390a25b505b61d6d85a1015610aa4575050505050565b5080610aaf81611bbb565b91505061081d565b5050505b50565b610ac6611230565b610ace611283565b565b610ad8611230565b60035460408051918252602082018390527f04330086c73b1fe1e13cd47a61c692e7c4399b5de08ed94b7ab824684af09323910160405180910390a1600355565b6002546001600160a01b03163314610b44576040516334e9a00d60e21b815260040160405180910390fd5b600154600160a01b900460ff1615610b6e5760405162461bcd60e51b81526004016107ec90611b36565b6000610b7c82840184611893565b9050610515816107c2565b60006060610b9f60015460ff600160a01b9091041690565b15610bbc5760405162461bcd60e51b81526004016107ec90611b36565b6000610bc661051a565b90506000815111925080604051602001610be09190611abb565b6040516020818303038152906040529150505b9250929050565b60606004805480602002602001604051908101604052809291908181526020018280548015610c5257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c34575b5050505050905090565b6001546001600160a01b03163314610caf5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b60448201526064016107ec565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d0e611230565b610ace611320565b610d1e611230565b600254604080516001600160a01b03928316815291831660208301527fb732223055abcde751d7a24272ffc8a3aa571cb72b443969a4199b7ecd59f8b9910160405180910390a1600280546001600160a01b0319166001600160a01b0392909216919091179055565b610d8f611230565b8483141580610d9e5750848114155b15610dbc57604051631c34ddf360e11b815260040160405180910390fd5b60006004805480602002602001604051908101604052809291908181526020018280548015610e1457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610df6575b5050505050905060005b8151811015610e8357600060056000848481518110610e3f57610e3f611bec565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610e7b81611bbb565b915050610e1e565b5060005b868110156111315760056000898984818110610ea557610ea5611bec565b9050602002016020810190610eba91906117a3565b6001600160a01b0316815260208101919091526040016000205460ff1615610f2857878782818110610eee57610eee611bec565b9050602002016020810190610f0391906117a3565b604051639f2277f360e01b81526001600160a01b0390911660048201526024016107ec565b6000888883818110610f3c57610f3c611bec565b9050602002016020810190610f5191906117a3565b6001600160a01b03161415610f7957604051631c34ddf360e11b815260040160405180910390fd5b838382818110610f8b57610f8b611bec565b9050602002016020810190610fa09190611a4a565b6001600160601b0316610fc657604051631c34ddf360e11b815260040160405180910390fd5b6040518060800160405280600115158152602001878784818110610fec57610fec611bec565b90506020020160208101906110019190611a4a565b6001600160601b0316815260200185858481811061102157611021611bec565b90506020020160208101906110369190611a4a565b6001600160601b03168152602001600066ffffffffffffff16815250600560008a8a8581811061106857611068611bec565b905060200201602081019061107d91906117a3565b6001600160a01b03168152602080820192909252604090810160002083518154938501519285015160609095015166ffffffffffffff16600160c81b026001600160c81b036001600160601b03968716600160681b02166cffffffffffffffffffffffffff96909416610100026cffffffffffffffffffffffff0019921515929092166cffffffffffffffffffffffffff19909516949094171793909316171790558061112981611bbb565b915050610e87565b5061113e600488886116d6565b5050505050505050565b611150611230565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b15801561119257600080fd5b505afa1580156111a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ca9190611a0c565b604080516001600160a01b03858116825260208201849052929350918516917f17ebca81c5f7ed9c553f76ca3f4a03b93af7d9ea1f3348a879306375452ca46f910160405180910390a2610515838383611385565b611227611230565b610abb816113d7565b6000546001600160a01b03163314610ace5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b60448201526064016107ec565b600154600160a01b900460ff166112d35760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107ec565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600154600160a01b900460ff161561134a5760405162461bcd60e51b81526004016107ec90611b36565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113033390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610515908490611481565b6001600160a01b0381163314156114305760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107ec565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006114d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115539092919063ffffffff16565b80519091501561051557808060200190518101906114f4919061195f565b6105155760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107ec565b6060611562848460008561156c565b90505b9392505050565b6060824710156115cd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107ec565b6001600160a01b0385163b6116245760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107ec565b600080866001600160a01b031685876040516116409190611a9f565b60006040518083038185875af1925050503d806000811461167d576040519150601f19603f3d011682016040523d82523d6000602084013e611682565b606091505b509150915061169282828661169d565b979650505050505050565b606083156116ac575081611565565b8251156116bc5782518084602001fd5b8160405162461bcd60e51b81526004016107ec9190611b23565b828054828255906000526020600020908101928215611729579160200282015b828111156117295781546001600160a01b0319166001600160a01b038435161782556020909201916001909101906116f6565b50611735929150611739565b5090565b5b80821115611735576000815560010161173a565b803561175981611c18565b919050565b60008083601f84011261177057600080fd5b50813567ffffffffffffffff81111561178857600080fd5b6020830191508360208260051b8501011115610bf357600080fd5b6000602082840312156117b557600080fd5b813561156581611c18565b600080604083850312156117d357600080fd5b82356117de81611c18565b915060208301356117ee81611c18565b809150509250929050565b6000806000806000806060878903121561181257600080fd5b863567ffffffffffffffff8082111561182a57600080fd5b6118368a838b0161175e565b9098509650602089013591508082111561184f57600080fd5b61185b8a838b0161175e565b9096509450604089013591508082111561187457600080fd5b5061188189828a0161175e565b979a9699509497509295939492505050565b600060208083850312156118a657600080fd5b823567ffffffffffffffff808211156118be57600080fd5b818501915085601f8301126118d257600080fd5b8135818111156118e4576118e4611c02565b8060051b604051601f19603f8301168101818110858211171561190957611909611c02565b604052828152858101935084860182860187018a101561192857600080fd5b600095505b838610156119525761193e8161174e565b85526001959095019493860193860161192d565b5098975050505050505050565b60006020828403121561197157600080fd5b8151801515811461156557600080fd5b6000806020838503121561199457600080fd5b823567ffffffffffffffff808211156119ac57600080fd5b818501915085601f8301126119c057600080fd5b8135818111156119cf57600080fd5b8660208285010111156119e157600080fd5b60209290920196919550909350505050565b600060208284031215611a0557600080fd5b5035919050565b600060208284031215611a1e57600080fd5b5051919050565b60008060408385031215611a3857600080fd5b8235915060208301356117ee81611c18565b600060208284031215611a5c57600080fd5b81356001600160601b038116811461156557600080fd5b60008151808452611a8b816020860160208601611b8f565b601f01601f19169290920160200192915050565b60008251611ab1818460208701611b8f565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b81811015611afc5783516001600160a01b031683529284019291840191600101611ad7565b50909695505050505050565b82151581526040602082015260006115626040830184611a73565b6020815260006115656020830184611a73565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60008219821115611b7357611b73611bd6565b500190565b600082821015611b8a57611b8a611bd6565b500390565b60005b83811015611baa578181015183820152602001611b92565b83811115610ab75750506000910152565b6000600019821415611bcf57611bcf611bd6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610abb57600080fdfea2646970667358221220e5e8427ef7c8cf49214ba9ffffc7dda43eda8c282423f2df90c4fb4ccd3a714064736f6c63430008060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007b3ec232b08bd7b4b3305be0c044d907b2df960b0000000000000000000000000000000000000000000000000000000000015180
-----Decoded View---------------
Arg [0] : keeperRegistryAddress (address): 0x7b3EC232b08BD7b4b3305BE0C044D907B2DF960B
Arg [1] : minWaitPeriodSeconds (uint256): 86400
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007b3ec232b08bd7b4b3305be0c044d907b2df960b
Arg [1] : 0000000000000000000000000000000000000000000000000000000000015180
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,164 | 7.9033 | $25,006.15 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.