ETH Price: $2,694.86 (+3.58%)
Gas: 0.04 GWei

Contract

0xf2eff2Cd0d9C82b7b2f17FbBed703fA7931dB1da

Overview

ETH Balance

Linea Mainnet LogoLinea Mainnet LogoLinea Mainnet Logo0 ETH

ETH Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MetaZapNG

Compiler Version
vyper:0.3.10

Optimization Enabled:
N/A

Other Settings:
default evmVersion, None license

Contract Source Code (Vyper language format)

# pragma version 0.3.10
# pragma evm-version paris
"""
@title MetaZapNG
@author Curve.Fi
@license Copyright (c) Curve.Fi, 2021 - all rights reserved
@notice A generalised zap contract for Stableswap-ng metapools where the base pool
        is a Stableswap-ng implementation as well.
@dev Contract assumes Metapools have 2 coins.
"""

interface ERC20:
    def transfer(receiver: address, amount: uint256): nonpayable
    def transferFrom(_sender: address, receiver: address, amount: uint256): nonpayable
    def approve(spender: address, amount: uint256): nonpayable
    def decimals() -> uint256: view
    def balanceOf(owner: address) -> uint256: view

interface StableSwapMetaNG:
    def add_liquidity(
        amounts: uint256[META_N_COINS],
        min_mint_amount: uint256,
        receiver: address
    ) -> uint256: nonpayable
    def remove_liquidity(
        amount: uint256,
        min_amounts: uint256[META_N_COINS]
    ) -> uint256[META_N_COINS]: nonpayable
    def remove_liquidity_one_coin(
        token_amount: uint256,
        i: int128,
        min_amount: uint256,
        receiver: address
    ) -> uint256: nonpayable
    def remove_liquidity_imbalance(
        amounts: uint256[META_N_COINS],
        max_burn_amount: uint256
    ) -> uint256: nonpayable
    def calc_withdraw_one_coin(token_amount: uint256, i: int128) -> uint256: view
    def calc_token_amount(amounts: uint256[META_N_COINS], deposit: bool) -> uint256: view
    def coins(i: uint256) -> address: view
    def BASE_POOL() -> address: view
    def BASE_POOL_IS_NG() -> bool: view

interface StableSwapNG:
    def N_COINS() -> uint256: view
    def add_liquidity(
        amounts: DynArray[uint256, MAX_COINS],
        min_mint_amount: uint256
    ) -> uint256: nonpayable
    def remove_liquidity(
        amount: uint256,
        min_amounts: DynArray[uint256, MAX_COINS]
    ) -> DynArray[uint256, MAX_COINS]: nonpayable
    def remove_liquidity_one_coin(
        token_amount: uint256,
        i: int128,
        min_amount: uint256
    ) -> uint256: nonpayable
    def remove_liquidity_imbalance(
        amounts: DynArray[uint256, MAX_COINS],
        max_burn_amount: uint256
    ) -> uint256: nonpayable
    def calc_withdraw_one_coin(token_amount: uint256, i: int128) -> uint256: view
    def calc_token_amount(
        amounts: DynArray[uint256, MAX_COINS],
        deposit: bool
    ) -> uint256: view
    def coins(i: uint256) -> address: view
    def fee() -> uint256: view


struct BasePool:
    pool_address: address
    coins: DynArray[address, MAX_COINS]


META_N_COINS: constant(uint256) = 2
MAX_COINS: constant(uint256) = 8
MAX_ALL_COINS: constant(uint256) = MAX_COINS + 1
FEE_DENOMINATOR: constant(uint256) = 10 ** 10
FEE_IMPRECISION: constant(uint256) = 100 * 10 ** 8  # % of the fee

# coin -> pool -> is approved to transfer?
is_approved: HashMap[address, HashMap[address, bool]]
base_pool_coins_spending_approved: HashMap[address, bool]
base_pool_registry: HashMap[address, BasePool]


@internal
@view
def get_coins_from_pool(_pool: address) -> DynArray[address, MAX_COINS]:
    n_coins: uint256 = StableSwapNG(_pool).N_COINS()
    coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS])
    for i in range(n_coins, bound=MAX_COINS):
        coins.append(StableSwapNG(_pool).coins(i))
    return coins


@internal
def _approve_pool_to_spend_zap_coins(
    pool: address,
    coins: DynArray[address, MAX_COINS],
):
    for i in range(len(coins), bound=MAX_COINS):
        ERC20(coins[i]).approve(pool, max_value(uint256))

    self.base_pool_coins_spending_approved[pool] = True


@internal
@view
def _fetch_base_pool_data(_pool: address) -> (address, DynArray[address, MAX_COINS]):

    base_pool: address = StableSwapMetaNG(_pool).BASE_POOL()
    assert base_pool != empty(address)  # dev: not a metapool
    base_coins: DynArray[address, MAX_COINS] = self.get_coins_from_pool(base_pool)
    return base_pool, base_coins


@internal
def _base_pool_data(_pool: address) -> (address, DynArray[address, MAX_COINS]):

    base_pool_data: BasePool = self.base_pool_registry[_pool]
    if base_pool_data.pool_address == empty(address):

        base_pool: address = empty(address)
        base_coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS])
        base_pool, base_coins = self._fetch_base_pool_data(_pool)

        self.base_pool_registry[_pool] = BasePool(
            {pool_address: base_pool, coins: base_coins}
        )
        return base_pool, base_coins

    return base_pool_data.pool_address, base_pool_data.coins



@view
@external
def calc_token_amount(
    _pool: address,
    _amounts: DynArray[uint256, MAX_ALL_COINS],
    _is_deposit: bool
) -> uint256:
    """
    @notice Calculate addition or reduction in token supply from a deposit or withdrawal
    @dev This calculation accounts for slippage, but not fees.
         Needed to prevent front-running, not for precise calculations!
    @param _pool Address of the pool to deposit into
    @param _amounts Amount of each underlying coin being deposited
    @param _is_deposit set True for deposits, False for withdrawals
    @return Expected amount of LP tokens received
    """
    meta_amounts: uint256[META_N_COINS] = empty(uint256[META_N_COINS])
    base_amounts: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    base_pool: address = empty(address)
    base_coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS])
    base_pool, base_coins = self._fetch_base_pool_data(_pool)
    base_n_coins: uint256 = len(base_coins)

    meta_amounts[0] = _amounts[0]
    for i in range(base_n_coins, bound=MAX_COINS):
        base_amounts.append(_amounts[i + META_N_COINS - 1])

    base_tokens: uint256 = StableSwapNG(base_pool).calc_token_amount(base_amounts, _is_deposit)
    meta_amounts[META_N_COINS - 1] = base_tokens

    return StableSwapMetaNG(_pool).calc_token_amount(meta_amounts, _is_deposit)


