ETH Price: $2,852.38 (-2.94%)
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Apply List Ops412996652026-01-26 0:51:172 hrs ago1769388677IN
EFP: List Records
0 ETH0.00000060.00718071
Apply List Ops412993762026-01-26 0:41:392 hrs ago1769388099IN
EFP: List Records
0 ETH0.000000530.00630793
Apply List Ops412993622026-01-26 0:41:112 hrs ago1769388071IN
EFP: List Records
0 ETH0.000000670.00612713
Apply List Ops412993342026-01-26 0:40:152 hrs ago1769388015IN
EFP: List Records
0 ETH0.000000870.00793916
Apply List Ops412993102026-01-26 0:39:272 hrs ago1769387967IN
EFP: List Records
0 ETH0.000000730.00665049
Apply List Ops412992872026-01-26 0:38:412 hrs ago1769387921IN
EFP: List Records
0 ETH0.000000750.00686029
Apply List Ops412992502026-01-26 0:37:272 hrs ago1769387847IN
EFP: List Records
0 ETH0.000000750.00680795
Apply List Ops412992282026-01-26 0:36:432 hrs ago1769387803IN
EFP: List Records
0 ETH0.000000770.00698813
Apply List Ops412991922026-01-26 0:35:312 hrs ago1769387731IN
EFP: List Records
0 ETH0.000000760.00687276
Apply List Ops412991492026-01-26 0:34:052 hrs ago1769387645IN
EFP: List Records
0 ETH0.00000070.00638622
Apply List Ops412991152026-01-26 0:32:572 hrs ago1769387577IN
EFP: List Records
0 ETH0.000000660.00786208
Apply List Ops412989582026-01-26 0:27:432 hrs ago1769387263IN
EFP: List Records
0 ETH0.000000910.01077994
Apply List Ops412989212026-01-26 0:26:292 hrs ago1769387189IN
EFP: List Records
0 ETH0.000001230.01118241
Apply List Ops412988922026-01-26 0:25:313 hrs ago1769387131IN
EFP: List Records
0 ETH0.000000880.00798661
Apply List Ops412988522026-01-26 0:24:113 hrs ago1769387051IN
EFP: List Records
0 ETH0.000000630.00744844
Apply List Ops412987922026-01-26 0:22:113 hrs ago1769386931IN
EFP: List Records
0 ETH0.000000690.01193602
Apply List Ops412987662026-01-26 0:21:193 hrs ago1769386879IN
EFP: List Records
0 ETH0.000000660.0078485
Apply List Ops412987442026-01-26 0:20:353 hrs ago1769386835IN
EFP: List Records
0 ETH0.000000850.01010043
Apply List Ops412986442026-01-26 0:17:153 hrs ago1769386635IN
EFP: List Records
0 ETH0.000000840.00994505
Apply List Ops412985682026-01-26 0:14:433 hrs ago1769386483IN
EFP: List Records
0 ETH0.000000860.00630796
Apply List Ops412985422026-01-26 0:13:513 hrs ago1769386431IN
EFP: List Records
0 ETH0.000000930.00686554
Apply List Ops412985142026-01-26 0:12:553 hrs ago1769386375IN
EFP: List Records
0 ETH0.00000060.00713785
Apply List Ops412984952026-01-26 0:12:173 hrs ago1769386337IN
EFP: List Records
0 ETH0.000000620.00741567
Apply List Ops412984632026-01-26 0:11:133 hrs ago1769386273IN
EFP: List Records
0 ETH0.000000910.01082213
Apply List Ops412984372026-01-26 0:10:213 hrs ago1769386221IN
EFP: List Records
0 ETH0.00000110.01311212
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EFPListRecords

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.23;

import {Ownable} from 'lib/openzeppelin-contracts/contracts/access/Ownable.sol';
import {Pausable} from 'lib/openzeppelin-contracts/contracts/security/Pausable.sol';
import {IEFPListMetadata, IEFPListRecords} from './interfaces/IEFPListRecords.sol';
import {ENSReverseClaimer} from './lib/ENSReverseClaimer.sol';

/**
 * @title ListMetadata
 * @author Cory Gabrielsen (cory.eth)
 * @custom:contributor throw; (0xthrpw.eth)
 * @custom:benediction DEVS BENEDICAT ET PROTEGAT CONTRACTVS MEAM
 *
 * @notice Manages key-value pairs associated with EFP List NFTs.
 *         Provides functionalities for list managers to set and retrieve metadata for their lists.
 */
