ETH Price: $2,583.53 (-4.16%)

Contract

0xd918685c42A248Ff471ef87e005718C4AaFe04B7
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Ownersh...190797152024-01-24 23:16:47215 days ago1706138207IN
0xd918685c...4AaFe04B7
0 ETH0.0003431512
0x60806040190362062024-01-18 20:43:35221 days ago1705610615IN
 Create: ChainlinkOracle
0 ETH0.029731240

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ChainlinkOracle

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
london EvmVersion, GNU GPLv3 license
File 1 of 9 : ChainlinkOracle.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.17;

import "Denominations.sol";
import "FeedRegistryInterface.sol";
import "Ownable.sol";

import "IOracle.sol";

interface IAggregatorV3Interface {
    function decimals() external view returns (uint8);

    function description() external view returns (string memory);

    function version() external view returns (uint256);

    /// @notice `getRoundData` and `latestRoundData` should both raise "No data present"
    /// if they do not have data to report, instead of returning unset values
    /// which could be misinterpreted as actual reported values.
    function getRoundData(
        uint80 _roundId
    )
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );

    function latestRoundData()
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );
}

contract ChainlinkOracle is IOracle, Ownable {
    event HeartbeatUpdated(uint256 heartbeat);

    uint256 public heartbeat = 24 hours;

    FeedRegistryInterface internal constant _feedRegistry =
        FeedRegistryInterface(0x47Fb2585D2C56Fe188D0E6ec628a38b74fCeeeDf);
    address internal constant _WETH = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
    address internal constant _CURVE_ETH = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
    uint256 internal constant _MIN_HEARTBEAT = 6 hours;

    function setHeartbeat(uint256 heartbeat_) external onlyOwner {
        require(heartbeat_ >= _MIN_HEARTBEAT, "heartbeat too low");
        require(heartbeat_ != heartbeat, "same as current");
        heartbeat = heartbeat_;
        emit HeartbeatUpdated(heartbeat_);
    }

    function isTokenSupported(address token) external view override returns (bool) {
        if (_isEth(token)) return true;
        try this.getUSDPrice(token) returns (uint256) {
            return true;
        } catch Error(string memory) {
            return false;
        }
    }

    // Prices are always provided with 18 decimals pecision
    function getUSDPrice(address token) external view returns (uint256) {
        return _getPrice(token, Denominations.USD, true);
    }

    function _getPrice(
        address token,
        address denomination,
        bool tryOtherDenomination
    ) internal view returns (uint256) {
        if (_isEth(token)) token = Denominations.ETH;
        try _feedRegistry.latestRoundData(token, denomination) returns (
            uint80,
            int256 price_,
            uint256,
            uint256 updatedAt_,
            uint80
        ) {
            require(updatedAt_ != 0, "round not complete");
            require(price_ > 0, "negative price");
            require(updatedAt_ >= block.timestamp - heartbeat, "price too old");
            return _scaleFrom(uint256(price_), _feedRegistry.decimals(token, denomination));
        } catch Error(string memory reason) {
            if (!tryOtherDenomination) revert(reason);

            if (denomination == Denominations.USD) {
                return
                    (_getPrice(token, Denominations.ETH, false) *
                        _getPrice(Denominations.ETH, Denominations.USD, false)) / 1e18;
            }
            return
                (_getPrice(token, Denominations.USD, false) * 1e18) /
                _getPrice(Denominations.ETH, Denominations.USD, false);
        }
    }

    function _scaleFrom(uint256 value, uint8 decimals) internal pure returns (uint256) {
        if (decimals == 18) return value;
        if (decimals > 18) return value / 10 ** (decimals - 18);
        else return value * 10 ** (18 - decimals);
    }

    function _isEth(address token) internal pure returns (bool) {
        return token == address(0) || token == _WETH || token == _CURVE_ETH;
    }
}

File 2 of 9 : Denominations.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

