Goerli Testnet

Contract

0x57A4a13b35d25EE78e084168aBaC5ad360252467
Transaction Hash
Method
Block
From
To
Value
Register Upkeep101316492023-11-30 6:45:24119 days ago1701326724IN
0x57A4a13b...360252467
0 ETH0.000342181.50000003
Register Upkeep100750062023-11-20 6:07:36129 days ago1700460456IN
0x57A4a13b...360252467
0 ETH0.000452861.65
Register Upkeep100750042023-11-20 6:07:12129 days ago1700460432IN
0x57A4a13b...360252467
0 ETH0.000452781.65
Register Upkeep100750002023-11-20 6:06:00129 days ago1700460360IN
0x57A4a13b...360252467
0 ETH0.000452841.65
Register Upkeep100749982023-11-20 6:05:36129 days ago1700460336IN
0x57A4a13b...360252467
0 ETH0.000452781.65
Register Upkeep100749962023-11-20 6:05:00129 days ago1700460300IN
0x57A4a13b...360252467
0 ETH0.000452861.65
Register Upkeep100749942023-11-20 6:04:24129 days ago1700460264IN
0x57A4a13b...360252467
0 ETH0.000452971.65
Register Upkeep99618832023-10-31 9:11:12149 days ago1698743472IN
0x57A4a13b...360252467
0 ETH0.000452861.65000001
Register Upkeep99618812023-10-31 9:10:48149 days ago1698743448IN
0x57A4a13b...360252467
0 ETH0.00045281.65000001
Register Upkeep99618762023-10-31 9:09:48149 days ago1698743388IN
0x57A4a13b...360252467
0 ETH0.000452821.65000001
Register Upkeep99618692023-10-31 9:08:12149 days ago1698743292IN
0x57A4a13b...360252467
0 ETH0.000452781.65000001
Register Upkeep99618632023-10-31 9:06:36149 days ago1698743196IN
0x57A4a13b...360252467
0 ETH0.000452861.65000001
Register Upkeep97080602023-09-17 0:39:24194 days ago1694911164IN
0x57A4a13b...360252467
0 ETH0.000342341.5
Register Upkeep97079492023-09-17 0:11:48194 days ago1694909508IN
0x57A4a13b...360252467
0 ETH0.00034231.5
Register Upkeep97075552023-09-16 22:40:48194 days ago1694904048IN
0x57A4a13b...360252467
0 ETH0.002805961
Approve85427812023-02-23 15:19:48399 days ago1677165588IN
0x57A4a13b...360252467
0 ETH0.03601383169.87257561
Approve85427702023-02-23 15:16:36399 days ago1677165396IN
0x57A4a13b...360252467
0 ETH0.03511706165.67074381
Approve85427652023-02-23 15:15:12399 days ago1677165312IN
0x57A4a13b...360252467
0 ETH0.03241829152.93020051
Approve85427582023-02-23 15:13:48399 days ago1677165228IN
0x57A4a13b...360252467
0 ETH0.03354138158.22824036
Approve85427532023-02-23 15:12:36399 days ago1677165156IN
0x57A4a13b...360252467
0 ETH0.03404902160.67759764
Approve85427432023-02-23 15:10:00399 days ago1677165000IN
0x57A4a13b...360252467
0 ETH0.03478869164.16808468
Approve85426672023-02-23 14:52:24399 days ago1677163944IN
0x57A4a13b...360252467
0 ETH0.03447729162.62491402
Set Registration...85425952023-02-23 14:34:36399 days ago1677162876IN
0x57A4a13b...360252467
0 ETH0.0033013395.37288696
Accept Ownership85373552023-02-22 16:40:12400 days ago1677084012IN
0x57A4a13b...360252467
0 ETH0.0018644866.13749096
Transfer Ownersh...85373532023-02-22 16:39:36400 days ago1677083976IN
0x57A4a13b...360252467
0 ETH0.0029303861.31799295
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Txn Hash Block From To Value
104814812024-02-04 3:06:2454 days ago1707015984
0x57A4a13b...360252467
0 ETH
104814812024-02-04 3:06:2454 days ago1707015984
0x57A4a13b...360252467
0 ETH
104814812024-02-04 3:06:2454 days ago1707015984
0x57A4a13b...360252467
0x57A4a13b...360252467
0 ETH
104814812024-02-04 3:06:2454 days ago1707015984
0x57A4a13b...360252467
0 ETH
104368592024-01-26 13:14:2462 days ago1706274864
0x57A4a13b...360252467
0 ETH
104368592024-01-26 13:14:2462 days ago1706274864
0x57A4a13b...360252467
0 ETH
104368592024-01-26 13:14:2462 days ago1706274864
0x57A4a13b...360252467
0x57A4a13b...360252467
0 ETH
104368592024-01-26 13:14:2462 days ago1706274864
0x57A4a13b...360252467
0 ETH
104365052024-01-26 11:36:2462 days ago1706268984
0x57A4a13b...360252467
0 ETH
104365052024-01-26 11:36:2462 days ago1706268984
0x57A4a13b...360252467
0 ETH
104365052024-01-26 11:36:2462 days ago1706268984
0x57A4a13b...360252467
0x57A4a13b...360252467
0 ETH
104365052024-01-26 11:36:2462 days ago1706268984
0x57A4a13b...360252467
0 ETH
104111952024-01-21 17:30:1267 days ago1705858212
0x57A4a13b...360252467
0 ETH
104111952024-01-21 17:30:1267 days ago1705858212
0x57A4a13b...360252467
0 ETH
104111952024-01-21 17:30:1267 days ago1705858212
0x57A4a13b...360252467
0x57A4a13b...360252467
0 ETH
104111952024-01-21 17:30:1267 days ago1705858212
0x57A4a13b...360252467
0 ETH
104111762024-01-21 17:25:0067 days ago1705857900
0x57A4a13b...360252467
0 ETH
104111762024-01-21 17:25:0067 days ago1705857900
0x57A4a13b...360252467
0 ETH
104111762024-01-21 17:25:0067 days ago1705857900
0x57A4a13b...360252467
0x57A4a13b...360252467
0 ETH
104111762024-01-21 17:25:0067 days ago1705857900
0x57A4a13b...360252467
0 ETH
104067042024-01-20 21:11:0068 days ago1705785060
0x57A4a13b...360252467
0 ETH
104067042024-01-20 21:11:0068 days ago1705785060
0x57A4a13b...360252467
0 ETH
104067042024-01-20 21:11:0068 days ago1705785060
0x57A4a13b...360252467
0x57A4a13b...360252467
0 ETH
104067042024-01-20 21:11:0068 days ago1705785060
0x57A4a13b...360252467
0 ETH
104066832024-01-20 21:06:0068 days ago1705784760
0x57A4a13b...360252467
0 ETH
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x29BA782a...906cD6c86
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
KeeperRegistrar2_0

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 8 : KeeperRegistrar2_0.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.6;