abstract contract ListMetadata is IEFPListMetadata, Pausable, Ownable {
  error SlotAlreadyClaimed(uint256 slot, address manager);
  // error NotListManager(address manager);

  ///////////////////////////////////////////////////////////////////////////
  // Data Structures
  ///////////////////////////////////////////////////////////////////////////

  /// @dev The key-value set for each token ID
  mapping(uint256 => mapping(string => bytes)) private values;

  /////////////////////////////////////////////////////////////////////////////
  // Pausable
  /////////////////////////////////////////////////////////////////////////////

  /**
   * @dev Pauses the contract. Can only be called by the contract owner.
   */
  function pause() public onlyOwner {
    _pause();
  }

  /**
   * @dev Unpauses the contract. Can only be called by the contract owner.
   */
  function unpause() public onlyOwner {
    _unpause();
  }

  /////////////////////////////////////////////////////////////////////////////
  // Helpers
  /////////////////////////////////////////////////////////////////////////////

  function bytesToAddress(bytes memory b) internal pure returns (address) {
    require(b.length == 20, 'Invalid length');
    address addr;
    assembly {
      addr := mload(add(b, 20))
    }
    return addr;
  }

  /////////////////////////////////////////////////////////////////////////////
  // Getters
  /////////////////////////////////////////////////////////////////////////////

  /**
   * @dev Retrieves metadata value for token ID and key.
   * @param tokenId The token Id to query.
   * @param key The key to query.
   * @return The associated value.
   */
  function getMetadataValue(uint256 tokenId, string calldata key) external view returns (bytes memory) {
    return values[tokenId][key];
  }

  /**
   * @dev Retrieves metadata values for token ID and keys.
   * @param tokenId The token Id to query.
   * @param keys The keys to query.
   * @return The associated values.
   */
  function getMetadataValues(uint256 tokenId, string[] calldata keys) external view returns (bytes[] memory) {
    uint256 length = keys.length;
    bytes[] memory result = new bytes[](length);
    for (uint256 i = 0; i < length;) {
      string calldata key = keys[i];
      result[i] = values[tokenId][key];
      unchecked {
        ++i;
      }
    }
    return result;
  }

  /////////////////////////////////////////////////////////////////////////////
  // Setters
  /////////////////////////////////////////////////////////////////////////////

  /**
   * @dev Sets metadata records for token ID with the unique key key to value,
   * overwriting anything previously stored for token ID and key. To clear a
   * field, set it to the empty string.
   * @param slot The slot corresponding to the list to update.
   * @param key The key to set.
   * @param value The value to set.
   */
  function _setMetadataValue(uint256 slot, string memory key, bytes memory value) internal {
    values[slot][key] = value;
    emit UpdateListMetadata(slot, key, value);
  }

  /**
   * @dev Sets metadata records for token ID with the unique key key to value,
   * overwriting anything previously stored for token ID and key. To clear a
   * field, set it to the empty string. Only callable by the list manager.
   * @param slot The slot corresponding to the list to update.
   * @param key The key to set.
   * @param value The value to set.
   */
  function setMetadataValue(uint256 slot, string calldata key, bytes calldata value)
    external
    whenNotPaused
    onlyListManager(slot)
  {
    _setMetadataValue(slot, key, value);
  }

  /**
   * @dev Sets an array of metadata records for a token ID. Each record is a
   * key/value pair.
   * @param slot The slot corresponding to the list to update.
   * @param records The records to set.
   */
  function _setMetadataValues(uint256 slot, KeyValue[] calldata records) internal {
    uint256 length = records.length;
    for (uint256 i = 0; i < length;) {
      KeyValue calldata record = records[i];
      _setMetadataValue(slot, record.key, record.value);
      unchecked {
        ++i;
      }
    }
  }

  /**
   * @dev Sets an array of metadata records for a token ID. Each record is a
   * key/value pair. Only callable by the list manager.
   * @param slot The slot corresponding to the list to update.
   * @param records The records to set.
   */
  function setMetadataValues(uint256 slot, KeyValue[] calldata records) external whenNotPaused onlyListManager(slot) {
    _setMetadataValues(slot, records);
  }

  ///////////////////////////////////////////////////////////////////////////
  // Modifiers
  ///////////////////////////////////////////////////////////////////////////

  /**
   * @notice Ensures that the caller is the manager of the specified list.
   * @param slot The unique identifier of the list.
   * @dev Used to restrict function access to the list's manager.
   */
  modifier onlyListManager(uint256 slot) {
    bytes memory existing = values[slot]['manager'];
    // if not set, claim for msg.sender
    if (existing.length != 20) {
      _claimListManager(slot, msg.sender);
    } else {
      address existingManager = bytesToAddress(existing);
      if (existingManager == address(0)) {
        _claimListManager(slot, msg.sender);
      } else {
        require(existingManager == msg.sender, 'Not list manager');
      }
    }
    _;
  }

  ///////////////////////////////////////////////////////////////////////////
  // List Manager - Claim
  ///////////////////////////////////////////////////////////////////////////

  /**
   * @notice Allows an address to claim management of an unclaimed list slot.
   * @param slot The slot that the sender wishes to claim.
   * @param manager The address to be set as the manager.
   * @dev This function establishes the first-come-first-serve basis for slot claiming.
   */
  function _claimListManager(uint256 slot, address manager) internal {
    bytes memory existing = values[slot]['manager'];
    // require(existing.length != 20 || bytesToAddress(existing) == manager, "slot already claimed");
    if (existing.length == 20) {
      address existingManager = bytesToAddress(existing);
      if (existingManager != manager) {
        revert SlotAlreadyClaimed(slot, existingManager);
      }
    }
    _setMetadataValue(slot, 'manager', abi.encodePacked(manager));
  }

  /**
   * @notice Allows the sender to claim management of an unclaimed list slot.
   * @param slot The slot that the sender wishes to claim.
   */
  function claimListManager(uint256 slot) external whenNotPaused {
    _claimListManager(slot, msg.sender);
  }

  /**
   * @notice Allows the sender to transfer management of a list to a new address.
   * @param slot The list's unique identifier.
   * @param manager The address to be set as the new manager.
   */
  function claimListManagerForAddress(uint256 slot, address manager) external whenNotPaused {
    _claimListManager(slot, manager);
  }

  ///////////////////////////////////////////////////////////////////////////
  // List Manager - Read
  ///////////////////////////////////////////////////////////////////////////

  /**
   * @notice Retrieves the address of the manager for a specified list slot.
   * @param slot The list's unique identifier.
   * @return The address of the manager.
   */
  function getListManager(uint256 slot) external view returns (address) {
    bytes memory existing = values[slot]['manager'];
    return existing.length != 20 ? address(0) : bytesToAddress(existing);
  }

  ///////////////////////////////////////////////////////////////////////////
  // List Manager - Write
  ///////////////////////////////////////////////////////////////////////////

  /**
   * @notice Allows the current manager to transfer management of a list to a new address.
   * @param slot The list's unique identifier.
   * @param manager The address to be set as the new manager.
   * @dev Only the current manager can transfer their management role.
   */
  function setListManager(uint256 slot, address manager) external whenNotPaused onlyListManager(slot) {
    _setMetadataValue(slot, 'manager', abi.encodePacked(manager));
  }

  ///////////////////////////////////////////////////////////////////////////
  // List User - Read
  ///////////////////////////////////////////////////////////////////////////

  /**
   * @notice Retrieves the address of the list user for a specified list
   *         slot.
   * @param slot The list's unique identifier.
   * @return The address of the list user.
   */
  function getListUser(uint256 slot) external view returns (address) {
    bytes memory existing = values[slot]['user'];
    return existing.length != 20 ? address(0) : bytesToAddress(existing);
  }

  ///////////////////////////////////////////////////////////////////////////
  // List Manager - Write
  ///////////////////////////////////////////////////////////////////////////

  /**
   * @notice Allows the current manager to change the list user to a new
   *         address.
   * @param slot The list's unique identifier.
   * @param user The address to be set as the new list user.
   * @dev Only the current manager can change the list user.
   */
  function setListUser(uint256 slot, address user) external whenNotPaused onlyListManager(slot) {
    _setMetadataValue(slot, 'user', abi.encodePacked(user));
  }
}

/**
 * @title EFPListRecords
 * @notice Manages a dynamic list of records associated with EFP List NFTs.
 *         Provides functionalities for list managers to apply operations to their lists.
 */
abstract contract ListRecords is IEFPListRecords, ListMetadata {
  ///////////////////////////////////////////////////////////////////////////
  // Data Structures
  ///////////////////////////////////////////////////////////////////////////

  /// @notice Stores a sequence of operations for each list identified by its slot.
  /// @dev Each list can have multiple operations performed over time.
  mapping(uint256 => bytes[]) public listOps;

  ///////////////////////////////////////////////////////////////////////////
  // List Operation Functions -  Read
  ///////////////////////////////////////////////////////////////////////////

  /**
   * @notice Retrieves the number of operations performed on a list.
   * @param slot The list's unique identifier.
   * @return The number of operations performed on the list.
   */
  function getListOpCount(uint256 slot) external view returns (uint256) {
    return listOps[slot].length;
  }

  /**
   * @notice Retrieves the operation at a specified index for a list.
   * @param slot The list's unique identifier.
   * @param index The index of the operation to be retrieved.
   * @return The operation at the specified index.
   */
  function getListOp(uint256 slot, uint256 index) external view returns (bytes memory) {
    return listOps[slot][index];
  }

  /**
   * @notice Retrieves a range of operations for a list.
   * @param slot The list's unique identifier.
   * @param start The starting index of the range.
   * @param end The ending index of the range.
   * @return The operations in the specified range.
   */
  function getListOpsInRange(uint256 slot, uint256 start, uint256 end) external view returns (bytes[] memory) {
    if (start > end) {
      revert('Invalid range');
    }

    bytes[] memory ops = new bytes[](end - start);
    for (uint256 i = start; i < end;) {
      ops[i - start] = listOps[slot][i];

      unchecked {
        ++i;
      }
    }
    return ops;
  }

  /**
   * @notice Retrieves all operations for a list.
   * @param slot The list's unique identifier.
   * @return The operations performed on the list.
   */
  function getAllListOps(uint256 slot) external view returns (bytes[] memory) {
    return listOps[slot];
  }

  ///////////////////////////////////////////////////////////////////////////
  // List Operation Functions - Write
  ///////////////////////////////////////////////////////////////////////////

  /**
   * @notice Applies a single operation to the list.
   * @param slot The list's unique identifier.
   * @param op The operation to be applied.
   */
  function _applyListOp(uint256 slot, bytes calldata op) internal {
    listOps[slot].push(op);
    emit ListOp(slot, op);
  }

  /**
   * @notice Public wrapper for `_applyOp`, enabling list managers to apply a single operation.
   * @param slot The list's unique identifier.
   * @param op The operation to be applied.
   */
  function applyListOp(uint256 slot, bytes calldata op) external whenNotPaused onlyListManager(slot) {
    _applyListOp(slot, op);
  }

  /**
   * @notice Allows list managers to apply multiple operations in a single transaction.
   * @param slot The list's unique identifier.
   * @param ops An array of operations to be applied.
   */
  function _applyListOps(uint256 slot, bytes[] calldata ops) internal {
    uint256 len = ops.length;
    for (uint256 i = 0; i < len;) {
      _applyListOp(slot, ops[i]);
      unchecked {
        ++i;
      }
    }
  }

  /**
   * @notice Allows list managers to apply multiple operations in a single transaction.
   * @param slot The list's unique identifier.
   * @param ops An array of operations to be applied.
   */
  function applyListOps(uint256 slot, bytes[] calldata ops) external whenNotPaused onlyListManager(slot) {
    _applyListOps(slot, ops);
  }

  /**
   * @notice Allows list managers to set metadata values and apply list ops
   *        in a single transaction.
   * @param slot The list's unique identifier.
   * @param records An array of key-value pairs to set.
   * @param ops An array of operations to be applied.
   */
  function setMetadataValuesAndApplyListOps(uint256 slot, KeyValue[] calldata records, bytes[] calldata ops)
    external
    whenNotPaused
    onlyListManager(slot)
  {
    _setMetadataValues(slot, records);
    _applyListOps(slot, ops);
  }
}

contract EFPListRecords is IEFPListRecords, ListRecords, ENSReverseClaimer {}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.23;

/**
 * @title IEFPListMetadata
 */
interface IEFPListMetadata {
  event UpdateListMetadata(uint256 indexed slot, string key, bytes value);

  struct KeyValue {
    string key;
    bytes value;
  }

  function getMetadataValue(uint256 slot, string calldata key) external view returns (bytes memory);

  function getMetadataValues(uint256 slot, string[] calldata keys) external view returns (bytes[] memory);

  function setMetadataValue(uint256 slot, string calldata key, bytes calldata value) external;

  function setMetadataValues(uint256 slot, KeyValue[] calldata records) external;

  // List Manager Functions
  function claimListManager(uint256 slot) external;

  function claimListManagerForAddress(uint256 slot, address manager) external;

  function getListManager(uint256 slot) external view returns (address);

  function setListManager(uint256 slot, address manager) external;

  // List User Functions
  function getListUser(uint256 slot) external view returns (address);

  function setListUser(uint256 slot, address user) external;
}

/**
 * @title IEFPListRecords
 * @notice Interface for the ListRecords contract.
 */
interface IEFPListRecords is IEFPListMetadata {
  // Events
  event ListOp(uint256 indexed slot, bytes op);

  // List Operation Functions - Read
  function getListOpCount(uint256 slot) external view returns (uint256);

  function getListOp(uint256 slot, uint256 index) external view returns (bytes memory);

  function getListOpsInRange(uint256 slot, uint256 start, uint256 end) external view returns (bytes[] memory);

  function getAllListOps(uint256 slot) external view returns (bytes[] memory);

  // List Operation Functions - Write
  function applyListOp(uint256 slot, bytes calldata op) external;

  function applyListOps(uint256 slot, bytes[] calldata ops) external;

  function setMetadataValuesAndApplyListOps(uint256 slot, KeyValue[] calldata records, bytes[] calldata ops) external;
}

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import {Ownable} from 'lib/openzeppelin-contracts/contracts/access/Ownable.sol';

interface ENS {
  /**
   * @dev Returns the address that owns the specified node.
   * @param node The specified node.
   * @return address of the owner.
   */
  function owner(bytes32 node) external view returns (address);
}

interface IReverseRegistrar {
  /**
   * @dev Transfers ownership of the reverse ENS record associated with the
   *      calling account.
   * @param owner The address to set as the owner of the reverse record in ENS.
   * @return The ENS node hash of the reverse record.
   */
  function claim(address owner) external returns (bytes32);

  /**
   * @dev Sets the `name()` record for the reverse ENS record associated with
   * the calling account. First updates the resolver to the default reverse
   * resolver if necessary.
   * @param name The name to set for this address.
   * @return The ENS node hash of the reverse record.
   */
  function setName(string memory name) external returns (bytes32);
}

/**
 * @title ENSReverseClaimer
 * @dev This contract is used to claim reverse ENS records.
 */
