Sepolia Testnet

Contract

0x6D8e3A744cc18E803B7a2fC95A44a3b0483703eb

Overview

ETH Balance

0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Publish Day Esr76958262025-02-13 1:00:486 hrs ago1739408448IN
0x6D8e3A74...0483703eb
0 ETH0.000066141.09489866
Publish Day Esr76893422025-02-12 0:54:4830 hrs ago1739321688IN
0x6D8e3A74...0483703eb
0 ETH0.000066621.10312244
Publish Day Esr76827732025-02-11 0:52:362 days ago1739235156IN
0x6D8e3A74...0483703eb
0 ETH0.000071211.17886297
Publish Day Esr76760472025-02-10 0:58:363 days ago1739149116IN
0x6D8e3A74...0483703eb
0 ETH0.000063721.05497001
Publish Day Esr76699432025-02-09 3:58:484 days ago1739073528IN
0x6D8e3A74...0483703eb
0 ETH0.000065171.07887336
Publish Day Esr76620462025-02-08 0:53:005 days ago1738975980IN
0x6D8e3A74...0483703eb
0 ETH0.000203523.36956136
Publish Day Esr76551502025-02-07 0:54:126 days ago1738889652IN
0x6D8e3A74...0483703eb
0 ETH0.000059090.97817648
Publish Day Esr76483762025-02-06 0:54:127 days ago1738803252IN
0x6D8e3A74...0483703eb
0 ETH0.000072231.19601263
Publish Day Esr76416592025-02-05 0:53:128 days ago1738716792IN
0x6D8e3A74...0483703eb
0 ETH0.00006681.10581567
Publish Day Esr76347832025-02-04 0:53:489 days ago1738630428IN
0x6D8e3A74...0483703eb
0 ETH0.000063581.0526683
Publish Day Esr76278362025-02-03 0:53:4810 days ago1738544028IN
0x6D8e3A74...0483703eb
0 ETH0.000060190.99638513
Publish Day Esr76208832025-02-02 0:54:4811 days ago1738457688IN
0x6D8e3A74...0483703eb
0 ETH0.00006541.0828745
Publish Day Esr76139062025-02-01 0:54:4812 days ago1738371288IN
0x6D8e3A74...0483703eb
0 ETH0.000063371.04898202
Publish Day Esr76067902025-01-31 0:52:3613 days ago1738284756IN
0x6D8e3A74...0483703eb
0 ETH0.000061571.01953448
Publish Day Esr75996302025-01-30 0:54:0014 days ago1738198440IN
0x6D8e3A74...0483703eb
0 ETH0.000068441.1329375
Publish Day Esr75924482025-01-29 0:52:3615 days ago1738111956IN
0x6D8e3A74...0483703eb
0 ETH0.000076711.27008137
Publish Day Esr75852732025-01-28 0:54:3616 days ago1738025676IN
0x6D8e3A74...0483703eb
0 ETH0.000064531.06821725
Publish Day Esr75782582025-01-27 0:53:4817 days ago1737939228IN
0x6D8e3A74...0483703eb
0 ETH0.000063951.05884928
Publish Day Esr75713712025-01-26 0:53:0018 days ago1737852780IN
0x6D8e3A74...0483703eb
0 ETH0.000064871.0739218
Publish Day Esr75648212025-01-25 1:58:2419 days ago1737770304IN
0x6D8e3A74...0483703eb
0 ETH0.000143122.36968227
Publish Day Esr75575662025-01-24 0:52:4820 days ago1737679968IN
0x6D8e3A74...0483703eb
0 ETH0.000124382.05899639
Publish Day Esr75506042025-01-23 0:53:0021 days ago1737593580IN
0x6D8e3A74...0483703eb
0 ETH0.000060791.00652904
Publish Day Esr75435662025-01-22 0:53:1222 days ago1737507192IN
0x6D8e3A74...0483703eb
0 ETH0.000084311.39572828
Publish Day Esr75363862025-01-21 0:54:4823 days ago1737420888IN
0x6D8e3A74...0483703eb
0 ETH0.000065991.09259215
Publish Day Esr75292022025-01-20 0:53:0024 days ago1737334380IN
0x6D8e3A74...0483703eb
0 ETH0.000006730.1115489
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:
ESR

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 4 : ESR.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import {Ownable, Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";

contract ESR is Ownable2Step {
    // constants
    string public constant name = "Treehouse Ethereum Staking Rate - Spot";
    string public constant symbol = "tESR";

    // address public immutable owner;
    uint256 public immutable decimals = 9;
    uint256 public immutable ESR_PUBLISH_FREQUENCY = 1 days;

    int256 private latestEsr = 0;
    uint256 private latestEsrObservedAt = 0;
    uint256 private esrStartDay = 0;

    constructor() Ownable(msg.sender) {
        // owner = msg.sender;
        esrStartDay = getStartOfDayTimestamp(block.timestamp);
    }

    // errors
    error Unauthorised();
    error InvalidTimestamp();
    error NotHistoricalData();
    error ArrayLengthMismatch();
    error MissingEsrData(uint256 date);

    // events
    event EsrUpdate(uint256 indexed observationDate, address publisher, int256 esr);

    /// @dev Convert any timestamp to SOD timestamp as date representation
    function getStartOfDayTimestamp(uint256 timestamp) private pure returns (uint256 sodTimestamp) {
        return (timestamp / ESR_PUBLISH_FREQUENCY) * ESR_PUBLISH_FREQUENCY;
    }

    // define the mapping from date to ESR
    mapping(uint256 timestamp => int256 esr) private esrFromDate;

    function checkAndUpdateEsrStartDay(uint256 timestamp) private {
        if (timestamp < esrStartDay) {
            esrStartDay = timestamp;
        }
    }

    // define write functions
    /// @notice Publish latest ESR value
    function publishDayEsr(uint256 timestamp, int256 esr) public onlyOwner {
        // data validation
        // get SOD timestamp
        timestamp = getStartOfDayTimestamp(timestamp);
        // require(
        //     latestEsrObservedAt == 0 || timestamp == latestEsrObservedAt + ESR_PUBLISH_FREQUENCY,
        //     "Submitted timestamp/date is not valid"
        // );
        if (latestEsrObservedAt != 0 && timestamp != latestEsrObservedAt + ESR_PUBLISH_FREQUENCY) {
            revert InvalidTimestamp();
        }
        latestEsr = esr;
        latestEsrObservedAt = timestamp;

        // update mapping
        esrFromDate[timestamp] = esr;

        // check and update esrStartDay
        checkAndUpdateEsrStartDay(timestamp);

        // emit event
        emit EsrUpdate(timestamp, msg.sender, esr);
    }

    /// @notice Publish historical ESR for a day
    // function publishDayEsr(uint256 timestamp, int256 esr, bool isHistoricalData) public onlyOwner {
    //     if (isHistoricalData) {
    //         // data validation
    //         // get SOD timestamp
    //         timestamp = getStartOfDayTimestamp(timestamp);

    //         // update mapping for historical data
    //         esrFromDate[timestamp] = esr;

    //         // check and update esrStartDay
    //         checkAndUpdateEsrStartDay(timestamp);
    //     } else {
    //         revert NotHistoricalData();
    //     }
    // }

    /// @notice Publish historical ESR for a number of days in batch
    function publishDayEsr(uint256[] calldata timestamps, int256[] calldata esrs, bool isHistoricalData)
        public
        onlyOwner
    {
        if (isHistoricalData) {
            // data validation
            // require(timestamps.length == esrs.length, "Submitted times and esr array lengths don't match");
            if (timestamps.length != esrs.length) revert ArrayLengthMismatch();

            // update mapping for historical data
            for (uint256 i = 0; i < timestamps.length; i++) {
                uint256 timestamp = getStartOfDayTimestamp(timestamps[i]); // get SOD timestamp
                esrFromDate[timestamp] = esrs[i];
                // check and update esrStartDay
                checkAndUpdateEsrStartDay(timestamp);
            }
        } else {
            revert NotHistoricalData();
        }
    }

    // define read functions
    /// @notice ESR for the latest observation date available
    function getLatestEsr() public view returns (int256 esr) {
        return latestEsr;
    }

    /// @notice ESR for the latest observation date available
    function getRollingAvgEsrForNdays(uint256 numOfDays) public view returns (int256 esr) {
        uint256 _date = 0;
        int256 _esr = 0;
        int256 _sumOfEsr = 0;
        for (uint256 i = 1; i <= numOfDays; i++) {
            _date = getStartOfDayTimestamp(block.timestamp) - i * ESR_PUBLISH_FREQUENCY;
            _esr = esrFromDate[_date];
            if (_esr == 0) revert MissingEsrData(_date);
            _sumOfEsr += _esr;
        }
        return _sumOfEsr / int256(numOfDays);
    }

    function getEarliestEsrDate() public view returns (uint256 earliestEsrObservationDate) {
        return esrStartDay;
    }

    function getLatestEsrObservationDate() public view returns (uint256 latestEsrObservationDate) {
        return latestEsrObservedAt;
    }

    function getDayEsr(uint256 timestamp) public view returns (uint256 observationDate, int256 esr) {
        // check if timestamp is SOD time
        timestamp = getStartOfDayTimestamp(timestamp); // get SOD timestamp
        return (timestamp, esrFromDate[timestamp]);
    }
}

File 2 of 4 : Ownable2Step.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.20;

import {Ownable} from "./Ownable.sol";

/**
 * @dev Contract module which provides access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This extension of the {Ownable} contract includes a two-step mechanism to transfer
 * ownership, where the new owner must call {acceptOwnership} in order to replace the
 * old one. This can help prevent common mistakes, such as transfers of ownership to
 * incorrect accounts, or to contracts that are unable to interact with the
 * permission system.
 *
 * The initial owner is specified at deployment time in the constructor for `Ownable`. This
 * can later be changed with {transferOwnership} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
    address private _pendingOwner;

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

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

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     *
     * Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer.
     */
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual override {
        delete _pendingOwner;
        super._transferOwnership(newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() public virtual {
        address sender = _msgSender();
        if (pendingOwner() != sender) {
            revert OwnableUnauthorizedAccount(sender);
        }
        _transferOwnership(sender);
    }
}

File 3 of 4 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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 4 of 4 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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
{
  "remappings": [
    "forge-std/=lib/forge-std/src/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false,
  "libraries": {}
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"InvalidTimestamp","type":"error"},{"inputs":[{"internalType":"uint256","name":"date","type":"uint256"}],"name":"MissingEsrData","type":"error"},{"inputs":[],"name":"NotHistoricalData","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"Unauthorised","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"observationDate","type":"uint256"},{"indexed":false,"internalType":"address","name":"publisher","type":"address"},{"indexed":false,"internalType":"int256","name":"esr","type":"int256"}],"name":"EsrUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","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":[],"name":"ESR_PUBLISH_FREQUENCY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getDayEsr","outputs":[{"internalType":"uint256","name":"observationDate","type":"uint256"},{"internalType":"int256","name":"esr","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEarliestEsrDate","outputs":[{"internalType":"uint256","name":"earliestEsrObservationDate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestEsr","outputs":[{"internalType":"int256","name":"esr","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestEsrObservationDate","outputs":[{"internalType":"uint256","name":"latestEsrObservationDate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numOfDays","type":"uint256"}],"name":"getRollingAvgEsrForNdays","outputs":[{"internalType":"int256","name":"esr","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"},{"internalType":"int256[]","name":"esrs","type":"int256[]"},{"internalType":"bool","name":"isHistoricalData","type":"bool"}],"name":"publishDayEsr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"int256","name":"esr","type":"int256"}],"name":"publishDayEsr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260096080526201518060a0525f60028190556003819055600455348015610029575f5ffd5b50338061004f57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100588161006a565b5061006242610086565b600455610136565b600180546001600160a01b0319169055610083816100a5565b50565b60a0515f9061009581846100f4565b61009f9190610113565b92915050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8261010e57634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761009f57634e487b7160e01b5f52601160045260245ffd5b60805160a05161095761016c5f395f81816101aa0152818161036f0152818161048e01526105f101525f61013701526109575ff3fe608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c80638085789f11610093578063ac11607311610063578063ac1160731461021b578063b3e6638b14610243578063e30c39781461024b578063f2fde38b1461025c575f5ffd5b80638085789f146101a55780638da5cb5b146101cc57806395d89b41146101f0578063a60d393c14610213575f5ffd5b80636fb88586116100ce5780636fb885861461017a578063715018a61461018257806379ba50971461018a5780637bddedca14610192575f5ffd5b806306fdde03146100ff5780631459f1011461011d578063313ce56714610132578063489fb55714610167575b5f5ffd5b61010761026f565b604051610114919061069c565b60405180910390f35b61013061012b366004610719565b61028b565b005b6101597f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610114565b6101306101753660046107a0565b61034d565b600454610159565b61013061041f565b610130610432565b6101596101a03660046107c0565b61047b565b6101597f000000000000000000000000000000000000000000000000000000000000000081565b5f546001600160a01b03165b6040516001600160a01b039091168152602001610114565b610107604051806040016040528060048152602001633a22a9a960e11b81525081565b600354610159565b61022e6102293660046107c0565b61052f565b60408051928352602083019190915201610114565b600254610159565b6001546001600160a01b03166101d8565b61013061026a3660046107d7565b610552565b6040518060600160405280602681526020016108fc6026913981565b6102936105c2565b801561032d578382146102b95760405163512509d360e11b815260040160405180910390fd5b5f5b84811015610327575f6102e58787848181106102d9576102d9610804565b905060200201356105ee565b90508484838181106102f9576102f9610804565b9050602002013560055f8381526020019081526020015f208190555061031e8161062a565b506001016102bb565b50610346565b604051638bb3ef8f60e01b815260040160405180910390fd5b5050505050565b6103556105c2565b61035e826105ee565b91506003545f1415801561039f57507f000000000000000000000000000000000000000000000000000000000000000060035461039b919061082c565b8214155b156103bd5760405163b7d0949760e01b815260040160405180910390fd5b600281905560038290555f8281526005602052604090208190556103e08261062a565b604080513381526020810183905283917f463ab7d735a9033f30ca849cbe589ceb85ff7b89f43f3d52f389fc46785cae8c910160405180910390a25050565b6104276105c2565b6104305f610639565b565b60015433906001600160a01b0316811461046f5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b61047881610639565b50565b5f80808060015b85811161051b576104b37f00000000000000000000000000000000000000000000000000000000000000008261083f565b6104bc426105ee565b6104c69190610856565b5f818152600560205260408120549195509093508390036104fd57604051639a1c663360e01b815260048101859052602401610466565b6105078383610869565b91508061051381610890565b915050610482565b5061052685826108bc565b95945050505050565b5f5f61053a836105ee565b5f818152600560205260409020549094909350915050565b61055a6105c2565b600180546001600160a01b0383166001600160a01b0319909116811790915561058a5f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b031633146104305760405163118cdaa760e01b8152336004820152602401610466565b5f7f000000000000000000000000000000000000000000000000000000000000000061061a81846108e8565b610624919061083f565b92915050565b60045481101561047857600455565b600180546001600160a01b0319169055610478815f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f83601f8401126106e1575f5ffd5b50813567ffffffffffffffff8111156106f8575f5ffd5b6020830191508360208260051b8501011115610712575f5ffd5b9250929050565b5f5f5f5f5f6060868803121561072d575f5ffd5b853567ffffffffffffffff811115610743575f5ffd5b61074f888289016106d1565b909650945050602086013567ffffffffffffffff81111561076e575f5ffd5b61077a888289016106d1565b90945092505060408601358015158114610792575f5ffd5b809150509295509295909350565b5f5f604083850312156107b1575f5ffd5b50508035926020909101359150565b5f602082840312156107d0575f5ffd5b5035919050565b5f602082840312156107e7575f5ffd5b81356001600160a01b03811681146107fd575f5ffd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561062457610624610818565b808202811582820484141761062457610624610818565b8181038181111561062457610624610818565b8082018281125f83128015821682158216171561088857610888610818565b505092915050565b5f600182016108a1576108a1610818565b5060010190565b634e487b7160e01b5f52601260045260245ffd5b5f826108ca576108ca6108a8565b600160ff1b82145f19841416156108e3576108e3610818565b500590565b5f826108f6576108f66108a8565b50049056fe54726565686f75736520457468657265756d205374616b696e672052617465202d2053706f74a2646970667358221220bfb72551b0473bfcf77b6a6ba75343fecf99102551cc19eac89a90958bee89f764736f6c634300081c0033

Deployed Bytecode

0x608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c80638085789f11610093578063ac11607311610063578063ac1160731461021b578063b3e6638b14610243578063e30c39781461024b578063f2fde38b1461025c575f5ffd5b80638085789f146101a55780638da5cb5b146101cc57806395d89b41146101f0578063a60d393c14610213575f5ffd5b80636fb88586116100ce5780636fb885861461017a578063715018a61461018257806379ba50971461018a5780637bddedca14610192575f5ffd5b806306fdde03146100ff5780631459f1011461011d578063313ce56714610132578063489fb55714610167575b5f5ffd5b61010761026f565b604051610114919061069c565b60405180910390f35b61013061012b366004610719565b61028b565b005b6101597f000000000000000000000000000000000000000000000000000000000000000981565b604051908152602001610114565b6101306101753660046107a0565b61034d565b600454610159565b61013061041f565b610130610432565b6101596101a03660046107c0565b61047b565b6101597f000000000000000000000000000000000000000000000000000000000001518081565b5f546001600160a01b03165b6040516001600160a01b039091168152602001610114565b610107604051806040016040528060048152602001633a22a9a960e11b81525081565b600354610159565b61022e6102293660046107c0565b61052f565b60408051928352602083019190915201610114565b600254610159565b6001546001600160a01b03166101d8565b61013061026a3660046107d7565b610552565b6040518060600160405280602681526020016108fc6026913981565b6102936105c2565b801561032d578382146102b95760405163512509d360e11b815260040160405180910390fd5b5f5b84811015610327575f6102e58787848181106102d9576102d9610804565b905060200201356105ee565b90508484838181106102f9576102f9610804565b9050602002013560055f8381526020019081526020015f208190555061031e8161062a565b506001016102bb565b50610346565b604051638bb3ef8f60e01b815260040160405180910390fd5b5050505050565b6103556105c2565b61035e826105ee565b91506003545f1415801561039f57507f000000000000000000000000000000000000000000000000000000000001518060035461039b919061082c565b8214155b156103bd5760405163b7d0949760e01b815260040160405180910390fd5b600281905560038290555f8281526005602052604090208190556103e08261062a565b604080513381526020810183905283917f463ab7d735a9033f30ca849cbe589ceb85ff7b89f43f3d52f389fc46785cae8c910160405180910390a25050565b6104276105c2565b6104305f610639565b565b60015433906001600160a01b0316811461046f5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b61047881610639565b50565b5f80808060015b85811161051b576104b37f00000000000000000000000000000000000000000000000000000000000151808261083f565b6104bc426105ee565b6104c69190610856565b5f818152600560205260408120549195509093508390036104fd57604051639a1c663360e01b815260048101859052602401610466565b6105078383610869565b91508061051381610890565b915050610482565b5061052685826108bc565b95945050505050565b5f5f61053a836105ee565b5f818152600560205260409020549094909350915050565b61055a6105c2565b600180546001600160a01b0383166001600160a01b0319909116811790915561058a5f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b031633146104305760405163118cdaa760e01b8152336004820152602401610466565b5f7f000000000000000000000000000000000000000000000000000000000001518061061a81846108e8565b610624919061083f565b92915050565b60045481101561047857600455565b600180546001600160a01b0319169055610478815f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f83601f8401126106e1575f5ffd5b50813567ffffffffffffffff8111156106f8575f5ffd5b6020830191508360208260051b8501011115610712575f5ffd5b9250929050565b5f5f5f5f5f6060868803121561072d575f5ffd5b853567ffffffffffffffff811115610743575f5ffd5b61074f888289016106d1565b909650945050602086013567ffffffffffffffff81111561076e575f5ffd5b61077a888289016106d1565b90945092505060408601358015158114610792575f5ffd5b809150509295509295909350565b5f5f604083850312156107b1575f5ffd5b50508035926020909101359150565b5f602082840312156107d0575f5ffd5b5035919050565b5f602082840312156107e7575f5ffd5b81356001600160a01b03811681146107fd575f5ffd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561062457610624610818565b808202811582820484141761062457610624610818565b8181038181111561062457610624610818565b8082018281125f83128015821682158216171561088857610888610818565b505092915050565b5f600182016108a1576108a1610818565b5060010190565b634e487b7160e01b5f52601260045260245ffd5b5f826108ca576108ca6108a8565b600160ff1b82145f19841416156108e3576108e3610818565b500590565b5f826108f6576108f66108a8565b50049056fe54726565686f75736520457468657265756d205374616b696e672052617465202d2053706f74a2646970667358221220bfb72551b0473bfcf77b6a6ba75343fecf99102551cc19eac89a90958bee89f764736f6c634300081c0033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.