import "../../interfaces/LinkTokenInterface.sol";
import "./interfaces/KeeperRegistryInterface2_0.sol";
import "../../interfaces/TypeAndVersionInterface.sol";
import "../../ConfirmedOwner.sol";
import "../../interfaces/ERC677ReceiverInterface.sol";

/**
 * @notice Contract to accept requests for upkeep registrations
 * @dev There are 2 registration workflows in this contract
 * Flow 1. auto approve OFF / manual registration - UI calls `register` function on this contract, this contract owner at a later time then manually
 *  calls `approve` to register upkeep and emit events to inform UI and others interested.
 * Flow 2. auto approve ON / real time registration - UI calls `register` function as before, which calls the `registerUpkeep` function directly on
 *  keeper registry and then emits approved event to finish the flow automatically without manual intervention.
 * The idea is to have same interface(functions,events) for UI or anyone using this contract irrespective of auto approve being enabled or not.
 * they can just listen to `RegistrationRequested` & `RegistrationApproved` events and know the status on registrations.
 */
contract KeeperRegistrar2_0 is TypeAndVersionInterface, ConfirmedOwner, ERC677ReceiverInterface {
  /**
   * DISABLED: No auto approvals, all new upkeeps should be approved manually.
   * ENABLED_SENDER_ALLOWLIST: Auto approvals for allowed senders subject to max allowed. Manual for rest.
   * ENABLED_ALL: Auto approvals for all new upkeeps subject to max allowed.
   */
  enum AutoApproveType {
    DISABLED,
    ENABLED_SENDER_ALLOWLIST,
    ENABLED_ALL
  }

  bytes4 private constant REGISTER_REQUEST_SELECTOR = this.register.selector;

  mapping(bytes32 => PendingRequest) private s_pendingRequests;

  LinkTokenInterface public immutable LINK;

  /**
   * @notice versions:
   * - KeeperRegistrar 2.0.0: Remove source from register
   *                          Breaks our example of "Register an Upkeep using your own deployed contract"
   * - KeeperRegistrar 1.1.0: Add functionality for sender allowlist in auto approve
   *                        : Remove rate limit and add max allowed for auto approve
   * - KeeperRegistrar 1.0.0: initial release
   */
  string public constant override typeAndVersion = "KeeperRegistrar 2.0.0";

  struct RegistrarConfig {
    AutoApproveType autoApproveConfigType;
    uint32 autoApproveMaxAllowed;
    uint32 approvedCount;
    KeeperRegistryBaseInterface keeperRegistry;
    uint96 minLINKJuels;
  }

  struct PendingRequest {
    address admin;
    uint96 balance;
  }

  struct RegistrationParams {
    string name;
    bytes encryptedEmail;
    address upkeepContract;
    uint32 gasLimit;
    address adminAddress;
    bytes checkData;
    bytes offchainConfig;
    uint96 amount;
  }

  RegistrarConfig private s_config;
  // Only applicable if s_config.configType is ENABLED_SENDER_ALLOWLIST
  mapping(address => bool) private s_autoApproveAllowedSenders;

  event RegistrationRequested(
    bytes32 indexed hash,
    string name,
    bytes encryptedEmail,
    address indexed upkeepContract,
    uint32 gasLimit,
    address adminAddress,
    bytes checkData,
    uint96 amount
  );

  event RegistrationApproved(bytes32 indexed hash, string displayName, uint256 indexed upkeepId);

  event RegistrationRejected(bytes32 indexed hash);

  event AutoApproveAllowedSenderSet(address indexed senderAddress, bool allowed);

  event ConfigChanged(
    AutoApproveType autoApproveConfigType,
    uint32 autoApproveMaxAllowed,
    address keeperRegistry,
    uint96 minLINKJuels
  );

  error InvalidAdminAddress();
  error RequestNotFound();
  error HashMismatch();
  error OnlyAdminOrOwner();
  error InsufficientPayment();
  error RegistrationRequestFailed();
  error OnlyLink();
  error AmountMismatch();
  error SenderMismatch();
  error FunctionNotPermitted();
  error LinkTransferFailed(address to);
  error InvalidDataLength();

  /*
   * @param LINKAddress Address of Link token
   * @param autoApproveConfigType setting for auto-approve registrations
   * @param autoApproveMaxAllowed max number of registrations that can be auto approved
   * @param keeperRegistry keeper registry address
   * @param minLINKJuels minimum LINK that new registrations should fund their upkeep with
   */
  constructor(
    address LINKAddress,
    AutoApproveType autoApproveConfigType,
    uint16 autoApproveMaxAllowed,
    address keeperRegistry,
    uint96 minLINKJuels
  ) ConfirmedOwner(msg.sender) {
    LINK = LinkTokenInterface(LINKAddress);
    setRegistrationConfig(autoApproveConfigType, autoApproveMaxAllowed, keeperRegistry, minLINKJuels);
  }

  //EXTERNAL

  /**
   * @notice register can only be called through transferAndCall on LINK contract
   * @param name string of the upkeep to be registered
   * @param encryptedEmail email address of upkeep contact
   * @param upkeepContract address to perform upkeep on
   * @param gasLimit amount of gas to provide the target contract when performing upkeep
   * @param adminAddress address to cancel upkeep and withdraw remaining funds
   * @param checkData data passed to the contract when checking for upkeep
   * @param amount quantity of LINK upkeep is funded with (specified in Juels)
   * @param offchainConfig offchainConfig for upkeep in bytes
   * @param sender address of the sender making the request
   */
  function register(
    string memory name,
    bytes calldata encryptedEmail,
    address upkeepContract,
    uint32 gasLimit,
    address adminAddress,
    bytes calldata checkData,
    bytes calldata offchainConfig,
    uint96 amount,
    address sender
  ) external onlyLINK {
    _register(
      RegistrationParams({
        name: name,
        encryptedEmail: encryptedEmail,
        upkeepContract: upkeepContract,
        gasLimit: gasLimit,
        adminAddress: adminAddress,
        checkData: checkData,
        offchainConfig: offchainConfig,
        amount: amount
      }),
      sender
    );
  }

  /**
   * @notice Allows external users to register upkeeps; assumes amount is approved for transfer by the contract
   * @param requestParams struct of all possible registration parameters
   */
  function registerUpkeep(RegistrationParams calldata requestParams) external returns (uint256) {
    if (requestParams.amount < s_config.minLINKJuels) {
      revert InsufficientPayment();
    }

    LINK.transferFrom(msg.sender, address(this), requestParams.amount);

    return _register(requestParams, msg.sender);
  }

  /**
   * @dev register upkeep on KeeperRegistry contract and emit RegistrationApproved event
   */
  function approve(
    string memory name,
    address upkeepContract,
    uint32 gasLimit,
    address adminAddress,
    bytes calldata checkData,
    bytes calldata offchainConfig,
    bytes32 hash
  ) external onlyOwner {
    PendingRequest memory request = s_pendingRequests[hash];
    if (request.admin == address(0)) {
      revert RequestNotFound();
    }
    bytes32 expectedHash = keccak256(abi.encode(upkeepContract, gasLimit, adminAddress, checkData, offchainConfig));
    if (hash != expectedHash) {
      revert HashMismatch();
    }
    delete s_pendingRequests[hash];
    _approve(
      RegistrationParams({
        name: name,
        encryptedEmail: "",
        upkeepContract: upkeepContract,
        gasLimit: gasLimit,
        adminAddress: adminAddress,
        checkData: checkData,
        offchainConfig: offchainConfig,
        amount: request.balance
      }),
      expectedHash
    );
  }

  /**
   * @notice cancel will remove a registration request and return the refunds to the request.admin
   * @param hash the request hash
   */
  function cancel(bytes32 hash) external {
    PendingRequest memory request = s_pendingRequests[hash];
    if (!(msg.sender == request.admin || msg.sender == owner())) {
      revert OnlyAdminOrOwner();
    }
    if (request.admin == address(0)) {
      revert RequestNotFound();
    }
    delete s_pendingRequests[hash];
    bool success = LINK.transfer(request.admin, request.balance);
    if (!success) {
      revert LinkTransferFailed(request.admin);
    }
    emit RegistrationRejected(hash);
  }

  /**
   * @notice owner calls this function to set if registration requests should be sent directly to the Keeper Registry
   * @param autoApproveConfigType setting for auto-approve registrations
   *                   note: autoApproveAllowedSenders list persists across config changes irrespective of type
   * @param autoApproveMaxAllowed max number of registrations that can be auto approved
   * @param keeperRegistry new keeper registry address
   * @param minLINKJuels minimum LINK that new registrations should fund their upkeep with
   */
  function setRegistrationConfig(
    AutoApproveType autoApproveConfigType,
    uint16 autoApproveMaxAllowed,
    address keeperRegistry,
    uint96 minLINKJuels
  ) public onlyOwner {
    uint32 approvedCount = s_config.approvedCount;
    s_config = RegistrarConfig({
      autoApproveConfigType: autoApproveConfigType,
      autoApproveMaxAllowed: autoApproveMaxAllowed,
      approvedCount: approvedCount,
      minLINKJuels: minLINKJuels,
      keeperRegistry: KeeperRegistryBaseInterface(keeperRegistry)
    });

    emit ConfigChanged(autoApproveConfigType, autoApproveMaxAllowed, keeperRegistry, minLINKJuels);
  }

  /**
   * @notice owner calls this function to set allowlist status for senderAddress
   * @param senderAddress senderAddress to set the allowlist status for
   * @param allowed true if senderAddress needs to be added to allowlist, false if needs to be removed
   */
  function setAutoApproveAllowedSender(address senderAddress, bool allowed) external onlyOwner {
    s_autoApproveAllowedSenders[senderAddress] = allowed;

    emit AutoApproveAllowedSenderSet(senderAddress, allowed);
  }

  /**
   * @notice read the allowlist status of senderAddress
   * @param senderAddress address to read the allowlist status for
   */
  function getAutoApproveAllowedSender(address senderAddress) external view returns (bool) {
    return s_autoApproveAllowedSenders[senderAddress];
  }

  /**
   * @notice read the current registration configuration
   */
  function getRegistrationConfig()
    external
    view
    returns (
      AutoApproveType autoApproveConfigType,
      uint32 autoApproveMaxAllowed,
      uint32 approvedCount,
      address keeperRegistry,
      uint256 minLINKJuels
    )
  {
    RegistrarConfig memory config = s_config;
    return (
      config.autoApproveConfigType,
      config.autoApproveMaxAllowed,
      config.approvedCount,
      address(config.keeperRegistry),
      config.minLINKJuels
    );
  }

  /**
   * @notice gets the admin address and the current balance of a registration request
   */
  function getPendingRequest(bytes32 hash) external view returns (address, uint96) {
    PendingRequest memory request = s_pendingRequests[hash];
    return (request.admin, request.balance);
  }

  /**
   * @notice Called when LINK is sent to the contract via `transferAndCall`
   * @param sender Address of the sender transfering LINK
   * @param amount Amount of LINK sent (specified in Juels)
   * @param data Payload of the transaction
   */
  function onTokenTransfer(
    address sender,
    uint256 amount,
    bytes calldata data
  )
    external
    override
    onlyLINK
    permittedFunctionsForLINK(data)
    isActualAmount(amount, data)
    isActualSender(sender, data)
  {
    if (data.length < 292) revert InvalidDataLength();
    if (amount < s_config.minLINKJuels) {
      revert InsufficientPayment();
    }
    (bool success, ) = address(this).delegatecall(data);
    // calls register
    if (!success) {
      revert RegistrationRequestFailed();
    }
  }

  //PRIVATE

  /**
   * @dev verify registration request and emit RegistrationRequested event
   */
  function _register(RegistrationParams memory params, address sender) private returns (uint256) {
    if (params.adminAddress == address(0)) {
      revert InvalidAdminAddress();
    }
    bytes32 hash = keccak256(
      abi.encode(params.upkeepContract, params.gasLimit, params.adminAddress, params.checkData, params.offchainConfig)
    );

    emit RegistrationRequested(
      hash,
      params.name,
      params.encryptedEmail,
      params.upkeepContract,
      params.gasLimit,
      params.adminAddress,
      params.checkData,
      params.amount
    );

    uint256 upkeepId;
    RegistrarConfig memory config = s_config;
    if (_shouldAutoApprove(config, sender)) {
      s_config.approvedCount = config.approvedCount + 1;

      upkeepId = _approve(params, hash);
    } else {
      uint96 newBalance = s_pendingRequests[hash].balance + params.amount;
      s_pendingRequests[hash] = PendingRequest({admin: params.adminAddress, balance: newBalance});
    }

    return upkeepId;
  }

  /**
   * @dev register upkeep on KeeperRegistry contract and emit RegistrationApproved event
   */
  function _approve(RegistrationParams memory params, bytes32 hash) private returns (uint256) {
    KeeperRegistryBaseInterface keeperRegistry = s_config.keeperRegistry;

    // register upkeep
    uint256 upkeepId = keeperRegistry.registerUpkeep(
      params.upkeepContract,
      params.gasLimit,
      params.adminAddress,
      params.checkData,
      params.offchainConfig
    );
    // fund upkeep
    bool success = LINK.transferAndCall(address(keeperRegistry), params.amount, abi.encode(upkeepId));
    if (!success) {
      revert LinkTransferFailed(address(keeperRegistry));
    }

    emit RegistrationApproved(hash, params.name, upkeepId);

    return upkeepId;
  }

  /**
   * @dev verify sender allowlist if needed and check max limit
   */
  function _shouldAutoApprove(RegistrarConfig memory config, address sender) private view returns (bool) {
    if (config.autoApproveConfigType == AutoApproveType.DISABLED) {
      return false;
    }
    if (
      config.autoApproveConfigType == AutoApproveType.ENABLED_SENDER_ALLOWLIST && (!s_autoApproveAllowedSenders[sender])
    ) {
      return false;
    }
    if (config.approvedCount < config.autoApproveMaxAllowed) {
      return true;
    }
    return false;
  }

  //MODIFIERS

  /**
   * @dev Reverts if not sent from the LINK token
   */
  modifier onlyLINK() {
    if (msg.sender != address(LINK)) {
      revert OnlyLink();
    }
    _;
  }

  /**
   * @dev Reverts if the given data does not begin with the `register` function selector
   * @param _data The data payload of the request
   */
  modifier permittedFunctionsForLINK(bytes memory _data) {
    bytes4 funcSelector;
    assembly {
      // solhint-disable-next-line avoid-low-level-calls
      funcSelector := mload(add(_data, 32)) // First 32 bytes contain length of data
    }
    if (funcSelector != REGISTER_REQUEST_SELECTOR) {
      revert FunctionNotPermitted();
    }
    _;
  }

  /**
   * @dev Reverts if the actual amount passed does not match the expected amount
   * @param expected amount that should match the actual amount
   * @param data bytes
   */
  modifier isActualAmount(uint256 expected, bytes calldata data) {
    // decode register function arguments to get actual amount
    (, , , , , , , uint96 amount, ) = abi.decode(
      data[4:],
      (string, bytes, address, uint32, address, bytes, bytes, uint96, address)
    );
    if (expected != amount) {
      revert AmountMismatch();
    }
    _;
  }

  /**
   * @dev Reverts if the actual sender address does not match the expected sender address
   * @param expected address that should match the actual sender address
   * @param data bytes
   */
  modifier isActualSender(address expected, bytes calldata data) {
    // decode register function arguments to get actual sender
    (, , , , , , , , address sender) = abi.decode(
      data[4:],
      (string, bytes, address, uint32, address, bytes, bytes, uint96, address)
    );
    if (expected != sender) {
      revert SenderMismatch();
    }
    _;
  }
}

