Sepolia Testnet

Contract

0xdcB2352AFD3CeC9B71F7742bC5A03d80E4958b43

Overview

ETH Balance

246.429253658299540077 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Approve75167312025-01-18 7:06:245 days ago1737183984IN
0xdcB2352A...0E4958b43
0 ETH0.000191447.87740484
Mint74995582025-01-15 21:33:007 days ago1736976780IN
0xdcB2352A...0E4958b43
0 ETH0.000045851.88712249
Transfer72791862024-12-14 19:29:0040 days ago1734204540IN
0xdcB2352A...0E4958b43
0.000656 ETH0.000138736.589142
Transfer71926112024-12-01 23:44:1252 days ago1733096652IN
0xdcB2352A...0E4958b43
0.000569 ETH0.000004780.22746565
Transfer71874642024-12-01 4:16:1253 days ago1733026572IN
0xdcB2352A...0E4958b43
0.000768 ETH0.000017410.82732612
Approve68991472024-10-18 16:14:2497 days ago1729268064IN
0xdcB2352A...0E4958b43
0 ETH0.00027665.97738819
Approve65365812024-08-20 11:48:36156 days ago1724154516IN
0xdcB2352A...0E4958b43
0 ETH0.000261155.64353982
Approve63910562024-07-28 11:29:48179 days ago1722166188IN
0xdcB2352A...0E4958b43
0 ETH0.000202796.95088325
Approve63817362024-07-26 23:23:48180 days ago1722036228IN
0xdcB2352A...0E4958b43
0 ETH0.0007547216.30947749
Approve63267552024-07-17 10:15:00190 days ago1721211300IN
0xdcB2352A...0E4958b43
0 ETH0.0006323613.66540945
Approve63203612024-07-16 9:17:12191 days ago1721121432IN
0xdcB2352A...0E4958b43
0 ETH0.000396188.56145679
Approve63065492024-07-14 3:21:12193 days ago1720927272IN
0xdcB2352A...0E4958b43
0 ETH0.000078672.9911883
Approve63065422024-07-14 3:19:12193 days ago1720927152IN
0xdcB2352A...0E4958b43
0 ETH0.000075932.88678724
Approve63030912024-07-13 13:41:12194 days ago1720878072IN
0xdcB2352A...0E4958b43
0 ETH0.000132452.86234216
Approve62729002024-07-08 23:06:48198 days ago1720480008IN
0xdcB2352A...0E4958b43
0 ETH0.000177956.09957086
Approve62716612024-07-08 18:29:12199 days ago1720463352IN
0xdcB2352A...0E4958b43
0 ETH0.000112153.8425604
Approve62652232024-07-07 18:27:12200 days ago1720376832IN
0xdcB2352A...0E4958b43
0 ETH0.000395078.53755156
Approve62639852024-07-07 13:45:12200 days ago1720359912IN
0xdcB2352A...0E4958b43
0 ETH0.0006002412.97123624
Approve62616752024-07-07 5:04:36200 days ago1720328676IN
0xdcB2352A...0E4958b43
0 ETH0.000200844.34016371
Approve62585682024-07-06 17:29:36201 days ago1720286976IN
0xdcB2352A...0E4958b43
0 ETH0.000085052.91517126
Approve62585682024-07-06 17:29:36201 days ago1720286976IN
0xdcB2352A...0E4958b43
0 ETH0.000039561.50000161
Approve62585682024-07-06 17:29:36201 days ago1720286976IN
0xdcB2352A...0E4958b43
0 ETH0.000039561.5000015
Approve62579452024-07-06 15:11:12201 days ago1720278672IN
0xdcB2352A...0E4958b43
0 ETH0.002816760.86874841
Approve62564752024-07-06 9:40:36201 days ago1720258836IN
0xdcB2352A...0E4958b43
0 ETH0.0005862512.66891339
Approve62536542024-07-05 23:07:24201 days ago1720220844IN
0xdcB2352A...0E4958b43
0 ETH0.000111674.23403715
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
62818272024-07-10 7:45:48197 days ago1720597548
0xdcB2352A...0E4958b43
0.01928015 ETH
62818122024-07-10 7:42:36197 days ago1720597356
0xdcB2352A...0E4958b43
0.00361502 ETH
62818092024-07-10 7:42:00197 days ago1720597320
0xdcB2352A...0E4958b43
0.00843506 ETH
62818022024-07-10 7:40:36197 days ago1720597236
0xdcB2352A...0E4958b43
0.03255986 ETH
62817762024-07-10 7:35:12197 days ago1720596912
0xdcB2352A...0E4958b43
0.00723552 ETH
62817702024-07-10 7:34:00197 days ago1720596840
0xdcB2352A...0E4958b43
0.0120592 ETH
62817622024-07-10 7:32:00197 days ago1720596720
0xdcB2352A...0E4958b43
0.01808881 ETH
62817482024-07-10 7:29:00197 days ago1720596540
0xdcB2352A...0E4958b43
0.00362504 ETH
62817462024-07-10 7:28:24197 days ago1720596504
0xdcB2352A...0E4958b43
0.09666799 ETH
62816712024-07-10 7:12:24197 days ago1720595544
0xdcB2352A...0E4958b43
3.94405431 ETH
62787022024-07-09 20:19:36197 days ago1720556376
0xdcB2352A...0E4958b43
0.00845844 ETH
62786972024-07-09 20:18:12197 days ago1720556292
0xdcB2352A...0E4958b43
0.01087514 ETH
62786952024-07-09 20:17:36197 days ago1720556256
0xdcB2352A...0E4958b43
0.00725009 ETH
62786922024-07-09 20:16:24197 days ago1720556184
0xdcB2352A...0E4958b43
0.00362504 ETH
62786892024-07-09 20:15:48197 days ago1720556148
0xdcB2352A...0E4958b43
0.00362504 ETH
62786862024-07-09 20:15:12197 days ago1720556112
0xdcB2352A...0E4958b43
0.00120834 ETH
62786852024-07-09 20:15:00197 days ago1720556100
0xdcB2352A...0E4958b43
0.00241669 ETH
62786832024-07-09 20:14:36197 days ago1720556076
0xdcB2352A...0E4958b43
0.00604174 ETH
62786812024-07-09 20:14:00197 days ago1720556040
0xdcB2352A...0E4958b43
0.00241669 ETH
62786792024-07-09 20:13:36197 days ago1720556016
0xdcB2352A...0E4958b43
0.00604174 ETH
62786762024-07-09 20:13:00197 days ago1720555980
0xdcB2352A...0E4958b43
0.00241669 ETH
62786742024-07-09 20:12:36197 days ago1720555956
0xdcB2352A...0E4958b43
0.00241669 ETH
62786722024-07-09 20:12:12197 days ago1720555932
0xdcB2352A...0E4958b43
0.00483339 ETH
62786692024-07-09 20:11:36197 days ago1720555896
0xdcB2352A...0E4958b43
0.00120834 ETH
62786682024-07-09 20:11:24197 days ago1720555884
0xdcB2352A...0E4958b43
0.00725009 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StETH

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 4 : mockStEth.sol
// SPDX-License-Identifier: BSL
pragma solidity ^0.8.18;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// import "@aragon/os/contracts/common/UnstructuredStorage.sol";
// import "@aragon/os/contracts/lib/math/SafeMath.sol";
// import "./utils/Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