library Denominations {
  address public constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
  address public constant BTC = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;

  // Fiat currencies follow https://en.wikipedia.org/wiki/ISO_4217
  address public constant USD = address(840);
  address public constant GBP = address(826);
  address public constant EUR = address(978);
  address public constant JPY = address(392);
  address public constant KRW = address(410);
  address public constant CNY = address(156);
  address public constant AUD = address(36);
  address public constant CAD = address(124);
  address public constant CHF = address(756);
  address public constant ARS = address(32);
  address public constant PHP = address(608);
  address public constant NZD = address(554);
  address public constant SGD = address(702);
  address public constant NGN = address(566);
  address public constant ZAR = address(710);
  address public constant RUB = address(643);
  address public constant INR = address(356);
  address public constant BRL = address(986);
}

File 3 of 9 : FeedRegistryInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
pragma abicoder v2;

import "AggregatorV2V3Interface.sol";

interface FeedRegistryInterface {
  struct Phase {
    uint16 phaseId;
    uint80 startingAggregatorRoundId;
    uint80 endingAggregatorRoundId;
  }

  event FeedProposed(
    address indexed asset,
    address indexed denomination,
    address indexed proposedAggregator,
    address currentAggregator,
    address sender
  );
  event FeedConfirmed(
    address indexed asset,
    address indexed denomination,
    address indexed latestAggregator,
    address previousAggregator,
    uint16 nextPhaseId,
    address sender
  );

  // V3 AggregatorV3Interface

  function decimals(address base, address quote) external view returns (uint8);

  function description(address base, address quote) external view returns (string memory);

  function version(address base, address quote) external view returns (uint256);

  function latestRoundData(address base, address quote)
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function getRoundData(
    address base,
    address quote,
    uint80 _roundId
  )
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  // V2 AggregatorInterface

  function latestAnswer(address base, address quote) external view returns (int256 answer);

  function latestTimestamp(address base, address quote) external view returns (uint256 timestamp);

  function latestRound(address base, address quote) external view returns (uint256 roundId);

  function getAnswer(
    address base,
    address quote,
    uint256 roundId
  ) external view returns (int256 answer);

  function getTimestamp(
    address base,
    address quote,
    uint256 roundId
  ) external view returns (uint256 timestamp);

  // Registry getters

  function getFeed(address base, address quote) external view returns (AggregatorV2V3Interface aggregator);

  function getPhaseFeed(
    address base,
    address quote,
    uint16 phaseId
  ) external view returns (AggregatorV2V3Interface aggregator);

  function isFeedEnabled(address aggregator) external view returns (bool);

  function getPhase(
    address base,
    address quote,
    uint16 phaseId
  ) external view returns (Phase memory phase);

  // Round helpers

  function getRoundFeed(
    address base,
    address quote,
    uint80 roundId
  ) external view returns (AggregatorV2V3Interface aggregator);

  function getPhaseRange(
    address base,
    address quote,
    uint16 phaseId
  ) external view returns (uint80 startingRoundId, uint80 endingRoundId);

  function getPreviousRoundId(
    address base,
    address quote,
    uint80 roundId
  ) external view returns (uint80 previousRoundId);

  function getNextRoundId(
    address base,
    address quote,
    uint80 roundId
  ) external view returns (uint80 nextRoundId);

  // Feed management

  function proposeFeed(
    address base,
    address quote,
    address aggregator
  ) external;

  function confirmFeed(
    address base,
    address quote,
    address aggregator
  ) external;

  // Proposed aggregator

  function getProposedFeed(address base, address quote)
    external
    view
    returns (AggregatorV2V3Interface proposedAggregator);

  function proposedGetRoundData(
    address base,
    address quote,
    uint80 roundId
  )
    external
    view
    returns (
      uint80 id,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function proposedLatestRoundData(address base, address quote)
    external
    view
    returns (
      uint80 id,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  // Phases
  function getCurrentPhaseId(address base, address quote) external view returns (uint16 currentPhaseId);
}

File 4 of 9 : AggregatorV2V3Interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "AggregatorInterface.sol";
import "AggregatorV3Interface.sol";

interface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface {}

File 5 of 9 : AggregatorInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface AggregatorInterface {
  function latestAnswer() external view returns (int256);

  function latestTimestamp() external view returns (uint256);

  function latestRound() external view returns (uint256);

  function getAnswer(uint256 roundId) external view returns (int256);

  function getTimestamp(uint256 roundId) external view returns (uint256);

  event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);

  event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);
}

File 6 of 9 : AggregatorV3Interface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  function getRoundData(uint80 _roundId)
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}

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

pragma solidity ^0.8.0;

import "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 8 of 9 : 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;
    }
}

File 9 of 9 : IOracle.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.17;

interface IOracle {
    event TokenUpdated(address indexed token, address feed, uint256 maxDelay, bool isEthPrice);

    /// @notice returns the price in USD of symbol.
    function getUSDPrice(address token) external view returns (uint256);

    /// @notice returns if the given token is supported for pricing.
    function isTokenSupported(address token) external view returns (bool);
}

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

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"heartbeat","type":"uint256"}],"name":"HeartbeatUpdated","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":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"feed","type":"address"},{"indexed":false,"internalType":"uint256","name":"maxDelay","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isEthPrice","type":"bool"}],"name":"TokenUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getUSDPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"heartbeat","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isTokenSupported","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"heartbeat_","type":"uint256"}],"name":"setHeartbeat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526201518060015534801561001757600080fd5b5061002133610026565b610076565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610b9f806100856000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80638b2f0f4f1161005b5780638b2f0f4f146100cb5780638da5cb5b146100de578063d29dba91146100f9578063f2fde38b1461010c57600080fd5b80633defb96214610082578063715018a61461009e57806375151b63146100a8575b600080fd5b61008b60015481565b6040519081526020015b60405180910390f35b6100a661011f565b005b6100bb6100b63660046107e4565b610133565b6040519015158152602001610095565b61008b6100d93660046107e4565b6101f9565b6000546040516001600160a01b039091168152602001610095565b6100a661010736600461080d565b61020f565b6100a661011a3660046107e4565b6102e0565b610127610359565b61013160006103b3565b565b600061013e82610403565b1561014b57506001919050565b604051638b2f0f4f60e01b81526001600160a01b03831660048201523090638b2f0f4f90602401602060405180830381865afa9250505080156101ab575060408051601f3d908101601f191682019092526101a891810190610826565b60015b6101eb576101b761083f565b806308c379a0036101df57506101cb610896565b806101d657506101e1565b50600092915050565b505b3d6000803e3d6000fd5b50600192915050565b919050565b6000610209826103486001610463565b92915050565b610217610359565b6154608110156102625760405162461bcd60e51b815260206004820152601160248201527068656172746265617420746f6f206c6f7760781b60448201526064015b60405180910390fd5b60015481036102a55760405162461bcd60e51b815260206004820152600f60248201526e1cd85b5948185cc818dd5c9c995b9d608a1b6044820152606401610259565b60018190556040518181527fc2178046992f7ede7649071430a5471a38fa34dc920c308b50d50c3271519b6d9060200160405180910390a150565b6102e8610359565b6001600160a01b03811661034d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610259565b610356816103b3565b50565b6000546001600160a01b031633146101315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610259565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b038216158061043757506001600160a01b03821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2145b8061020957506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1492915050565b600061046e84610403565b1561048b5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee93505b60405163bcfd032d60e01b81526001600160a01b038086166004830152841660248201527347fb2585d2c56fe188d0e6ec628a38b74fceeedf9063bcfd032d9060440160a060405180830381865afa925050508015610507575060408051601f3d908101601f191682019092526105049181019061093a565b60015b61060d5761051361083f565b806308c379a0036101df5750610527610896565b8061053257506101e1565b82610551578060405162461bcd60e51b8152600401610259919061098a565b610347196001600160a01b038516016105cb57670de0b6b3a764000061058f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6103486000610463565b6105af8773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6000610463565b6105b991906109ee565b6105c39190610a05565b915050610776565b6105ed73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6103486000610463565b6105fb866103486000610463565b6105b990670de0b6b3a76400006109ee565b816000036106525760405162461bcd60e51b8152602060048201526012602482015271726f756e64206e6f7420636f6d706c65746560701b6044820152606401610259565b600084136106935760405162461bcd60e51b815260206004820152600e60248201526d6e6567617469766520707269636560901b6044820152606401610259565b6001546106a09042610a27565b8210156106df5760405162461bcd60e51b815260206004820152600d60248201526c1c1c9a58d9481d1bdbc81bdb19609a1b6044820152606401610259565b604051630b1c5a7560e31b81526001600160a01b03808b1660048301528916602482015261076e9085907347fb2585d2c56fe188d0e6ec628a38b74fceeedf906358e2d3a890604401602060405180830381865afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190610a3a565b61077d565b955050505050505b9392505050565b60008160ff16601203610791575081610209565b60128260ff1611156107c4576107a8601283610a5d565b6107b390600a610b5a565b6107bd9084610a05565b9050610209565b6107cf826012610a5d565b6107da90600a610b5a565b6107bd90846109ee565b6000602082840312156107f657600080fd5b81356001600160a01b038116811461077657600080fd5b60006020828403121561081f57600080fd5b5035919050565b60006020828403121561083857600080fd5b5051919050565b600060033d11156108585760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff8111828210171561088f57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156108a45790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156108d457505050505090565b82850191508151818111156108ec5750505050505090565b843d87010160208285010111156109065750505050505090565b6109156020828601018761085b565b509095945050505050565b805169ffffffffffffffffffff811681146101f457600080fd5b600080600080600060a0868803121561095257600080fd5b61095b86610920565b945060208601519350604086015192506060860151915061097e60808701610920565b90509295509295909350565b600060208083528351808285015260005b818110156109b75785810183015185820160400152820161099b565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610209576102096109d8565b600082610a2257634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610209576102096109d8565b600060208284031215610a4c57600080fd5b815160ff8116811461077657600080fd5b60ff8281168282160390811115610209576102096109d8565b600181815b80851115610ab1578160001904821115610a9757610a976109d8565b80851615610aa457918102915b93841c9390800290610a7b565b509250929050565b600082610ac857506001610209565b81610ad557506000610209565b8160018114610aeb5760028114610af557610b11565b6001915050610209565b60ff841115610b0657610b066109d8565b50506001821b610209565b5060208310610133831016604e8410600b8410161715610b34575081810a610209565b610b3e8383610a76565b8060001904821115610b5257610b526109d8565b029392505050565b600061077660ff841683610ab956fea26469706673582212208159b71a9544352a5293a949b3d25feb921c96ae1b2b32e4ac77abc8938acc0664736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80638b2f0f4f1161005b5780638b2f0f4f146100cb5780638da5cb5b146100de578063d29dba91146100f9578063f2fde38b1461010c57600080fd5b80633defb96214610082578063715018a61461009e57806375151b63146100a8575b600080fd5b61008b60015481565b6040519081526020015b60405180910390f35b6100a661011f565b005b6100bb6100b63660046107e4565b610133565b6040519015158152602001610095565b61008b6100d93660046107e4565b6101f9565b6000546040516001600160a01b039091168152602001610095565b6100a661010736600461080d565b61020f565b6100a661011a3660046107e4565b6102e0565b610127610359565b61013160006103b3565b565b600061013e82610403565b1561014b57506001919050565b604051638b2f0f4f60e01b81526001600160a01b03831660048201523090638b2f0f4f90602401602060405180830381865afa9250505080156101ab575060408051601f3d908101601f191682019092526101a891810190610826565b60015b6101eb576101b761083f565b806308c379a0036101df57506101cb610896565b806101d657506101e1565b50600092915050565b505b3d6000803e3d6000fd5b50600192915050565b919050565b6000610209826103486001610463565b92915050565b610217610359565b6154608110156102625760405162461bcd60e51b815260206004820152601160248201527068656172746265617420746f6f206c6f7760781b60448201526064015b60405180910390fd5b60015481036102a55760405162461bcd60e51b815260206004820152600f60248201526e1cd85b5948185cc818dd5c9c995b9d608a1b6044820152606401610259565b60018190556040518181527fc2178046992f7ede7649071430a5471a38fa34dc920c308b50d50c3271519b6d9060200160405180910390a150565b6102e8610359565b6001600160a01b03811661034d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610259565b610356816103b3565b50565b6000546001600160a01b031633146101315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610259565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b038216158061043757506001600160a01b03821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2145b8061020957506001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1492915050565b600061046e84610403565b1561048b5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee93505b60405163bcfd032d60e01b81526001600160a01b038086166004830152841660248201527347fb2585d2c56fe188d0e6ec628a38b74fceeedf9063bcfd032d9060440160a060405180830381865afa925050508015610507575060408051601f3d908101601f191682019092526105049181019061093a565b60015b61060d5761051361083f565b806308c379a0036101df5750610527610896565b8061053257506101e1565b82610551578060405162461bcd60e51b8152600401610259919061098a565b610347196001600160a01b038516016105cb57670de0b6b3a764000061058f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6103486000610463565b6105af8773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6000610463565b6105b991906109ee565b6105c39190610a05565b915050610776565b6105ed73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6103486000610463565b6105fb866103486000610463565b6105b990670de0b6b3a76400006109ee565b816000036106525760405162461bcd60e51b8152602060048201526012602482015271726f756e64206e6f7420636f6d706c65746560701b6044820152606401610259565b600084136106935760405162461bcd60e51b815260206004820152600e60248201526d6e6567617469766520707269636560901b6044820152606401610259565b6001546106a09042610a27565b8210156106df5760405162461bcd60e51b815260206004820152600d60248201526c1c1c9a58d9481d1bdbc81bdb19609a1b6044820152606401610259565b604051630b1c5a7560e31b81526001600160a01b03808b1660048301528916602482015261076e9085907347fb2585d2c56fe188d0e6ec628a38b74fceeedf906358e2d3a890604401602060405180830381865afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190610a3a565b61077d565b955050505050505b9392505050565b60008160ff16601203610791575081610209565b60128260ff1611156107c4576107a8601283610a5d565b6107b390600a610b5a565b6107bd9084610a05565b9050610209565b6107cf826012610a5d565b6107da90600a610b5a565b6107bd90846109ee565b6000602082840312156107f657600080fd5b81356001600160a01b038116811461077657600080fd5b60006020828403121561081f57600080fd5b5035919050565b60006020828403121561083857600080fd5b5051919050565b600060033d11156108585760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff8111828210171561088f57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d10156108a45790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156108d457505050505090565b82850191508151818111156108ec5750505050505090565b843d87010160208285010111156109065750505050505090565b6109156020828601018761085b565b509095945050505050565b805169ffffffffffffffffffff811681146101f457600080fd5b600080600080600060a0868803121561095257600080fd5b61095b86610920565b945060208601519350604086015192506060860151915061097e60808701610920565b90509295509295909350565b600060208083528351808285015260005b818110156109b75785810183015185820160400152820161099b565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610209576102096109d8565b600082610a2257634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610209576102096109d8565b600060208284031215610a4c57600080fd5b815160ff8116811461077657600080fd5b60ff8281168282160390811115610209576102096109d8565b600181815b80851115610ab1578160001904821115610a9757610a976109d8565b80851615610aa457918102915b93841c9390800290610a7b565b509250929050565b600082610ac857506001610209565b81610ad557506000610209565b8160018114610aeb5760028114610af557610b11565b6001915050610209565b60ff841115610b0657610b066109d8565b50506001821b610209565b5060208310610133831016604e8410600b8410161715610b34575081810a610209565b610b3e8383610a76565b8060001904821115610b5257610b526109d8565b029392505050565b600061077660ff841683610ab956fea26469706673582212208159b71a9544352a5293a949b3d25feb921c96ae1b2b32e4ac77abc8938acc0664736f6c63430008110033

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.