File 2 of 8 : LinkTokenInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface LinkTokenInterface {
  function allowance(address owner, address spender) external view returns (uint256 remaining);

  function approve(address spender, uint256 value) external returns (bool success);

  function balanceOf(address owner) external view returns (uint256 balance);

  function decimals() external view returns (uint8 decimalPlaces);

  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);

  function increaseApproval(address spender, uint256 subtractedValue) external;

  function name() external view returns (string memory tokenName);

  function symbol() external view returns (string memory tokenSymbol);

  function totalSupply() external view returns (uint256 totalTokensIssued);

  function transfer(address to, uint256 value) external returns (bool success);

  function transferAndCall(
    address to,
    uint256 value,
    bytes calldata data
  ) external returns (bool success);

  function transferFrom(
    address from,
    address to,
    uint256 value
  ) external returns (bool success);
}

File 3 of 8 : KeeperRegistryInterface2_0.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @notice OnchainConfig of the registry
 * @dev only used in params and return values
 * @member paymentPremiumPPB payment premium rate oracles receive on top of
 * being reimbursed for gas, measured in parts per billion
 * @member flatFeeMicroLink flat fee paid to oracles for performing upkeeps,
 * priced in MicroLink; can be used in conjunction with or independently of
 * paymentPremiumPPB
 * @member checkGasLimit gas limit when checking for upkeep
 * @member stalenessSeconds number of seconds that is allowed for feed data to
 * be stale before switching to the fallback pricing
 * @member gasCeilingMultiplier multiplier to apply to the fast gas feed price
 * when calculating the payment ceiling for keepers
 * @member minUpkeepSpend minimum LINK that an upkeep must spend before cancelling
 * @member maxPerformGas max executeGas allowed for an upkeep on this registry
 * @member fallbackGasPrice gas price used if the gas price feed is stale
 * @member fallbackLinkPrice LINK price used if the LINK price feed is stale
 * @member transcoder address of the transcoder contract
 * @member registrar address of the registrar contract
 */