abstract contract ENSReverseClaimer is Ownable {
  /// @dev The namehash of 'addr.reverse', the domain at which reverse records
  ///      are stored in ENS.
  bytes32 constant ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2;

  /**
   * @dev Transfers ownership of the reverse ENS record associated with the
   *      contract.
   * @param ens The ENS registry.
   * @param claimant The address to set as the owner of the reverse record in
   *                 ENS.
   * @return The ENS node hash of the reverse record.
   */
  function claimReverseENS(ENS ens, address claimant) external onlyOwner returns (bytes32) {
    return IReverseRegistrar(ens.owner(ADDR_REVERSE_NODE)).claim(claimant);
  }

  /**
   * @dev Sets the reverse ENS record associated with the contract.
   * @param ens The ENS registry.
   * @param name The name to set as the reverse record in ENS.
   * @return The ENS node hash of the reverse record.
   */
  function setReverseENS(ENS ens, string calldata name) external onlyOwner returns (bytes32) {
    return IReverseRegistrar(ens.owner(ADDR_REVERSE_NODE)).setName(name);
  }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

Settings
{
  "remappings": [
    "ERC721A/=lib/ERC721A/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"address","name":"manager","type":"address"}],"name":"SlotAlreadyClaimed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"slot","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"op","type":"bytes"}],"name":"ListOp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"slot","type":"uint256"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"bytes","name":"value","type":"bytes"}],"name":"UpdateListMetadata","type":"event"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"bytes","name":"op","type":"bytes"}],"name":"applyListOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"bytes[]","name":"ops","type":"bytes[]"}],"name":"applyListOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"}],"name":"claimListManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"address","name":"manager","type":"address"}],"name":"claimListManagerForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ENS","name":"ens","type":"address"},{"internalType":"address","name":"claimant","type":"address"}],"name":"claimReverseENS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"}],"name":"getAllListOps","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"}],"name":"getListManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getListOp","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"}],"name":"getListOpCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getListOpsInRange","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"}],"name":"getListUser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"key","type":"string"}],"name":"getMetadataValue","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string[]","name":"keys","type":"string[]"}],"name":"getMetadataValues","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"listOps","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"address","name":"manager","type":"address"}],"name":"setListManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"setListUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"name":"setMetadataValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"internalType":"struct IEFPListMetadata.KeyValue[]","name":"records","type":"tuple[]"}],"name":"setMetadataValues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slot","type":"uint256"},{"components":[{"internalType":"string","name":"key","type":"string"},{"internalType":"bytes","name":"value","type":"bytes"}],"internalType":"struct IEFPListMetadata.KeyValue[]","name":"records","type":"tuple[]"},{"internalType":"bytes[]","name":"ops","type":"bytes[]"}],"name":"setMetadataValuesAndApplyListOps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ENS","name":"ens","type":"address"},{"internalType":"string","name":"name","type":"string"}],"name":"setReverseENS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506000805460ff1916905561002433610029565b610082565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b6124ab806100916000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80637a58aa72116100de57806387d40dab11610097578063aed5dafd11610071578063aed5dafd1461036e578063c553f29c14610381578063ec379ab914610394578063f2fde38b146103a757600080fd5b806387d40dab146103325780638da5cb5b146103455780639b7f61321461035b57600080fd5b80637a58aa72146102cb5780638007c940146102de5780638214bd41146102f157806382820b07146103045780638456cb59146103175780638780b3801461031f57600080fd5b806351c0dfbd1161014b5780636950320b116101255780636950320b1461028a5780636f1fe79d1461029d5780636fcab637146102b0578063715018a6146102c357600080fd5b806351c0dfbd1461024e5780635c975abb1461026157806361e7792a1461027757600080fd5b806302dc2af914610193578063268d387f146101c6578063324eaf7a146101f15780633f4ba83a1461020657806340783baa1461020e5780634846b5161461022e575b600080fd5b6101b36101a1366004611cc1565b60009081526002602052604090205490565b6040519081526020015b60405180910390f35b6101d96101d4366004611cc1565b6103ba565b6040516001600160a01b0390911681526020016101bd565b6102046101ff366004611d23565b610496565b005b6102046105dc565b61022161021c366004611d6f565b6105ee565b6040516101bd9190611de1565b61024161023c366004611e39565b6106a7565b6040516101bd9190611e78565b61022161025c366004611d23565b61081c565b60005460ff1660405190151581526020016101bd565b610204610285366004611edc565b6108e1565b610204610298366004611cc1565b610a89565b6101d96102ab366004611cc1565b610a9e565b6102046102be366004611f56565b610abb565b610204610bfc565b6101b36102d9366004611fd4565b610c0e565b6101b36102ec366004612010565b610d18565b6102046102ff366004612049565b610e21565b61024161031236600461206e565b610fae565b610204611140565b61020461032d366004611e39565b611150565b610221610340366004611d6f565b611286565b60005461010090046001600160a01b03166101d9565b610241610369366004611cc1565b611345565b61020461037c366004612049565b611431565b61020461038f366004611e39565b611447565b6102046103a2366004612049565b61157d565b6102046103b536600461209a565b6116ed565b6000818152600160205260408082209051633ab9b2b960e11b81528291906004015b908152602001604051809103902080546103f5906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610421906120b7565b801561046e5780601f106104435761010080835404028352916020019161046e565b820191906000526020600020905b81548152906001019060200180831161045157829003601f168201915b50505050509050805160140361048c5761048781611763565b61048f565b60005b9392505050565b61049e6117af565b6000838152600160205260408082209051859291906104bc906120f1565b908152602001604051809103902080546104d5906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610501906120b7565b801561054e5780601f106105235761010080835404028352916020019161054e565b820191906000526020600020905b81548152906001019060200180831161053157829003601f168201915b50505050509050805160141461056d5761056882336117f5565b6105ca565b600061057882611763565b90506001600160a01b0381166105975761059283336117f5565b6105c8565b6001600160a01b03811633146105c85760405162461bcd60e51b81526004016105bf90612104565b60405180910390fd5b505b6105d5858585611951565b5050505050565b6105e46119ba565b6105ec611a1a565b565b6002602052816000526040600020818154811061060a57600080fd5b90600052602060002001600091509150508054610626906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610652906120b7565b801561069f5780601f106106745761010080835404028352916020019161069f565b820191906000526020600020905b81548152906001019060200180831161068257829003601f168201915b505050505081565b60608160008167ffffffffffffffff8111156106c5576106c561212e565b6040519080825280602002602001820160405280156106f857816020015b60608152602001906001900390816106e35790505b50905060005b828110156108125736600087878481811061071b5761071b612144565b905060200281019061072d919061215a565b91509150600160008a815260200190815260200160002082826040516107549291906121a1565b9081526020016040518091039020805461076d906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610799906120b7565b80156107e65780601f106107bb576101008083540402835291602001916107e6565b820191906000526020600020905b8154815290600101906020018083116107c957829003601f168201915b50505050508484815181106107fd576107fd612144565b602090810291909101015250506001016106fe565b5095945050505050565b60606001600085815260200190815260200160002083836040516108419291906121a1565b9081526020016040518091039020805461085a906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610886906120b7565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b505050505090509392505050565b6108e96117af565b600085815260016020526040808220905187929190610907906120f1565b90815260200160405180910390208054610920906120b7565b80601f016020809104026020016040519081016040528092919081815260200182805461094c906120b7565b80156109995780601f1061096e57610100808354040283529160200191610999565b820191906000526020600020905b81548152906001019060200180831161097c57829003601f168201915b5050505050905080516014146109b8576109b382336117f5565b610a0c565b60006109c382611763565b90506001600160a01b0381166109e2576109dd83336117f5565b610a0a565b6001600160a01b0381163314610a0a5760405162461bcd60e51b81526004016105bf90612104565b505b610a808787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250611a6c92505050565b50505050505050565b610a916117af565b610a9b81336117f5565b50565b60008181526001602052604080822090518291906103dc906120f1565b610ac36117af565b600085815260016020526040808220905187929190610ae1906120f1565b90815260200160405180910390208054610afa906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b26906120b7565b8015610b735780601f10610b4857610100808354040283529160200191610b73565b820191906000526020600020905b815481529060010190602001808311610b5657829003601f168201915b505050505090508051601414610b9257610b8d82336117f5565b610be6565b6000610b9d82611763565b90506001600160a01b038116610bbc57610bb783336117f5565b610be4565b6001600160a01b0381163314610be45760405162461bcd60e51b81526004016105bf90612104565b505b610bf1878787611adb565b610a80878585611ba1565b610c046119ba565b6105ec6000611be2565b6000610c186119ba565b6040516302571be360e01b81527f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260048201526001600160a01b038516906302571be390602401602060405180830381865afa158015610c7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca091906121b1565b6001600160a01b031663c47f002784846040518363ffffffff1660e01b8152600401610ccd9291906121f7565b6020604051808303816000875af1158015610cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d10919061220b565b949350505050565b6000610d226119ba565b6040516302571be360e01b81527f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260048201526001600160a01b038416906302571be390602401602060405180830381865afa158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa91906121b1565b604051630f41a04d60e11b81526001600160a01b0384811660048301529190911690631e83409a906024016020604051808303816000875af1158015610df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e18919061220b565b90505b92915050565b610e296117af565b600082815260016020526040808220905184929190610e47906120f1565b90815260200160405180910390208054610e60906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8c906120b7565b8015610ed95780601f10610eae57610100808354040283529160200191610ed9565b820191906000526020600020905b815481529060010190602001808311610ebc57829003601f168201915b505050505090508051601414610ef857610ef382336117f5565b610f4c565b6000610f0382611763565b90506001600160a01b038116610f2257610f1d83336117f5565b610f4a565b6001600160a01b0381163314610f4a5760405162461bcd60e51b81526004016105bf90612104565b505b610fa8846040518060400160405280600781526020016636b0b730b3b2b960c91b81525085604051602001610f94919060609190911b6001600160601b031916815260140190565b604051602081830303815290604052611a6c565b50505050565b606081831115610ff05760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642072616e676560981b60448201526064016105bf565b6000610ffc8484612224565b67ffffffffffffffff8111156110145761101461212e565b60405190808252806020026020018201604052801561104757816020015b60608152602001906001900390816110325790505b509050835b8381101561113757600086815260026020526040902080548290811061107457611074612144565b906000526020600020018054611089906120b7565b80601f01602080910402602001604051908101604052809291908181526020018280546110b5906120b7565b80156111025780601f106110d757610100808354040283529160200191611102565b820191906000526020600020905b8154815290600101906020018083116110e557829003601f168201915b50505050508286836111149190612224565b8151811061112457611124612144565b602090810291909101015260010161104c565b50949350505050565b6111486119ba565b6105ec611c3b565b6111586117af565b600083815260016020526040808220905185929190611176906120f1565b9081526020016040518091039020805461118f906120b7565b80601f01602080910402602001604051908101604052809291908181526020018280546111bb906120b7565b80156112085780601f106111dd57610100808354040283529160200191611208565b820191906000526020600020905b8154815290600101906020018083116111eb57829003601f168201915b5050505050905080516014146112275761122282336117f5565b61127b565b600061123282611763565b90506001600160a01b0381166112515761124c83336117f5565b611279565b6001600160a01b03811633146112795760405162461bcd60e51b81526004016105bf90612104565b505b6105d5858585611adb565b6000828152600260205260409020805460609190839081106112aa576112aa612144565b9060005260206000200180546112bf906120b7565b80601f01602080910402602001604051908101604052809291908181526020018280546112eb906120b7565b80156113385780601f1061130d57610100808354040283529160200191611338565b820191906000526020600020905b81548152906001019060200180831161131b57829003601f168201915b5050505050905092915050565b606060026000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611426578382906000526020600020018054611399906120b7565b80601f01602080910402602001604051908101604052809291908181526020018280546113c5906120b7565b80156114125780601f106113e757610100808354040283529160200191611412565b820191906000526020600020905b8154815290600101906020018083116113f557829003601f168201915b50505050508152602001906001019061137a565b505050509050919050565b6114396117af565b61144382826117f5565b5050565b61144f6117af565b60008381526001602052604080822090518592919061146d906120f1565b90815260200160405180910390208054611486906120b7565b80601f01602080910402602001604051908101604052809291908181526020018280546114b2906120b7565b80156114ff5780601f106114d4576101008083540402835291602001916114ff565b820191906000526020600020905b8154815290600101906020018083116114e257829003601f168201915b50505050509050805160141461151e5761151982336117f5565b611572565b600061152982611763565b90506001600160a01b0381166115485761154383336117f5565b611570565b6001600160a01b03811633146115705760405162461bcd60e51b81526004016105bf90612104565b505b6105d5858585611ba1565b6115856117af565b6000828152600160205260408082209051849291906115a3906120f1565b908152602001604051809103902080546115bc906120b7565b80601f01602080910402602001604051908101604052809291908181526020018280546115e8906120b7565b80156116355780601f1061160a57610100808354040283529160200191611635565b820191906000526020600020905b81548152906001019060200180831161161857829003601f168201915b5050505050905080516014146116545761164f82336117f5565b6116a8565b600061165f82611763565b90506001600160a01b03811661167e5761167983336117f5565b6116a6565b6001600160a01b03811633146116a65760405162461bcd60e51b81526004016105bf90612104565b505b610fa884604051806040016040528060048152602001633ab9b2b960e11b81525085604051602001610f94919060609190911b6001600160601b031916815260140190565b6116f56119ba565b6001600160a01b03811661175a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105bf565b610a9b81611be2565b600081516014146117a75760405162461bcd60e51b815260206004820152600e60248201526d092dcecc2d8d2c840d8cadccee8d60931b60448201526064016105bf565b506014015190565b60005460ff16156105ec5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105bf565b600082815260016020526040808220905161180f906120f1565b90815260200160405180910390208054611828906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611854906120b7565b80156118a15780601f10611876576101008083540402835291602001916118a1565b820191906000526020600020905b81548152906001019060200180831161188457829003601f168201915b5050505050905080516014036119045760006118bc82611763565b9050826001600160a01b0316816001600160a01b031614611902576040516378a6c03d60e11b8152600481018590526001600160a01b03821660248201526044016105bf565b505b61194c836040518060400160405280600781526020016636b0b730b3b2b960c91b81525084604051602001610f94919060609190911b6001600160601b031916815260140190565b505050565b60008381526002602090815260408220805460018101825590835291200161197a828483612295565b50827fb067630e3908f166069c77766250c553414e2745e742a562d533f29744a91a7383836040516119ad9291906121f7565b60405180910390a2505050565b6000546001600160a01b036101009091041633146105ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105bf565b611a22611c78565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b806001600085815260200190815260200160002083604051611a8e9190612355565b90815260200160405180910390209081611aa89190612371565b50827f59ae30478c6dc6ad258000ec5c1e2da773a457572397f6b85ddd54ab719ecd5483836040516119ad929190612431565b8060005b818110156105d55736848483818110611afa57611afa612144565b9050602002810190611b0c919061245f565b9050611b9886611b1c838061215a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b5e92505050602085018561215a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a6c92505050565b50600101611adf565b8060005b818110156105d557611bda85858584818110611bc357611bc3612144565b9050602002810190611bd5919061215a565b611951565b600101611ba5565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b611c436117af565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a4f3390565b60005460ff166105ec5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105bf565b600060208284031215611cd357600080fd5b5035919050565b60008083601f840112611cec57600080fd5b50813567ffffffffffffffff811115611d0457600080fd5b602083019150836020828501011115611d1c57600080fd5b9250929050565b600080600060408486031215611d3857600080fd5b83359250602084013567ffffffffffffffff811115611d5657600080fd5b611d6286828701611cda565b9497909650939450505050565b60008060408385031215611d8257600080fd5b50508035926020909101359150565b60005b83811015611dac578181015183820152602001611d94565b50506000910152565b60008151808452611dcd816020860160208601611d91565b601f01601f19169290920160200192915050565b602081526000610e186020830184611db5565b60008083601f840112611e0657600080fd5b50813567ffffffffffffffff811115611e1e57600080fd5b6020830191508360208260051b8501011115611d1c57600080fd5b600080600060408486031215611e4e57600080fd5b83359250602084013567ffffffffffffffff811115611e6c57600080fd5b611d6286828701611df4565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015611ecf57603f19888603018452611ebd858351611db5565b94509285019290850190600101611ea1565b5092979650505050505050565b600080600080600060608688031215611ef457600080fd5b85359450602086013567ffffffffffffffff80821115611f1357600080fd5b611f1f89838a01611cda565b90965094506040880135915080821115611f3857600080fd5b50611f4588828901611cda565b969995985093965092949392505050565b600080600080600060608688031215611f6e57600080fd5b85359450602086013567ffffffffffffffff80821115611f8d57600080fd5b611f9989838a01611df4565b90965094506040880135915080821115611fb257600080fd5b50611f4588828901611df4565b6001600160a01b0381168114610a9b57600080fd5b600080600060408486031215611fe957600080fd5b8335611ff481611fbf565b9250602084013567ffffffffffffffff811115611d5657600080fd5b6000806040838503121561202357600080fd5b823561202e81611fbf565b9150602083013561203e81611fbf565b809150509250929050565b6000806040838503121561205c57600080fd5b82359150602083013561203e81611fbf565b60008060006060848603121561208357600080fd5b505081359360208301359350604090920135919050565b6000602082840312156120ac57600080fd5b813561048f81611fbf565b600181811c908216806120cb57607f821691505b6020821081036120eb57634e487b7160e01b600052602260045260246000fd5b50919050565b6636b0b730b3b2b960c91b815260070190565b60208082526010908201526f2737ba103634b9ba1036b0b730b3b2b960811b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261217157600080fd5b83018035915067ffffffffffffffff82111561218c57600080fd5b602001915036819003821315611d1c57600080fd5b8183823760009101908152919050565b6000602082840312156121c357600080fd5b815161048f81611fbf565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000610d106020830184866121ce565b60006020828403121561221d57600080fd5b5051919050565b81810381811115610e1b57634e487b7160e01b600052601160045260246000fd5b601f82111561194c576000816000526020600020601f850160051c8101602086101561226e5750805b601f850160051c820191505b8181101561228d5782815560010161227a565b505050505050565b67ffffffffffffffff8311156122ad576122ad61212e565b6122c1836122bb83546120b7565b83612245565b6000601f8411600181146122f557600085156122dd5750838201355b600019600387901b1c1916600186901b1783556105d5565b600083815260209020601f19861690835b828110156123265786850135825560209485019460019092019101612306565b50868210156123435760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008251612367818460208701611d91565b9190910192915050565b815167ffffffffffffffff81111561238b5761238b61212e565b61239f8161239984546120b7565b84612245565b602080601f8311600181146123d457600084156123bc5750858301515b600019600386901b1c1916600185901b17855561228d565b600085815260208120601f198616915b82811015612403578886015182559484019460019091019084016123e4565b50858210156124215787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815260006124446040830185611db5565b82810360208401526124568185611db5565b95945050505050565b60008235603e1983360301811261236757600080fdfea2646970667358221220db6aca8b1dc54087d11400b442c45f398a7f0ab7c1fcaae17d5bae216bfcf67964736f6c63430008170033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80637a58aa72116100de57806387d40dab11610097578063aed5dafd11610071578063aed5dafd1461036e578063c553f29c14610381578063ec379ab914610394578063f2fde38b146103a757600080fd5b806387d40dab146103325780638da5cb5b146103455780639b7f61321461035b57600080fd5b80637a58aa72146102cb5780638007c940146102de5780638214bd41146102f157806382820b07146103045780638456cb59146103175780638780b3801461031f57600080fd5b806351c0dfbd1161014b5780636950320b116101255780636950320b1461028a5780636f1fe79d1461029d5780636fcab637146102b0578063715018a6146102c357600080fd5b806351c0dfbd1461024e5780635c975abb1461026157806361e7792a1461027757600080fd5b806302dc2af914610193578063268d387f146101c6578063324eaf7a146101f15780633f4ba83a1461020657806340783baa1461020e5780634846b5161461022e575b600080fd5b6101b36101a1366004611cc1565b60009081526002602052604090205490565b6040519081526020015b60405180910390f35b6101d96101d4366004611cc1565b6103ba565b6040516001600160a01b0390911681526020016101bd565b6102046101ff366004611d23565b610496565b005b6102046105dc565b61022161021c366004611d6f565b6105ee565b6040516101bd9190611de1565b61024161023c366004611e39565b6106a7565b6040516101bd9190611e78565b61022161025c366004611d23565b61081c565b60005460ff1660405190151581526020016101bd565b610204610285366004611edc565b6108e1565b610204610298366004611cc1565b610a89565b6101d96102ab366004611cc1565b610a9e565b6102046102be366004611f56565b610abb565b610204610bfc565b6101b36102d9366004611fd4565b610c0e565b6101b36102ec366004612010565b610d18565b6102046102ff366004612049565b610e21565b61024161031236600461206e565b610fae565b610204611140565b61020461032d366004611e39565b611150565b610221610340366004611d6f565b611286565b60005461010090046001600160a01b03166101d9565b610241610369366004611cc1565b611345565b61020461037c366004612049565b611431565b61020461038f366004611e39565b611447565b6102046103a2366004612049565b61157d565b6102046103b536600461209a565b6116ed565b6000818152600160205260408082209051633ab9b2b960e11b81528291906004015b908152602001604051809103902080546103f5906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610421906120b7565b801561046e5780601f106104435761010080835404028352916020019161046e565b820191906000526020600020905b81548152906001019060200180831161045157829003601f168201915b50505050509050805160140361048c5761048781611763565b61048f565b60005b9392505050565b61049e6117af565b6000838152600160205260408082209051859291906104bc906120f1565b908152602001604051809103902080546104d5906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610501906120b7565b801561054e5780601f106105235761010080835404028352916020019161054e565b820191906000526020600020905b81548152906001019060200180831161053157829003601f168201915b50505050509050805160141461056d5761056882336117f5565b6105ca565b600061057882611763565b90506001600160a01b0381166105975761059283336117f5565b6105c8565b6001600160a01b03811633146105c85760405162461bcd60e51b81526004016105bf90612104565b60405180910390fd5b505b6105d5858585611951565b5050505050565b6105e46119ba565b6105ec611a1a565b565b6002602052816000526040600020818154811061060a57600080fd5b90600052602060002001600091509150508054610626906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610652906120b7565b801561069f5780601f106106745761010080835404028352916020019161069f565b820191906000526020600020905b81548152906001019060200180831161068257829003601f168201915b505050505081565b60608160008167ffffffffffffffff8111156106c5576106c561212e565b6040519080825280602002602001820160405280156106f857816020015b60608152602001906001900390816106e35790505b50905060005b828110156108125736600087878481811061071b5761071b612144565b905060200281019061072d919061215a565b91509150600160008a815260200190815260200160002082826040516107549291906121a1565b9081526020016040518091039020805461076d906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610799906120b7565b80156107e65780601f106107bb576101008083540402835291602001916107e6565b820191906000526020600020905b8154815290600101906020018083116107c957829003601f168201915b50505050508484815181106107fd576107fd612144565b602090810291909101015250506001016106fe565b5095945050505050565b60606001600085815260200190815260200160002083836040516108419291906121a1565b9081526020016040518091039020805461085a906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610886906120b7565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b505050505090509392505050565b6108e96117af565b600085815260016020526040808220905187929190610907906120f1565b90815260200160405180910390208054610920906120b7565b80601f016020809104026020016040519081016040528092919081815260200182805461094c906120b7565b80156109995780601f1061096e57610100808354040283529160200191610999565b820191906000526020600020905b81548152906001019060200180831161097c57829003601f168201915b5050505050905080516014146109b8576109b382336117f5565b610a0c565b60006109c382611763565b90506001600160a01b0381166109e2576109dd83336117f5565b610a0a565b6001600160a01b0381163314610a0a5760405162461bcd60e51b81526004016105bf90612104565b505b610a808787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250611a6c92505050565b50505050505050565b610a916117af565b610a9b81336117f5565b50565b60008181526001602052604080822090518291906103dc906120f1565b610ac36117af565b600085815260016020526040808220905187929190610ae1906120f1565b90815260200160405180910390208054610afa906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b26906120b7565b8015610b735780601f10610b4857610100808354040283529160200191610b73565b820191906000526020600020905b815481529060010190602001808311610b5657829003601f168201915b505050505090508051601414610b9257610b8d82336117f5565b610be6565b6000610b9d82611763565b90506001600160a01b038116610bbc57610bb783336117f5565b610be4565b6001600160a01b0381163314610be45760405162461bcd60e51b81526004016105bf90612104565b505b610bf1878787611adb565b610a80878585611ba1565b610c046119ba565b6105ec6000611be2565b6000610c186119ba565b6040516302571be360e01b81527f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260048201526001600160a01b038516906302571be390602401602060405180830381865afa158015610c7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca091906121b1565b6001600160a01b031663c47f002784846040518363ffffffff1660e01b8152600401610ccd9291906121f7565b6020604051808303816000875af1158015610cec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d10919061220b565b949350505050565b6000610d226119ba565b6040516302571be360e01b81527f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260048201526001600160a01b038416906302571be390602401602060405180830381865afa158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa91906121b1565b604051630f41a04d60e11b81526001600160a01b0384811660048301529190911690631e83409a906024016020604051808303816000875af1158015610df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e18919061220b565b90505b92915050565b610e296117af565b600082815260016020526040808220905184929190610e47906120f1565b90815260200160405180910390208054610e60906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8c906120b7565b8015610ed95780601f10610eae57610100808354040283529160200191610ed9565b820191906000526020600020905b815481529060010190602001808311610ebc57829003601f168201915b505050505090508051601414610ef857610ef382336117f5565b610f4c565b6000610f0382611763565b90506001600160a01b038116610f2257610f1d83336117f5565b610f4a565b6001600160a01b0381163314610f4a5760405162461bcd60e51b81526004016105bf90612104565b505b610fa8846040518060400160405280600781526020016636b0b730b3b2b960c91b81525085604051602001610f94919060609190911b6001600160601b031916815260140190565b604051602081830303815290604052611a6c565b50505050565b606081831115610ff05760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642072616e676560981b60448201526064016105bf565b6000610ffc8484612224565b67ffffffffffffffff8111156110145761101461212e565b60405190808252806020026020018201604052801561104757816020015b60608152602001906001900390816110325790505b509050835b8381101561113757600086815260026020526040902080548290811061107457611074612144565b906000526020600020018054611089906120b7565b80601f01602080910402602001604051908101604052809291908181526020018280546110b5906120b7565b80156111025780601f106110d757610100808354040283529160200191611102565b820191906000526020600020905b8154815290600101906020018083116110e557829003601f168201915b50505050508286836111149190612224565b8151811061112457611124612144565b602090810291909101015260010161104c565b50949350505050565b6111486119ba565b6105ec611c3b565b6111586117af565b600083815260016020526040808220905185929190611176906120f1565b9081526020016040518091039020805461118f906120b7565b80601f01602080910402602001604051908101604052809291908181526020018280546111bb906120b7565b80156112085780601f106111dd57610100808354040283529160200191611208565b820191906000526020600020905b8154815290600101906020018083116111eb57829003601f168201915b5050505050905080516014146112275761122282336117f5565b61127b565b600061123282611763565b90506001600160a01b0381166112515761124c83336117f5565b611279565b6001600160a01b03811633146112795760405162461bcd60e51b81526004016105bf90612104565b505b6105d5858585611adb565b6000828152600260205260409020805460609190839081106112aa576112aa612144565b9060005260206000200180546112bf906120b7565b80601f01602080910402602001604051908101604052809291908181526020018280546112eb906120b7565b80156113385780601f1061130d57610100808354040283529160200191611338565b820191906000526020600020905b81548152906001019060200180831161131b57829003601f168201915b5050505050905092915050565b606060026000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611426578382906000526020600020018054611399906120b7565b80601f01602080910402602001604051908101604052809291908181526020018280546113c5906120b7565b80156114125780601f106113e757610100808354040283529160200191611412565b820191906000526020600020905b8154815290600101906020018083116113f557829003601f168201915b50505050508152602001906001019061137a565b505050509050919050565b6114396117af565b61144382826117f5565b5050565b61144f6117af565b60008381526001602052604080822090518592919061146d906120f1565b90815260200160405180910390208054611486906120b7565b80601f01602080910402602001604051908101604052809291908181526020018280546114b2906120b7565b80156114ff5780601f106114d4576101008083540402835291602001916114ff565b820191906000526020600020905b8154815290600101906020018083116114e257829003601f168201915b50505050509050805160141461151e5761151982336117f5565b611572565b600061152982611763565b90506001600160a01b0381166115485761154383336117f5565b611570565b6001600160a01b03811633146115705760405162461bcd60e51b81526004016105bf90612104565b505b6105d5858585611ba1565b6115856117af565b6000828152600160205260408082209051849291906115a3906120f1565b908152602001604051809103902080546115bc906120b7565b80601f01602080910402602001604051908101604052809291908181526020018280546115e8906120b7565b80156116355780601f1061160a57610100808354040283529160200191611635565b820191906000526020600020905b81548152906001019060200180831161161857829003601f168201915b5050505050905080516014146116545761164f82336117f5565b6116a8565b600061165f82611763565b90506001600160a01b03811661167e5761167983336117f5565b6116a6565b6001600160a01b03811633146116a65760405162461bcd60e51b81526004016105bf90612104565b505b610fa884604051806040016040528060048152602001633ab9b2b960e11b81525085604051602001610f94919060609190911b6001600160601b031916815260140190565b6116f56119ba565b6001600160a01b03811661175a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105bf565b610a9b81611be2565b600081516014146117a75760405162461bcd60e51b815260206004820152600e60248201526d092dcecc2d8d2c840d8cadccee8d60931b60448201526064016105bf565b506014015190565b60005460ff16156105ec5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105bf565b600082815260016020526040808220905161180f906120f1565b90815260200160405180910390208054611828906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611854906120b7565b80156118a15780601f10611876576101008083540402835291602001916118a1565b820191906000526020600020905b81548152906001019060200180831161188457829003601f168201915b5050505050905080516014036119045760006118bc82611763565b9050826001600160a01b0316816001600160a01b031614611902576040516378a6c03d60e11b8152600481018590526001600160a01b03821660248201526044016105bf565b505b61194c836040518060400160405280600781526020016636b0b730b3b2b960c91b81525084604051602001610f94919060609190911b6001600160601b031916815260140190565b505050565b60008381526002602090815260408220805460018101825590835291200161197a828483612295565b50827fb067630e3908f166069c77766250c553414e2745e742a562d533f29744a91a7383836040516119ad9291906121f7565b60405180910390a2505050565b6000546001600160a01b036101009091041633146105ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105bf565b611a22611c78565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b806001600085815260200190815260200160002083604051611a8e9190612355565b90815260200160405180910390209081611aa89190612371565b50827f59ae30478c6dc6ad258000ec5c1e2da773a457572397f6b85ddd54ab719ecd5483836040516119ad929190612431565b8060005b818110156105d55736848483818110611afa57611afa612144565b9050602002810190611b0c919061245f565b9050611b9886611b1c838061215a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b5e92505050602085018561215a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a6c92505050565b50600101611adf565b8060005b818110156105d557611bda85858584818110611bc357611bc3612144565b9050602002810190611bd5919061215a565b611951565b600101611ba5565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b611c436117af565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a4f3390565b60005460ff166105ec5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105bf565b600060208284031215611cd357600080fd5b5035919050565b60008083601f840112611cec57600080fd5b50813567ffffffffffffffff811115611d0457600080fd5b602083019150836020828501011115611d1c57600080fd5b9250929050565b600080600060408486031215611d3857600080fd5b83359250602084013567ffffffffffffffff811115611d5657600080fd5b611d6286828701611cda565b9497909650939450505050565b60008060408385031215611d8257600080fd5b50508035926020909101359150565b60005b83811015611dac578181015183820152602001611d94565b50506000910152565b60008151808452611dcd816020860160208601611d91565b601f01601f19169290920160200192915050565b602081526000610e186020830184611db5565b60008083601f840112611e0657600080fd5b50813567ffffffffffffffff811115611e1e57600080fd5b6020830191508360208260051b8501011115611d1c57600080fd5b600080600060408486031215611e4e57600080fd5b83359250602084013567ffffffffffffffff811115611e6c57600080fd5b611d6286828701611df4565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015611ecf57603f19888603018452611ebd858351611db5565b94509285019290850190600101611ea1565b5092979650505050505050565b600080600080600060608688031215611ef457600080fd5b85359450602086013567ffffffffffffffff80821115611f1357600080fd5b611f1f89838a01611cda565b90965094506040880135915080821115611f3857600080fd5b50611f4588828901611cda565b969995985093965092949392505050565b600080600080600060608688031215611f6e57600080fd5b85359450602086013567ffffffffffffffff80821115611f8d57600080fd5b611f9989838a01611df4565b90965094506040880135915080821115611fb257600080fd5b50611f4588828901611df4565b6001600160a01b0381168114610a9b57600080fd5b600080600060408486031215611fe957600080fd5b8335611ff481611fbf565b9250602084013567ffffffffffffffff811115611d5657600080fd5b6000806040838503121561202357600080fd5b823561202e81611fbf565b9150602083013561203e81611fbf565b809150509250929050565b6000806040838503121561205c57600080fd5b82359150602083013561203e81611fbf565b60008060006060848603121561208357600080fd5b505081359360208301359350604090920135919050565b6000602082840312156120ac57600080fd5b813561048f81611fbf565b600181811c908216806120cb57607f821691505b6020821081036120eb57634e487b7160e01b600052602260045260246000fd5b50919050565b6636b0b730b3b2b960c91b815260070190565b60208082526010908201526f2737ba103634b9ba1036b0b730b3b2b960811b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261217157600080fd5b83018035915067ffffffffffffffff82111561218c57600080fd5b602001915036819003821315611d1c57600080fd5b8183823760009101908152919050565b6000602082840312156121c357600080fd5b815161048f81611fbf565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000610d106020830184866121ce565b60006020828403121561221d57600080fd5b5051919050565b81810381811115610e1b57634e487b7160e01b600052601160045260246000fd5b601f82111561194c576000816000526020600020601f850160051c8101602086101561226e5750805b601f850160051c820191505b8181101561228d5782815560010161227a565b505050505050565b67ffffffffffffffff8311156122ad576122ad61212e565b6122c1836122bb83546120b7565b83612245565b6000601f8411600181146122f557600085156122dd5750838201355b600019600387901b1c1916600186901b1783556105d5565b600083815260209020601f19861690835b828110156123265786850135825560209485019460019092019101612306565b50868210156123435760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008251612367818460208701611d91565b9190910192915050565b815167ffffffffffffffff81111561238b5761238b61212e565b61239f8161239984546120b7565b84612245565b602080601f8311600181146123d457600084156123bc5750858301515b600019600386901b1c1916600185901b17855561228d565b600085815260208120601f198616915b82811015612403578886015182559484019460019091019084016123e4565b50858210156124215787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815260006124446040830185611db5565b82810360208401526124568185611db5565b95945050505050565b60008235603e1983360301811261236757600080fdfea2646970667358221220db6aca8b1dc54087d11400b442c45f398a7f0ab7c1fcaae17d5bae216bfcf67964736f6c63430008170033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.