ETH Price: $3,164.46 (-8.82%)
Gas: 4 Gwei

Contract

0x04C0205b9D900a49597d9a0345aEAD6D73307C3B
 

Overview

ETH Balance

7.903330603715662585 ETH

Eth Value

$25,009.78 (@ $3,164.46/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer180644972023-09-04 17:06:23324 days ago1693847183IN
0x04C0205b...D73307C3B
1.14 ETH0.0004121318.18549925
Transfer180644902023-09-04 17:04:59324 days ago1693847099IN
0x04C0205b...D73307C3B
1.14276181 ETH0.0003834418.2590497
Transfer180069472023-08-27 15:39:11332 days ago1693150751IN
0x04C0205b...D73307C3B
0.069 ETH0.0003921317.30267379
Transfer179291002023-08-16 18:13:11343 days ago1692209591IN
0x04C0205b...D73307C3B
1.88 ETH0.0007837934.58485165
Transfer179290782023-08-16 18:08:35343 days ago1692209315IN
0x04C0205b...D73307C3B
0.51 ETH0.0006788429.95379834
Transfer179290552023-08-16 18:03:59343 days ago1692209039IN
0x04C0205b...D73307C3B
0.5148634 ETH0.0007121833.91361005
Transfer179290122023-08-16 17:55:23343 days ago1692208523IN
0x04C0205b...D73307C3B
1.89062726 ETH0.0005487426.1308614
Transfer159564532022-11-12 20:54:11620 days ago1668286451IN
0x04C0205b...D73307C3B
3.56 ETH0.0002846812.56181313
Transfer Ownersh...148475722022-05-26 10:58:32790 days ago1653562712IN
0x04C0205b...D73307C3B
0 ETH0.0010253421.41723069
0x60806040148474962022-05-26 10:39:38790 days ago1653561578IN
 Create: GasStationExact
0 ETH0.0400506423.47355225

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
199916102024-05-31 18:29:5954 days ago1717180199
0x04C0205b...D73307C3B
0.50719418 ETH
197332572024-04-25 15:24:3590 days ago1714058675
0x04C0205b...D73307C3B
0.59314485 ETH
197332572024-04-25 15:24:3590 days ago1714058675
0x04C0205b...D73307C3B
0.50997543 ETH
197332572024-04-25 15:24:3590 days ago1714058675
0x04C0205b...D73307C3B
0.60600192 ETH
197332562024-04-25 15:24:2390 days ago1714058663
0x04C0205b...D73307C3B
10 ETH
195746162024-04-03 10:21:11112 days ago1712139671
0x04C0205b...D73307C3B
0.50117872 ETH
195298722024-03-28 3:15:11119 days ago1711595711
0x04C0205b...D73307C3B
0.93243379 ETH
195290672024-03-28 0:30:23119 days ago1711585823
0x04C0205b...D73307C3B
0.95056878 ETH
195202972024-03-26 18:11:23120 days ago1711476683
0x04C0205b...D73307C3B
0.50132184 ETH
195193242024-03-26 14:52:11120 days ago1711464731
0x04C0205b...D73307C3B
0.60116816 ETH
195193242024-03-26 14:52:11120 days ago1711464731
0x04C0205b...D73307C3B
1 ETH
195193242024-03-26 14:52:11120 days ago1711464731
0x04C0205b...D73307C3B
1 ETH
195144132024-03-25 22:21:11121 days ago1711405271
0x04C0205b...D73307C3B
0.81598022 ETH
194752912024-03-20 10:23:35126 days ago1710930215
0x04C0205b...D73307C3B
0.50326087 ETH
194159342024-03-12 2:11:11135 days ago1710209471
0x04C0205b...D73307C3B
0.5008796 ETH
194130112024-03-11 16:21:47135 days ago1710174107
0x04C0205b...D73307C3B
0.51105982 ETH
193879472024-03-08 4:04:35139 days ago1709870675
0x04C0205b...D73307C3B
0.58654367 ETH
193807912024-03-07 4:04:23140 days ago1709784263
0x04C0205b...D73307C3B
0.50463078 ETH
193707512024-03-05 18:26:59141 days ago1709663219
0x04C0205b...D73307C3B
0.50627323 ETH
193623122024-03-04 14:11:35142 days ago1709561495
0x04C0205b...D73307C3B
0.54937037 ETH
193622952024-03-04 14:08:11142 days ago1709561291
0x04C0205b...D73307C3B
10 ETH
193277772024-02-28 18:20:59147 days ago1709144459
0x04C0205b...D73307C3B
0.50641998 ETH
192777312024-02-21 18:11:35154 days ago1708539095
0x04C0205b...D73307C3B
0.5021301 ETH
192611492024-02-19 10:20:47156 days ago1708338047
0x04C0205b...D73307C3B
0.50150159 ETH
192358912024-02-15 21:03:59160 days ago1708031039
0x04C0205b...D73307C3B
0.50624406 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GasStationExact

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 10 : GasStationExact.sol
// 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();
    }
    _;
  }
}

File 2 of 10 : ConfirmedOwner.sol
// 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)) {}
}

File 3 of 10 : ConfirmedOwnerWithProposal.sol
// 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();
    _;
  }
}

File 4 of 10 : OwnableInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface OwnableInterface {
  function owner() external returns (address);

  function transferOwnership(address recipient) external;

  function acceptOwnership() external;
}

File 5 of 10 : KeeperCompatibleInterface.sol
// 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;
}

File 6 of 10 : Pausable.sol
// 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());
    }
}

File 7 of 10 : Context.sol
// 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;
    }
}

File 8 of 10 : SafeERC20.sol
// 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");
        }
    }
}

File 9 of 10 : IERC20.sol
// 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);
}

File 10 of 10 : Address.sol
// 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);
            }
        }
    }
}

Settings
{
  "evmVersion": "istanbul",
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"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"}]

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


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.