Contract 0xDb8e8e2ccb5C033938736aa89Fe4fa1eDfD15a1d 13

Contract Overview

Balance:
0 AVAX
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x166a7786067d3f4a91b03f8fe29edac3a47f413578a152ce264b59a37c899d71Set Registration...122026912022-08-03 21:49:44179 days 4 hrs ago0x8fa510072009e71cfd447169ab5a84cac394f58a IN 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX0.0010351679 29.9
0xbe959b448fad7001bba8b1fb2e9f1a6535f8fab327890d437adef95f2053e086Accept Ownership110583402022-06-28 21:53:52215 days 4 hrs ago0x8fa510072009e71cfd447169ab5a84cac394f58a IN 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX0.000857766 26
0xfa4856e0199b321349233497658106988f970599cb6fb345e75b0f878b8b26b5Transfer Ownersh...110583252022-06-28 21:53:18215 days 4 hrs ago0xdd06d3c49dcc68221cbc3ba5f98c9f14dd817b6a IN 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX0.001242618 26
0x3320ca2c478575816273c9ce4551d0605c765babec400f609565b04dc0aa073bAccept Ownership107428532022-06-16 15:14:33227 days 11 hrs ago0xdd06d3c49dcc68221cbc3ba5f98c9f14dd817b6a IN 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX0.0008742615 26.5
0x9c040bdb38a0f3e5199dd23a49bcd9b6b4d318a0fe1e97c9d8e0e96242345fbdTransfer Ownersh...107428412022-06-16 15:13:57227 days 11 hrs ago0x9e3d8dcd4c4c67eaa752457a51efbf98cb5439c6 IN 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX0.0012665145 26.5
0x0c649a0a9000486684bd15629b2d6ee6e0747e6ab4860ab7755122852de531c40x60a06040107224562022-06-16 0:01:28228 days 2 hrs ago0x9e3d8dcd4c4c67eaa752457a51efbf98cb5439c6 IN  Create: KeeperRegistrar0 AVAX0.045128225
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x5725b2735a610fe6b2ad0476f00e74d0e8c8c9e6c12dc47f8cebb8c88b3d332b184275442023-01-29 0:31:321 day 1 hr ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d 0x0b9d5d9136855f6fec3c0993fee6e9ce8a2978460 AVAX
0x5725b2735a610fe6b2ad0476f00e74d0e8c8c9e6c12dc47f8cebb8c88b3d332b184275442023-01-29 0:31:321 day 1 hr ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0x02777053d6764996e594c3e88af1d58d5363a2e60 AVAX
0x5725b2735a610fe6b2ad0476f00e74d0e8c8c9e6c12dc47f8cebb8c88b3d332b184275442023-01-29 0:31:321 day 1 hr ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX
0x5725b2735a610fe6b2ad0476f00e74d0e8c8c9e6c12dc47f8cebb8c88b3d332b184275442023-01-29 0:31:321 day 1 hr ago 0x0b9d5d9136855f6fec3c0993fee6e9ce8a2978460xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX
0x5725b2735a610fe6b2ad0476f00e74d0e8c8c9e6c12dc47f8cebb8c88b3d332b184275442023-01-29 0:31:321 day 1 hr ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d 0x0b9d5d9136855f6fec3c0993fee6e9ce8a2978460 AVAX
0x5725b2735a610fe6b2ad0476f00e74d0e8c8c9e6c12dc47f8cebb8c88b3d332b184275442023-01-29 0:31:321 day 1 hr ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0x02777053d6764996e594c3e88af1d58d5363a2e60 AVAX
0x5725b2735a610fe6b2ad0476f00e74d0e8c8c9e6c12dc47f8cebb8c88b3d332b184275442023-01-29 0:31:321 day 1 hr ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX
0x5725b2735a610fe6b2ad0476f00e74d0e8c8c9e6c12dc47f8cebb8c88b3d332b184275442023-01-29 0:31:321 day 1 hr ago 0x0b9d5d9136855f6fec3c0993fee6e9ce8a2978460xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX
0x19a9a3a3d354c6b984ffadc80e20fe74dc5fe4ac41508e3fb9897855e9176dae184273042023-01-29 0:17:051 day 1 hr ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d 0x0b9d5d9136855f6fec3c0993fee6e9ce8a2978460 AVAX
0x19a9a3a3d354c6b984ffadc80e20fe74dc5fe4ac41508e3fb9897855e9176dae184273042023-01-29 0:17:051 day 1 hr ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0x02777053d6764996e594c3e88af1d58d5363a2e60 AVAX
0x19a9a3a3d354c6b984ffadc80e20fe74dc5fe4ac41508e3fb9897855e9176dae184273042023-01-29 0:17:051 day 1 hr ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX
0x19a9a3a3d354c6b984ffadc80e20fe74dc5fe4ac41508e3fb9897855e9176dae184273042023-01-29 0:17:051 day 1 hr ago 0x0b9d5d9136855f6fec3c0993fee6e9ce8a2978460xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX
0x19a9a3a3d354c6b984ffadc80e20fe74dc5fe4ac41508e3fb9897855e9176dae184273042023-01-29 0:17:051 day 1 hr ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d 0x0b9d5d9136855f6fec3c0993fee6e9ce8a2978460 AVAX
0x19a9a3a3d354c6b984ffadc80e20fe74dc5fe4ac41508e3fb9897855e9176dae184273042023-01-29 0:17:051 day 1 hr ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0x02777053d6764996e594c3e88af1d58d5363a2e60 AVAX
0x19a9a3a3d354c6b984ffadc80e20fe74dc5fe4ac41508e3fb9897855e9176dae184273042023-01-29 0:17:051 day 1 hr ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX
0x19a9a3a3d354c6b984ffadc80e20fe74dc5fe4ac41508e3fb9897855e9176dae184273042023-01-29 0:17:051 day 1 hr ago 0x0b9d5d9136855f6fec3c0993fee6e9ce8a2978460xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX
0x3a1d5dbee748c57388211d8765fcd35b61eaffb7d5dddc7ecd70a4935e1b30d2184268822023-01-28 23:46:161 day 2 hrs ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d 0x0b9d5d9136855f6fec3c0993fee6e9ce8a2978460 AVAX
0x3a1d5dbee748c57388211d8765fcd35b61eaffb7d5dddc7ecd70a4935e1b30d2184268822023-01-28 23:46:161 day 2 hrs ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0x02777053d6764996e594c3e88af1d58d5363a2e60 AVAX
0x3a1d5dbee748c57388211d8765fcd35b61eaffb7d5dddc7ecd70a4935e1b30d2184268822023-01-28 23:46:161 day 2 hrs ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX
0x3a1d5dbee748c57388211d8765fcd35b61eaffb7d5dddc7ecd70a4935e1b30d2184268822023-01-28 23:46:161 day 2 hrs ago 0x0b9d5d9136855f6fec3c0993fee6e9ce8a2978460xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX
0x3a1d5dbee748c57388211d8765fcd35b61eaffb7d5dddc7ecd70a4935e1b30d2184268822023-01-28 23:46:161 day 2 hrs ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d 0x0b9d5d9136855f6fec3c0993fee6e9ce8a2978460 AVAX
0x3a1d5dbee748c57388211d8765fcd35b61eaffb7d5dddc7ecd70a4935e1b30d2184268822023-01-28 23:46:161 day 2 hrs ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0x02777053d6764996e594c3e88af1d58d5363a2e60 AVAX
0x3a1d5dbee748c57388211d8765fcd35b61eaffb7d5dddc7ecd70a4935e1b30d2184268822023-01-28 23:46:161 day 2 hrs ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX
0x3a1d5dbee748c57388211d8765fcd35b61eaffb7d5dddc7ecd70a4935e1b30d2184268822023-01-28 23:46:161 day 2 hrs ago 0x0b9d5d9136855f6fec3c0993fee6e9ce8a2978460xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d0 AVAX
0x078360140733d781753eae7ebea7d032e0a7a23c8f66505c6923be4b8f9ef4f5160251342022-11-20 20:16:3870 days 5 hrs ago 0xdb8e8e2ccb5c033938736aa89fe4fa1edfd15a1d 0x0b9d5d9136855f6fec3c0993fee6e9ce8a2978460 AVAX
[ Download CSV Export 
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
KeeperRegistrar

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 8 : KeeperRegistrar.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./interfaces/LinkTokenInterface.sol";
import "./interfaces/KeeperRegistryInterface.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 KeeperRegistrar 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 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 1.1.0";

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

  struct PendingRequest {
    address admin;
    uint96 balance;
  }

  Config 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,
    uint8 indexed source
  );

  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 source application sending this request
   * @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,
    uint96 amount,
    uint8 source,
    address sender
  ) external onlyLINK {
    if (adminAddress == address(0)) {
      revert InvalidAdminAddress();
    }
    bytes32 hash = keccak256(abi.encode(upkeepContract, gasLimit, adminAddress, checkData));

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

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

      _approve(name, upkeepContract, gasLimit, adminAddress, checkData, amount, hash);
    } else {
      uint96 newBalance = s_pendingRequests[hash].balance + amount;
      s_pendingRequests[hash] = PendingRequest({admin: adminAddress, balance: newBalance});
    }
  }

  /**
   * @dev register upkeep on KeeperRegistry contract and emit RegistrationApproved event
   */
  function approve(
    string memory name,
    address upkeepContract,
    uint32 gasLimit,
    address adminAddress,
    bytes calldata checkData,
    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));
    if (hash != expectedHash) {
      revert HashMismatch();
    }
    delete s_pendingRequests[hash];
    _approve(name, upkeepContract, gasLimit, adminAddress, checkData, request.balance, hash);
  }

  /**
   * @notice cancel will remove a registration request and return the refunds to the msg.sender
   * @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(msg.sender, request.balance);
    if (!success) {
      revert LinkTransferFailed(msg.sender);
    }
    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 = Config({
      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
    )
  {
    Config 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 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 register upkeep on KeeperRegistry contract and emit RegistrationApproved event
   */
  function _approve(
    string memory name,
    address upkeepContract,
    uint32 gasLimit,
    address adminAddress,
    bytes calldata checkData,
    uint96 amount,
    bytes32 hash
  ) private {
    KeeperRegistryBaseInterface keeperRegistry = s_config.keeperRegistry;

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

    emit RegistrationApproved(hash, name, upkeepId);
  }

  /**
   * @dev verify sender allowlist if needed and check max limit
   */
  function _shouldAutoApprove(Config memory config, address sender) private 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 memory data) {
    uint256 actual;
    assembly {
      actual := mload(add(data, 228))
    }
    if (expected != actual) {
      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 memory data) {
    address actual;
    assembly {
      actual := mload(add(data, 292))
    }
    if (expected != actual) {
      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 : KeeperRegistryInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @notice config 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 blockCountPerTurn number of blocks each oracle has during their turn to
 * perform upkeep before it will be the next keeper's turn to submit
 * @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 Config {
  uint32 paymentPremiumPPB;
  uint32 flatFeeMicroLink; // min 0.000001 LINK, max 4294 LINK
  uint24 blockCountPerTurn;
  uint32 checkGasLimit;
  uint24 stalenessSeconds;
  uint16 gasCeilingMultiplier;
  uint96 minUpkeepSpend;
  uint32 maxPerformGas;
  uint256 fallbackGasPrice;
  uint256 fallbackLinkPrice;
  address transcoder;
  address registrar;
}

/**
 * @notice config of the registry
 * @dev only used in params and return values
 * @member nonce used for ID generation
 * @ownerLinkBalance withdrawable balance of LINK by contract owner
 * @numUpkeeps total number of upkeeps on the registry
 */
struct State {
  uint32 nonce;
  uint96 ownerLinkBalance;
  uint256 expectedLinkBalance;
  uint256 numUpkeeps;
}

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

  function performUpkeep(uint256 id, bytes calldata performData) external returns (bool success);

  function cancelUpkeep(uint256 id) external;

  function addFunds(uint256 id, uint96 amount) external;

  function setUpkeepGasLimit(uint256 id, uint32 gasLimit) external;

  function getUpkeep(uint256 id)
    external
    view
    returns (
      address target,
      uint32 executeGas,
      bytes memory checkData,
      uint96 balance,
      address lastKeeper,
      address admin,
      uint64 maxValidBlocknumber,
      uint96 amountSpent
    );

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

  function getKeeperInfo(address query)
    external
    view
    returns (
      address payee,
      bool active,
      uint96 balance
    );

  function getState()
    external
    view
    returns (
      State memory,
      Config memory,
      address[] memory
    );
}

/**
 * @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, address from)
    external
    view
    returns (
      bytes memory performData,
      uint256 maxLinkPayment,
      uint256 gasLimit,
      int256 gasWei,
      int256 linkEth
    );
}

interface KeeperRegistryExecutableInterface is KeeperRegistryBaseInterface {
  function checkUpkeep(uint256 upkeepId, address from)
    external
    returns (
      bytes memory performData,
      uint256 maxLinkPayment,
      uint256 gasLimit,
      uint256 adjustedGasWei,
      uint256 linkEth
    );
}

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 KeeperRegistrar.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 KeeperRegistrar.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"},{"indexed":true,"internalType":"uint8","name":"source","type":"uint8"}],"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":"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 KeeperRegistrar.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":"uint96","name":"amount","type":"uint96"},{"internalType":"uint8","name":"source","type":"uint8"},{"internalType":"address","name":"sender","type":"address"}],"name":"register","outputs":[],"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 KeeperRegistrar.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"}]

60a06040523480156200001157600080fd5b50604051620023123803806200231283398101604081905262000034916200038e565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000e7565b5050506001600160a01b038516608052620000dc8484848462000192565b505050505062000487565b336001600160a01b03821603620001415760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6200019c62000313565b6003546040805160a081019091526501000000000090910463ffffffff169080866002811115620001d157620001d16200041c565b815261ffff8616602082015263ffffffff831660408201526001600160a01b03851660608201526001600160601b038416608090910152805160038054909190829060ff191660018360028111156200022e576200022e6200041c565b0217905550602082015181546040808501516060860151610100600160481b031990931661010063ffffffff9586160263ffffffff60281b19161765010000000000949091169390930292909217600160481b600160e81b03191669010000000000000000006001600160a01b0390921691909102178255608090920151600190910180546001600160601b0319166001600160601b03909216919091179055517f6293a703ec7145dfa23c5cde2e627d6a02e153fc2e9c03b14d1e22cbb4a7e9cd906200030490879087908790879062000432565b60405180910390a15050505050565b6000546001600160a01b031633146200036f5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000082565b565b80516001600160a01b03811681146200038957600080fd5b919050565b600080600080600060a08688031215620003a757600080fd5b620003b28662000371565b9450602086015160038110620003c757600080fd5b604087015190945061ffff81168114620003e057600080fd5b9250620003f06060870162000371565b60808701519092506001600160601b03811681146200040e57600080fd5b809150509295509295909350565b634e487b7160e01b600052602160045260246000fd5b60808101600386106200045557634e487b7160e01b600052602160045260246000fd5b94815261ffff9390931660208401526001600160a01b039190911660408301526001600160601b031660609091015290565b608051611e53620004bf6000396000818161015b015281816104a601528181610a410152818161110b01526113320152611e536000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063850af0cb1161008c578063a4c0ed3611610066578063a4c0ed36146102fd578063a793ab8b14610310578063c4d252f514610323578063f2fde38b1461033657600080fd5b8063850af0cb1461021957806388b12d55146102325780638da5cb5b146102df57600080fd5b80633659d666116100c85780633659d666146101a2578063367b9b4f146101b557806379ba5097146101c85780637e776f7f146101d057600080fd5b8063181f5a77146100ef578063183310b3146101415780631b6b6d2314610156575b600080fd5b61012b6040518060400160405280601581526020017f4b656570657252656769737472617220312e312e30000000000000000000000081525081565b604051610138919061168e565b60405180910390f35b61015461014f366004611808565b610349565b005b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610138565b6101546101b03660046118da565b61048e565b6101546101c33660046119e2565b6107b4565b610154610846565b6102096101de366004611a19565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205460ff1690565b6040519015158152602001610138565b610221610948565b604051610138959493929190611a9e565b6102a6610240366004611aee565b60009081526002602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116808452740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff169290910182905291565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526bffffffffffffffffffffffff909116602083015201610138565b60005473ffffffffffffffffffffffffffffffffffffffff1661017d565b61015461030b366004611b07565b610a29565b61015461031e366004611b61565b610d7c565b610154610331366004611aee565b610f91565b610154610344366004611a19565b6111e3565b6103516111f7565b60008181526002602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116808452740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff16918301919091526103ea576040517f4b13b31e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008787878787604051602001610405959493929190611c0d565b604051602081830303815290604052805190602001209050808314610456576040517f3f4d605300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600260209081526040822091909155820151610483908a908a908a908a908a908a908a61127a565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146104fd576040517f018d10be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff861661054a576040517f05bb467c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008888888888604051602001610565959493929190611c0d565b6040516020818303038152906040528051906020012090508260ff168973ffffffffffffffffffffffffffffffffffffffff16827fc3f5df4aefec026f610a3fcb08f19476492d69d2cb78b1c2eba259a8820e6a788f8f8f8e8e8e8e8e6040516105d6989796959493929190611c5e565b60405180910390a46040805160a08101909152600380546000929190829060ff16600281111561060857610608611a34565b600281111561061957610619611a34565b8152815463ffffffff61010082048116602084015265010000000000820416604083015273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff16608090910152905061068c8184611488565b156106f55760408101516106a1906001611d14565b6003805463ffffffff9290921665010000000000027fffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff9092169190911790556106f08d8b8b8b8b8b8b8961127a565b6107a5565b6000828152600260205260408120546107359087907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16611d3c565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff808d1682526bffffffffffffffffffffffff9384166020808401918252600089815260029091529390932091519251909316740100000000000000000000000000000000000000000291909216179055505b50505050505050505050505050565b6107bc6111f7565b73ffffffffffffffffffffffffffffffffffffffff821660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f20c6237dac83526a849285a9f79d08a483291bdd3a056a0ef9ae94ecee1ad356910160405180910390a25050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146108cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6040805160a081019091526003805460009283928392839283928392829060ff16600281111561097a5761097a611a34565b600281111561098b5761098b611a34565b81528154610100810463ffffffff908116602080850191909152650100000000008304909116604080850191909152690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff166060808501919091526001909401546bffffffffffffffffffffffff90811660809485015285519186015192860151948601519590930151909b919a50929850929650169350915050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610a98576040517f018d10be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060208101517fffffffff0000000000000000000000000000000000000000000000000000000081167f3659d6660000000000000000000000000000000000000000000000000000000014610b4e576040517fe3d6792100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060e4810151828114610bc3576040517f55e97b0d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8887878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061012481015173ffffffffffffffffffffffffffffffffffffffff83811690821614610c52576040517ff8c5638e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610124891015610c8e576040517fdfe9309000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004546bffffffffffffffffffffffff168b1015610cd8576040517fcd1c886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff168b8b604051610d01929190611d63565b600060405180830381855af49150503d8060008114610d3c576040519150601f19603f3d011682016040523d82523d6000602084013e610d41565b606091505b50509050806107a5576040517f649bf81000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d846111f7565b6003546040805160a081019091526501000000000090910463ffffffff169080866002811115610db657610db6611a34565b815261ffff8616602082015263ffffffff8316604082015273ffffffffffffffffffffffffffffffffffffffff851660608201526bffffffffffffffffffffffff841660809091015280516003805490919082907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001836002811115610e4057610e40611a34565b02179055506020820151815460408085015160608601517fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90931661010063ffffffff958616027fffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff1617650100000000009490911693909302929092177fffffff0000000000000000000000000000000000000000ffffffffffffffffff16690100000000000000000073ffffffffffffffffffffffffffffffffffffffff90921691909102178255608090920151600190910180547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff909216919091179055517f6293a703ec7145dfa23c5cde2e627d6a02e153fc2e9c03b14d1e22cbb4a7e9cd90610f82908790879087908790611d73565b60405180910390a15050505050565b60008181526002602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116808452740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff1691830191909152331480611018575060005473ffffffffffffffffffffffffffffffffffffffff1633145b61104e576040517f61685c2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff1661109c576040517f4b13b31e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526002602090815260408083208390559083015190517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526bffffffffffffffffffffffff909116602482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015611154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111789190611dc4565b9050806111b3576040517fc2e4dce80000000000000000000000000000000000000000000000000000000081523360048201526024016108c3565b60405183907f3663fb28ebc87645eb972c9dad8521bf665c623f287e79f1c56f1eb374b82a2290600090a2505050565b6111eb6111f7565b6111f48161152e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108c3565b565b6003546040517fda5c6741000000000000000000000000000000000000000000000000000000008152690100000000000000000090910473ffffffffffffffffffffffffffffffffffffffff1690600090829063da5c6741906112e9908c908c908c908c908c90600401611c0d565b6020604051808303816000875af1158015611308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132c9190611de1565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea084878560405160200161138191815260200190565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016113ae93929190611dfa565b6020604051808303816000875af11580156113cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f19190611dc4565b905080611442576040517fc2e4dce800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016108c3565b81847fb9a292fb7e3edd920cd2d2829a3615a640c43fd7de0a0820aa0668feb4c37d4b8d604051611473919061168e565b60405180910390a35050505050505050505050565b6000808351600281111561149e5761149e611a34565b036114ab57506000611528565b6001835160028111156114c0576114c0611a34565b1480156114f3575073ffffffffffffffffffffffffffffffffffffffff821660009081526005602052604090205460ff16155b1561150057506000611528565b826020015163ffffffff16836040015163ffffffff16101561152457506001611528565b5060005b92915050565b3373ffffffffffffffffffffffffffffffffffffffff8216036115ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108c3565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000815180845260005b818110156116495760208185018101518683018201520161162d565b8181111561165b576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006116a16020830184611623565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126116e857600080fd5b813567ffffffffffffffff80821115611703576117036116a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611749576117496116a8565b8160405283815286602085880101111561176257600080fd5b836020870160208301376000602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146117a657600080fd5b919050565b803563ffffffff811681146117a657600080fd5b60008083601f8401126117d157600080fd5b50813567ffffffffffffffff8111156117e957600080fd5b60208301915083602082850101111561180157600080fd5b9250929050565b600080600080600080600060c0888a03121561182357600080fd5b873567ffffffffffffffff8082111561183b57600080fd5b6118478b838c016116d7565b985061185560208b01611782565b975061186360408b016117ab565b965061187160608b01611782565b955060808a013591508082111561188757600080fd5b506118948a828b016117bf565b989b979a5095989497959660a090950135949350505050565b80356bffffffffffffffffffffffff811681146117a657600080fd5b803560ff811681146117a657600080fd5b60008060008060008060008060008060006101208c8e0312156118fc57600080fd5b67ffffffffffffffff808d35111561191357600080fd5b6119208e8e358f016116d7565b9b508060208e0135111561193357600080fd5b6119438e60208f01358f016117bf565b909b50995061195460408e01611782565b985061196260608e016117ab565b975061197060808e01611782565b96508060a08e0135111561198357600080fd5b506119948d60a08e01358e016117bf565b90955093506119a560c08d016118ad565b92506119b360e08d016118c9565b91506119c26101008d01611782565b90509295989b509295989b9093969950565b80151581146111f457600080fd5b600080604083850312156119f557600080fd5b6119fe83611782565b91506020830135611a0e816119d4565b809150509250929050565b600060208284031215611a2b57600080fd5b6116a182611782565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110611a9a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60a08101611aac8288611a63565b63ffffffff808716602084015280861660408401525073ffffffffffffffffffffffffffffffffffffffff841660608301528260808301529695505050505050565b600060208284031215611b0057600080fd5b5035919050565b60008060008060608587031215611b1d57600080fd5b611b2685611782565b935060208501359250604085013567ffffffffffffffff811115611b4957600080fd5b611b55878288016117bf565b95989497509550505050565b60008060008060808587031215611b7757600080fd5b843560038110611b8657600080fd5b9350602085013561ffff81168114611b9d57600080fd5b9250611bab60408601611782565b9150611bb9606086016118ad565b905092959194509250565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808816835263ffffffff8716602084015280861660408401525060806060830152611c53608083018486611bc4565b979650505050505050565b60c081526000611c7160c083018b611623565b8281036020840152611c84818a8c611bc4565b905063ffffffff8816604084015273ffffffffffffffffffffffffffffffffffffffff871660608401528281036080840152611cc1818688611bc4565b9150506bffffffffffffffffffffffff831660a08301529998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff808316818516808303821115611d3357611d33611ce5565b01949350505050565b60006bffffffffffffffffffffffff808316818516808303821115611d3357611d33611ce5565b8183823760009101908152919050565b60808101611d818287611a63565b61ffff8516602083015273ffffffffffffffffffffffffffffffffffffffff841660408301526bffffffffffffffffffffffff8316606083015295945050505050565b600060208284031215611dd657600080fd5b81516116a1816119d4565b600060208284031215611df357600080fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff841681526bffffffffffffffffffffffff83166020820152606060408201526000611e3d6060830184611623565b9594505050505056fea164736f6c634300080d000a0000000000000000000000000b9d5d9136855f6fec3c0993fee6e9ce8a297846000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000003e800000000000000000000000002777053d6764996e594c3e88af1d58d5363a2e60000000000000000000000000000000000000000000000004563918244f40000

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000b9d5d9136855f6fec3c0993fee6e9ce8a297846000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000003e800000000000000000000000002777053d6764996e594c3e88af1d58d5363a2e60000000000000000000000000000000000000000000000004563918244f40000

-----Decoded View---------------
Arg [0] : LINKAddress (address): 0x0b9d5d9136855f6fec3c0993fee6e9ce8a297846
Arg [1] : autoApproveConfigType (uint8): 2
Arg [2] : autoApproveMaxAllowed (uint16): 1000
Arg [3] : keeperRegistry (address): 0x02777053d6764996e594c3e88af1d58d5363a2e6
Arg [4] : minLINKJuels (uint96): 5000000000000000000

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000b9d5d9136855f6fec3c0993fee6e9ce8a297846
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [3] : 00000000000000000000000002777053d6764996e594c3e88af1d58d5363a2e6
Arg [4] : 0000000000000000000000000000000000000000000000004563918244f40000


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading