ETH Price: $2,720.91 (+4.19%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Ownersh...203101602024-07-15 6:35:59359 days ago1721025359IN
0xCb253Fa9...90650CD82
0 ETH0.000085332.9760894
Batch Add Adapte...203101602024-07-15 6:35:59359 days ago1721025359IN
0xCb253Fa9...90650CD82
0 ETH0.000788972.9760894

View more zero value Internal Transactions in Advanced View mode

Advanced mode:

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ExchangeAdapterRegistry

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/*

    Copyright 2022 31Third B.V.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

    SPDX-License-Identifier: Apache-2.0

*/

pragma solidity 0.8.16;

import "@openzeppelin/contracts/access/Ownable.sol";

contract ExchangeAdapterRegistry is Ownable {
  /*** ### Events ### ***/

  event AdapterAdded(address indexed adapter, string adapterName);
  event AdapterRemoved(address indexed adapter, string adapterName);
  event AdapterEdited(address indexed newAdapter, string adapterName);

  /*** ### Custom Errors ### ***/

  error RenounceOwnershipDisabled();
  error NameEmptyString();
  error NameAlreadyExists(string name);
  error InvalidAddress(string paramName, address passedAddress);
  error EmptyArray(string name);
  error ArrayLengthMismatch(string name1, string name2);
  error NoAdapterWithName(string name);

  /*** ### State Variables ### ***/

  // Mapping of exchange adapter identifier => adapter address
  mapping(bytes32 => address) private adapters;

  /*** ### External Functions ### ***/

  /**
   * ONLY OWNER: Override renounceOwnership to disable it
   */
  function renounceOwnership() public override view onlyOwner {
    revert RenounceOwnershipDisabled();
  }

  /**
   * ONLY OWNER: Add a new adapter to the registry
   *
   * @param  _name    Human readable string identifying the adapter
   * @param  _adapter Address of the adapter contract to add
   */
  function addAdapter(string memory _name, address _adapter) public onlyOwner {
    if (bytes(_name).length == 0) {
      revert NameEmptyString();
    }

    bytes32 hashedName = _getNameHash(_name);
    if (adapters[hashedName] != address(0)) {
      revert NameAlreadyExists(_name);
    }

    if (_adapter == address(0)) {
      revert InvalidAddress("_adapter", _adapter);
    }

    adapters[hashedName] = _adapter;

    emit AdapterAdded(_adapter, _name);
  }

  /**
   * ONLY OWNER: Batch add new adapters. Reverts if exists on any module and name
   *
   * @param  _names    Array of human readable strings identifying the adapter
   * @param  _adapters Array of addresses of the adapter contracts to add
   */
  function batchAddAdapter(
    string[] memory _names,
    address[] memory _adapters
  ) external onlyOwner {
    // Storing modules count to local variable to save on invocation
    uint256 namesCount = _names.length;

    if (namesCount == 0) {
      revert EmptyArray("_names");
    }
    if (namesCount != _adapters.length) {
      revert ArrayLengthMismatch("_names", "_adapters");
    }

    for (uint256 i = 0; i < namesCount; i++) {
      // Add adapters to the specified module. Will revert if module and name combination exists
      addAdapter(_names[i], _adapters[i]);
    }
  }

  /**
   * ONLY OWNER: Edit an existing adapter on the registry
   *
   * @param  _name    Human readable string identifying the adapter
   * @param  _adapter Address of the adapter contract to edit
   */
  function editAdapter(string memory _name, address _adapter) public onlyOwner {
    bytes32 hashedName = _getNameHash(_name);

    if (adapters[hashedName] == address(0)) {
      revert NoAdapterWithName(_name);
    }
    if (_adapter == address(0)) {
      revert InvalidAddress("_adapter", _adapter);
    }

    adapters[hashedName] = _adapter;

    emit AdapterEdited(_adapter, _name);
  }

  /**
   * ONLY OWNER: Batch edit adapters for modules. Reverts if module and
   * adapter name don't map to an adapter address
   *
   * @param  _names    Array of human readable strings identifying the adapter
   * @param  _adapters Array of addresses of the adapter contracts to add
   */
  function batchEditAdapter(
    string[] memory _names,
    address[] memory _adapters
  ) external onlyOwner {
    // Storing name count to local variable to save on invocation
    uint256 namesCount = _names.length;

    if (namesCount == 0) {
      revert EmptyArray("_names");
    }
    if (namesCount != _adapters.length) {
      revert ArrayLengthMismatch("_names", "_adapters");
    }

    for (uint256 i = 0; i < namesCount; i++) {
      // Edits adapters to the specified module. Will revert if module and name combination does not exist
      editAdapter(_names[i], _adapters[i]);
    }
  }

  /**
   * ONLY OWNER: Remove an existing adapter on the registry
   *
   * @param  _name Human readable string identifying the adapter
   */
  function removeAdapter(string memory _name) external onlyOwner {
    bytes32 hashedName = _getNameHash(_name);
    if (adapters[hashedName] == address(0)) {
      revert NoAdapterWithName(_name);
    }

    address oldAdapter = adapters[hashedName];
    delete adapters[hashedName];

    emit AdapterRemoved(oldAdapter, _name);
  }

  /*** ### External Getter Functions ### ***/

  /**
   * Get adapter adapter address associated with passed human readable name
   *
   * @param  _name Human readable adapter name
   *
   * @return       Address of adapter
   */
  function getAdapter(string memory _name) external view returns (address) {
    return adapters[_getNameHash(_name)];
  }

  /**
   * Get adapter adapter address associated with passed hashed name
   *
   * @param  _nameHash Hash of human readable adapter name
   *
   * @return           Address of adapter
   */
  function getAdapterWithHash(
    bytes32 _nameHash
  ) external view returns (address) {
    return adapters[_nameHash];
  }

  /**
   * Check if adapter name is valid
   *
   * @param  _name Human readable string identifying the adapter
   *
   * @return       Boolean indicating if valid
   */
  function isValidAdapter(string memory _name) external view returns (bool) {
    return adapters[_getNameHash(_name)] != address(0);
  }

  /*** ### Internal Functions ### ***/

  /**
   * Hashes the string and returns a bytes32 value
   */
  function _getNameHash(string memory _name) internal pure returns (bytes32) {
    return keccak256(bytes(_name));
  }
}

// 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.9.4) (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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"name1","type":"string"},{"internalType":"string","name":"name2","type":"string"}],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"EmptyArray","type":"error"},{"inputs":[{"internalType":"string","name":"paramName","type":"string"},{"internalType":"address","name":"passedAddress","type":"address"}],"name":"InvalidAddress","type":"error"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"NameAlreadyExists","type":"error"},{"inputs":[],"name":"NameEmptyString","type":"error"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"NoAdapterWithName","type":"error"},{"inputs":[],"name":"RenounceOwnershipDisabled","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"adapter","type":"address"},{"indexed":false,"internalType":"string","name":"adapterName","type":"string"}],"name":"AdapterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdapter","type":"address"},{"indexed":false,"internalType":"string","name":"adapterName","type":"string"}],"name":"AdapterEdited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"adapter","type":"address"},{"indexed":false,"internalType":"string","name":"adapterName","type":"string"}],"name":"AdapterRemoved","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"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_adapter","type":"address"}],"name":"addAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_names","type":"string[]"},{"internalType":"address[]","name":"_adapters","type":"address[]"}],"name":"batchAddAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_names","type":"string[]"},{"internalType":"address[]","name":"_adapters","type":"address[]"}],"name":"batchEditAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_adapter","type":"address"}],"name":"editAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"getAdapter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_nameHash","type":"bytes32"}],"name":"getAdapterWithHash","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"isValidAdapter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"removeAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610bb18061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80638da5cb5b116100715780638da5cb5b1461014757806390bb3c7b14610158578063b29485431461016b578063bc4c22121461017e578063ecdda3bb14610191578063f2fde38b146101a457600080fd5b806315d41bc5146100ae5780632e56b3ca146100c35780633ef11fd7146100eb5780634d483a3f146100fe578063715018a61461013f575b600080fd5b6100c16100bc366004610813565b6101b7565b005b6100d66100d1366004610861565b61029d565b60405190151581526020015b60405180910390f35b6100c16100f9366004610861565b6102d4565b61012761010c36600461089e565b6000908152600160205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016100e2565b6100c161037d565b6000546001600160a01b0316610127565b6100c161016636600461094d565b6103a1565b6100c1610179366004610813565b61044d565b61012761018c366004610861565b610540565b6100c161019f36600461094d565b610575565b6100c16101b2366004610a21565b61061b565b6101bf610694565b815160208301206000906000818152600160205260409020549091506001600160a01b031661020c5782604051633a8726e560e01b81526004016102039190610a43565b60405180910390fd5b6001600160a01b0382166102355781604051630961777760e41b81526004016102039190610a91565b6000818152600160205260409081902080546001600160a01b0319166001600160a01b03851690811790915590517f1a411c5153bf50e23baacf3aed3607cdabec221fe9118a6d691dbe343427112c90610290908690610a43565b60405180910390a2505050565b6000806001816102b285805160209091012090565b81526020810191909152604001600020546001600160a01b0316141592915050565b6102dc610694565b805160208201206000906000818152600160205260409020549091506001600160a01b03166103205781604051633a8726e560e01b81526004016102039190610a43565b6000818152600160205260409081902080546001600160a01b0319811690915590516001600160a01b039091169081907f030206afd58a0fcbf979c8a39065616008d826ae649328ca586c215b27694db890610290908690610a43565b610385610694565b6040516001623f026d60e01b0319815260040160405180910390fd5b6103a9610694565b815160008190036103cd57604051630446493360e01b815260040161020390610ac4565b815181146103ee5760405163616c411360e01b815260040161020390610af0565b60005b818110156104475761043584828151811061040e5761040e610b3e565b602002602001015184838151811061042857610428610b3e565b60200260200101516101b7565b8061043f81610b54565b9150506103f1565b50505050565b610455610694565b81516000036104775760405163240c147960e01b815260040160405180910390fd5b815160208301206000906000818152600160205260409020549091506001600160a01b0316156104bc57826040516309463f9760e31b81526004016102039190610a43565b6001600160a01b0382166104e55781604051630961777760e41b81526004016102039190610a91565b6000818152600160205260409081902080546001600160a01b0319166001600160a01b03851690811790915590517f4deb6bd78aac4294eea8398a24a28c165979a11a42e36e743b4aba149eb369f690610290908690610a43565b60006001600061055584805160209091012090565b81526020810191909152604001600020546001600160a01b031692915050565b61057d610694565b815160008190036105a157604051630446493360e01b815260040161020390610ac4565b815181146105c25760405163616c411360e01b815260040161020390610af0565b60005b81811015610447576106098482815181106105e2576105e2610b3e565b60200260200101518483815181106105fc576105fc610b3e565b602002602001015161044d565b8061061381610b54565b9150506105c5565b610623610694565b6001600160a01b0381166106885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610203565b610691816106f0565b50565b6000546001600160a01b031633146106ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610203565b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561077f5761077f610740565b604052919050565b600082601f83011261079857600080fd5b813567ffffffffffffffff8111156107b2576107b2610740565b6107c5601f8201601f1916602001610756565b8181528460208386010111156107da57600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160a01b038116811461080e57600080fd5b919050565b6000806040838503121561082657600080fd5b823567ffffffffffffffff81111561083d57600080fd5b61084985828601610787565b925050610858602084016107f7565b90509250929050565b60006020828403121561087357600080fd5b813567ffffffffffffffff81111561088a57600080fd5b61089684828501610787565b949350505050565b6000602082840312156108b057600080fd5b5035919050565b600067ffffffffffffffff8211156108d1576108d1610740565b5060051b60200190565b600082601f8301126108ec57600080fd5b813560206109016108fc836108b7565b610756565b82815260059290921b8401810191818101908684111561092057600080fd5b8286015b8481101561094257610935816107f7565b8352918301918301610924565b509695505050505050565b6000806040838503121561096057600080fd5b823567ffffffffffffffff8082111561097857600080fd5b818501915085601f83011261098c57600080fd5b8135602061099c6108fc836108b7565b82815260059290921b840181019181810190898411156109bb57600080fd5b8286015b848110156109f3578035868111156109d75760008081fd5b6109e58c86838b0101610787565b8452509183019183016109bf565b5096505086013592505080821115610a0a57600080fd5b50610a17858286016108db565b9150509250929050565b600060208284031215610a3357600080fd5b610a3c826107f7565b9392505050565b600060208083528351808285015260005b81811015610a7057858101830151858201604001528201610a54565b506000604082860101526040601f19601f8301168501019250505092915050565b6040808252600890820152672fb0b230b83a32b960c11b60608201526001600160a01b0391909116602082015260800190565b602081526000610aea6020830160068152655f6e616d657360d01b602082015260400190565b92915050565b604081526000610b166040830160068152655f6e616d657360d01b602082015260400190565b82810360209384015260098152685f616461707465727360b81b928101929092525060400190565b634e487b7160e01b600052603260045260246000fd5b600060018201610b7457634e487b7160e01b600052601160045260246000fd5b506001019056fea2646970667358221220b78f5304ac61803dad308a6b7af9869d3c1269611dbebb3bd2297fdabd8bc6c664736f6c63430008100033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80638da5cb5b116100715780638da5cb5b1461014757806390bb3c7b14610158578063b29485431461016b578063bc4c22121461017e578063ecdda3bb14610191578063f2fde38b146101a457600080fd5b806315d41bc5146100ae5780632e56b3ca146100c35780633ef11fd7146100eb5780634d483a3f146100fe578063715018a61461013f575b600080fd5b6100c16100bc366004610813565b6101b7565b005b6100d66100d1366004610861565b61029d565b60405190151581526020015b60405180910390f35b6100c16100f9366004610861565b6102d4565b61012761010c36600461089e565b6000908152600160205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016100e2565b6100c161037d565b6000546001600160a01b0316610127565b6100c161016636600461094d565b6103a1565b6100c1610179366004610813565b61044d565b61012761018c366004610861565b610540565b6100c161019f36600461094d565b610575565b6100c16101b2366004610a21565b61061b565b6101bf610694565b815160208301206000906000818152600160205260409020549091506001600160a01b031661020c5782604051633a8726e560e01b81526004016102039190610a43565b60405180910390fd5b6001600160a01b0382166102355781604051630961777760e41b81526004016102039190610a91565b6000818152600160205260409081902080546001600160a01b0319166001600160a01b03851690811790915590517f1a411c5153bf50e23baacf3aed3607cdabec221fe9118a6d691dbe343427112c90610290908690610a43565b60405180910390a2505050565b6000806001816102b285805160209091012090565b81526020810191909152604001600020546001600160a01b0316141592915050565b6102dc610694565b805160208201206000906000818152600160205260409020549091506001600160a01b03166103205781604051633a8726e560e01b81526004016102039190610a43565b6000818152600160205260409081902080546001600160a01b0319811690915590516001600160a01b039091169081907f030206afd58a0fcbf979c8a39065616008d826ae649328ca586c215b27694db890610290908690610a43565b610385610694565b6040516001623f026d60e01b0319815260040160405180910390fd5b6103a9610694565b815160008190036103cd57604051630446493360e01b815260040161020390610ac4565b815181146103ee5760405163616c411360e01b815260040161020390610af0565b60005b818110156104475761043584828151811061040e5761040e610b3e565b602002602001015184838151811061042857610428610b3e565b60200260200101516101b7565b8061043f81610b54565b9150506103f1565b50505050565b610455610694565b81516000036104775760405163240c147960e01b815260040160405180910390fd5b815160208301206000906000818152600160205260409020549091506001600160a01b0316156104bc57826040516309463f9760e31b81526004016102039190610a43565b6001600160a01b0382166104e55781604051630961777760e41b81526004016102039190610a91565b6000818152600160205260409081902080546001600160a01b0319166001600160a01b03851690811790915590517f4deb6bd78aac4294eea8398a24a28c165979a11a42e36e743b4aba149eb369f690610290908690610a43565b60006001600061055584805160209091012090565b81526020810191909152604001600020546001600160a01b031692915050565b61057d610694565b815160008190036105a157604051630446493360e01b815260040161020390610ac4565b815181146105c25760405163616c411360e01b815260040161020390610af0565b60005b81811015610447576106098482815181106105e2576105e2610b3e565b60200260200101518483815181106105fc576105fc610b3e565b602002602001015161044d565b8061061381610b54565b9150506105c5565b610623610694565b6001600160a01b0381166106885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610203565b610691816106f0565b50565b6000546001600160a01b031633146106ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610203565b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561077f5761077f610740565b604052919050565b600082601f83011261079857600080fd5b813567ffffffffffffffff8111156107b2576107b2610740565b6107c5601f8201601f1916602001610756565b8181528460208386010111156107da57600080fd5b816020850160208301376000918101602001919091529392505050565b80356001600160a01b038116811461080e57600080fd5b919050565b6000806040838503121561082657600080fd5b823567ffffffffffffffff81111561083d57600080fd5b61084985828601610787565b925050610858602084016107f7565b90509250929050565b60006020828403121561087357600080fd5b813567ffffffffffffffff81111561088a57600080fd5b61089684828501610787565b949350505050565b6000602082840312156108b057600080fd5b5035919050565b600067ffffffffffffffff8211156108d1576108d1610740565b5060051b60200190565b600082601f8301126108ec57600080fd5b813560206109016108fc836108b7565b610756565b82815260059290921b8401810191818101908684111561092057600080fd5b8286015b8481101561094257610935816107f7565b8352918301918301610924565b509695505050505050565b6000806040838503121561096057600080fd5b823567ffffffffffffffff8082111561097857600080fd5b818501915085601f83011261098c57600080fd5b8135602061099c6108fc836108b7565b82815260059290921b840181019181810190898411156109bb57600080fd5b8286015b848110156109f3578035868111156109d75760008081fd5b6109e58c86838b0101610787565b8452509183019183016109bf565b5096505086013592505080821115610a0a57600080fd5b50610a17858286016108db565b9150509250929050565b600060208284031215610a3357600080fd5b610a3c826107f7565b9392505050565b600060208083528351808285015260005b81811015610a7057858101830151858201604001528201610a54565b506000604082860101526040601f19601f8301168501019250505092915050565b6040808252600890820152672fb0b230b83a32b960c11b60608201526001600160a01b0391909116602082015260800190565b602081526000610aea6020830160068152655f6e616d657360d01b602082015260400190565b92915050565b604081526000610b166040830160068152655f6e616d657360d01b602082015260400190565b82810360209384015260098152685f616461707465727360b81b928101929092525060400190565b634e487b7160e01b600052603260045260246000fd5b600060018201610b7457634e487b7160e01b600052601160045260246000fd5b506001019056fea2646970667358221220b78f5304ac61803dad308a6b7af9869d3c1269611dbebb3bd2297fdabd8bc6c664736f6c63430008100033

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.