Sepolia Testnet

Token

Liquid staked Ether 2.0 (stETH)
ERC-20

Overview

Max Total Supply

1,001,000,366.427260658299540077 stETH

Holders

449

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.02 stETH
0xbb2494140121706b888a9e0fe51822bf05805cda
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

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

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

[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.