/**
 * @title Interest-bearing ERC20-like token for Lido Liquid Stacking protocol.
 *
 * This contract is abstract. To make the contract deployable override the
 * `_getTotalPooledEther` function. `Lido.sol` contract inherits StETH and defines
 * the `_getTotalPooledEther` function.
 *
 * StETH balances are dynamic and represent the holder's share in the total amount
 * of Ether controlled by the protocol. Account shares aren't normalized, so the
 * contract also stores the sum of all shares to calculate each account's token balance
 * which equals to:
 *
 *   shares[account] * _getTotalPooledEther() / _getTotalShares()
 *
 * For example, assume that we have:
 *
 *   _getTotalPooledEther() -> 10 ETH
 *   sharesOf(user1) -> 100
 *   sharesOf(user2) -> 400
 *
 * Therefore:
 *
 *   balanceOf(user1) -> 2 tokens which corresponds 2 ETH
 *   balanceOf(user2) -> 8 tokens which corresponds 8 ETH
 *
 * Since balances of all token holders change when the amount of total pooled Ether
 * changes, this token cannot fully implement ERC20 standard: it only emits `Transfer`
 * events upon explicit transfer between holders. In contrast, when total amount of
 * pooled Ether increases, no `Transfer` events are generated: doing so would require
 * emitting an event for each token holder and thus running an unbounded loop.
 *
 * The token inherits from `Pausable` and uses `whenNotStopped` modifier for methods
 * which change `shares` or `allowances`. `_stop` and `_resume` functions are overridden
 * in `Lido.sol` and might be called by an account with the `PAUSE_ROLE` assigned by the
 * DAO. This is useful for emergency scenarios, e.g. a protocol bug, where one might want
 * to freeze all token transfers and approvals until the emergency is resolved.
 */