@external
def add_liquidity(
    _pool: address,
    _deposit_amounts: DynArray[uint256, MAX_ALL_COINS],
    _min_mint_amount: uint256,
    _receiver: address = msg.sender,
) -> uint256:
    """
    @notice Wrap underlying coins and deposit them into `_pool`
    @param _pool Address of the pool to deposit into
    @param _deposit_amounts List of amounts of underlying coins to deposit
    @param _min_mint_amount Minimum amount of LP tokens to mint from the deposit
    @param _receiver Address that receives the LP tokens
    @return Amount of LP tokens received by depositing
    """

    base_amounts: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    deposit_base: bool = False

    # -------------------------- Get base pool data --------------------------

    base_pool: address = empty(address)
    base_coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS])
    base_pool, base_coins = self._base_pool_data(_pool)
    n_all_coins: uint256 = len(base_coins) + 1

    if not self.base_pool_coins_spending_approved[base_pool]:
        self._approve_pool_to_spend_zap_coins(base_pool, base_coins)

    # ------------------------ Transfer tokens to Zap ------------------------

    meta_amounts: uint256[META_N_COINS] = empty(uint256[META_N_COINS])

    # Transfer meta-token (token in metapool that is not base pool token) if
    # any:
    if _deposit_amounts[0] != 0:
        coin: address = StableSwapMetaNG(_pool).coins(0)
        if not self.is_approved[coin][_pool]:
            ERC20(coin).approve(_pool, max_value(uint256))
            self.is_approved[coin][_pool] = True
        ERC20(coin).transferFrom(msg.sender, self, _deposit_amounts[0])
        meta_amounts[0] = _deposit_amounts[0]

    # Transfer base pool coins (if any):
    for i in range(n_all_coins, bound=MAX_ALL_COINS):

        amount: uint256 = _deposit_amounts[i]
        base_amounts.append(0)
        if i == 0 or amount == 0:
            base_amounts.append(0)
            continue

        deposit_base = True
        base_idx: uint256 = i - 1
        coin: address = base_coins[base_idx]

        ERC20(coin).transferFrom(msg.sender, self, amount)
        base_amounts[base_idx] = amount

    # ----------------------- Deposit to the base pool -----------------------

    if deposit_base:
        meta_amounts[META_N_COINS - 1] = StableSwapNG(base_pool).add_liquidity(base_amounts, 0)
        if not self.is_approved[base_pool][_pool]:
            ERC20(base_pool).approve(_pool, max_value(uint256))
            self.is_approved[base_pool][_pool] = True

    # ----------------------- Deposit to the meta pool -----------------------

    return StableSwapMetaNG(_pool).add_liquidity(
        meta_amounts,
        _min_mint_amount,
        _receiver
    )


@view
@external
def calc_withdraw_one_coin(_pool: address, _token_amount: uint256, i: int128) -> uint256:
    """
    @notice Calculate the amount received when withdrawing and unwrapping a single coin
    @param _pool Address of the pool to deposit into
    @param _token_amount Amount of LP tokens to burn in the withdrawal
    @param i Index value of the underlying coin to withdraw
    @return Amount of coin received
    """
    if i < META_N_COINS - 1:
        return StableSwapMetaNG(_pool).calc_withdraw_one_coin(_token_amount, i)
    else:
        base_pool: address = StableSwapMetaNG(_pool).BASE_POOL()
        assert base_pool != empty(address)  # dev: not a metapool!
        _base_tokens: uint256 = StableSwapMetaNG(_pool).calc_withdraw_one_coin(_token_amount, META_N_COINS - 1)
        return StableSwapNG(base_pool).calc_withdraw_one_coin(
            _base_tokens,
            i - convert(META_N_COINS - 1, int128)
        )


@external
def remove_liquidity(
    _pool: address,
    _burn_amount: uint256,
    _min_amounts: DynArray[uint256, MAX_ALL_COINS],
    _receiver: address = msg.sender
) -> DynArray[uint256, MAX_ALL_COINS]:
    """
    @notice Withdraw and unwrap coins from the pool
    @dev Withdrawal amounts are based on current deposit ratios
    @param _pool Address of the pool to deposit into
    @param _burn_amount Quantity of LP tokens to burn in the withdrawal
    @param _min_amounts Minimum amounts of underlying coins to receive
    @param _receiver Address that receives the LP tokens
    @return List of amounts of underlying coins that were withdrawn
    """
    ERC20(_pool).transferFrom(msg.sender, self, _burn_amount)

    base_pool: address = empty(address)
    base_coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS])
    base_pool, base_coins = self._base_pool_data(_pool)
    base_n_coins: uint256 = len(base_coins)

    min_amounts_base: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    amounts: DynArray[uint256, MAX_ALL_COINS] = empty(DynArray[uint256, MAX_ALL_COINS])

    # Withdraw from meta
    meta_received: uint256[META_N_COINS] = StableSwapMetaNG(_pool).remove_liquidity(
        _burn_amount,
        [_min_amounts[0], convert(0, uint256)]
    )

    # Withdraw from base
    for i in range(base_n_coins, bound=MAX_COINS):
        min_amounts_base.append(_min_amounts[i + META_N_COINS - 1])
    StableSwapNG(base_pool).remove_liquidity(meta_received[1], min_amounts_base)

    # Transfer all coins out
    coin: address = StableSwapMetaNG(_pool).coins(0)
    ERC20(coin).transfer(_receiver, meta_received[0])
    amounts.append(meta_received[0])

    for i in range(base_n_coins + 1, bound=MAX_ALL_COINS):

        if i == 0:
            continue

        coin = base_coins[i-1]
        amounts.append(ERC20(coin).balanceOf(self))

        ERC20(coin).transfer(_receiver, amounts[i])

    return amounts


