ETH Price: $3,225.79 (-2.05%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Metadata Val...216737322025-01-21 15:22:5946 hrs ago1737472979IN
0x5289fE5d...F4E0F17EF
0 ETH0.002207714.19880853
Set Metadata Val...216330482025-01-15 23:04:117 days ago1736982251IN
0x5289fE5d...F4E0F17EF
0 ETH0.000932957.20541404
Apply List Ops216250782025-01-14 20:20:478 days ago1736886047IN
0x5289fE5d...F4E0F17EF
0 ETH0.000500578.55205899
Apply List Ops216198042025-01-14 2:41:479 days ago1736822507IN
0x5289fE5d...F4E0F17EF
0 ETH0.000433983.92932232
Apply List Ops216197252025-01-14 2:25:359 days ago1736821535IN
0x5289fE5d...F4E0F17EF
0 ETH0.000312565.34110746
Set Metadata Val...216196262025-01-14 2:05:239 days ago1736820323IN
0x5289fE5d...F4E0F17EF
0 ETH0.000818133.50631551
Apply List Ops215977992025-01-11 0:56:1112 days ago1736556971IN
0x5289fE5d...F4E0F17EF
0 ETH0.000374444.43180724
Apply List Ops215977082025-01-11 0:37:4712 days ago1736555867IN
0x5289fE5d...F4E0F17EF
0 ETH0.00027224.6504064
Apply List Ops215976922025-01-11 0:34:3512 days ago1736555675IN
0x5289fE5d...F4E0F17EF
0 ETH0.000350714.15094935
Set Metadata Val...215190252024-12-31 0:58:5923 days ago1735606739IN
0x5289fE5d...F4E0F17EF
0 ETH0.000783296.04957822
Set Metadata Val...215190072024-12-31 0:55:2323 days ago1735606523IN
0x5289fE5d...F4E0F17EF
0 ETH0.001454546.23347133
Set Metadata Val...214956292024-12-27 18:36:4726 days ago1735324607IN
0x5289fE5d...F4E0F17EF
0 ETH0.001369938.81345367
Set Metadata Val...214936172024-12-27 11:52:4727 days ago1735300367IN
0x5289fE5d...F4E0F17EF
0 ETH0.000854016.59570921
Set Metadata Val...214915002024-12-27 4:46:2327 days ago1735274783IN
0x5289fE5d...F4E0F17EF
0 ETH0.001302274.18417022
Set Metadata Val...214910572024-12-27 3:16:5927 days ago1735269419IN
0x5289fE5d...F4E0F17EF
0 ETH0.001039035.0106864
Set Metadata Val...214904672024-12-27 1:18:2327 days ago1735262303IN
0x5289fE5d...F4E0F17EF
0 ETH0.002275674.87265601
Set Metadata Val...214903962024-12-27 1:04:1127 days ago1735261451IN
0x5289fE5d...F4E0F17EF
0 ETH0.000748074.81271189
Set Metadata Val...214899472024-12-26 23:33:1127 days ago1735255991IN
0x5289fE5d...F4E0F17EF
0 ETH0.00120815.17736978
Set Metadata Val...214628052024-12-23 4:28:4731 days ago1734928127IN
0x5289fE5d...F4E0F17EF
0 ETH0.000729075.63134351
Apply List Ops214486102024-12-21 4:50:5933 days ago1734756659IN
0x5289fE5d...F4E0F17EF
0 ETH0.001875276.41684639
Apply List Ops213992312024-12-14 7:22:1140 days ago1734160931IN
0x5289fE5d...F4E0F17EF
0 ETH0.000834547.55604525
Set Metadata Val...213502302024-12-07 11:10:3547 days ago1733569835IN
0x5289fE5d...F4E0F17EF
0 ETH0.0043340913.92476736
Set Metadata Val...213489682024-12-07 6:56:4747 days ago1733554607IN
0x5289fE5d...F4E0F17EF
0 ETH0.0056924412.90453823
Set Metadata Val...213025562024-11-30 19:23:2353 days ago1732994603IN
0x5289fE5d...F4E0F17EF
0 ETH0.0040117915.47300952
Set Metadata Val...212918252024-11-29 7:20:5955 days ago1732864859IN
0x5289fE5d...F4E0F17EF
0 ETH0.001164668.99492408
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
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
File 1 of 6 : EFPListRecords.sol
// 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 {}

File 2 of 6 : Ownable.sol
// 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);
    }
}

File 3 of 6 : Pausable.sol
// 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());
    }
}

File 4 of 6 : IEFPListRecords.sol
// 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;
}

File 5 of 6 : ENSReverseClaimer.sol
//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);
  }
}

File 6 of 6 : Context.sol
// 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

[{"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

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.