contract StETH is IERC20, Ownable {
    // using SafeMath for uint256;
    // using UnstructuredStorage for bytes32;

    // address constant internal INITIAL_TOKEN_HOLDER = 0x0000;
    uint256 internal constant INFINITE_ALLOWANCE = ~uint256(0);

    /**
     * @dev StETH balances are dynamic and are calculated based on the accounts' shares
     * and the total amount of Ether controlled by the protocol. Account shares aren't
     * normalized, so the contract also stores the sum of all shares to calculate
     * each account's token balance which equals to:
     *
     *   shares[account] * _getTotalPooledEther() / _getTotalShares()
     */
    mapping(address => uint256) private shares;

    /**
     * @dev Allowances are nominated in tokens, not token shares.
     */
    mapping(address => mapping(address => uint256)) private allowances;

    /**
     * @dev Storage position used for holding the total amount of shares in existence.
     *
     * The Lido protocol is built on top of Aragon and uses the Unstructured Storage pattern
     * for value types:
     *
     * https://blog.openzeppelin.com/upgradeability-using-unstructured-storage
     * https://blog.8bitzen.com/posts/20-02-2020-understanding-how-solidity-upgradeable-unstructured-proxies-work
     *
     * For reference types, conventional storage variables are used since it's non-trivial
     * and error-prone to implement reference-type unstructured storage using Solidity v0.4;
     * see https://github.com/lidofinance/lido-dao/issues/181#issuecomment-736098834
     *
     * keccak256("lido.StETH.totalShares")
     */
    // bytes32 internal constant TOTAL_SHARES_POSITION =
    //     0xe3b4b636e601189b5f4c6742edf2538ac12bb61ed03e6da26949d69838fa447e;
    uint256 public TOTAL_SHARES_POSITION = 1000000000 ether;
    uint256 public TotalEthAmount = 1000000000 ether;
    /**
      * @notice An executed shares transfer from `sender` to `recipient`.
      *
      * @dev emitted in pair with an ERC20-defined `Transfer` event.
      */
    event TransferShares(address indexed from, address indexed to, uint256 sharesValue);

    /**
     * @notice An executed `burnShares` request
     *
     * @dev Reports simultaneously burnt shares amount
     * and corresponding stETH amount.
     * The stETH amount is calculated twice: before and after the burning incurred rebase.
     *
     * @param account holder of the burnt shares
     * @param preRebaseTokenAmount amount of stETH the burnt shares corresponded to before the burn
     * @param postRebaseTokenAmount amount of stETH the burnt shares corresponded to after the burn
     * @param sharesAmount amount of burnt shares
     */
    event SharesBurnt(
        address indexed account,
        uint256 preRebaseTokenAmount,
        uint256 postRebaseTokenAmount,
        uint256 sharesAmount
    );

    /**
     * @return the name of the token.
     */
    function name() external pure returns (string memory) {
        return "Liquid staked Ether 2.0";
    }

    /**
     * @return the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() external pure returns (string memory) {
        return "stETH";
    }

    /**
     * @return the number of decimals for getting user representation of a token amount.
     */
    function decimals() external pure returns (uint8) {
        return 18;
    }

    /**
     * @return the amount of tokens in existence.
     *
     * @dev Always equals to `_getTotalPooledEther()` since token amount
     * is pegged to the total amount of Ether controlled by the protocol.
     */
    function totalSupply() external view returns (uint256) {
        return _getTotalPooledEther();
    }

    /**
     * @return the entire amount of Ether controlled by the protocol.
     *
     * @dev The sum of all ETH balances in the protocol, equals to the total supply of stETH.
     */
    function getTotalPooledEther() external view returns (uint256) {
        return _getTotalPooledEther();
    }

    /**
     * @return the amount of tokens owned by the `_account`.
     *
     * @dev Balances are dynamic and equal the `_account`'s share in the amount of the
     * total Ether controlled by the protocol. See `sharesOf`.
     */
    function balanceOf(address _account) external view returns (uint256) {
        return getPooledEthByShares(_sharesOf(_account));
    }

    /**
     * @notice Moves `_amount` tokens from the caller's account to the `_recipient` account.
     *
     * @return a boolean value indicating whether the operation succeeded.
     * Emits a `Transfer` event.
     * Emits a `TransferShares` event.
     *
     * Requirements:
     *
     * - `_recipient` cannot be the zero address.
     * - the caller must have a balance of at least `_amount`.
     * - the contract must not be paused.
     *
     * @dev The `_amount` argument is the amount of tokens, not shares.
     */
    function transfer(address _recipient, uint256 _amount) external returns (bool) {
        _transfer(msg.sender, _recipient, _amount);
        return true;
    }

    /**
     * @return the remaining number of tokens that `_spender` is allowed to spend
     * on behalf of `_owner` through `transferFrom`. This is zero by default.
     *
     * @dev This value changes when `approve` or `transferFrom` is called.
     */
    function allowance(address _owner, address _spender) external view returns (uint256) {
        return allowances[_owner][_spender];
    }

    /**
     * @notice Sets `_amount` as the allowance of `_spender` over the caller's tokens.
     *
     * @return a boolean value indicating whether the operation succeeded.
     * Emits an `Approval` event.
     *
     * Requirements:
     *
     * - `_spender` cannot be the zero address.
     *
     * @dev The `_amount` argument is the amount of tokens, not shares.
     */
    function approve(address _spender, uint256 _amount) external returns (bool) {
        _approve(msg.sender, _spender, _amount);
        return true;
    }

    /**
     * @notice Moves `_amount` tokens from `_sender` to `_recipient` using the
     * allowance mechanism. `_amount` is then deducted from the caller's
     * allowance.
     *
     * @return a boolean value indicating whether the operation succeeded.
     *
     * Emits a `Transfer` event.
     * Emits a `TransferShares` event.
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `_sender` and `_recipient` cannot be the zero addresses.
     * - `_sender` must have a balance of at least `_amount`.
     * - the caller must have allowance for `_sender`'s tokens of at least `_amount`.
     * - the contract must not be paused.
     *
     * @dev The `_amount` argument is the amount of tokens, not shares.
     */
    function transferFrom(address _sender, address _recipient, uint256 _amount) external returns (bool) {
        _spendAllowance(_sender, msg.sender, _amount);
        _transfer(_sender, _recipient, _amount);
        return true;
    }

    /**
     * @notice Atomically increases the allowance granted to `_spender` by the caller by `_addedValue`.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in:
     * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/b709eae01d1da91902d06ace340df6b324e6f049/contracts/token/ERC20/IERC20.sol#L57
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `_spender` cannot be the the zero address.
     */
    function increaseAllowance(address _spender, uint256 _addedValue) external returns (bool) {
        _approve(msg.sender, _spender, (allowances[msg.sender][_spender] + (_addedValue)));
        return true;
    }

    /**
     * @notice Atomically decreases the allowance granted to `_spender` by the caller by `_subtractedValue`.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in:
     * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/b709eae01d1da91902d06ace340df6b324e6f049/contracts/token/ERC20/IERC20.sol#L57
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `_spender` cannot be the zero address.
     * - `_spender` must have allowance for the caller of at least `_subtractedValue`.
     */
    function decreaseAllowance(address _spender, uint256 _subtractedValue) external returns (bool) {
        uint256 currentAllowance = allowances[msg.sender][_spender];
        require(currentAllowance >= _subtractedValue, "ALLOWANCE_BELOW_ZERO");
        _approve(msg.sender, _spender, (currentAllowance - (_subtractedValue)));
        return true;
    }

    /**
     * @return the total amount of shares in existence.
     *
     * @dev The sum of all accounts' shares can be an arbitrary number, therefore
     * it is necessary to store it in order to calculate each account's relative share.
     */
    function getTotalShares() external view returns (uint256) {
        return _getTotalShares();
    }

    /**
     * @return the amount of shares owned by `_account`.
     */
    function sharesOf(address _account) external view returns (uint256) {
        return _sharesOf(_account);
    }

    /**
     * @return the amount of shares that corresponds to `_ethAmount` protocol-controlled Ether.
     */
    function getSharesByPooledEth(uint256 _ethAmount) public view returns (uint256) {
        return (_ethAmount * (_getTotalShares())) / (_getTotalPooledEther());
    }

    /**
     * @return the amount of Ether that corresponds to `_sharesAmount` token shares.
     */
    function getPooledEthByShares(uint256 _sharesAmount) public view returns (uint256) {
        return (_sharesAmount * (_getTotalPooledEther())) / (_getTotalShares());
    }

    /**
     * @notice Moves `_sharesAmount` token shares from the caller's account to the `_recipient` account.
     *
     * @return amount of transferred tokens.
     * Emits a `TransferShares` event.
     * Emits a `Transfer` event.
     *
     * Requirements:
     *
     * - `_recipient` cannot be the zero address.
     * - the caller must have at least `_sharesAmount` shares.
     * - the contract must not be paused.
     *
     * @dev The `_sharesAmount` argument is the amount of shares, not tokens.
     */
    function transferShares(address _recipient, uint256 _sharesAmount) external returns (uint256) {
        _transferShares(msg.sender, _recipient, _sharesAmount);
        uint256 tokensAmount = getPooledEthByShares(_sharesAmount);
        _emitTransferEvents(msg.sender, _recipient, tokensAmount, _sharesAmount);
        return tokensAmount;
    }

    /**
     * @notice Moves `_sharesAmount` token shares from the `_sender` account to the `_recipient` account.
     *
     * @return amount of transferred tokens.
     * Emits a `TransferShares` event.
     * Emits a `Transfer` event.
     *
     * Requirements:
     *
     * - `_sender` and `_recipient` cannot be the zero addresses.
     * - `_sender` must have at least `_sharesAmount` shares.
     * - the caller must have allowance for `_sender`'s tokens of at least `getPooledEthByShares(_sharesAmount)`.
     * - the contract must not be paused.
     *
     * @dev The `_sharesAmount` argument is the amount of shares, not tokens.
     */
    function transferSharesFrom(address _sender, address _recipient, uint256 _sharesAmount) external returns (uint256) {
        uint256 tokensAmount = getPooledEthByShares(_sharesAmount);
        _spendAllowance(_sender, msg.sender, tokensAmount);
        _transferShares(_sender, _recipient, _sharesAmount);
        _emitTransferEvents(_sender, _recipient, tokensAmount, _sharesAmount);
        return tokensAmount;
    }

    /**
     * @return the total amount (in wei) of Ether controlled by the protocol.
     * @dev This is used for calculating tokens from shares and vice versa.
     * @dev This function is required to be implemented in a derived contract.
     */
    function _getTotalPooledEther() internal view returns (uint256) {
        return TotalEthAmount;
    }

    /**
     * @notice Moves `_amount` tokens from `_sender` to `_recipient`.
     * Emits a `Transfer` event.
     * Emits a `TransferShares` event.
     */
    function _transfer(address _sender, address _recipient, uint256 _amount) internal {
        uint256 _sharesToTransfer = getSharesByPooledEth(_amount);
        _transferShares(_sender, _recipient, _sharesToTransfer);
        _emitTransferEvents(_sender, _recipient, _amount, _sharesToTransfer);
    }

    /**
     * @notice Sets `_amount` as the allowance of `_spender` over the `_owner` s tokens.
     *
     * Emits an `Approval` event.
     *
     * NB: the method can be invoked even if the protocol paused.
     *
     * Requirements:
     *
     * - `_owner` cannot be the zero address.
     * - `_spender` cannot be the zero address.
     */
    function _approve(address _owner, address _spender, uint256 _amount) internal {
        require(_owner != address(0), "APPROVE_FROM_ZERO_ADDR");
        require(_spender != address(0), "APPROVE_TO_ZERO_ADDR");

        allowances[_owner][_spender] = _amount;
        emit Approval(_owner, _spender, _amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address _owner, address _spender, uint256 _amount) internal {
        uint256 currentAllowance = allowances[_owner][_spender];
        if (currentAllowance != INFINITE_ALLOWANCE) {
            require(currentAllowance >= _amount, "ALLOWANCE_EXCEEDED");
            _approve(_owner, _spender, currentAllowance - _amount);
        }
    }

    /**
     * @return the total amount of shares in existence.
     */
    function _getTotalShares() internal view returns (uint256) {
        return TOTAL_SHARES_POSITION;
    }

    /**
     * @return the amount of shares owned by `_account`.
     */
    function _sharesOf(address _account) internal view returns (uint256) {
        return shares[_account];
    }

    /**
     * @notice Moves `_sharesAmount` shares from `_sender` to `_recipient`.
     *
     * Requirements:
     *
     * - `_sender` cannot be the zero address.
     * - `_recipient` cannot be the zero address or the `stETH` token contract itself
     * - `_sender` must hold at least `_sharesAmount` shares.
     * - the contract must not be paused.
     */
    function _transferShares(address _sender, address _recipient, uint256 _sharesAmount) internal {
        require(_sender != address(0), "TRANSFER_FROM_ZERO_ADDR");
        require(_recipient != address(0), "TRANSFER_TO_ZERO_ADDR");
        require(_recipient != address(this), "TRANSFER_TO_STETH_CONTRACT");
        // _whenNotStopped();

        uint256 currentSenderShares = shares[_sender];
        require(_sharesAmount <= currentSenderShares, "BALANCE_EXCEEDED");

        shares[_sender] = currentSenderShares - (_sharesAmount);
        shares[_recipient] = shares[_recipient] + (_sharesAmount);
    }

    /**
     * @notice Creates `_sharesAmount` shares and assigns them to `_recipient`, increasing the total amount of shares.
     * @dev This doesn't increase the token total supply.
     *
     * NB: The method doesn't check protocol pause relying on the external enforcement.
     *
     * Requirements:
     *
     * - `_recipient` cannot be the zero address.
     * - the contract must not be paused.
     */
    function _mintShares(address _recipient, uint256 _sharesAmount) internal returns (uint256 newTotalShares) {
        require(_recipient != address(0), "MINT_TO_ZERO_ADDR");

        newTotalShares = _getTotalShares() + (_sharesAmount);
        TOTAL_SHARES_POSITION = newTotalShares;

        shares[_recipient] = shares[_recipient] + (_sharesAmount);

        // Notice: we're not emitting a Transfer event from the zero address here since shares mint
        // works by taking the amount of tokens corresponding to the minted shares from all other
        // token holders, proportionally to their share. The total supply of the token doesn't change
        // as the result. This is equivalent to performing a send from each other token holder's
        // address to `address`, but we cannot reflect this as it would require sending an unbounded
        // number of events.
    }

    /**
     * @notice Destroys `_sharesAmount` shares from `_account`'s holdings, decreasing the total amount of shares.
     * @dev This doesn't decrease the token total supply.
     *
     * Requirements:
     *
     * - `_account` cannot be the zero address.
     * - `_account` must hold at least `_sharesAmount` shares.
     * - the contract must not be paused.
     */
    function _burnShares(address _account, uint256 _sharesAmount) internal returns (uint256 newTotalShares) {
        require(_account != address(0), "BURN_FROM_ZERO_ADDR");

        uint256 accountShares = shares[_account];
        require(_sharesAmount <= accountShares, "BALANCE_EXCEEDED");

        uint256 preRebaseTokenAmount = getPooledEthByShares(_sharesAmount);

        newTotalShares = _getTotalShares() - (_sharesAmount);
        TOTAL_SHARES_POSITION = newTotalShares;

        shares[_account] = accountShares - (_sharesAmount);

        uint256 postRebaseTokenAmount = getPooledEthByShares(_sharesAmount);

        emit SharesBurnt(_account, preRebaseTokenAmount, postRebaseTokenAmount, _sharesAmount);

        // Notice: we're not emitting a Transfer event to the zero address here since shares burn
        // works by redistributing the amount of tokens corresponding to the burned shares between
        // all other token holders. The total supply of the token doesn't change as the result.
        // This is equivalent to performing a send from `address` to each other token holder address,
        // but we cannot reflect this as it would require sending an unbounded number of events.

        // We're emitting `SharesBurnt` event to provide an explicit rebase log record nonetheless.
    }

    /**
     * @dev Emits {Transfer} and {TransferShares} events
     */
    function _emitTransferEvents(address _from, address _to, uint _tokenAmount, uint256 _sharesAmount) internal {
        emit Transfer(_from, _to, _tokenAmount);
        emit TransferShares(_from, _to, _sharesAmount);
    }

    /**
     * @dev Emits {Transfer} and {TransferShares} events where `from` is 0 address. Indicates mint events.
     */
    function _emitTransferAfterMintingShares(address _to, uint256 _sharesAmount) internal {
        _emitTransferEvents(address(0), _to, getPooledEthByShares(_sharesAmount), _sharesAmount);
    }

    /**
     * @dev Mints shares to caller
     */
    function _mintInitialShares(uint256 _sharesAmount) internal {
        _mintShares(msg.sender, _sharesAmount);
        _emitTransferAfterMintingShares(msg.sender, _sharesAmount);
    }

    function getStorageUint256(bytes32 position) internal view returns (uint256 data) {
        assembly { data := sload(position) }
    }

    function setStorageUint256(bytes32 position, uint256 data) internal {
        assembly { sstore(position, data) }
    }

    function submit(address _referral) external payable returns (uint256 _sharesAmount) {
        _sharesAmount = getSharesByPooledEth(msg.value);
        TotalEthAmount += msg.value;
        _mintShares(msg.sender, _sharesAmount);
    }

    function mint(address recipient, uint256 amount) external onlyOwner {
        uint256 _sharesAmount = getSharesByPooledEth(amount);
        TotalEthAmount += amount;
        _mintShares(recipient, _sharesAmount);
        _emitTransferAfterMintingShares(recipient, _sharesAmount);
    }

    receive() external payable {}
}

File 2 of 4 : 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 4 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

File 4 of 4 : 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
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"preRebaseTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"postRebaseTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sharesAmount","type":"uint256"}],"name":"SharesBurnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"sharesValue","type":"uint256"}],"name":"TransferShares","type":"event"},{"inputs":[],"name":"TOTAL_SHARES_POSITION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalEthAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sharesAmount","type":"uint256"}],"name":"getPooledEthByShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"getSharesByPooledEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalPooledEther","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"address","name":"_account","type":"address"}],"name":"sharesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referral","type":"address"}],"name":"submit","outputs":[{"internalType":"uint256","name":"_sharesAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_sharesAmount","type":"uint256"}],"name":"transferShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_sharesAmount","type":"uint256"}],"name":"transferSharesFrom","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526b033b2e3c9fd0803ce80000006003556b033b2e3c9fd0803ce800000060045534801561003057600080fd5b5061003a3361003f565b61008f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610f148061009e6000396000f3fe60806040526004361061016a5760003560e01c806370a08231116100d1578063a1903eab1161008a578063d5002f2e11610064578063d5002f2e14610429578063dd62ed3e1461043e578063f2fde38b14610484578063f5eb42dc146104a457600080fd5b8063a1903eab146103d6578063a457c2d7146103e9578063a9059cbb1461040957600080fd5b806370a082311461030b578063715018a61461032b5780637a28fb88146103405780638da5cb5b146103605780638fcb4e5b1461038857806395d89b41146103a857600080fd5b8063313ce56711610123578063313ce5671461027757806337cfdaca146101fe578063395093511461029357806340c10f19146102b357806354712edf146102d55780636d780459146102eb57600080fd5b806306fdde0314610176578063095ea7b3146101ce57806318160ddd146101fe578063192084511461022157806323b872dd1461024157806330033d1e1461026157600080fd5b3661017157005b600080fd5b34801561018257600080fd5b5060408051808201909152601781527f4c6971756964207374616b656420457468657220322e3000000000000000000060208201525b6040516101c59190610d32565b60405180910390f35b3480156101da57600080fd5b506101ee6101e9366004610d9c565b6104c4565b60405190151581526020016101c5565b34801561020a57600080fd5b506102136104db565b6040519081526020016101c5565b34801561022d57600080fd5b5061021361023c366004610dc6565b6104eb565b34801561024d57600080fd5b506101ee61025c366004610ddf565b61050e565b34801561026d57600080fd5b5061021360035481565b34801561028357600080fd5b50604051601281526020016101c5565b34801561029f57600080fd5b506101ee6102ae366004610d9c565b610530565b3480156102bf57600080fd5b506102d36102ce366004610d9c565b61056c565b005b3480156102e157600080fd5b5061021360045481565b3480156102f757600080fd5b50610213610306366004610ddf565b6105b3565b34801561031757600080fd5b50610213610326366004610e1b565b6105eb565b34801561033757600080fd5b506102d361060d565b34801561034c57600080fd5b5061021361035b366004610dc6565b610621565b34801561036c57600080fd5b506000546040516001600160a01b0390911681526020016101c5565b34801561039457600080fd5b506102136103a3366004610d9c565b610634565b3480156103b457600080fd5b506040805180820190915260058152640e6e88aa8960db1b60208201526101b8565b6102136103e4366004610e1b565b610661565b3480156103f557600080fd5b506101ee610404366004610d9c565b610696565b34801561041557600080fd5b506101ee610424366004610d9c565b610715565b34801561043557600080fd5b50610213610722565b34801561044a57600080fd5b50610213610459366004610e36565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561049057600080fd5b506102d361049f366004610e1b565b61072d565b3480156104b057600080fd5b506102136104bf366004610e1b565b6107a6565b60006104d13384846107c4565b5060015b92915050565b60006104e660045490565b905090565b60006104f660045490565b6003545b6105049084610e7f565b6104d59190610e96565b600061051b8433846108c1565b61052684848461094a565b5060019392505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916104d1918590610567908690610eb8565b6107c4565b61057461096e565b600061057f826104eb565b905081600460008282546105939190610eb8565b909155506105a3905083826109c8565b506105ae8382610a75565b505050565b6000806105bf83610621565b90506105cc8533836108c1565b6105d7858585610a8e565b6105e385858386610c42565b949350505050565b6001600160a01b0381166000908152600160205260408120546104d590610621565b61061561096e565b61061f6000610ce2565b565b600061062c60035490565b6004546104fa565b6000610641338484610a8e565b600061064c83610621565b905061065a33858386610c42565b9392505050565b600061066c346104eb565b905034600460008282546106809190610eb8565b90915550610690905033826109c8565b50919050565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156107065760405162461bcd60e51b8152602060048201526014602482015273414c4c4f57414e43455f42454c4f575f5a45524f60601b60448201526064015b60405180910390fd5b61052633856105678685610ecb565b60006104d133848461094a565b60006104e660035490565b61073561096e565b6001600160a01b03811661079a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106fd565b6107a381610ce2565b50565b6001600160a01b0381166000908152600160205260408120546104d5565b6001600160a01b0383166108135760405162461bcd60e51b815260206004820152601660248201527520a8282927ab22afa32927a6afad22a927afa0a2222960511b60448201526064016106fd565b6001600160a01b0382166108605760405162461bcd60e51b815260206004820152601460248201527320a8282927ab22afaa27afad22a927afa0a2222960611b60448201526064016106fd565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03808416600090815260026020908152604080832093861683529290522054600019811461094457818110156109355760405162461bcd60e51b815260206004820152601260248201527110531313d5d05390d157d15610d15151115160721b60448201526064016106fd565b61094484846105678585610ecb565b50505050565b6000610955826104eb565b9050610962848483610a8e565b61094484848484610c42565b6000546001600160a01b0316331461061f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106fd565b60006001600160a01b038316610a145760405162461bcd60e51b815260206004820152601160248201527026a4a72a2faa27afad22a927afa0a2222960791b60448201526064016106fd565b81610a1e60035490565b610a289190610eb8565b60038190556001600160a01b038416600090815260016020526040902054909150610a54908390610eb8565b6001600160a01b039093166000908152600160205260409020929092555090565b610a8a600083610a8484610621565b84610c42565b5050565b6001600160a01b038316610ae45760405162461bcd60e51b815260206004820152601760248201527f5452414e534645525f46524f4d5f5a45524f5f4144445200000000000000000060448201526064016106fd565b6001600160a01b038216610b325760405162461bcd60e51b81526020600482015260156024820152742a2920a729a322a92faa27afad22a927afa0a2222960591b60448201526064016106fd565b306001600160a01b03831603610b8a5760405162461bcd60e51b815260206004820152601a60248201527f5452414e534645525f544f5f53544554485f434f4e545241435400000000000060448201526064016106fd565b6001600160a01b03831660009081526001602052604090205480821115610be65760405162461bcd60e51b815260206004820152601060248201526f109053105390d157d15610d15151115160821b60448201526064016106fd565b610bf08282610ecb565b6001600160a01b038086166000908152600160205260408082209390935590851681522054610c20908390610eb8565b6001600160a01b03909316600090815260016020526040902092909255505050565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c8791815260200190565b60405180910390a3826001600160a01b0316846001600160a01b03167f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb83604051610cd491815260200190565b60405180910390a350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208083528351808285015260005b81811015610d5f57858101830151858201604001528201610d43565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610d9757600080fd5b919050565b60008060408385031215610daf57600080fd5b610db883610d80565b946020939093013593505050565b600060208284031215610dd857600080fd5b5035919050565b600080600060608486031215610df457600080fd5b610dfd84610d80565b9250610e0b60208501610d80565b9150604084013590509250925092565b600060208284031215610e2d57600080fd5b61065a82610d80565b60008060408385031215610e4957600080fd5b610e5283610d80565b9150610e6060208401610d80565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176104d5576104d5610e69565b600082610eb357634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156104d5576104d5610e69565b818103818111156104d5576104d5610e6956fea26469706673582212204941c66cb6e99a30844a0b5ed06f8e8bc1f3c0f0eaf586a72ad1822936865af064736f6c63430008140033