@external
def remove_liquidity_one_coin(
    _pool: address,
    _burn_amount: uint256,
    i: int128,
    _min_amount: uint256,
    _receiver: address=msg.sender
) -> uint256:
    """
    @notice Withdraw and unwrap a single coin from the pool
    @param _pool Address of the pool to deposit into
    @param _burn_amount Amount of LP tokens to burn in the withdrawal
    @param i Index value of the coin to withdraw
    @param _min_amount Minimum amount of underlying coin to receive
    @param _receiver Address that receives the LP tokens
    @return Amount of underlying coin received
    """
    ERC20(_pool).transferFrom(msg.sender, self, _burn_amount)

    coin_amount: uint256 = 0
    if i == 0:
        coin_amount = StableSwapMetaNG(_pool).remove_liquidity_one_coin(
            _burn_amount, i, _min_amount, _receiver
        )
    else:
        base_pool: address = empty(address)
        base_coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS])
        base_pool, base_coins = self._base_pool_data(_pool)
        base_n_coins: uint256 = len(base_coins)

        coin: address = base_coins[i - convert(META_N_COINS - 1, int128)]
        # Withdraw a base pool coin
        coin_amount = StableSwapMetaNG(_pool).remove_liquidity_one_coin(
            _burn_amount, convert(META_N_COINS - 1, int128), 0, self
        )
        coin_amount = StableSwapNG(base_pool).remove_liquidity_one_coin(
            coin_amount, i - convert(META_N_COINS - 1, int128), _min_amount
        )
        ERC20(coin).transfer(_receiver, coin_amount)

    return coin_amount


@external
def remove_liquidity_imbalance(
    _pool: address,
    _amounts: DynArray[uint256, MAX_ALL_COINS],
    _max_burn_amount: uint256,
    _receiver: address=msg.sender
) -> uint256:
    """
    @notice Withdraw coins from the pool in an imbalanced amount
    @param _pool Address of the pool to deposit into
    @param _amounts List of amounts of underlying coins to withdraw
    @param _max_burn_amount Maximum amount of LP token to burn in the withdrawal
    @param _receiver Address that receives the LP tokens
    @return Actual amount of the LP token burned in the withdrawal
    """

    base_pool: address = empty(address)
    base_coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS])
    base_pool, base_coins = self._base_pool_data(_pool)
    base_n_coins: uint256 = len(base_coins)

    fee: uint256 = StableSwapNG(base_pool).fee() * base_n_coins / (4 * (base_n_coins - 1))
    fee += fee * FEE_IMPRECISION / FEE_DENOMINATOR  # Overcharge to account for imprecision

    # Transfer the LP token in
    ERC20(_pool).transferFrom(msg.sender, self, _max_burn_amount)

    withdraw_base: bool = False
    amounts_base: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    amounts_meta: uint256[META_N_COINS] = [_amounts[0], 0]

    # determine amounts to withdraw from base pool
    for i in range(base_n_coins, bound=MAX_COINS):
        amount: uint256 = _amounts[META_N_COINS - 1 + i]
        if amount != 0:
            amounts_base.append(amount)
            withdraw_base = True
        else:
            amounts_base.append(0)

    # determine amounts to withdraw from metapool
    if withdraw_base:
        amounts_meta[1] = StableSwapNG(base_pool).calc_token_amount(amounts_base, False)
        amounts_meta[1] += amounts_meta[1] * fee / FEE_DENOMINATOR + 1

    # withdraw from metapool and return the remaining LP tokens
    burn_amount: uint256 = StableSwapMetaNG(_pool).remove_liquidity_imbalance(amounts_meta, _max_burn_amount)
    ERC20(_pool).transfer(msg.sender, _max_burn_amount - burn_amount)

    # withdraw from base pool
    if withdraw_base:
        StableSwapNG(base_pool).remove_liquidity_imbalance(amounts_base, amounts_meta[1])
        coin: address = base_pool
        leftover: uint256 = ERC20(coin).balanceOf(self)

        if leftover > 0:
            # if some base pool LP tokens remain, re-deposit them for the caller
            if not self.is_approved[coin][_pool]:
                ERC20(coin).approve(_pool, MAX_UINT256)
                self.is_approved[coin][_pool] = True
            burn_amount -= StableSwapMetaNG(_pool).add_liquidity([convert(0, uint256), leftover], 0, msg.sender)

        # transfer withdrawn base pool tokens to caller
        for i in range(base_n_coins, bound=MAX_COINS):
            ERC20(base_coins[i]).transfer(_receiver, amounts_base[i])

    # transfer withdrawn metapool tokens to caller
    if _amounts[0] > 0:
        coin: address = StableSwapMetaNG(_pool).coins(0)
        ERC20(coin).transfer(_receiver, _amounts[0])

    return burn_amount

Contract Security Audit

Contract ABI

[{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"_pool","type":"address"},{"name":"_amounts","type":"uint256[]"},{"name":"_is_deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_deposit_amounts","type":"uint256[]"},{"name":"_min_mint_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_deposit_amounts","type":"uint256[]"},{"name":"_min_mint_amount","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"_pool","type":"address"},{"name":"_token_amount","type":"uint256"},{"name":"i","type":"int128"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[]"}],"outputs":[{"name":"","type":"uint256[]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[]"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256[]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"_min_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"_min_amount","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_pool","type":"address"},{"name":"_amounts","type":"uint256[]"},{"name":"_max_burn_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_pool","type":"address"},{"name":"_amounts","type":"uint256[]"},{"name":"_max_burn_amount","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]}]

