Overview
ETH Balance
40 ETH
Eth Value
$133,826.76 (@ $3,345.67/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 5 from a total of 5 transactions
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21446532 | 11 days ago | 9.8 ETH | ||||
21402275 | 17 days ago | 4 ETH | ||||
21394439 | 18 days ago | 0.3 ETH | ||||
21394439 | 18 days ago | 0.3 ETH | ||||
21394438 | 18 days ago | 34.8 ETH | ||||
21394261 | 18 days ago | 34.8 ETH | ||||
21373043 | 21 days ago | 0.3 ETH | ||||
21366319 | 22 days ago | 0.3 ETH | ||||
21350511 | 24 days ago | 4 ETH | ||||
21343912 | 25 days ago | 0.3 ETH | ||||
21343856 | 25 days ago | 0.3 ETH | ||||
21343665 | 25 days ago | 27.8 ETH | ||||
21342573 | 25 days ago | 2 ETH | ||||
21337339 | 26 days ago | 0.3 ETH | ||||
21337236 | 26 days ago | 2 ETH | ||||
21331646 | 27 days ago | 2 ETH | ||||
21330307 | 27 days ago | 0.3 ETH | ||||
21330303 | 27 days ago | 0.3 ETH | ||||
21324103 | 28 days ago | 0.3 ETH | ||||
21324054 | 28 days ago | 0.3 ETH | ||||
21324054 | 28 days ago | 0.3 ETH | ||||
21297241 | 31 days ago | 4 ETH | ||||
21279419 | 34 days ago | 2 ETH | ||||
21268486 | 35 days ago | 2 ETH | ||||
21263105 | 36 days ago | 2 ETH |
Loading...
Loading
Contract Name:
EthBalanceMonitor
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "@chainlink/contracts/src/v0.8/ConfirmedOwner.sol"; import "@chainlink/contracts/src/v0.8/interfaces/KeeperCompatibleInterface.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; /** * @title The EthBalanceMonitor contract * @notice A keeper-compatible contract that monitors and funds eth addresses */ contract EthBalanceMonitor 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); error InvalidWatchList(); error OnlyKeeperRegistry(); error DuplicateAddress(address duplicate); struct Target { bool isActive; uint96 minBalanceWei; uint96 topUpAmountWei; 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], topUpAmountWei: 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 ( target.lastTopUpTimestamp + minWaitPeriod <= block.timestamp && balance >= target.topUpAmountWei && watchList[idx].balance < target.minBalanceWei ) { needsFunding[count] = watchList[idx]; count++; balance -= target.topUpAmountWei; } } 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 topUp(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]]; if ( target.isActive && target.lastTopUpTimestamp + minWaitPeriodSeconds <= block.timestamp && needsFunding[idx].balance < target.minBalanceWei ) { bool success = payable(needsFunding[idx]).send(target.topUpAmountWei); 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[])); topUp(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 { require(payee != address(0)); emit FundsWithdrawn(amount, payee); payee.transfer(amount); } /** * @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 { require(keeperRegistryAddress != address(0)); 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 topUpAmountWei, uint56 lastTopUpTimestamp ) { Target memory target = s_targets[targetAddress]; return (target.isActive, target.minBalanceWei, target.topUpAmountWei, 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 // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/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 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 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 // 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 pragma solidity ^0.8.0; import "./interfaces/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; }
{ "optimizer": { "enabled": true, "runs": 1000 }, "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"},{"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":"topUpAmountWei","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":"needsFunding","type":"address[]"}],"name":"topUp","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
60806040523480156200001157600080fd5b5060405162001be238038062001be28339810160408190526200003491620002c8565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000ec565b50506001805460ff60a01b1916905550620000d98262000198565b620000e4816200021f565b505062000304565b6001600160a01b038116331415620001475760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b620001a26200026a565b6001600160a01b038116620001b657600080fd5b600254604080516001600160a01b03928316815291831660208301527fb732223055abcde751d7a24272ffc8a3aa571cb72b443969a4199b7ecd59f8b9910160405180910390a1600280546001600160a01b0319166001600160a01b0392909216919091179055565b620002296200026a565b60035460408051918252602082018390527f04330086c73b1fe1e13cd47a61c692e7c4399b5de08ed94b7ab824684af09323910160405180910390a1600355565b6000546001600160a01b03163314620002c65760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000082565b565b60008060408385031215620002dc57600080fd5b82516001600160a01b0381168114620002f457600080fd5b6020939093015192949293505050565b6118ce80620003146000396000f3fe60806040526004361061012c5760003560e01c8063728584b7116100a55780638456cb591161007457806394555114116100595780639455511414610404578063b1d52fa014610424578063f2fde38b1461044457600080fd5b80638456cb59146103d15780638da5cb5b146103e657600080fd5b8063728584b7146102ae57806379ba5097146102c35780637b510fe8146102d8578063810623e31461039f57600080fd5b80633f85861f116100fc5780634585e33b116100e15780634585e33b146102365780635c975abb146102565780636e04ff0d1461028057600080fd5b80633f85861f146101f857806341d2052e1461021857600080fd5b8062f714ce146101765780630b67ddce146101985780633e4ca677146101c35780633f4ba83a146101e357600080fd5b366101715760408051348152476020820152338183015290517fc6f3fb0fec49e4877342d4625d77a632541f55b7aae0f9d0b34c69b3478706dc9181900360600190a1005b600080fd5b34801561018257600080fd5b506101966101913660046116f2565b610464565b005b3480156101a457600080fd5b506101ad6104fb565b6040516101ba919061174b565b60405180910390f35b3480156101cf57600080fd5b506101966101de36600461159b565b61076a565b3480156101ef57600080fd5b50610196610a6b565b34801561020457600080fd5b506101966102133660046116d9565b610a7d565b34801561022457600080fd5b506003546040519081526020016101ba565b34801561024257600080fd5b50610196610251366004611667565b610ac6565b34801561026257600080fd5b50600154600160a01b900460ff1660405190151581526020016101ba565b34801561028c57600080fd5b506102a061029b366004611667565b610b70565b6040516101ba929190611798565b3480156102ba57600080fd5b506101ad610c06565b3480156102cf57600080fd5b50610196610c68565b3480156102e457600080fd5b506103646102f33660046114dd565b6001600160a01b03166000908152600560209081526040918290208251608081018452905460ff8116151580835261010082046001600160601b03908116948401859052600160681b830416948301859052600160c81b90910466ffffffffffffff16606090920182905293919291565b6040516101ba949392919093151584526001600160601b0392831660208501529116604083015266ffffffffffffff16606082015260800190565b3480156103ab57600080fd5b506002546001600160a01b03165b6040516001600160a01b0390911681526020016101ba565b3480156103dd57600080fd5b50610196610d26565b3480156103f257600080fd5b506000546001600160a01b03166103b9565b34801561041057600080fd5b5061019661041f3660046114dd565b610d36565b34801561043057600080fd5b5061019661043f366004611501565b610dc7565b34801561045057600080fd5b5061019661045f3660046114dd565b6111b3565b61046c6111c4565b6001600160a01b03811661047f57600080fd5b604080518381526001600160a01b03831660208201527f6141b54b56b8a52a8c6f5cd2a857f6117b18ffbf4d46bd3106f300a839cbf5ea910160405180910390a16040516001600160a01b0382169083156108fc029084906000818181858888f193505050501580156104f6573d6000803e3d6000fd5b505050565b60606000600480548060200260200160405190810160405280929190818152602001828054801561055557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610537575b505050505090506000815167ffffffffffffffff8111156105785761057861186d565b6040519080825280602002602001820160405280156105a1578160200160208202803683370190505b50600354604080516080810182526000808252602082018190529181018290526060810182905292935091479060005b865181101561075257600560008883815181106105f0576105f0611857565b6020908102919091018101516001600160a01b031682528181019290925260409081016000208151608081018352905460ff81161515825261010081046001600160601b0390811694830194909452600160681b810490931691810191909152600160c81b90910466ffffffffffffff166060820181905290925042906106789086906117f7565b11158015610693575081604001516001600160601b03168310155b80156106ce575081602001516001600160601b03168782815181106106ba576106ba611857565b60200260200101516001600160a01b031631105b15610740578681815181106106e5576106e5611857565b60200260200101518686815181106106ff576106ff611857565b6001600160a01b03909216602092830291909101909101528461072181611826565b95505081604001516001600160601b03168361073d919061180f565b92505b8061074a81611826565b9150506105d1565b508551841461075f578385525b509295945050505050565b600154600160a01b900460ff16156107bc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b6003546040805160808101825260008082526020820181905291810182905260608101829052905b8351811015610a64576005600085838151811061080357610803611857565b6020908102919091018101516001600160a01b031682528181019290925260409081016000208151608081018352905460ff81161580158084526001600160601b036101008404811696850196909652600160681b83049095169383019390935266ffffffffffffff600160c81b909104166060820152935061089e57504283836060015166ffffffffffffff1661089b91906117f7565b11155b80156108d9575081602001516001600160601b03168482815181106108c5576108c5611857565b60200260200101516001600160a01b031631105b15610a425760008482815181106108f2576108f2611857565b60200260200101516001600160a01b03166108fc84604001516001600160601b03169081150290604051600060405180830381858888f19350505050905080156109f057426005600087858151811061094d5761094d611857565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060000160196101000a81548166ffffffffffffff021916908366ffffffffffffff1602179055508482815181106109ae576109ae611857565b60200260200101516001600160a01b03167f9eec55c371a49ce19e0a5792787c79b32dcf7d3490aa737436b49c0978ce9ce960405160405180910390a2610a40565b848281518110610a0257610a02611857565b60200260200101516001600160a01b03167fa9ff7a9b96721b0e16adb7de9db0764fbfd6a4516d4d165f9564e8c3755eb10560405160405180910390a25b505b61d6d85a1015610a525750505050565b80610a5c81611826565b9150506107e4565b5050505b50565b610a736111c4565b610a7b61121e565b565b610a856111c4565b60035460408051918252602082018390527f04330086c73b1fe1e13cd47a61c692e7c4399b5de08ed94b7ab824684af09323910160405180910390a1600355565b6002546001600160a01b03163314610b0a576040517fd3a6803400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600160a01b900460ff1615610b575760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107b3565b6000610b658284018461159b565b90506104f68161076a565b60006060610b8860015460ff600160a01b9091041690565b15610bc85760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107b3565b6000610bd26104fb565b90506000815111925080604051602001610bec919061174b565b6040516020818303038152906040529150505b9250929050565b60606004805480602002602001604051908101604052809291908181526020018280548015610c5e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c40575b5050505050905090565b6001546001600160a01b03163314610cc25760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016107b3565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d2e6111c4565b610a7b6112c4565b610d3e6111c4565b6001600160a01b038116610d5157600080fd5b600254604080516001600160a01b03928316815291831660208301527fb732223055abcde751d7a24272ffc8a3aa571cb72b443969a4199b7ecd59f8b9910160405180910390a16002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b610dcf6111c4565b8483141580610dde5750848114155b15610dfc57604051631c34ddf360e11b815260040160405180910390fd5b60006004805480602002602001604051908101604052809291908181526020018280548015610e5457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e36575b5050505050905060005b8151811015610ec357600060056000848481518110610e7f57610e7f611857565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610ebb81611826565b915050610e5e565b5060005b8681101561119c5760056000898984818110610ee557610ee5611857565b9050602002016020810190610efa91906114dd565b6001600160a01b0316815260208101919091526040016000205460ff1615610f8157878782818110610f2e57610f2e611857565b9050602002016020810190610f4391906114dd565b6040517f9f2277f30000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016107b3565b6000888883818110610f9557610f95611857565b9050602002016020810190610faa91906114dd565b6001600160a01b03161415610fd257604051631c34ddf360e11b815260040160405180910390fd5b838382818110610fe457610fe4611857565b9050602002016020810190610ff99190611722565b6001600160601b031661101f57604051631c34ddf360e11b815260040160405180910390fd5b604051806080016040528060011515815260200187878481811061104557611045611857565b905060200201602081019061105a9190611722565b6001600160601b0316815260200185858481811061107a5761107a611857565b905060200201602081019061108f9190611722565b6001600160601b03168152602001600066ffffffffffffff16815250600560008a8a858181106110c1576110c1611857565b90506020020160208101906110d691906114dd565b6001600160a01b03168152602080820192909252604090810160002083518154938501519285015160609095015166ffffffffffffff16600160c81b0278ffffffffffffffffffffffffffffffffffffffffffffffffff6001600160601b03968716600160681b02166cffffffffffffffffffffffffff96909416610100026cffffffffffffffffffffffff0019921515929092166cffffffffffffffffffffffffff19909516949094171793909316171790558061119481611826565b915050610ec7565b506111a960048888611403565b5050505050505050565b6111bb6111c4565b610a688161134c565b6000546001600160a01b03163314610a7b5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016107b3565b600154600160a01b900460ff166112775760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107b3565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600154600160a01b900460ff16156113115760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107b3565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112a73390565b6001600160a01b0381163314156113a55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107b3565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b828054828255906000526020600020908101928215611463579160200282015b8281111561146357815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03843516178255602090920191600190910190611423565b5061146f929150611473565b5090565b5b8082111561146f5760008155600101611474565b803561149381611883565b919050565b60008083601f8401126114aa57600080fd5b50813567ffffffffffffffff8111156114c257600080fd5b6020830191508360208260051b8501011115610bff57600080fd5b6000602082840312156114ef57600080fd5b81356114fa81611883565b9392505050565b6000806000806000806060878903121561151a57600080fd5b863567ffffffffffffffff8082111561153257600080fd5b61153e8a838b01611498565b9098509650602089013591508082111561155757600080fd5b6115638a838b01611498565b9096509450604089013591508082111561157c57600080fd5b5061158989828a01611498565b979a9699509497509295939492505050565b600060208083850312156115ae57600080fd5b823567ffffffffffffffff808211156115c657600080fd5b818501915085601f8301126115da57600080fd5b8135818111156115ec576115ec61186d565b8060051b604051601f19603f830116810181811085821117156116115761161161186d565b604052828152858101935084860182860187018a101561163057600080fd5b600095505b8386101561165a5761164681611488565b855260019590950194938601938601611635565b5098975050505050505050565b6000806020838503121561167a57600080fd5b823567ffffffffffffffff8082111561169257600080fd5b818501915085601f8301126116a657600080fd5b8135818111156116b557600080fd5b8660208285010111156116c757600080fd5b60209290920196919550909350505050565b6000602082840312156116eb57600080fd5b5035919050565b6000806040838503121561170557600080fd5b82359150602083013561171781611883565b809150509250929050565b60006020828403121561173457600080fd5b81356001600160601b03811681146114fa57600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561178c5783516001600160a01b031683529284019291840191600101611767565b50909695505050505050565b821515815260006020604081840152835180604085015260005b818110156117ce578581018301518582016060015282016117b2565b818111156117e0576000606083870101525b50601f01601f191692909201606001949350505050565b6000821982111561180a5761180a611841565b500190565b60008282101561182157611821611841565b500390565b600060001982141561183a5761183a611841565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a6857600080fdfea2646970667358221220c2e43bc0b2eec3161161da84084dd8964773d7d323036f88a1a2b547c2429d9964736f6c634300080700330000000000000000000000007b3ec232b08bd7b4b3305be0c044d907b2df960b000000000000000000000000000000000000000000000000000000000000003c
Deployed Bytecode
0x60806040526004361061012c5760003560e01c8063728584b7116100a55780638456cb591161007457806394555114116100595780639455511414610404578063b1d52fa014610424578063f2fde38b1461044457600080fd5b80638456cb59146103d15780638da5cb5b146103e657600080fd5b8063728584b7146102ae57806379ba5097146102c35780637b510fe8146102d8578063810623e31461039f57600080fd5b80633f85861f116100fc5780634585e33b116100e15780634585e33b146102365780635c975abb146102565780636e04ff0d1461028057600080fd5b80633f85861f146101f857806341d2052e1461021857600080fd5b8062f714ce146101765780630b67ddce146101985780633e4ca677146101c35780633f4ba83a146101e357600080fd5b366101715760408051348152476020820152338183015290517fc6f3fb0fec49e4877342d4625d77a632541f55b7aae0f9d0b34c69b3478706dc9181900360600190a1005b600080fd5b34801561018257600080fd5b506101966101913660046116f2565b610464565b005b3480156101a457600080fd5b506101ad6104fb565b6040516101ba919061174b565b60405180910390f35b3480156101cf57600080fd5b506101966101de36600461159b565b61076a565b3480156101ef57600080fd5b50610196610a6b565b34801561020457600080fd5b506101966102133660046116d9565b610a7d565b34801561022457600080fd5b506003546040519081526020016101ba565b34801561024257600080fd5b50610196610251366004611667565b610ac6565b34801561026257600080fd5b50600154600160a01b900460ff1660405190151581526020016101ba565b34801561028c57600080fd5b506102a061029b366004611667565b610b70565b6040516101ba929190611798565b3480156102ba57600080fd5b506101ad610c06565b3480156102cf57600080fd5b50610196610c68565b3480156102e457600080fd5b506103646102f33660046114dd565b6001600160a01b03166000908152600560209081526040918290208251608081018452905460ff8116151580835261010082046001600160601b03908116948401859052600160681b830416948301859052600160c81b90910466ffffffffffffff16606090920182905293919291565b6040516101ba949392919093151584526001600160601b0392831660208501529116604083015266ffffffffffffff16606082015260800190565b3480156103ab57600080fd5b506002546001600160a01b03165b6040516001600160a01b0390911681526020016101ba565b3480156103dd57600080fd5b50610196610d26565b3480156103f257600080fd5b506000546001600160a01b03166103b9565b34801561041057600080fd5b5061019661041f3660046114dd565b610d36565b34801561043057600080fd5b5061019661043f366004611501565b610dc7565b34801561045057600080fd5b5061019661045f3660046114dd565b6111b3565b61046c6111c4565b6001600160a01b03811661047f57600080fd5b604080518381526001600160a01b03831660208201527f6141b54b56b8a52a8c6f5cd2a857f6117b18ffbf4d46bd3106f300a839cbf5ea910160405180910390a16040516001600160a01b0382169083156108fc029084906000818181858888f193505050501580156104f6573d6000803e3d6000fd5b505050565b60606000600480548060200260200160405190810160405280929190818152602001828054801561055557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610537575b505050505090506000815167ffffffffffffffff8111156105785761057861186d565b6040519080825280602002602001820160405280156105a1578160200160208202803683370190505b50600354604080516080810182526000808252602082018190529181018290526060810182905292935091479060005b865181101561075257600560008883815181106105f0576105f0611857565b6020908102919091018101516001600160a01b031682528181019290925260409081016000208151608081018352905460ff81161515825261010081046001600160601b0390811694830194909452600160681b810490931691810191909152600160c81b90910466ffffffffffffff166060820181905290925042906106789086906117f7565b11158015610693575081604001516001600160601b03168310155b80156106ce575081602001516001600160601b03168782815181106106ba576106ba611857565b60200260200101516001600160a01b031631105b15610740578681815181106106e5576106e5611857565b60200260200101518686815181106106ff576106ff611857565b6001600160a01b03909216602092830291909101909101528461072181611826565b95505081604001516001600160601b03168361073d919061180f565b92505b8061074a81611826565b9150506105d1565b508551841461075f578385525b509295945050505050565b600154600160a01b900460ff16156107bc5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b6003546040805160808101825260008082526020820181905291810182905260608101829052905b8351811015610a64576005600085838151811061080357610803611857565b6020908102919091018101516001600160a01b031682528181019290925260409081016000208151608081018352905460ff81161580158084526001600160601b036101008404811696850196909652600160681b83049095169383019390935266ffffffffffffff600160c81b909104166060820152935061089e57504283836060015166ffffffffffffff1661089b91906117f7565b11155b80156108d9575081602001516001600160601b03168482815181106108c5576108c5611857565b60200260200101516001600160a01b031631105b15610a425760008482815181106108f2576108f2611857565b60200260200101516001600160a01b03166108fc84604001516001600160601b03169081150290604051600060405180830381858888f19350505050905080156109f057426005600087858151811061094d5761094d611857565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060000160196101000a81548166ffffffffffffff021916908366ffffffffffffff1602179055508482815181106109ae576109ae611857565b60200260200101516001600160a01b03167f9eec55c371a49ce19e0a5792787c79b32dcf7d3490aa737436b49c0978ce9ce960405160405180910390a2610a40565b848281518110610a0257610a02611857565b60200260200101516001600160a01b03167fa9ff7a9b96721b0e16adb7de9db0764fbfd6a4516d4d165f9564e8c3755eb10560405160405180910390a25b505b61d6d85a1015610a525750505050565b80610a5c81611826565b9150506107e4565b5050505b50565b610a736111c4565b610a7b61121e565b565b610a856111c4565b60035460408051918252602082018390527f04330086c73b1fe1e13cd47a61c692e7c4399b5de08ed94b7ab824684af09323910160405180910390a1600355565b6002546001600160a01b03163314610b0a576040517fd3a6803400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154600160a01b900460ff1615610b575760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107b3565b6000610b658284018461159b565b90506104f68161076a565b60006060610b8860015460ff600160a01b9091041690565b15610bc85760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107b3565b6000610bd26104fb565b90506000815111925080604051602001610bec919061174b565b6040516020818303038152906040529150505b9250929050565b60606004805480602002602001604051908101604052809291908181526020018280548015610c5e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c40575b5050505050905090565b6001546001600160a01b03163314610cc25760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016107b3565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d2e6111c4565b610a7b6112c4565b610d3e6111c4565b6001600160a01b038116610d5157600080fd5b600254604080516001600160a01b03928316815291831660208301527fb732223055abcde751d7a24272ffc8a3aa571cb72b443969a4199b7ecd59f8b9910160405180910390a16002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b610dcf6111c4565b8483141580610dde5750848114155b15610dfc57604051631c34ddf360e11b815260040160405180910390fd5b60006004805480602002602001604051908101604052809291908181526020018280548015610e5457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e36575b5050505050905060005b8151811015610ec357600060056000848481518110610e7f57610e7f611857565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610ebb81611826565b915050610e5e565b5060005b8681101561119c5760056000898984818110610ee557610ee5611857565b9050602002016020810190610efa91906114dd565b6001600160a01b0316815260208101919091526040016000205460ff1615610f8157878782818110610f2e57610f2e611857565b9050602002016020810190610f4391906114dd565b6040517f9f2277f30000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016107b3565b6000888883818110610f9557610f95611857565b9050602002016020810190610faa91906114dd565b6001600160a01b03161415610fd257604051631c34ddf360e11b815260040160405180910390fd5b838382818110610fe457610fe4611857565b9050602002016020810190610ff99190611722565b6001600160601b031661101f57604051631c34ddf360e11b815260040160405180910390fd5b604051806080016040528060011515815260200187878481811061104557611045611857565b905060200201602081019061105a9190611722565b6001600160601b0316815260200185858481811061107a5761107a611857565b905060200201602081019061108f9190611722565b6001600160601b03168152602001600066ffffffffffffff16815250600560008a8a858181106110c1576110c1611857565b90506020020160208101906110d691906114dd565b6001600160a01b03168152602080820192909252604090810160002083518154938501519285015160609095015166ffffffffffffff16600160c81b0278ffffffffffffffffffffffffffffffffffffffffffffffffff6001600160601b03968716600160681b02166cffffffffffffffffffffffffff96909416610100026cffffffffffffffffffffffff0019921515929092166cffffffffffffffffffffffffff19909516949094171793909316171790558061119481611826565b915050610ec7565b506111a960048888611403565b5050505050505050565b6111bb6111c4565b610a688161134c565b6000546001600160a01b03163314610a7b5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016107b3565b600154600160a01b900460ff166112775760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107b3565b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600154600160a01b900460ff16156113115760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107b3565b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112a73390565b6001600160a01b0381163314156113a55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107b3565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b828054828255906000526020600020908101928215611463579160200282015b8281111561146357815473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03843516178255602090920191600190910190611423565b5061146f929150611473565b5090565b5b8082111561146f5760008155600101611474565b803561149381611883565b919050565b60008083601f8401126114aa57600080fd5b50813567ffffffffffffffff8111156114c257600080fd5b6020830191508360208260051b8501011115610bff57600080fd5b6000602082840312156114ef57600080fd5b81356114fa81611883565b9392505050565b6000806000806000806060878903121561151a57600080fd5b863567ffffffffffffffff8082111561153257600080fd5b61153e8a838b01611498565b9098509650602089013591508082111561155757600080fd5b6115638a838b01611498565b9096509450604089013591508082111561157c57600080fd5b5061158989828a01611498565b979a9699509497509295939492505050565b600060208083850312156115ae57600080fd5b823567ffffffffffffffff808211156115c657600080fd5b818501915085601f8301126115da57600080fd5b8135818111156115ec576115ec61186d565b8060051b604051601f19603f830116810181811085821117156116115761161161186d565b604052828152858101935084860182860187018a101561163057600080fd5b600095505b8386101561165a5761164681611488565b855260019590950194938601938601611635565b5098975050505050505050565b6000806020838503121561167a57600080fd5b823567ffffffffffffffff8082111561169257600080fd5b818501915085601f8301126116a657600080fd5b8135818111156116b557600080fd5b8660208285010111156116c757600080fd5b60209290920196919550909350505050565b6000602082840312156116eb57600080fd5b5035919050565b6000806040838503121561170557600080fd5b82359150602083013561171781611883565b809150509250929050565b60006020828403121561173457600080fd5b81356001600160601b03811681146114fa57600080fd5b6020808252825182820181905260009190848201906040850190845b8181101561178c5783516001600160a01b031683529284019291840191600101611767565b50909695505050505050565b821515815260006020604081840152835180604085015260005b818110156117ce578581018301518582016060015282016117b2565b818111156117e0576000606083870101525b50601f01601f191692909201606001949350505050565b6000821982111561180a5761180a611841565b500190565b60008282101561182157611821611841565b500390565b600060001982141561183a5761183a611841565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a6857600080fdfea2646970667358221220c2e43bc0b2eec3161161da84084dd8964773d7d323036f88a1a2b547c2429d9964736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007b3ec232b08bd7b4b3305be0c044d907b2df960b000000000000000000000000000000000000000000000000000000000000003c
-----Decoded View---------------
Arg [0] : keeperRegistryAddress (address): 0x7b3EC232b08BD7b4b3305BE0C044D907B2DF960B
Arg [1] : minWaitPeriodSeconds (uint256): 60
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007b3ec232b08bd7b4b3305be0c044d907b2df960b
Arg [1] : 000000000000000000000000000000000000000000000000000000000000003c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,343.83 | 40 | $133,753.16 |
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.