Contract 0x4f3af332a30973106fe146af0b4220bbbea748ec 9

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9f74837b37e267c01b93afc5e21ff6ead6f83a3b889e5dec321ceb9ace57e786Transfer Ownersh...845694432023-04-26 18:17:45337 days 19 hrs ago0x51aea7355f6e9179b2982934025be0dd915a3b66 IN  0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH0.00006028 0.1
0x93026f9a19162006c3545bfcd0fb1a8b0eeace527413862c6018f615b1725f52Set Registration...631852872023-02-21 18:49:42401 days 18 hrs ago0x51aea7355f6e9179b2982934025be0dd915a3b66 IN  0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH0.00008894 0.1
0xcb19ee087bdc0ec52ee2e4555c2082915e83c8815b8abc1fff2f853e4ac95996Accept Ownership631845382023-02-21 18:46:30401 days 18 hrs ago0x51aea7355f6e9179b2982934025be0dd915a3b66 IN  0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH0.00004329 0.1
0x2310ce3e7c11f6bacf345641dbd8d328311eeceabe98ced526926110cd02803cTransfer Ownersh...631844132023-02-21 18:45:59401 days 18 hrs ago0x8fa510072009e71cfd447169ab5a84cac394f58a IN  0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH0.00005676 0.1
0x67cb9f84c28ae64c3cde3de1404dd587e4f127f42a8f2d85d43d5abf8f829f24Accept Ownership242553822022-09-12 13:13:12564 days 20 mins ago0x8fa510072009e71cfd447169ab5a84cac394f58a IN  0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH0.0000179 0.1
0x7efb32fe1d8125dd492fbcb724ea652bbb245e13a0701bdd69785f55172c7c81Transfer Ownersh...238880682022-09-10 5:33:01566 days 8 hrs ago0xcbb37a4b2dfd158b66d5dad7c7a175db2318502b IN  0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH0.00000894 0.1
0xa6241f2ac325d4be8e9f1467df2992c35c05bc39f01c0e6f7ba94b6031e93485Set Registration...236316622022-09-08 18:07:54567 days 19 hrs ago0xcbb37a4b2dfd158b66d5dad7c7a175db2318502b IN  0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH0.0000761 0.1
0x8cf81421c66b93f0aae465d08790cf8a202862a8928792909df7e705c4f492eb0x60a06040236300292022-09-08 17:52:52567 days 19 hrs ago0xcbb37a4b2dfd158b66d5dad7c7a175db2318502b IN  Create: KeeperRegistrar0 ETH0.00151009 0.1
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xe5076a783d66cc0ba22546c14a11303f7bf164832478e6a16bcb642ce54dbae1718737312023-03-20 19:27:40374 days 18 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0xf97f4df75117a78c1a5a0dbb814af92458539fb40 ETH
0xe5076a783d66cc0ba22546c14a11303f7bf164832478e6a16bcb642ce54dbae1718737312023-03-20 19:27:40374 days 18 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0x75c0530885f385721fdda23c539af3701d6183d40 ETH
0xe5076a783d66cc0ba22546c14a11303f7bf164832478e6a16bcb642ce54dbae1718737312023-03-20 19:27:40374 days 18 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH
0xe5076a783d66cc0ba22546c14a11303f7bf164832478e6a16bcb642ce54dbae1718737312023-03-20 19:27:40374 days 18 hrs ago 0xf97f4df75117a78c1a5a0dbb814af92458539fb4 0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH
0xad6bf228b9264163c7e694a74248878ffd9d226fe1864903541eb9d9779c1786714598562023-03-19 14:42:10375 days 22 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0xf97f4df75117a78c1a5a0dbb814af92458539fb40 ETH
0xad6bf228b9264163c7e694a74248878ffd9d226fe1864903541eb9d9779c1786714598562023-03-19 14:42:10375 days 22 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0x75c0530885f385721fdda23c539af3701d6183d40 ETH
0xad6bf228b9264163c7e694a74248878ffd9d226fe1864903541eb9d9779c1786714598562023-03-19 14:42:10375 days 22 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH
0xad6bf228b9264163c7e694a74248878ffd9d226fe1864903541eb9d9779c1786714598562023-03-19 14:42:10375 days 22 hrs ago 0xf97f4df75117a78c1a5a0dbb814af92458539fb4 0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH
0x9c23afec184b494cbc3adaa5cba256cbeb7ec6e0492029684bcae77a4d151a77714593582023-03-19 14:40:11375 days 22 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0xf97f4df75117a78c1a5a0dbb814af92458539fb40 ETH
0x9c23afec184b494cbc3adaa5cba256cbeb7ec6e0492029684bcae77a4d151a77714593582023-03-19 14:40:11375 days 22 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0x75c0530885f385721fdda23c539af3701d6183d40 ETH
0x9c23afec184b494cbc3adaa5cba256cbeb7ec6e0492029684bcae77a4d151a77714593582023-03-19 14:40:11375 days 22 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH
0x9c23afec184b494cbc3adaa5cba256cbeb7ec6e0492029684bcae77a4d151a77714593582023-03-19 14:40:11375 days 22 hrs ago 0xf97f4df75117a78c1a5a0dbb814af92458539fb4 0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH
0x45a9170acbae958eb0e9b4f61d18bc5ab6ac5774dd7d2cff3a51f81029a6fa38709066222023-03-17 23:50:14377 days 13 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0xf97f4df75117a78c1a5a0dbb814af92458539fb40 ETH
0x45a9170acbae958eb0e9b4f61d18bc5ab6ac5774dd7d2cff3a51f81029a6fa38709066222023-03-17 23:50:14377 days 13 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0x75c0530885f385721fdda23c539af3701d6183d40 ETH
0x45a9170acbae958eb0e9b4f61d18bc5ab6ac5774dd7d2cff3a51f81029a6fa38709066222023-03-17 23:50:14377 days 13 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH
0x45a9170acbae958eb0e9b4f61d18bc5ab6ac5774dd7d2cff3a51f81029a6fa38709066222023-03-17 23:50:14377 days 13 hrs ago 0xf97f4df75117a78c1a5a0dbb814af92458539fb4 0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH
0xb601a25ea583752ce79fdc50c4c485df67b86316675728d4cf2c140e65d967b7702303482023-03-16 0:17:26379 days 13 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0xf97f4df75117a78c1a5a0dbb814af92458539fb40 ETH
0xb601a25ea583752ce79fdc50c4c485df67b86316675728d4cf2c140e65d967b7702303482023-03-16 0:17:26379 days 13 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0x75c0530885f385721fdda23c539af3701d6183d40 ETH
0xb601a25ea583752ce79fdc50c4c485df67b86316675728d4cf2c140e65d967b7702303482023-03-16 0:17:26379 days 13 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH
0xb601a25ea583752ce79fdc50c4c485df67b86316675728d4cf2c140e65d967b7702303482023-03-16 0:17:26379 days 13 hrs ago 0xf97f4df75117a78c1a5a0dbb814af92458539fb4 0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH
0xf6b0f3163d701d21b0ab0668f6a4f2b8240671f1ee97e7012a43e6931414cc96700714142023-03-15 12:29:43380 days 1 hr ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0xf97f4df75117a78c1a5a0dbb814af92458539fb40 ETH
0xf6b0f3163d701d21b0ab0668f6a4f2b8240671f1ee97e7012a43e6931414cc96700714142023-03-15 12:29:43380 days 1 hr ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0x75c0530885f385721fdda23c539af3701d6183d40 ETH
0xf6b0f3163d701d21b0ab0668f6a4f2b8240671f1ee97e7012a43e6931414cc96700714142023-03-15 12:29:43380 days 1 hr ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH
0xf6b0f3163d701d21b0ab0668f6a4f2b8240671f1ee97e7012a43e6931414cc96700714142023-03-15 12:29:43380 days 1 hr ago 0xf97f4df75117a78c1a5a0dbb814af92458539fb4 0x4f3af332a30973106fe146af0b4220bbbea748ec0 ETH
0x540fc5c0d24061196ed33eb4100ca3385310b91ce6e53e4601e16b3b387e877e694637812023-03-13 14:36:03381 days 22 hrs ago 0x4f3af332a30973106fe146af0b4220bbbea748ec 0xf97f4df75117a78c1a5a0dbb814af92458539fb40 ETH
[ 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.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

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

import "./interfaces/LinkTokenInterface.sol";
import "./interfaces/KeeperRegistryInterface1_2.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
    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 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 : KeeperRegistryInterface1_2.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 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 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": 200
  },
  "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"}]