611bb061001161000039611bb0610000f360003560e01c60026007821660011b611ba001601e39600051565b63f558454d811861183b57608436103417611b9b576004358060a01c611b9b576104a0526024356004016009813511611b9b57803560208160051b0180836104c0375050506044358060011c611b9b57610600526060366106203760006107805260006107a0526104a051610220526100946108c06119d0565b6108c080516107805260208101805160208160051b01806107a0828560045afa50505050506107a0516108c0526104c05115611b9b57600060051b6104e001516106205260006108c05160088111611b9b57801561014d57905b806108e0526106605160078111611b9b576108e05160028101818110611b9b57905060018103818111611b9b5790506104c051811015611b9b5760051b6104e001518160051b61068001526001810161066052506001018181186100ee575b505061078051633db06dd8610900526040806109205280610920016000610660518083528060051b60008260088111611b9b5780156101a657905b8060051b61068001518160051b602088010152600101818118610188575b50508201602001915050905081019050610600516109405250602061090061016461091c845afa6101dc573d600060003e3d6000fd5b60203d10611b9b576109009050516108e0526108e0516106405260206104a05163ed8e84f3610900526106205161092052610640516109405261060051610960526020610900606461091c845afa610239573d600060003e3d6000fd5b60203d10611b9b576109009050f361183b565b63fd9de631811861183b57608436103417611b9b57336109e0526102945661183b565b639a01e4d281186107d85760a436103417611b9b576064358060a01c611b9b576109e0525b6004358060a01c611b9b57610880526024356004016009813511611b9b57803560208160051b0180836108a0375050506000610a00526000610b2052604036610b4037610880516104a0526102ea610c80611a76565b610c808051610b405260208101805160208160051b0180610b60828560045afa5050505050610b605160018101818110611b9b579050610c80526001610b405160205260005260406000205461036257610b4051604052610b605160208160051b0180606082610b6060045afa505050610362611924565b604036610ca0376108a05115611b9b57600060051b6108c00151156104ed576108805163c6610657610d00526000610d20526020610d006024610d1c845afa6103b0573d600060003e3d6000fd5b60203d10611b9b57610d00518060a01c611b9b57610d4052610d40905051610ce0526000610ce05160205260005260406000208061088051602052600052604060002090505461048157610ce05163095ea7b3610d005261088051610d20527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610d4052803b15611b9b576000610d006044610d1c6000855af1610459573d600060003e3d6000fd5b5060016000610ce0516020526000526040600020806108805160205260005260406000209050555b610ce0516323b872dd610d005233610d205230610d40526108a05115611b9b57600060051b6108c00151610d6052803b15611b9b576000610d006064610d1c6000855af16104d4573d600060003e3d6000fd5b506108a05115611b9b57600060051b6108c00151610ca0525b6000610c805160098111611b9b57801561062457905b80610ce052610ce0516108a051811015611b9b5760051b6108c00151610d0052610a005160078111611b9b5760008160051b610a20015260018101610a005250610ce051610552576001610558565b610d0051155b1561058257610a005160078111611b9b5760008160051b610a20015260018101610a005250610619565b6001610b2052610ce05160018103818111611b9b579050610d2052610d2051610b6051811015611b9b5760051b610b800151610d4052610d40516323b872dd610d605233610d805230610da052610d0051610dc052803b15611b9b576000610d606064610d7c6000855af16105fc573d600060003e3d6000fd5b50610d0051610d2051610a0051811015611b9b5760051b610a2001525b600101818118610503575b5050610b20511561077d57610b405163b72df5de610ce052604080610d005280610d00016000610a00518083528060051b60008260088111611b9b57801561068657905b8060051b610a2001518160051b602088010152600101818118610668575b505082016020019150509050810190506000610d2052506020610ce0610164610cfc6000855af16106bc573d600060003e3d6000fd5b60203d10611b9b57610ce0905051610cc0526000610b405160205260005260406000208061088051602052600052604060002090505461077d57610b405163095ea7b3610ce05261088051610d00527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610d2052803b15611b9b576000610ce06044610cfc6000855af1610755573d600060003e3d6000fd5b5060016000610b40516020526000526040600020806108805160205260005260406000209050555b602061088051630c3e4b54610ce052610ca051610d0052610cc051610d2052604435610d40526109e051610d60526020610ce06084610cfc6000855af16107c9573d600060003e3d6000fd5b60203d10611b9b57610ce09050f35b6329ed2862811861183b57608436103417611b9b57336108c0526109855661183b565b6341b028f3811861096057606436103417611b9b576004358060a01c611b9b5760405260443580600f0b8118611b9b576060526000606051131561091e576040516371511a5e60a052602060a0600460bc845afa61085e573d600060003e3d6000fd5b60203d10611b9b5760a0518060a01c611b9b5760e05260e090505160805260805115611b9b5760405163cc2b27d760c05260243560e052600161010052602060c0604460dc845afa6108b5573d600060003e3d6000fd5b60203d10611b9b5760c090505160a052602060805163cc2b27d760c05260a05160e0526060516001810380600f0b8118611b9b57905061010052602060c0604460dc845afa610909573d600060003e3d6000fd5b60203d10611b9b5760c0905061095e5661095e565b602060405163cc2b27d760805260243560a05260605160c052602060806044609c845afa610951573d600060003e3d6000fd5b60203d10611b9b57608090505bf35b631e700cbb811861183b5760a436103417611b9b576084358060a01c611b9b576108c0525b6004358060a01c611b9b576108805260443580600f0b8118611b9b576108a052610880516323b872dd6108e0523361090052306109205260243561094052803b15611b9b5760006108e060646108fc6000855af16109e8573d600060003e3d6000fd5b5060006108e0526108a051610a57576108805163081579a561090052602435610920526108a05161094052606435610960526108c051610980526020610900608461091c6000855af1610a40573d600060003e3d6000fd5b60203d10611b9b576109009050516108e052610bc6565b60403661090037610880516104a052610a71610a40611a76565b610a4080516109005260208101805160208160051b0180610920828560045afa505050505061092051610a40526108a0516001810380600f0b8118611b9b57905061092051811015611b9b5760051b6109400151610a60526108805163081579a5610a8052602435610aa0526001610ac0526000610ae05230610b00526020610a806084610a9c6000855af1610b0c573d600060003e3d6000fd5b60203d10611b9b57610a809050516108e05261090051631a4d01d2610a80526108e051610aa0526108a0516001810380600f0b8118611b9b579050610ac052606435610ae0526020610a806064610a9c6000855af1610b70573d600060003e3d6000fd5b60203d10611b9b57610a809050516108e052610a605163a9059cbb610a80526108c051610aa0526108e051610ac052803b15611b9b576000610a806044610a9c6000855af1610bc4573d600060003e3d6000fd5b505b60206108e0f361183b565b638dae1a80811861183b57608436103417611b9b57336109e052610c195661183b565b637f3e155681186110b75760a436103417611b9b576064358060a01c611b9b576109e0525b6004358060a01c611b9b57610880526044356004016009813511611b9b57803560208160051b0180836108a037505050610880516323b872dd610a005233610a205230610a4052602435610a6052803b15611b9b576000610a006064610a1c6000855af1610c8c573d600060003e3d6000fd5b50604036610a0037610880516104a052610ca7610b40611a76565b610b408051610a005260208101805160208160051b0180610a20828560045afa5050505050610a2051610b40526000610b60526000610c805261088051635b36389c610e0052602435610e20526108a05115611b9b57600060051b6108c00151610e40526000610e60526040610e006064610e1c6000855af1610d2f573d600060003e3d6000fd5b60403d10611b9b57610e0090508051610dc0526020810151610de052506000610b405160088111611b9b578015610dc157905b80610e0052610b605160078111611b9b57610e005160028101818110611b9b57905060018103818111611b9b5790506108a051811015611b9b5760051b6108c001518160051b610b80015260018101610b605250600101818118610d62575b5050610a005163d40ddb8c610e00526040610de051610e205280610e405280610e20016000610b60518083528060051b60008260088111611b9b578015610e2257905b8060051b610b8001518160051b602088010152600101818118610e04575b50508201602001915050905081015050610140610e00610164610e1c6000855af1610e52573d600060003e3d6000fd5b60403d10611b9b57610e0051610e00016008815111611b9b57805160208160051b0180610f80828560045afa50505050610f8050506108805163c6610657610e20526000610e40526020610e206024610e3c845afa610eb6573d600060003e3d6000fd5b60203d10611b9b57610e20518060a01c611b9b57610e6052610e60905051610e0052610e005163a9059cbb610e20526109e051610e4052610dc051610e6052803b15611b9b576000610e206044610e3c6000855af1610f1a573d600060003e3d6000fd5b50610c805160088111611b9b57610dc0518160051b610ca0015260018101610c8052506000610b405160018101818110611b9b57905060098111611b9b57801561105657905b80610e2052610e2051610f725761104b565b610e205160018103818111611b9b579050610a2051811015611b9b5760051b610a400151610e0052610c805160088111611b9b57610e00516370a08231610e405230610e60526020610e406024610e5c845afa610fd4573d600060003e3d6000fd5b60203d10611b9b57610e409050518160051b610ca0015260018101610c805250610e005163a9059cbb610e40526109e051610e6052610e2051610c8051811015611b9b5760051b610ca00151610e8052803b15611b9b576000610e406044610e5c6000855af1611049573d600060003e3d6000fd5b505b600101818118610f60575b5050602080610e205280610e20016000610c80518083528060051b60008260098111611b9b5780156110a257905b8060051b610ca001518160051b602088010152600101818118611084575b50508201602001915050905081019050610e20f35b6385267a6e811861183b57608436103417611b9b57336109e0526110ff5661183b565b639941bdec811861183b5760a436103417611b9b576064358060a01c611b9b576109e0525b6004358060a01c611b9b57610880526024356004016009813511611b9b57803560208160051b0180836108a037505050604036610a0037610880516104a052611149610b40611a76565b610b408051610a005260208101805160208160051b0180610a20828560045afa5050505050610a2051610b4052610a005163ddca3f43610b80526020610b806004610b9c845afa61119f573d600060003e3d6000fd5b60203d10611b9b57610b80905051610b4051808202811583838304141715611b9b5790509050610b405160018103818111611b9b5790508060021b818160021c18611b9b5790508015611b9b5780820490509050610b6052610b6051610b60516402540be4008102816402540be400820418611b9b5790506402540be40081049050808201828110611b9b5790509050610b6052610880516323b872dd610b805233610ba05230610bc052604435610be052803b15611b9b576000610b806064610b9c6000855af1611276573d600060003e3d6000fd5b50604036610b80376108a05115611b9b57600060051b6108c00151610cc0526000610ce0526000610b405160088111611b9b57801561134157905b80610d0052610d00518060010160018110611b9b5790506108a051811015611b9b5760051b6108c00151610d2052610d20511561131557610ba05160078111611b9b57610d20518160051b610bc0015260018101610ba052506001610b8052611336565b610ba05160078111611b9b5760008160051b610bc0015260018101610ba052505b6001018181186112b1575b5050610b80511561143357610a0051633db06dd8610d0052604080610d205280610d20016000610ba0518083528060051b60008260088111611b9b5780156113a357905b8060051b610bc001518160051b602088010152600101818118611385575b505082016020019150509050810190506000610d4052506020610d00610164610d1c845afa6113d7573d600060003e3d6000fd5b60203d10611b9b57610d00905051610ce052610ce051610ce051610b6051808202811583838304141715611b9b57905090506402540be4008104905060018101818110611b9b579050808201828110611b9b5790509050610ce0525b6108805163e3103273610d2052610cc051610d4052610ce051610d6052604435610d80526020610d206064610d3c6000855af1611475573d600060003e3d6000fd5b60203d10611b9b57610d20905051610d00526108805163a9059cbb610d205233610d4052604435610d0051808203828111611b9b5790509050610d6052803b15611b9b576000610d206044610d3c6000855af16114d7573d600060003e3d6000fd5b50610b80511561177857610a0051637706db75610d2052604080610d405280610d40016000610ba0518083528060051b60008260088111611b9b57801561153857905b8060051b610bc001518160051b60208801015260010181811861151a575b50508201602001915050905081019050610ce051610d6052506020610d20610164610d3c6000855af1611570573d600060003e3d6000fd5b60203d10611b9b57610d205050610a0051610d2052610d20516370a08231610d605230610d80526020610d606024610d7c845afa6115b3573d600060003e3d6000fd5b60203d10611b9b57610d60905051610d4052610d4051156116e6576000610d205160205260005260406000208061088051602052600052604060002090505461167d57610d205163095ea7b3610d605261088051610d80527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610da052803b15611b9b576000610d606044610d7c6000855af1611655573d600060003e3d6000fd5b5060016000610d20516020526000526040600020806108805160205260005260406000209050555b610d005161088051630c3e4b54610d60526000610d8052610d4051610da0526000610dc05233610de0526020610d606084610d7c6000855af16116c5573d600060003e3d6000fd5b60203d10611b9b57610d60905051808203828111611b9b5790509050610d00525b6000610b405160088111611b9b57801561177557905b80610d6052610d6051610a2051811015611b9b5760051b610a40015163a9059cbb610d80526109e051610da052610d6051610ba051811015611b9b5760051b610bc00151610dc052803b15611b9b576000610d806044610d9c6000855af1611769573d600060003e3d6000fd5b506001018181186116fc575b50505b6108a05115611b9b57600060051b6108c0015115611834576108805163c6610657610d40526000610d60526020610d406024610d5c845afa6117bf573d600060003e3d6000fd5b60203d10611b9b57610d40518060a01c611b9b57610d8052610d80905051610d2052610d205163a9059cbb610d40526109e051610d60526108a05115611b9b57600060051b6108c00151610d8052803b15611b9b576000610d406044610d5c6000855af1611832573d600060003e3d6000fd5b505b6020610d00f35b60006000fd5b6040516329357750608052602060806004609c845afa611866573d600060003e3d6000fd5b60203d10611b9b5760809050516060526000608052600060605160088111611b9b57801561190957905b806101a05260805160078111611b9b5760405163c66106576101c0526101a0516101e05260206101c060246101dc845afa6118d0573d600060003e3d6000fd5b60203d10611b9b576101c0518060a01c611b9b57610200526102009050518160051b60a001526001810160805250600101818118611890575b505060805160208160051b01808382608060045afa50505050565b600060605160088111611b9b5780156119b957905b806101805261018051606051811015611b9b5760051b6080015163095ea7b36101a0526040516101c0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e052803b15611b9b5760006101a060446101bc6000855af16119ad573d600060003e3d6000fd5b50600101818118611939575b505060016001604051602052600052604060002055565b610220516371511a5e610260526020610260600461027c845afa6119f9573d600060003e3d6000fd5b60203d10611b9b57610260518060a01c611b9b576102a0526102a0905051610240526102405115611b9b5761024051604052611a36610380611841565b610380805160208160051b0180610260828560045afa505050506102405181526102605160208160051b016020830181818361026060045afa5050505050565b60026104a05160205260005260406000206000600a905b808301548160051b6104c00152600101818118611a8d575050506104c051611b7457604036610600376104a05161022052611ac96107406119d0565b61074080516106005260208101805160208160051b0180610620828560045afa505050505060026104a05160205260005260406000206106005181556106205160208160051b0160018301600082601f0160051c60098111611b9b578015611b4557905b8060051b610620015181840155600101818118611b2d575b5050505050506106005181526106205160208160051b016020830181818361062060045afa5050505050611b99565b6104c05181526104e05160208160051b01602083018181836104e060045afa50505050505b565b600080fd0bd1024c026f07fb10da001a0bf4183b84191bb0811000a16576797065728300030a0014