struct OnchainConfig {
  uint32 paymentPremiumPPB;
  uint32 flatFeeMicroLink; // min 0.000001 LINK, max 4294 LINK
  uint32 checkGasLimit;
  uint24 stalenessSeconds;
  uint16 gasCeilingMultiplier;
  uint96 minUpkeepSpend;
  uint32 maxPerformGas;
  uint32 maxCheckDataSize;
  uint32 maxPerformDataSize;
  uint256 fallbackGasPrice;
  uint256 fallbackLinkPrice;
  address transcoder;
  address registrar;
}

/**
 * @notice state of the registry
 * @dev only used in params and return values
 * @member nonce used for ID generation
 * @member ownerLinkBalance withdrawable balance of LINK by contract owner
 * @member expectedLinkBalance the expected balance of LINK of the registry
 * @member totalPremium the total premium collected on registry so far
 * @member numUpkeeps total number of upkeeps on the registry
 * @member configCount ordinal number of current config, out of all configs applied to this contract so far
 * @member latestConfigBlockNumber last block at which this config was set
 * @member latestConfigDigest domain-separation tag for current config
 * @member latestEpoch for which a report was transmitted
 * @member paused freeze on execution scoped to the entire registry
 */
struct State {
  uint32 nonce;
  uint96 ownerLinkBalance;
  uint256 expectedLinkBalance;
  uint96 totalPremium;
  uint256 numUpkeeps;
  uint32 configCount;
  uint32 latestConfigBlockNumber;
  bytes32 latestConfigDigest;
  uint32 latestEpoch;
  bool paused;
}