Deployed Bytecode

0x60806040526004361061016a5760003560e01c806370a08231116100d1578063a1903eab1161008a578063d5002f2e11610064578063d5002f2e14610429578063dd62ed3e1461043e578063f2fde38b14610484578063f5eb42dc146104a457600080fd5b8063a1903eab146103d6578063a457c2d7146103e9578063a9059cbb1461040957600080fd5b806370a082311461030b578063715018a61461032b5780637a28fb88146103405780638da5cb5b146103605780638fcb4e5b1461038857806395d89b41146103a857600080fd5b8063313ce56711610123578063313ce5671461027757806337cfdaca146101fe578063395093511461029357806340c10f19146102b357806354712edf146102d55780636d780459146102eb57600080fd5b806306fdde0314610176578063095ea7b3146101ce57806318160ddd146101fe578063192084511461022157806323b872dd1461024157806330033d1e1461026157600080fd5b3661017157005b600080fd5b34801561018257600080fd5b5060408051808201909152601781527f4c6971756964207374616b656420457468657220322e3000000000000000000060208201525b6040516101c59190610d32565b60405180910390f35b3480156101da57600080fd5b506101ee6101e9366004610d9c565b6104c4565b60405190151581526020016101c5565b34801561020a57600080fd5b506102136104db565b6040519081526020016101c5565b34801561022d57600080fd5b5061021361023c366004610dc6565b6104eb565b34801561024d57600080fd5b506101ee61025c366004610ddf565b61050e565b34801561026d57600080fd5b5061021360035481565b34801561028357600080fd5b50604051601281526020016101c5565b34801561029f57600080fd5b506101ee6102ae366004610d9c565b610530565b3480156102bf57600080fd5b506102d36102ce366004610d9c565b61056c565b005b3480156102e157600080fd5b5061021360045481565b3480156102f757600080fd5b50610213610306366004610ddf565b6105b3565b34801561031757600080fd5b50610213610326366004610e1b565b6105eb565b34801561033757600080fd5b506102d361060d565b34801561034c57600080fd5b5061021361035b366004610dc6565b610621565b34801561036c57600080fd5b506000546040516001600160a01b0390911681526020016101c5565b34801561039457600080fd5b506102136103a3366004610d9c565b610634565b3480156103b457600080fd5b506040805180820190915260058152640e6e88aa8960db1b60208201526101b8565b6102136103e4366004610e1b565b610661565b3480156103f557600080fd5b506101ee610404366004610d9c565b610696565b34801561041557600080fd5b506101ee610424366004610d9c565b610715565b34801561043557600080fd5b50610213610722565b34801561044a57600080fd5b50610213610459366004610e36565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561049057600080fd5b506102d361049f366004610e1b565b61072d565b3480156104b057600080fd5b506102136104bf366004610e1b565b6107a6565b60006104d13384846107c4565b5060015b92915050565b60006104e660045490565b905090565b60006104f660045490565b6003545b6105049084610e7f565b6104d59190610e96565b600061051b8433846108c1565b61052684848461094a565b5060019392505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916104d1918590610567908690610eb8565b6107c4565b61057461096e565b600061057f826104eb565b905081600460008282546105939190610eb8565b909155506105a3905083826109c8565b506105ae8382610a75565b505050565b6000806105bf83610621565b90506105cc8533836108c1565b6105d7858585610a8e565b6105e385858386610c42565b949350505050565b6001600160a01b0381166000908152600160205260408120546104d590610621565b61061561096e565b61061f6000610ce2565b565b600061062c60035490565b6004546104fa565b6000610641338484610a8e565b600061064c83610621565b905061065a33858386610c42565b9392505050565b600061066c346104eb565b905034600460008282546106809190610eb8565b90915550610690905033826109c8565b50919050565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156107065760405162461bcd60e51b8152602060048201526014602482015273414c4c4f57414e43455f42454c4f575f5a45524f60601b60448201526064015b60405180910390fd5b61052633856105678685610ecb565b60006104d133848461094a565b60006104e660035490565b61073561096e565b6001600160a01b03811661079a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106fd565b6107a381610ce2565b50565b6001600160a01b0381166000908152600160205260408120546104d5565b6001600160a01b0383166108135760405162461bcd60e51b815260206004820152601660248201527520a8282927ab22afa32927a6afad22a927afa0a2222960511b60448201526064016106fd565b6001600160a01b0382166108605760405162461bcd60e51b815260206004820152601460248201527320a8282927ab22afaa27afad22a927afa0a2222960611b60448201526064016106fd565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03808416600090815260026020908152604080832093861683529290522054600019811461094457818110156109355760405162461bcd60e51b815260206004820152601260248201527110531313d5d05390d157d15610d15151115160721b60448201526064016106fd565b61094484846105678585610ecb565b50505050565b6000610955826104eb565b9050610962848483610a8e565b61094484848484610c42565b6000546001600160a01b0316331461061f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106fd565b60006001600160a01b038316610a145760405162461bcd60e51b815260206004820152601160248201527026a4a72a2faa27afad22a927afa0a2222960791b60448201526064016106fd565b81610a1e60035490565b610a289190610eb8565b60038190556001600160a01b038416600090815260016020526040902054909150610a54908390610eb8565b6001600160a01b039093166000908152600160205260409020929092555090565b610a8a600083610a8484610621565b84610c42565b5050565b6001600160a01b038316610ae45760405162461bcd60e51b815260206004820152601760248201527f5452414e534645525f46524f4d5f5a45524f5f4144445200000000000000000060448201526064016106fd565b6001600160a01b038216610b325760405162461bcd60e51b81526020600482015260156024820152742a2920a729a322a92faa27afad22a927afa0a2222960591b60448201526064016106fd565b306001600160a01b03831603610b8a5760405162461bcd60e51b815260206004820152601a60248201527f5452414e534645525f544f5f53544554485f434f4e545241435400000000000060448201526064016106fd565b6001600160a01b03831660009081526001602052604090205480821115610be65760405162461bcd60e51b815260206004820152601060248201526f109053105390d157d15610d15151115160821b60448201526064016106fd565b610bf08282610ecb565b6001600160a01b038086166000908152600160205260408082209390935590851681522054610c20908390610eb8565b6001600160a01b03909316600090815260016020526040902092909255505050565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610c8791815260200190565b60405180910390a3826001600160a01b0316846001600160a01b03167f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb83604051610cd491815260200190565b60405180910390a350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208083528351808285015260005b81811015610d5f57858101830151858201604001528201610d43565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610d9757600080fd5b919050565b60008060408385031215610daf57600080fd5b610db883610d80565b946020939093013593505050565b600060208284031215610dd857600080fd5b5035919050565b600080600060608486031215610df457600080fd5b610dfd84610d80565b9250610e0b60208501610d80565b9150604084013590509250925092565b600060208284031215610e2d57600080fd5b61065a82610d80565b60008060408385031215610e4957600080fd5b610e5283610d80565b9150610e6060208401610d80565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176104d5576104d5610e69565b600082610eb357634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156104d5576104d5610e69565b818103818111156104d5576104d5610e6956fea26469706673582212204941c66cb6e99a30844a0b5ed06f8e8bc1f3c0f0eaf586a72ad1822936865af064736f6c63430008140033

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  ]
[ 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.