Deployed Bytecode

0x60003560e01c60026007821660011b611ba001601e39600051565b63f558454d811861183b57608436103417611b9b576004358060a01c611b9b576104a0526024356004016009813511611b9b57803560208160051b0180836104c0375050506044358060011c611b9b57610600526060366106203760006107805260006107a0526104a051610220526100946108c06119d0565b6108c080516107805260208101805160208160051b01806107a0828560045afa50505050506107a0516108c0526104c05115611b9b57600060051b6104e001516106205260006108c05160088111611b9b57801561014d57905b806108e0526106605160078111611b9b576108e05160028101818110611b9b57905060018103818111611b9b5790506104c051811015611b9b5760051b6104e001518160051b61068001526001810161066052506001018181186100ee575b505061078051633db06dd8610900526040806109205280610920016000610660518083528060051b60008260088111611b9b5780156101a657905b8060051b61068001518160051b602088010152600101818118610188575b50508201602001915050905081019050610600516109405250602061090061016461091c845afa6101dc573d600060003e3d6000fd5b60203d10611b9b576109009050516108e0526108e0516106405260206104a05163ed8e84f3610900526106205161092052610640516109405261060051610960526020610900606461091c845afa610239573d600060003e3d6000fd5b60203d10611b9b576109009050f361183b565b63fd9de631811861183b57608436103417611b9b57336109e0526102945661183b565b639a01e4d281186107d85760a436103417611b9b576064358060a01c611b9b576109e0525b6004358060a01c611b9b57610880526024356004016009813511611b9b57803560208160051b0180836108a0375050506000610a00526000610b2052604036610b4037610880516104a0526102ea610c80611a76565b610c808051610b405260208101805160208160051b0180610b60828560045afa5050505050610b605160018101818110611b9b579050610c80526001610b405160205260005260406000205461036257610b4051604052610b605160208160051b0180606082610b6060045afa505050610362611924565b604036610ca0376108a05115611b9b57600060051b6108c00151156104ed576108805163c6610657610d00526000610d20526020610d006024610d1c845afa6103b0573d600060003e3d6000fd5b60203d10611b9b57610d00518060a01c611b9b57610d4052610d40905051610ce0526000610ce05160205260005260406000208061088051602052600052604060002090505461048157610ce05163095ea7b3610d005261088051610d20527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610d4052803b15611b9b576000610d006044610d1c6000855af1610459573d600060003e3d6000fd5b5060016000610ce0516020526000526040600020806108805160205260005260406000209050555b610ce0516323b872dd610d005233610d205230610d40526108a05115611b9b57600060051b6108c00151610d6052803b15611b9b576000610d006064610d1c6000855af16104d4573d600060003e3d6000fd5b506108a05115611b9b57600060051b6108c00151610ca0525b6000610c805160098111611b9b57801561062457905b80610ce052610ce0516108a051811015611b9b5760051b6108c00151610d0052610a005160078111611b9b5760008160051b610a20015260018101610a005250610ce051610552576001610558565b610d0051155b1561058257610a005160078111611b9b5760008160051b610a20015260018101610a005250610619565b6001610b2052610ce05160018103818111611b9b579050610d2052610d2051610b6051811015611b9b5760051b610b800151610d4052610d40516323b872dd610d605233610d805230610da052610d0051610dc052803b15611b9b576000610d606064610d7c6000855af16105fc573d600060003e3d6000fd5b50610d0051610d2051610a0051811015611b9b5760051b610a2001525b600101818118610503575b5050610b20511561077d57610b405163b72df5de610ce052604080610d005280610d00016000610a00518083528060051b60008260088111611b9b57801561068657905b8060051b610a2001518160051b602088010152600101818118610668575b505082016020019150509050810190506000610d2052506020610ce0610164610cfc6000855af16106bc573d600060003e3d6000fd5b60203d10611b9b57610ce0905051610cc0526000610b405160205260005260406000208061088051602052600052604060002090505461077d57610b405163095ea7b3610ce05261088051610d00527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610d2052803b15611b9b576000610ce06044610cfc6000855af1610755573d600060003e3d6000fd5b5060016000610b40516020526000526040600020806108805160205260005260406000209050555b602061088051630c3e4b54610ce052610ca051610d0052610cc051610d2052604435610d40526109e051610d60526020610ce06084610cfc6000855af16107c9573d600060003e3d6000fd5b60203d10611b9b57610ce09050f35b6329ed2862811861183b57608436103417611b9b57336108c0526109855661183b565b6341b028f3811861096057606436103417611b9b576004358060a01c611b9b5760405260443580600f0b8118611b9b576060526000606051131561091e576040516371511a5e60a052602060a0600460bc845afa61085e573d600060003e3d6000fd5b60203d10611b9b5760a0518060a01c611b9b5760e05260e090505160805260805115611b9b5760405163cc2b27d760c05260243560e052600161010052602060c0604460dc845afa6108b5573d600060003e3d6000fd5b60203d10611b9b5760c090505160a052602060805163cc2b27d760c05260a05160e0526060516001810380600f0b8118611b9b57905061010052602060c0604460dc845afa610909573d600060003e3d6000fd5b60203d10611b9b5760c0905061095e5661095e565b602060405163cc2b27d760805260243560a05260605160c052602060806044609c845afa610951573d600060003e3d6000fd5b60203d10611b9b57608090505bf35b631e700cbb811861183b5760a436103417611b9b576084358060a01c611b9b576108c0525b6004358060a01c611b9b576108805260443580600f0b8118611b9b576108a052610880516323b872dd6108e0523361090052306109205260243561094052803b15611b9b5760006108e060646108fc6000855af16109e8573d600060003e3d6000fd5b5060006108e0526108a051610a57576108805163081579a561090052602435610920526108a05161094052606435610960526108c051610980526020610900608461091c6000855af1610a40573d600060003e3d6000fd5b60203d10611b9b576109009050516108e052610bc6565b60403661090037610880516104a052610a71610a40611a76565b610a4080516109005260208101805160208160051b0180610920828560045afa505050505061092051610a40526108a0516001810380600f0b8118611b9b57905061092051811015611b9b5760051b6109400151610a60526108805163081579a5610a8052602435610aa0526001610ac0526000610ae05230610b00526020610a806084610a9c6000855af1610b0c573d600060003e3d6000fd5b60203d10611b9b57610a809050516108e05261090051631a4d01d2610a80526108e051610aa0526108a0516001810380600f0b8118611b9b579050610ac052606435610ae0526020610a806064610a9c6000855af1610b70573d600060003e3d6000fd5b60203d10611b9b57610a809050516108e052610a605163a9059cbb610a80526108c051610aa0526108e051610ac052803b15611b9b576000610a806044610a9c6000855af1610bc4573d600060003e3d6000fd5b505b60206108e0f361183b565b638dae1a80811861183b57608436103417611b9b57336109e052610c195661183b565b637f3e155681186110b75760a436103417611b9b576064358060a01c611b9b576109e0525b6004358060a01c611b9b57610880526044356004016009813511611b9b57803560208160051b0180836108a037505050610880516323b872dd610a005233610a205230610a4052602435610a6052803b15611b9b576000610a006064610a1c6000855af1610c8c573d600060003e3d6000fd5b50604036610a0037610880516104a052610ca7610b40611a76565b610b408051610a005260208101805160208160051b0180610a20828560045afa5050505050610a2051610b40526000610b60526000610c805261088051635b36389c610e0052602435610e20526108a05115611b9b57600060051b6108c00151610e40526000610e60526040610e006064610e1c6000855af1610d2f573d600060003e3d6000fd5b60403d10611b9b57610e0090508051610dc0526020810151610de052506000610b405160088111611b9b578015610dc157905b80610e0052610b605160078111611b9b57610e005160028101818110611b9b57905060018103818111611b9b5790506108a051811015611b9b5760051b6108c001518160051b610b80015260018101610b605250600101818118610d62575b5050610a005163d40ddb8c610e00526040610de051610e205280610e405280610e20016000610b60518083528060051b60008260088111611b9b578015610e2257905b8060051b610b8001518160051b602088010152600101818118610e04575b50508201602001915050905081015050610140610e00610164610e1c6000855af1610e52573d600060003e3d6000fd5b60403d10611b9b57610e0051610e00016008815111611b9b57805160208160051b0180610f80828560045afa50505050610f8050506108805163c6610657610e20526000610e40526020610e206024610e3c845afa610eb6573d600060003e3d6000fd5b60203d10611b9b57610e20518060a01c611b9b57610e6052610e60905051610e0052610e005163a9059cbb610e20526109e051610e4052610dc051610e6052803b15611b9b576000610e206044610e3c6000855af1610f1a573d600060003e3d6000fd5b50610c805160088111611b9b57610dc0518160051b610ca0015260018101610c8052506000610b405160018101818110611b9b57905060098111611b9b57801561105657905b80610e2052610e2051610f725761104b565b610e205160018103818111611b9b579050610a2051811015611b9b5760051b610a400151610e0052610c805160088111611b9b57610e00516370a08231610e405230610e60526020610e406024610e5c845afa610fd4573d600060003e3d6000fd5b60203d10611b9b57610e409050518160051b610ca0015260018101610c805250610e005163a9059cbb610e40526109e051610e6052610e2051610c8051811015611b9b5760051b610ca00151610e8052803b15611b9b576000610e406044610e5c6000855af1611049573d600060003e3d6000fd5b505b600101818118610f60575b5050602080610e205280610e20016000610c80518083528060051b60008260098111611b9b5780156110a257905b8060051b610ca001518160051b602088010152600101818118611084575b50508201602001915050905081019050610e20f35b6385267a6e811861183b57608436103417611b9b57336109e0526110ff5661183b565b639941bdec811861183b5760a436103417611b9b576064358060a01c611b9b576109e0525b6004358060a01c611b9b57610880526024356004016009813511611b9b57803560208160051b0180836108a037505050604036610a0037610880516104a052611149610b40611a76565b610b408051610a005260208101805160208160051b0180610a20828560045afa5050505050610a2051610b4052610a005163ddca3f43610b80526020610b806004610b9c845afa61119f573d600060003e3d6000fd5b60203d10611b9b57610b80905051610b4051808202811583838304141715611b9b5790509050610b405160018103818111611b9b5790508060021b818160021c18611b9b5790508015611b9b5780820490509050610b6052610b6051610b60516402540be4008102816402540be400820418611b9b5790506402540be40081049050808201828110611b9b5790509050610b6052610880516323b872dd610b805233610ba05230610bc052604435610be052803b15611b9b576000610b806064610b9c6000855af1611276573d600060003e3d6000fd5b50604036610b80376108a05115611b9b57600060051b6108c00151610cc0526000610ce0526000610b405160088111611b9b57801561134157905b80610d0052610d00518060010160018110611b9b5790506108a051811015611b9b5760051b6108c00151610d2052610d20511561131557610ba05160078111611b9b57610d20518160051b610bc0015260018101610ba052506001610b8052611336565b610ba05160078111611b9b5760008160051b610bc0015260018101610ba052505b6001018181186112b1575b5050610b80511561143357610a0051633db06dd8610d0052604080610d205280610d20016000610ba0518083528060051b60008260088111611b9b5780156113a357905b8060051b610bc001518160051b602088010152600101818118611385575b505082016020019150509050810190506000610d4052506020610d00610164610d1c845afa6113d7573d600060003e3d6000fd5b60203d10611b9b57610d00905051610ce052610ce051610ce051610b6051808202811583838304141715611b9b57905090506402540be4008104905060018101818110611b9b579050808201828110611b9b5790509050610ce0525b6108805163e3103273610d2052610cc051610d4052610ce051610d6052604435610d80526020610d206064610d3c6000855af1611475573d600060003e3d6000fd5b60203d10611b9b57610d20905051610d00526108805163a9059cbb610d205233610d4052604435610d0051808203828111611b9b5790509050610d6052803b15611b9b576000610d206044610d3c6000855af16114d7573d600060003e3d6000fd5b50610b80511561177857610a0051637706db75610d2052604080610d405280610d40016000610ba0518083528060051b60008260088111611b9b57801561153857905b8060051b610bc001518160051b60208801015260010181811861151a575b50508201602001915050905081019050610ce051610d6052506020610d20610164610d3c6000855af1611570573d600060003e3d6000fd5b60203d10611b9b57610d205050610a0051610d2052610d20516370a08231610d605230610d80526020610d606024610d7c845afa6115b3573d600060003e3d6000fd5b60203d10611b9b57610d60905051610d4052610d4051156116e6576000610d205160205260005260406000208061088051602052600052604060002090505461167d57610d205163095ea7b3610d605261088051610d80527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610da052803b15611b9b576000610d606044610d7c6000855af1611655573d600060003e3d6000fd5b5060016000610d20516020526000526040600020806108805160205260005260406000209050555b610d005161088051630c3e4b54610d60526000610d8052610d4051610da0526000610dc05233610de0526020610d606084610d7c6000855af16116c5573d600060003e3d6000fd5b60203d10611b9b57610d60905051808203828111611b9b5790509050610d00525b6000610b405160088111611b9b57801561177557905b80610d6052610d6051610a2051811015611b9b5760051b610a40015163a9059cbb610d80526109e051610da052610d6051610ba051811015611b9b5760051b610bc00151610dc052803b15611b9b576000610d806044610d9c6000855af1611769573d600060003e3d6000fd5b506001018181186116fc575b50505b6108a05115611b9b57600060051b6108c0015115611834576108805163c6610657610d40526000610d60526020610d406024610d5c845afa6117bf573d600060003e3d6000fd5b60203d10611b9b57610d40518060a01c611b9b57610d8052610d80905051610d2052610d205163a9059cbb610d40526109e051610d60526108a05115611b9b57600060051b6108c00151610d8052803b15611b9b576000610d406044610d5c6000855af1611832573d600060003e3d6000fd5b505b6020610d00f35b60006000fd5b6040516329357750608052602060806004609c845afa611866573d600060003e3d6000fd5b60203d10611b9b5760809050516060526000608052600060605160088111611b9b57801561190957905b806101a05260805160078111611b9b5760405163c66106576101c0526101a0516101e05260206101c060246101dc845afa6118d0573d600060003e3d6000fd5b60203d10611b9b576101c0518060a01c611b9b57610200526102009050518160051b60a001526001810160805250600101818118611890575b505060805160208160051b01808382608060045afa50505050565b600060605160088111611b9b5780156119b957905b806101805261018051606051811015611b9b5760051b6080015163095ea7b36101a0526040516101c0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e052803b15611b9b5760006101a060446101bc6000855af16119ad573d600060003e3d6000fd5b50600101818118611939575b505060016001604051602052600052604060002055565b610220516371511a5e610260526020610260600461027c845afa6119f9573d600060003e3d6000fd5b60203d10611b9b57610260518060a01c611b9b576102a0526102a0905051610240526102405115611b9b5761024051604052611a36610380611841565b610380805160208160051b0180610260828560045afa505050506102405181526102605160208160051b016020830181818361026060045afa5050505050565b60026104a05160205260005260406000206000600a905b808301548160051b6104c00152600101818118611a8d575050506104c051611b7457604036610600376104a05161022052611ac96107406119d0565b61074080516106005260208101805160208160051b0180610620828560045afa505050505060026104a05160205260005260406000206106005181556106205160208160051b0160018301600082601f0160051c60098111611b9b578015611b4557905b8060051b610620015181840155600101818118611b2d575b5050505050506106005181526106205160208160051b016020830181818361062060045afa5050505050611b99565b6104c05181526104e05160208160051b01602083018181836104e060045afa50505050505b565b600080fd0bd1024c026f07fb10da001a0bf4183b

Block Transaction Gas Used Reward
view all blocks sequenced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits

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.