/**
 * @notice all information about an upkeep
 * @dev only used in return values
 * @member target the contract which needs to be serviced
 * @member executeGas the gas limit of upkeep execution
 * @member checkData the checkData bytes for this upkeep
 * @member balance the balance of this upkeep
 * @member admin for this upkeep
 * @member maxValidBlocknumber until which block this upkeep is valid
 * @member lastPerformBlockNumber the last block number when this upkeep was performed
 * @member amountSpent the amount this upkeep has spent
 * @member paused if this upkeep has been paused
 * @member skipSigVerification skip signature verification in transmit for a low security low cost model
 */
struct UpkeepInfo {
  address target;
  uint32 executeGas;
  bytes checkData;
  uint96 balance;
  address admin;
  uint64 maxValidBlocknumber;
  uint32 lastPerformBlockNumber;
  uint96 amountSpent;
  bool paused;
  bytes offchainConfig;
}

enum UpkeepFailureReason {
  NONE,
  UPKEEP_CANCELLED,
  UPKEEP_PAUSED,
  TARGET_CHECK_REVERTED,
  UPKEEP_NOT_NEEDED,
  PERFORM_DATA_EXCEEDS_LIMIT,
  INSUFFICIENT_BALANCE
}

interface KeeperRegistryBaseInterface {
  function registerUpkeep(
    address target,
    uint32 gasLimit,
    address admin,
    bytes calldata checkData,
    bytes calldata offchainConfig
  ) external returns (uint256 id);

  function cancelUpkeep(uint256 id) external;

  function pauseUpkeep(uint256 id) external;

  function unpauseUpkeep(uint256 id) external;

  function transferUpkeepAdmin(uint256 id, address proposed) external;

  function acceptUpkeepAdmin(uint256 id) external;

  function updateCheckData(uint256 id, bytes calldata newCheckData) external;

  function addFunds(uint256 id, uint96 amount) external;

  function setUpkeepGasLimit(uint256 id, uint32 gasLimit) external;

  function setUpkeepOffchainConfig(uint256 id, bytes calldata config) external;

  function getUpkeep(uint256 id) external view returns (UpkeepInfo memory upkeepInfo);

  function getActiveUpkeepIDs(uint256 startIndex, uint256 maxCount) external view returns (uint256[] memory);

  function getTransmitterInfo(address query)
    external
    view
    returns (
      bool active,
      uint8 index,
      uint96 balance,
      uint96 lastCollected,
      address payee
    );

  function getState()
    external
    view
    returns (
      State memory state,
      OnchainConfig memory config,
      address[] memory signers,
      address[] memory transmitters,
      uint8 f
    );
}

/**
 * @dev The view methods are not actually marked as view in the implementation
 * but we want them to be easily queried off-chain. Solidity will not compile
 * if we actually inherit from this interface, so we document it here.
 */
interface KeeperRegistryInterface is KeeperRegistryBaseInterface {
  function checkUpkeep(uint256 upkeepId)
    external
    view
    returns (
      bool upkeepNeeded,
      bytes memory performData,
      UpkeepFailureReason upkeepFailureReason,
      uint256 gasUsed,
      uint256 fastGasWei,
      uint256 linkNative
    );
}

interface KeeperRegistryExecutableInterface is KeeperRegistryBaseInterface {
  function checkUpkeep(uint256 upkeepId)
    external
    returns (
      bool upkeepNeeded,
      bytes memory performData,
      UpkeepFailureReason upkeepFailureReason,
      uint256 gasUsed,
      uint256 fastGasWei,
      uint256 linkNative
    );
}

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

abstract contract TypeAndVersionInterface {
  function typeAndVersion() external pure virtual returns (string memory);
}

File 5 of 8 : 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 6 of 8 : ERC677ReceiverInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;

interface ERC677ReceiverInterface {
  function onTokenTransfer(
    address sender,
    uint256 amount,
    bytes calldata data
  ) external;
}

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