60a06040523480156200001157600080fd5b5060405162001cda38038062001cda833981016040819052620000349162000394565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000ec565b5050506001600160601b0319606086901b16608052620000e18484848462000198565b50505050506200048d565b6001600160a01b038116331415620001475760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b620001a262000319565b6003546040805160a081019091526501000000000090910463ffffffff169080866002811115620001d757620001d762000477565b815261ffff8616602082015263ffffffff831660408201526001600160a01b03851660608201526001600160601b038416608090910152805160038054909190829060ff1916600183600281111562000234576200023462000477565b0217905550602082015181546040808501516060860151610100600160481b031990931661010063ffffffff9586160263ffffffff60281b19161765010000000000949091169390930292909217600160481b600160e81b03191669010000000000000000006001600160a01b0390921691909102178255608090920151600190910180546001600160601b0319166001600160601b03909216919091179055517f6293a703ec7145dfa23c5cde2e627d6a02e153fc2e9c03b14d1e22cbb4a7e9cd906200030a90879087908790879062000422565b60405180910390a15050505050565b6000546001600160a01b03163314620003755760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640162000082565b565b80516001600160a01b03811681146200038f57600080fd5b919050565b600080600080600060a08688031215620003ad57600080fd5b620003b88662000377565b9450602086015160038110620003cd57600080fd5b604087015190945061ffff81168114620003e657600080fd5b9250620003f66060870162000377565b60808701519092506001600160601b03811681146200041457600080fd5b809150509295509295909350565b60808101600386106200044557634e487b7160e01b600052602160045260246000fd5b94815261ffff9390931660208401526001600160a01b039190911660408301526001600160601b031660609091015290565b634e487b7160e01b600052602160045260246000fd5b60805160601c611812620004c860003960008181610153015281816103e00152818161081e01528181610cc30152610e9501526118126000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063850af0cb1161008c578063a4c0ed3611610066578063a4c0ed3614610299578063a793ab8b146102ac578063c4d252f5146102bf578063f2fde38b146102d257600080fd5b8063850af0cb146101f757806388b12d55146102105780638da5cb5b1461028857600080fd5b80633659d666116100c85780633659d6661461018d578063367b9b4f146101a057806379ba5097146101b35780637e776f7f146101bb57600080fd5b8063181f5a77146100ef578063183310b3146101395780631b6b6d231461014e575b600080fd5b6101236040518060400160405280601581526020017404b656570657252656769737472617220312e312e3605c1b81525081565b60405161013091906116e7565b60405180910390f35b61014c610147366004611385565b6102e5565b005b6101757f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610130565b61014c61019b36600461142a565b6103d5565b61014c6101ae36600461125b565b610636565b61014c61069d565b6101e76101c9366004611239565b6001600160a01b031660009081526005602052604090205460ff1690565b6040519015158152602001610130565b6101ff61074c565b6040516101309594939291906116a4565b61026161021e366004611309565b6000908152600260209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160601b03169290910182905291565b604080516001600160a01b0390931683526001600160601b03909116602083015201610130565b6000546001600160a01b0316610175565b61014c6102a7366004611292565b610813565b61014c6102ba366004611322565b610a59565b61014c6102cd366004611309565b610be3565b61014c6102e0366004611239565b610d91565b6102ed610da5565b6000818152600260209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160601b03169183019190915261034a57604051632589d98f60e11b815260040160405180910390fd5b600087878787876040516020016103659594939291906115e5565b60405160208183030381529060405280519060200120905080831461039d57604051633f4d605360e01b815260040160405180910390fd5b60008381526002602090815260408220919091558201516103ca908a908a908a908a908a908a908a610dfa565b505050505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461041d5760405162c6885f60e11b815260040160405180910390fd5b6001600160a01b0386166104445760405163016ed19f60e21b815260040160405180910390fd5b6000888888888860405160200161045f9594939291906115e5565b6040516020818303038152906040528051906020012090508260ff16896001600160a01b0316827fc3f5df4aefec026f610a3fcb08f19476492d69d2cb78b1c2eba259a8820e6a788f8f8f8e8e8e8e8e6040516104c39897969594939291906116fa565b60405180910390a46040805160a08101909152600380546000929190829060ff1660028111156104f5576104f56117cb565b6002811115610506576105066117cb565b8152815463ffffffff610100820481166020840152600160281b82041660408301526001600160a01b03600160481b9091041660608201526001909101546001600160601b0316608090910152905061055f8184610fc7565b156105b057604081015161057490600161176f565b6003805463ffffffff92909216600160281b0268ffffffff0000000000199092169190911790556105ab8d8b8b8b8b8b8b89610dfa565b610627565b6000828152600260205260408120546105da908790600160a01b90046001600160601b0316611797565b6040805180820182526001600160a01b03808d1682526001600160601b039384166020808401918252600089815260029091529390932091519251909316600160a01b0291909216179055505b50505050505050505050505050565b61063e610da5565b6001600160a01b038216600081815260056020908152604091829020805460ff191685151590811790915591519182527f20c6237dac83526a849285a9f79d08a483291bdd3a056a0ef9ae94ecee1ad356910160405180910390a25050565b6001546001600160a01b031633146106f55760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b60448201526064015b60405180910390fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6040805160a081019091526003805460009283928392839283928392829060ff16600281111561077e5761077e6117cb565b600281111561078f5761078f6117cb565b81528154610100810463ffffffff908116602080850191909152600160281b8304909116604080850191909152600160481b9092046001600160a01b03166060808501919091526001909401546001600160601b0390811660809485015285519186015192860151948601519590930151909b919a50929850929650169350915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461085b5760405162c6885f60e11b815260040160405180910390fd5b81818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060208101516001600160e01b03198116631b2ceb3360e11b146108c75760405163e3d6792160e01b815260040160405180910390fd5b8484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060e4810151828114610923576040516355e97b0d60e01b815260040160405180910390fd5b8887878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101248101516001600160a01b038381169082161461098c57604051637c62b1c760e11b815260040160405180910390fd5b6101248910156109af57604051630dfe930960e41b815260040160405180910390fd5b6004546001600160601b03168b10156109db5760405163cd1c886760e01b815260040160405180910390fd5b6000306001600160a01b03168b8b6040516109f79291906115d5565b600060405180830381855af49150503d8060008114610a32576040519150601f19603f3d011682016040523d82523d6000602084013e610a37565b606091505b505090508061062757604051630649bf8160e41b815260040160405180910390fd5b610a61610da5565b6003546040805160a08101909152600160281b90910463ffffffff169080866002811115610a9157610a916117cb565b815261ffff8616602082015263ffffffff831660408201526001600160a01b03851660608201526001600160601b038416608090910152805160038054909190829060ff19166001836002811115610aeb57610aeb6117cb565b021790555060208201518154604080850151606086015168ffffffffffffffff001990931661010063ffffffff9586160268ffffffff0000000000191617600160281b9490911693909302929092177fffffff0000000000000000000000000000000000000000ffffffffffffffffff16600160481b6001600160a01b0390921691909102178255608090920151600190910180546bffffffffffffffffffffffff19166001600160601b03909216919091179055517f6293a703ec7145dfa23c5cde2e627d6a02e153fc2e9c03b14d1e22cbb4a7e9cd90610bd4908790879087908790611665565b60405180910390a15050505050565b6000818152600260209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160601b031691830191909152331480610c3a57506000546001600160a01b031633145b610c57576040516361685c2b60e01b815260040160405180910390fd5b80516001600160a01b0316610c7f57604051632589d98f60e11b815260040160405180910390fd5b600082815260026020908152604080832083905590830151905163a9059cbb60e01b81523360048201526001600160601b0390911660248201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b158015610d0757600080fd5b505af1158015610d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3f91906112ec565b905080610d615760405163185c9b9d60e31b81523360048201526024016106ec565b60405183907f3663fb28ebc87645eb972c9dad8521bf665c623f287e79f1c56f1eb374b82a2290600090a2505050565b610d99610da5565b610da281611061565b50565b6000546001600160a01b03163314610df85760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b60448201526064016106ec565b565b60035460405163da5c674160e01b8152600160481b9091046001600160a01b031690600090829063da5c674190610e3d908c908c908c908c908c906004016115e5565b602060405180830381600087803b158015610e5757600080fd5b505af1158015610e6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8f9190611524565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634000aea0848785604051602001610ed791815260200190565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401610f0493929190611629565b602060405180830381600087803b158015610f1e57600080fd5b505af1158015610f32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5691906112ec565b905080610f815760405163185c9b9d60e31b81526001600160a01b03841660048201526024016106ec565b81847fb9a292fb7e3edd920cd2d2829a3615a640c43fd7de0a0820aa0668feb4c37d4b8d604051610fb291906116e7565b60405180910390a35050505050505050505050565b60008083516002811115610fdd57610fdd6117cb565b1415610feb5750600061105b565b600183516002811115611000576110006117cb565b14801561102657506001600160a01b03821660009081526005602052604090205460ff16155b156110335750600061105b565b826020015163ffffffff16836040015163ffffffff1610156110575750600161105b565b5060005b92915050565b6001600160a01b0381163314156110ba5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106ec565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80356001600160a01b038116811461112257600080fd5b919050565b60008083601f84011261113957600080fd5b50813567ffffffffffffffff81111561115157600080fd5b60208301915083602082850101111561116957600080fd5b9250929050565b600082601f83011261118157600080fd5b813567ffffffffffffffff8082111561119c5761119c6117e1565b604051601f8301601f19908116603f011681019082821181831017156111c4576111c46117e1565b816040528381528660208588010111156111dd57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803563ffffffff8116811461112257600080fd5b803560ff8116811461112257600080fd5b80356001600160601b038116811461112257600080fd5b60006020828403121561124b57600080fd5b6112548261110b565b9392505050565b6000806040838503121561126e57600080fd5b6112778361110b565b91506020830135611287816117f7565b809150509250929050565b600080600080606085870312156112a857600080fd5b6112b18561110b565b935060208501359250604085013567ffffffffffffffff8111156112d457600080fd5b6112e087828801611127565b95989497509550505050565b6000602082840312156112fe57600080fd5b8151611254816117f7565b60006020828403121561131b57600080fd5b5035919050565b6000806000806080858703121561133857600080fd5b84356003811061134757600080fd5b9350602085013561ffff8116811461135e57600080fd5b925061136c6040860161110b565b915061137a60608601611222565b905092959194509250565b600080600080600080600060c0888a0312156113a057600080fd5b873567ffffffffffffffff808211156113b857600080fd5b6113c48b838c01611170565b98506113d260208b0161110b565b97506113e060408b016111fd565b96506113ee60608b0161110b565b955060808a013591508082111561140457600080fd5b506114118a828b01611127565b989b979a5095989497959660a090950135949350505050565b60008060008060008060008060008060006101208c8e03121561144c57600080fd5b67ffffffffffffffff808d35111561146357600080fd5b6114708e8e358f01611170565b9b508060208e0135111561148357600080fd5b6114938e60208f01358f01611127565b909b5099506114a460408e0161110b565b98506114b260608e016111fd565b97506114c060808e0161110b565b96508060a08e013511156114d357600080fd5b506114e48d60a08e01358e01611127565b90955093506114f560c08d01611222565b925061150360e08d01611211565b91506115126101008d0161110b565b90509295989b509295989b9093969950565b60006020828403121561153657600080fd5b5051919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000815180845260005b8181101561158c57602081850181015186830182015201611570565b8181111561159e576000602083870101525b50601f01601f19169290920160200192915050565b600381106115d157634e487b7160e01b600052602160045260246000fd5b9052565b8183823760009101908152919050565b6001600160a01b03868116825263ffffffff861660208301528416604082015260806060820181905260009061161e908301848661153d565b979650505050505050565b6001600160a01b03841681526001600160601b038316602082015260606040820181905260009061165c90830184611566565b95945050505050565b6080810161167382876115b3565b61ffff9490941660208201526001600160a01b039290921660408301526001600160601b0316606090910152919050565b60a081016116b282886115b3565b63ffffffff95861660208301529390941660408501526001600160a01b03919091166060840152608090920191909152919050565b6020815260006112546020830184611566565b60c08152600061170d60c083018b611566565b8281036020840152611720818a8c61153d565b63ffffffff891660408501526001600160a01b03881660608501528381036080850152905061175081868861153d565b9150506001600160601b03831660a08301529998505050505050505050565b600063ffffffff80831681851680830382111561178e5761178e6117b5565b01949350505050565b60006001600160601b0380831681851680830382111561178e5761178e5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610da257600080fdfea164736f6c6343000806000a000000000000000000000000f97f4df75117a78c1a5a0dbb814af92458539fb40000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004563918244f40000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063850af0cb1161008c578063a4c0ed3611610066578063a4c0ed3614610299578063a793ab8b146102ac578063c4d252f5146102bf578063f2fde38b146102d257600080fd5b8063850af0cb146101f757806388b12d55146102105780638da5cb5b1461028857600080fd5b80633659d666116100c85780633659d6661461018d578063367b9b4f146101a057806379ba5097146101b35780637e776f7f146101bb57600080fd5b8063181f5a77146100ef578063183310b3146101395780631b6b6d231461014e575b600080fd5b6101236040518060400160405280601581526020017404b656570657252656769737472617220312e312e3605c1b81525081565b60405161013091906116e7565b60405180910390f35b61014c610147366004611385565b6102e5565b005b6101757f000000000000000000000000f97f4df75117a78c1a5a0dbb814af92458539fb481565b6040516001600160a01b039091168152602001610130565b61014c61019b36600461142a565b6103d5565b61014c6101ae36600461125b565b610636565b61014c61069d565b6101e76101c9366004611239565b6001600160a01b031660009081526005602052604090205460ff1690565b6040519015158152602001610130565b6101ff61074c565b6040516101309594939291906116a4565b61026161021e366004611309565b6000908152600260209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160601b03169290910182905291565b604080516001600160a01b0390931683526001600160601b03909116602083015201610130565b6000546001600160a01b0316610175565b61014c6102a7366004611292565b610813565b61014c6102ba366004611322565b610a59565b61014c6102cd366004611309565b610be3565b61014c6102e0366004611239565b610d91565b6102ed610da5565b6000818152600260209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160601b03169183019190915261034a57604051632589d98f60e11b815260040160405180910390fd5b600087878787876040516020016103659594939291906115e5565b60405160208183030381529060405280519060200120905080831461039d57604051633f4d605360e01b815260040160405180910390fd5b60008381526002602090815260408220919091558201516103ca908a908a908a908a908a908a908a610dfa565b505050505050505050565b336001600160a01b037f000000000000000000000000f97f4df75117a78c1a5a0dbb814af92458539fb4161461041d5760405162c6885f60e11b815260040160405180910390fd5b6001600160a01b0386166104445760405163016ed19f60e21b815260040160405180910390fd5b6000888888888860405160200161045f9594939291906115e5565b6040516020818303038152906040528051906020012090508260ff16896001600160a01b0316827fc3f5df4aefec026f610a3fcb08f19476492d69d2cb78b1c2eba259a8820e6a788f8f8f8e8e8e8e8e6040516104c39897969594939291906116fa565b60405180910390a46040805160a08101909152600380546000929190829060ff1660028111156104f5576104f56117cb565b6002811115610506576105066117cb565b8152815463ffffffff610100820481166020840152600160281b82041660408301526001600160a01b03600160481b9091041660608201526001909101546001600160601b0316608090910152905061055f8184610fc7565b156105b057604081015161057490600161176f565b6003805463ffffffff92909216600160281b0268ffffffff0000000000199092169190911790556105ab8d8b8b8b8b8b8b89610dfa565b610627565b6000828152600260205260408120546105da908790600160a01b90046001600160601b0316611797565b6040805180820182526001600160a01b03808d1682526001600160601b039384166020808401918252600089815260029091529390932091519251909316600160a01b0291909216179055505b50505050505050505050505050565b61063e610da5565b6001600160a01b038216600081815260056020908152604091829020805460ff191685151590811790915591519182527f20c6237dac83526a849285a9f79d08a483291bdd3a056a0ef9ae94ecee1ad356910160405180910390a25050565b6001546001600160a01b031633146106f55760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b60448201526064015b60405180910390fd5b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6040805160a081019091526003805460009283928392839283928392829060ff16600281111561077e5761077e6117cb565b600281111561078f5761078f6117cb565b81528154610100810463ffffffff908116602080850191909152600160281b8304909116604080850191909152600160481b9092046001600160a01b03166060808501919091526001909401546001600160601b0390811660809485015285519186015192860151948601519590930151909b919a50929850929650169350915050565b336001600160a01b037f000000000000000000000000f97f4df75117a78c1a5a0dbb814af92458539fb4161461085b5760405162c6885f60e11b815260040160405180910390fd5b81818080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060208101516001600160e01b03198116631b2ceb3360e11b146108c75760405163e3d6792160e01b815260040160405180910390fd5b8484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505060e4810151828114610923576040516355e97b0d60e01b815260040160405180910390fd5b8887878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101248101516001600160a01b038381169082161461098c57604051637c62b1c760e11b815260040160405180910390fd5b6101248910156109af57604051630dfe930960e41b815260040160405180910390fd5b6004546001600160601b03168b10156109db5760405163cd1c886760e01b815260040160405180910390fd5b6000306001600160a01b03168b8b6040516109f79291906115d5565b600060405180830381855af49150503d8060008114610a32576040519150601f19603f3d011682016040523d82523d6000602084013e610a37565b606091505b505090508061062757604051630649bf8160e41b815260040160405180910390fd5b610a61610da5565b6003546040805160a08101909152600160281b90910463ffffffff169080866002811115610a9157610a916117cb565b815261ffff8616602082015263ffffffff831660408201526001600160a01b03851660608201526001600160601b038416608090910152805160038054909190829060ff19166001836002811115610aeb57610aeb6117cb565b021790555060208201518154604080850151606086015168ffffffffffffffff001990931661010063ffffffff9586160268ffffffff0000000000191617600160281b9490911693909302929092177fffffff0000000000000000000000000000000000000000ffffffffffffffffff16600160481b6001600160a01b0390921691909102178255608090920151600190910180546bffffffffffffffffffffffff19166001600160601b03909216919091179055517f6293a703ec7145dfa23c5cde2e627d6a02e153fc2e9c03b14d1e22cbb4a7e9cd90610bd4908790879087908790611665565b60405180910390a15050505050565b6000818152600260209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160601b031691830191909152331480610c3a57506000546001600160a01b031633145b610c57576040516361685c2b60e01b815260040160405180910390fd5b80516001600160a01b0316610c7f57604051632589d98f60e11b815260040160405180910390fd5b600082815260026020908152604080832083905590830151905163a9059cbb60e01b81523360048201526001600160601b0390911660248201526001600160a01b037f000000000000000000000000f97f4df75117a78c1a5a0dbb814af92458539fb4169063a9059cbb90604401602060405180830381600087803b158015610d0757600080fd5b505af1158015610d1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3f91906112ec565b905080610d615760405163185c9b9d60e31b81523360048201526024016106ec565b60405183907f3663fb28ebc87645eb972c9dad8521bf665c623f287e79f1c56f1eb374b82a2290600090a2505050565b610d99610da5565b610da281611061565b50565b6000546001600160a01b03163314610df85760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b60448201526064016106ec565b565b60035460405163da5c674160e01b8152600160481b9091046001600160a01b031690600090829063da5c674190610e3d908c908c908c908c908c906004016115e5565b602060405180830381600087803b158015610e5757600080fd5b505af1158015610e6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8f9190611524565b905060007f000000000000000000000000f97f4df75117a78c1a5a0dbb814af92458539fb46001600160a01b0316634000aea0848785604051602001610ed791815260200190565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401610f0493929190611629565b602060405180830381600087803b158015610f1e57600080fd5b505af1158015610f32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5691906112ec565b905080610f815760405163185c9b9d60e31b81526001600160a01b03841660048201526024016106ec565b81847fb9a292fb7e3edd920cd2d2829a3615a640c43fd7de0a0820aa0668feb4c37d4b8d604051610fb291906116e7565b60405180910390a35050505050505050505050565b60008083516002811115610fdd57610fdd6117cb565b1415610feb5750600061105b565b600183516002811115611000576110006117cb565b14801561102657506001600160a01b03821660009081526005602052604090205460ff16155b156110335750600061105b565b826020015163ffffffff16836040015163ffffffff1610156110575750600161105b565b5060005b92915050565b6001600160a01b0381163314156110ba5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106ec565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80356001600160a01b038116811461112257600080fd5b919050565b60008083601f84011261113957600080fd5b50813567ffffffffffffffff81111561115157600080fd5b60208301915083602082850101111561116957600080fd5b9250929050565b600082601f83011261118157600080fd5b813567ffffffffffffffff8082111561119c5761119c6117e1565b604051601f8301601f19908116603f011681019082821181831017156111c4576111c46117e1565b816040528381528660208588010111156111dd57600080fd5b836020870160208301376000602085830101528094505050505092915050565b803563ffffffff8116811461112257600080fd5b803560ff8116811461112257600080fd5b80356001600160601b038116811461112257600080fd5b60006020828403121561124b57600080fd5b6112548261110b565b9392505050565b6000806040838503121561126e57600080fd5b6112778361110b565b91506020830135611287816117f7565b809150509250929050565b600080600080606085870312156112a857600080fd5b6112b18561110b565b935060208501359250604085013567ffffffffffffffff8111156112d457600080fd5b6112e087828801611127565b95989497509550505050565b6000602082840312156112fe57600080fd5b8151611254816117f7565b60006020828403121561131b57600080fd5b5035919050565b6000806000806080858703121561133857600080fd5b84356003811061134757600080fd5b9350602085013561ffff8116811461135e57600080fd5b925061136c6040860161110b565b915061137a60608601611222565b905092959194509250565b600080600080600080600060c0888a0312156113a057600080fd5b873567ffffffffffffffff808211156113b857600080fd5b6113c48b838c01611170565b98506113d260208b0161110b565b97506113e060408b016111fd565b96506113ee60608b0161110b565b955060808a013591508082111561140457600080fd5b506114118a828b01611127565b989b979a5095989497959660a090950135949350505050565b60008060008060008060008060008060006101208c8e03121561144c57600080fd5b67ffffffffffffffff808d35111561146357600080fd5b6114708e8e358f01611170565b9b508060208e0135111561148357600080fd5b6114938e60208f01358f01611127565b909b5099506114a460408e0161110b565b98506114b260608e016111fd565b97506114c060808e0161110b565b96508060a08e013511156114d357600080fd5b506114e48d60a08e01358e01611127565b90955093506114f560c08d01611222565b925061150360e08d01611211565b91506115126101008d0161110b565b90509295989b509295989b9093969950565b60006020828403121561153657600080fd5b5051919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000815180845260005b8181101561158c57602081850181015186830182015201611570565b8181111561159e576000602083870101525b50601f01601f19169290920160200192915050565b600381106115d157634e487b7160e01b600052602160045260246000fd5b9052565b8183823760009101908152919050565b6001600160a01b03868116825263ffffffff861660208301528416604082015260806060820181905260009061161e908301848661153d565b979650505050505050565b6001600160a01b03841681526001600160601b038316602082015260606040820181905260009061165c90830184611566565b95945050505050565b6080810161167382876115b3565b61ffff9490941660208201526001600160a01b039290921660408301526001600160601b0316606090910152919050565b60a081016116b282886115b3565b63ffffffff95861660208301529390941660408501526001600160a01b03919091166060840152608090920191909152919050565b6020815260006112546020830184611566565b60c08152600061170d60c083018b611566565b8281036020840152611720818a8c61153d565b63ffffffff891660408501526001600160a01b03881660608501528381036080850152905061175081868861153d565b9150506001600160601b03831660a08301529998505050505050505050565b600063ffffffff80831681851680830382111561178e5761178e6117b5565b01949350505050565b60006001600160601b0380831681851680830382111561178e5761178e5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610da257600080fdfea164736f6c6343000806000a

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

000000000000000000000000f97f4df75117a78c1a5a0dbb814af92458539fb40000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004563918244f40000

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

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000f97f4df75117a78c1a5a0dbb814af92458539fb4
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
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
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.