File 8 of 8 : 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;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "metadata": {
    "bytecodeHash": "none",
    "useLiteralContent": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"LINKAddress","type":"address"},{"internalType":"enum KeeperRegistrar2_0.AutoApproveType","name":"autoApproveConfigType","type":"uint8"},{"internalType":"uint16","name":"autoApproveMaxAllowed","type":"uint16"},{"internalType":"address","name":"keeperRegistry","type":"address"},{"internalType":"uint96","name":"minLINKJuels","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountMismatch","type":"error"},{"inputs":[],"name":"FunctionNotPermitted","type":"error"},{"inputs":[],"name":"HashMismatch","type":"error"},{"inputs":[],"name":"InsufficientPayment","type":"error"},{"inputs":[],"name":"InvalidAdminAddress","type":"error"},{"inputs":[],"name":"InvalidDataLength","type":"error"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"LinkTransferFailed","type":"error"},{"inputs":[],"name":"OnlyAdminOrOwner","type":"error"},{"inputs":[],"name":"OnlyLink","type":"error"},{"inputs":[],"name":"RegistrationRequestFailed","type":"error"},{"inputs":[],"name":"RequestNotFound","type":"error"},{"inputs":[],"name":"SenderMismatch","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"senderAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"AutoApproveAllowedSenderSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum KeeperRegistrar2_0.AutoApproveType","name":"autoApproveConfigType","type":"uint8"},{"indexed":false,"internalType":"uint32","name":"autoApproveMaxAllowed","type":"uint32"},{"indexed":false,"internalType":"address","name":"keeperRegistry","type":"address"},{"indexed":false,"internalType":"uint96","name":"minLINKJuels","type":"uint96"}],"name":"ConfigChanged","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":true,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"displayName","type":"string"},{"indexed":true,"internalType":"uint256","name":"upkeepId","type":"uint256"}],"name":"RegistrationApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"RegistrationRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"bytes","name":"encryptedEmail","type":"bytes"},{"indexed":true,"internalType":"address","name":"upkeepContract","type":"address"},{"indexed":false,"internalType":"uint32","name":"gasLimit","type":"uint32"},{"indexed":false,"internalType":"address","name":"adminAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"checkData","type":"bytes"},{"indexed":false,"internalType":"uint96","name":"amount","type":"uint96"}],"name":"RegistrationRequested","type":"event"},{"inputs":[],"name":"LINK","outputs":[{"internalType":"contract LinkTokenInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"upkeepContract","type":"address"},{"internalType":"uint32","name":"gasLimit","type":"uint32"},{"internalType":"address","name":"adminAddress","type":"address"},{"internalType":"bytes","name":"checkData","type":"bytes"},{"internalType":"bytes","name":"offchainConfig","type":"bytes"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"senderAddress","type":"address"}],"name":"getAutoApproveAllowedSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"getPendingRequest","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegistrationConfig","outputs":[{"internalType":"enum KeeperRegistrar2_0.AutoApproveType","name":"autoApproveConfigType","type":"uint8"},{"internalType":"uint32","name":"autoApproveMaxAllowed","type":"uint32"},{"internalType":"uint32","name":"approvedCount","type":"uint32"},{"internalType":"address","name":"keeperRegistry","type":"address"},{"internalType":"uint256","name":"minLINKJuels","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"bytes","name":"encryptedEmail","type":"bytes"},{"internalType":"address","name":"upkeepContract","type":"address"},{"internalType":"uint32","name":"gasLimit","type":"uint32"},{"internalType":"address","name":"adminAddress","type":"address"},{"internalType":"bytes","name":"checkData","type":"bytes"},{"internalType":"bytes","name":"offchainConfig","type":"bytes"},{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"address","name":"sender","type":"address"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"bytes","name":"encryptedEmail","type":"bytes"},{"internalType":"address","name":"upkeepContract","type":"address"},{"internalType":"uint32","name":"gasLimit","type":"uint32"},{"internalType":"address","name":"adminAddress","type":"address"},{"internalType":"bytes","name":"checkData","type":"bytes"},{"internalType":"bytes","name":"offchainConfig","type":"bytes"},{"internalType":"uint96","name":"amount","type":"uint96"}],"internalType":"struct KeeperRegistrar2_0.RegistrationParams","name":"requestParams","type":"tuple"}],"name":"registerUpkeep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"senderAddress","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setAutoApproveAllowedSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum KeeperRegistrar2_0.AutoApproveType","name":"autoApproveConfigType","type":"uint8"},{"internalType":"uint16","name":"autoApproveMaxAllowed","type":"uint16"},{"internalType":"address","name":"keeperRegistry","type":"address"},{"internalType":"uint96","name":"minLINKJuels","type":"uint96"}],"name":"setRegistrationConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"typeAndVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063850af0cb11610097578063a611ea5611610066578063a611ea5614610325578063a793ab8b14610338578063c4d252f51461034b578063f2fde38b1461035e57600080fd5b8063850af0cb1461022e57806388b12d55146102475780638da5cb5b146102f4578063a4c0ed361461031257600080fd5b8063367b9b4f116100d3578063367b9b4f146101b557806362105854146101ca57806379ba5097146101dd5780637e776f7f146101e557600080fd5b806308b79da4146100fa578063181f5a77146101205780631b6b6d2314610169575b600080fd5b61010d610108366004612011565b610371565b6040519081526020015b60405180910390f35b61015c6040518060400160405280601581526020017f4b656570657252656769737472617220322e302e30000000000000000000000081525081565b6040516101179190612337565b6101907f000000000000000000000000326c977e6efc84e512bb9c30f76e30c160ed06fb81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610117565b6101c86101c3366004611be0565b6104fe565b005b6101c86101d8366004611d10565b610590565b6101c86107a4565b61021e6101f3366004611bbc565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205460ff1690565b6040519015158152602001610117565b6102366108a6565b6040516101179594939291906122e7565b6102bb610255366004611c92565b60009081526002602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116808452740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff169290910182905291565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526bffffffffffffffffffffffff909116602083015201610117565b60005473ffffffffffffffffffffffffffffffffffffffff16610190565b6101c8610320366004611c19565b610987565b6101c8610333366004611de7565b610ce5565b6101c8610346366004611cab565b610e78565b6101c8610359366004611c92565b61108d565b6101c861036c366004611bbc565b611326565b6004546000906bffffffffffffffffffffffff16610396610100840160e08501612066565b6bffffffffffffffffffffffff1610156103dc576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000326c977e6efc84e512bb9c30f76e30c160ed06fb166323b872dd333061042b610100870160e08801612066565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526bffffffffffffffffffffffff166044820152606401602060405180830381600087803b1580156104ad57600080fd5b505af11580156104c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e59190611c75565b506104f86104f283612470565b3361133a565b92915050565b610506611622565b73ffffffffffffffffffffffffffffffffffffffff821660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f20c6237dac83526a849285a9f79d08a483291bdd3a056a0ef9ae94ecee1ad356910160405180910390a25050565b610598611622565b60008181526002602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116808452740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff1691830191909152610631576040517f4b13b31e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000898989898989896040516020016106509796959493929190612180565b6040516020818303038152906040528051906020012090508083146106a1576040517f3f4d605300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526002602090815260408083208390558051610100810182528e8152815180840183529384528083019390935273ffffffffffffffffffffffffffffffffffffffff8d81168483015263ffffffff8d1660608501528b1660808401528051601f8a01839004830281018301909152888152610796929160a0830191908b908b9081908401838280828437600092019190915250505090825250604080516020601f8a01819004810282018101909252888152918101919089908990819084018382808284376000920191909152505050908252506020858101516bffffffffffffffffffffffff16910152826116a5565b505050505050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461082a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6040805160a081019091526003805460009283928392839283928392829060ff1660028111156108d8576108d861259b565b60028111156108e9576108e961259b565b81528154610100810463ffffffff908116602080850191909152650100000000008304909116604080850191909152690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff166060808501919091526001909401546bffffffffffffffffffffffff90811660809485015285519186015192860151948601519590930151909b919a50929850929650169350915050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000326c977e6efc84e512bb9c30f76e30c160ed06fb16146109f6576040517f018d10be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060208101517fffffffff0000000000000000000000000000000000000000000000000000000081167fa611ea560000000000000000000000000000000000000000000000000000000014610aac576040517fe3d6792100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484846000610abe82600481866123f7565b810190610acb9190611f10565b50975050505050505050806bffffffffffffffffffffffff168414610b1c576040517f55e97b0d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8988886000610b2e82600481866123f7565b810190610b3b9190611f10565b985050505050505050508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610baa576040517ff8c5638e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101248b1015610be6576040517fdfe9309000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004546bffffffffffffffffffffffff168d1015610c30576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff168d8d604051610c59929190612170565b600060405180830381855af49150503d8060008114610c94576040519150601f19603f3d011682016040523d82523d6000602084013e610c99565b606091505b5050905080610cd4576040517f649bf81000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000326c977e6efc84e512bb9c30f76e30c160ed06fb1614610d54576040517f018d10be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e696040518061010001604052808e81526020018d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525073ffffffffffffffffffffffffffffffffffffffff808d1660208084019190915263ffffffff8d16604080850191909152918c1660608401528151601f8b018290048202810182019092528982526080909201918a908a9081908401838280828437600092019190915250505090825250604080516020601f8901819004810282018101909252878152918101919088908890819084018382808284376000920191909152505050908252506bffffffffffffffffffffffff85166020909101528261133a565b50505050505050505050505050565b610e80611622565b6003546040805160a081019091526501000000000090910463ffffffff169080866002811115610eb257610eb261259b565b815261ffff8616602082015263ffffffff8316604082015273ffffffffffffffffffffffffffffffffffffffff851660608201526bffffffffffffffffffffffff841660809091015280516003805490919082907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001836002811115610f3c57610f3c61259b565b02179055506020820151815460408085015160608601517fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90931661010063ffffffff958616027fffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff1617650100000000009490911693909302929092177fffffff0000000000000000000000000000000000000000ffffffffffffffffff16690100000000000000000073ffffffffffffffffffffffffffffffffffffffff90921691909102178255608090920151600190910180547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff909216919091179055517f6293a703ec7145dfa23c5cde2e627d6a02e153fc2e9c03b14d1e22cbb4a7e9cd9061107e908790879087908790612296565b60405180910390a15050505050565b60008181526002602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116808452740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff1691830191909152331480611114575060005473ffffffffffffffffffffffffffffffffffffffff1633145b61114a576040517f61685c2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff16611198576040517f4b13b31e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260026020908152604080832083905583519184015190517fa9059cbb0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000326c977e6efc84e512bb9c30f76e30c160ed06fb73ffffffffffffffffffffffffffffffffffffffff169263a9059cbb926112509260040173ffffffffffffffffffffffffffffffffffffffff9290921682526bffffffffffffffffffffffff16602082015260400190565b602060405180830381600087803b15801561126a57600080fd5b505af115801561127e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a29190611c75565b9050806112f65781516040517fc2e4dce800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610821565b60405183907f3663fb28ebc87645eb972c9dad8521bf665c623f287e79f1c56f1eb374b82a2290600090a2505050565b61132e611622565b611337816118ec565b50565b608082015160009073ffffffffffffffffffffffffffffffffffffffff1661138e576040517f05bb467c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008360400151846060015185608001518660a001518760c001516040516020016113bd9594939291906121e7565b604051602081830303815290604052805190602001209050836040015173ffffffffffffffffffffffffffffffffffffffff16817f9b8456f925542af2c5fb15ff4be32cc8f209dda96c544766e301367df40f499886600001518760200151886060015189608001518a60a001518b60e001516040516114429695949392919061234a565b60405180910390a36040805160a081019091526003805460009283929091829060ff1660028111156114765761147661259b565b60028111156114875761148761259b565b8152815463ffffffff61010082048116602084015265010000000000820416604083015273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff1660809091015290506114fa81866119e2565b1561155f57604081015161150f906001612421565b6003805463ffffffff9290921665010000000000027fffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff90921691909117905561155886846116a5565b9150611619565b60e086015160008481526002602052604081205490916115a4917401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16612449565b60408051808201825260808a015173ffffffffffffffffffffffffffffffffffffffff90811682526bffffffffffffffffffffffff938416602080840191825260008a815260029091529390932091519251909316740100000000000000000000000000000000000000000291909216179055505b50949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610821565b565b6003546040838101516060850151608086015160a087015160c088015194517f6ded9eae0000000000000000000000000000000000000000000000000000000081526000966901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff169587958795636ded9eae9561172b95929491939092916004016121e7565b602060405180830381600087803b15801561174557600080fd5b505af1158015611759573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177d919061204d565b905060007f000000000000000000000000326c977e6efc84e512bb9c30f76e30c160ed06fb73ffffffffffffffffffffffffffffffffffffffff16634000aea0848860e00151856040516020016117d691815260200190565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016118039392919061224a565b602060405180830381600087803b15801561181d57600080fd5b505af1158015611831573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118559190611c75565b9050806118a6576040517fc2e4dce800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610821565b81857fb9a292fb7e3edd920cd2d2829a3615a640c43fd7de0a0820aa0668feb4c37d4b88600001516040516118db9190612337565b60405180910390a350949350505050565b73ffffffffffffffffffffffffffffffffffffffff811633141561196c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610821565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600080835160028111156119f8576119f861259b565b1415611a06575060006104f8565b600183516002811115611a1b57611a1b61259b565b148015611a4e575073ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604090205460ff16155b15611a5b575060006104f8565b826020015163ffffffff16836040015163ffffffff161015611a7f575060016104f8565b50600092915050565b8035611a93816125f9565b919050565b60008083601f840112611aaa57600080fd5b50813567ffffffffffffffff811115611ac257600080fd5b602083019150836020828501011115611ada57600080fd5b9250929050565b600082601f830112611af257600080fd5b813567ffffffffffffffff80821115611b0d57611b0d6125ca565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611b5357611b536125ca565b81604052838152866020858801011115611b6c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803563ffffffff81168114611a9357600080fd5b80356bffffffffffffffffffffffff81168114611a9357600080fd5b600060208284031215611bce57600080fd5b8135611bd9816125f9565b9392505050565b60008060408385031215611bf357600080fd5b8235611bfe816125f9565b91506020830135611c0e8161261b565b809150509250929050565b60008060008060608587031215611c2f57600080fd5b8435611c3a816125f9565b935060208501359250604085013567ffffffffffffffff811115611c5d57600080fd5b611c6987828801611a98565b95989497509550505050565b600060208284031215611c8757600080fd5b8151611bd98161261b565b600060208284031215611ca457600080fd5b5035919050565b60008060008060808587031215611cc157600080fd5b843560038110611cd057600080fd5b9350602085013561ffff81168114611ce757600080fd5b92506040850135611cf7816125f9565b9150611d0560608601611ba0565b905092959194509250565b600080600080600080600080600060e08a8c031215611d2e57600080fd5b893567ffffffffffffffff80821115611d4657600080fd5b611d528d838e01611ae1565b9a5060208c01359150611d64826125f9565b819950611d7360408d01611b8c565b985060608c01359150611d85826125f9565b90965060808b01359080821115611d9b57600080fd5b611da78d838e01611a98565b909750955060a08c0135915080821115611dc057600080fd5b50611dcd8c828d01611a98565b9a9d999c50979a9699959894979660c00135949350505050565b6000806000806000806000806000806000806101208d8f031215611e0a57600080fd5b67ffffffffffffffff8d351115611e2057600080fd5b611e2d8e8e358f01611ae1565b9b5067ffffffffffffffff60208e01351115611e4857600080fd5b611e588e60208f01358f01611a98565b909b509950611e6960408e01611a88565b9850611e7760608e01611b8c565b9750611e8560808e01611a88565b965067ffffffffffffffff60a08e01351115611ea057600080fd5b611eb08e60a08f01358f01611a98565b909650945067ffffffffffffffff60c08e01351115611ece57600080fd5b611ede8e60c08f01358f01611a98565b9094509250611eef60e08e01611ba0565b9150611efe6101008e01611a88565b90509295989b509295989b509295989b565b60008060008060008060008060006101208a8c031215611f2f57600080fd5b893567ffffffffffffffff80821115611f4757600080fd5b611f538d838e01611ae1565b9a5060208c0135915080821115611f6957600080fd5b611f758d838e01611ae1565b9950611f8360408d01611a88565b9850611f9160608d01611b8c565b9750611f9f60808d01611a88565b965060a08c0135915080821115611fb557600080fd5b611fc18d838e01611ae1565b955060c08c0135915080821115611fd757600080fd5b50611fe48c828d01611ae1565b935050611ff360e08b01611ba0565b91506120026101008b01611a88565b90509295985092959850929598565b60006020828403121561202357600080fd5b813567ffffffffffffffff81111561203a57600080fd5b82016101008185031215611bd957600080fd5b60006020828403121561205f57600080fd5b5051919050565b60006020828403121561207857600080fd5b611bd982611ba0565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b6000815180845260005b818110156120f0576020818501810151868301820152016120d4565b81811115612102576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6003811061216c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b8183823760009101908152919050565b600073ffffffffffffffffffffffffffffffffffffffff808a16835263ffffffff8916602084015280881660408401525060a060608301526121c660a083018688612081565b82810360808401526121d9818587612081565b9a9950505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835263ffffffff8716602084015280861660408401525060a0606083015261222c60a08301856120ca565b828103608084015261223e81856120ca565b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff841681526bffffffffffffffffffffffff8316602082015260606040820152600061228d60608301846120ca565b95945050505050565b608081016122a48287612135565b61ffff8516602083015273ffffffffffffffffffffffffffffffffffffffff841660408301526bffffffffffffffffffffffff8316606083015295945050505050565b60a081016122f58288612135565b63ffffffff808716602084015280861660408401525073ffffffffffffffffffffffffffffffffffffffff841660608301528260808301529695505050505050565b602081526000611bd960208301846120ca565b60c08152600061235d60c08301896120ca565b828103602084015261236f81896120ca565b905063ffffffff8716604084015273ffffffffffffffffffffffffffffffffffffffff8616606084015282810360808401526123ab81866120ca565b9150506bffffffffffffffffffffffff831660a0830152979650505050505050565b604051610100810167ffffffffffffffff811182821017156123f1576123f16125ca565b60405290565b6000808585111561240757600080fd5b8386111561241457600080fd5b5050820193919092039150565b600063ffffffff8083168185168083038211156124405761244061256c565b01949350505050565b60006bffffffffffffffffffffffff8083168185168083038211156124405761244061256c565b6000610100823603121561248357600080fd5b61248b6123cd565b823567ffffffffffffffff808211156124a357600080fd5b6124af36838701611ae1565b835260208501359150808211156124c557600080fd5b6124d136838701611ae1565b60208401526124e260408601611a88565b60408401526124f360608601611b8c565b606084015261250460808601611a88565b608084015260a085013591508082111561251d57600080fd5b61252936838701611ae1565b60a084015260c085013591508082111561254257600080fd5b5061254f36828601611ae1565b60c08301525061256160e08401611ba0565b60e082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461133757600080fd5b801515811461133757600080fdfea164736f6c6343000806000a

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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