ETH Price: $2,343.37 (+0.36%)
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

> 10 Internal Transactions found.

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355432026-04-15 16:17:431 min ago1776269863
0xbC7654d2...EA9f96443
0 ETH
1503355352026-04-15 16:17:271 min ago1776269847
0xbC7654d2...EA9f96443
0 ETH
1503355352026-04-15 16:17:271 min ago1776269847
0xbC7654d2...EA9f96443
0 ETH
1503355352026-04-15 16:17:271 min ago1776269847
0xbC7654d2...EA9f96443
0 ETH
1503355352026-04-15 16:17:271 min ago1776269847
0xbC7654d2...EA9f96443
0 ETH
1503355352026-04-15 16:17:271 min ago1776269847
0xbC7654d2...EA9f96443
0 ETH
1503355352026-04-15 16:17:271 min ago1776269847
0xbC7654d2...EA9f96443
0 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CurveStableSwapNGViews

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 CurveStableSwapNGViews
@author Curve.Fi
@license Copyright (c) Curve.Fi, 2020-2023 - all rights reserved
@notice Auxiliary contract for Stableswap-NG containing utility methods for
        integrators
"""

from vyper.interfaces import ERC20Detailed

interface StableSwapNG:
    def N_COINS() -> uint256: view
    def BASE_POOL() -> address: view
    def BASE_N_COINS() -> uint256: view
    def stored_rates() -> DynArray[uint256, MAX_COINS]: view
    def balances(i: uint256) -> uint256: view
    def get_balances() -> DynArray[uint256, MAX_COINS]: view
    def fee() -> uint256: view
    def get_dy(i: int128, j: int128, dx: uint256) -> uint256: view
    def A() -> uint256: view
    def calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> uint256: view
    def totalSupply() -> uint256: view
    def offpeg_fee_multiplier() -> uint256: view
    def coins(i: uint256) -> address: view

A_PRECISION: constant(uint256) = 100
MAX_COINS: constant(uint256) = 8
PRECISION: constant(uint256) = 10 ** 18
FEE_DENOMINATOR: constant(uint256) = 10 ** 10


VERSION: public(constant(String[8])) = "1.2.0"
# first version was: 0xe0B15824862f3222fdFeD99FeBD0f7e0EC26E1FA (ethereum mainnet)
# second version was: 0x13526206545e2DC7CcfBaF28dC88F440ce7AD3e0 (ethereum mainnet)


# ------------------------------ Public Getters ------------------------------


@view
@external
def get_dx(i: int128, j: int128, dy: uint256, pool: address) -> uint256:
    """
    @notice Calculate the current input dx given output dy
    @dev Index values can be found via the `coins` public getter method
    @param i Index value for the coin to send
    @param j Index valie of the coin to recieve
    @param dy Amount of `j` being received after exchange
    @return Amount of `i` predicted
    """
    N_COINS: uint256 = StableSwapNG(pool).N_COINS()
    return self._get_dx(i, j, dy, pool, False, N_COINS)


@view
@external
def get_dy(i: int128, j: int128, dx: uint256, pool: address) -> uint256:
    """
    @notice Calculate the current output dy given input dx
    @dev Index values can be found via the `coins` public getter method
    @param i Index value for the coin to send
    @param j Index valie of the coin to recieve
    @param dx Amount of `i` being exchanged
    @return Amount of `j` predicted
    """
    N_COINS: uint256 = StableSwapNG(pool).N_COINS()

    rates: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    balances: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    xp: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    rates, balances, xp = self._get_rates_balances_xp(pool, N_COINS)

    amp: uint256 = StableSwapNG(pool).A() * A_PRECISION
    D: uint256 = self.get_D(xp, amp, N_COINS)

    x: uint256 = xp[i] + (dx * rates[i] / PRECISION)
    y: uint256 = self.get_y(i, j, x, xp, amp, D, N_COINS)
    dy: uint256 = xp[j] - y - 1

    base_fee: uint256 = StableSwapNG(pool).fee()
    fee_multiplier: uint256 = StableSwapNG(pool).offpeg_fee_multiplier()
    fee: uint256 = self._dynamic_fee((xp[i] + x) / 2, (xp[j] + y) / 2, base_fee, fee_multiplier) * dy / FEE_DENOMINATOR

    return (dy - fee) * PRECISION / rates[j]


@view
@external
def get_dx_underlying(
    i: int128,
    j: int128,
    dy: uint256,
    pool: address,
) -> uint256:

    BASE_POOL: address = StableSwapNG(pool).BASE_POOL()
    BASE_N_COINS: uint256 = StableSwapNG(pool).BASE_N_COINS()
    N_COINS: uint256 = StableSwapNG(pool).N_COINS()
    base_pool_has_static_fee: bool = self._has_static_fee(BASE_POOL)
    base_pool_lp_token: address = StableSwapNG(pool).coins(1)

    # CASE 1: Swap does not involve Metapool at all. In this case, we kindly ask the user
    # to use the right pool for their swaps.
    if min(i, j) > 0:
        raise "Not a Metapool Swap. Use Base pool."

    # CASE 2:
    #    1. meta token_0 of (unknown amount) > base pool lp_token
    #    2. base pool lp_token > calc_withdraw_one_coin gives dy amount of (j-1)th base coin
    # So, need to do the following calculations:
    #    1. calc_token_amounts on base pool for depositing liquidity on (j-1)th token > lp_tokens.
    #    2. get_dx on metapool for i = 0, and j = 1 (base lp token) with amt calculated in (1).
    if i == 0:
        # Calculate LP tokens that are burnt to receive dy amount of base_j tokens.
        lp_amount_burnt: uint256 = self._base_calc_token_amount(
            dy, j - 1, BASE_N_COINS, BASE_POOL, base_pool_lp_token, False,
        )
        return self._get_dx(0, 1, lp_amount_burnt, pool, False, N_COINS)

    # CASE 3: Swap in token i-1 from base pool and swap out dy amount of token 0 (j) from metapool.
    #    1. deposit i-1 token from base pool > receive base pool lp_token
    #    2. swap base pool lp token > 0th token of the metapool
    # So, need to do the following calculations:
    #    1. get_dx on metapool with i = 0, j = 1 > gives how many base lp tokens are required for receiving
    #       dy amounts of i-1 tokens from the metapool
    #    2. We have number of lp tokens: how many i-1 base pool coins are needed to mint that many tokens?
    #       We don't have a method where user inputs lp tokens and it gives number of coins of (i-1)th token
    #       is needed to mint that many base_lp_tokens. Instead, we will use calc_withdraw_one_coin. That's
    #       close enough.
    lp_amount_required: uint256 = self._get_dx(1, 0, dy, pool, False, N_COINS)
    return StableSwapNG(BASE_POOL).calc_withdraw_one_coin(lp_amount_required, i-1)


@view
@external
def get_dy_underlying(
    i: int128,
    j: int128,
    dx: uint256,
    pool: address,
) -> uint256:
    """
    @notice Calculate the current output dy given input dx on underlying
    @dev Index values can be found via the `coins` public getter method
    @param i Index value for the coin to send
    @param j Index valie of the coin to recieve
    @param dx Amount of `i` being exchanged
    @return Amount of `j` predicted
    """

    N_COINS: uint256 = StableSwapNG(pool).N_COINS()
    MAX_COIN: int128 = convert(N_COINS, int128) - 1
    BASE_POOL: address = StableSwapNG(pool).BASE_POOL()
    base_lp_token: address = StableSwapNG(pool).coins(1)

    rates: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    balances: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    xp: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    rates, balances, xp = self._get_rates_balances_xp(pool, N_COINS)

    x: uint256 = 0
    base_i: int128 = 0
    base_j: int128 = 0
    meta_i: int128 = 0
    meta_j: int128 = 0

    if i != 0:
        base_i = i - MAX_COIN
        meta_i = 1
    if j != 0:
        base_j = j - MAX_COIN
        meta_j = 1

    if i == 0:

        x = xp[i] + dx * rates[0] / 10**18

    else:

        if j == 0:

            # i is from BasePool
            base_n_coins: uint256 = StableSwapNG(pool).BASE_N_COINS()
            x = self._base_calc_token_amount(
                dx,
                base_i,
                base_n_coins,
                BASE_POOL,
                base_lp_token,
                True,
            ) * rates[1] / PRECISION

            # Adding number of pool tokens
            x += xp[1]

        else:
            # If both are from the base pool
            return StableSwapNG(BASE_POOL).get_dy(base_i, base_j, dx)

    # This pool is involved only when in-pool assets are used
    amp: uint256 = StableSwapNG(pool).A() * A_PRECISION
    D: uint256 = self.get_D(xp, amp, N_COINS)
    y: uint256 = self.get_y(meta_i, meta_j, x, xp, amp, D, N_COINS)
    dy: uint256 = xp[meta_j] - y - 1

    # calculate output after subtracting dynamic fee
    base_fee: uint256 = StableSwapNG(pool).fee()
    fee_multiplier: uint256 = StableSwapNG(pool).offpeg_fee_multiplier()

    dynamic_fee: uint256 = self._dynamic_fee((xp[meta_i] + x) / 2, (xp[meta_j] + y) / 2, base_fee, fee_multiplier)
    dy = (dy - dynamic_fee * dy / FEE_DENOMINATOR)

    # If output is going via the metapool
    if j == 0:
        dy = dy * 10**18 / rates[0]
    else:
        # j is from BasePool
        # The fee is already accounted for
        dy = StableSwapNG(BASE_POOL).calc_withdraw_one_coin(dy * PRECISION / rates[1], base_j)

    return dy


@view
@external
def calc_token_amount(
    _amounts: DynArray[uint256, MAX_COINS],
    _is_deposit: bool,
    pool: address
) -> uint256:
    """
    @notice Calculate addition or reduction in token supply from a deposit or withdrawal
    @dev Only works for StableswapNG pools and not legacy versions
    @param _amounts Amount of each coin being deposited
    @param _is_deposit set True for deposits, False for withdrawals
    @return Expected amount of LP tokens received
    """

    return self._calc_token_amount(
        _amounts,
        _is_deposit,
        pool,
        pool,
        StableSwapNG(pool).N_COINS()
    )


@view
@external
def calc_withdraw_one_coin(_burn_amount: uint256, i: int128, pool: address) -> uint256:
    # First, need to calculate
    # * Get current D
    # * Solve Eqn against y_i for D - _token_amount

    amp: uint256 = StableSwapNG(pool).A() * A_PRECISION
    N_COINS: uint256 = StableSwapNG(pool).N_COINS()

    rates: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    balances: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    xp: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    rates, balances, xp = self._get_rates_balances_xp(pool, N_COINS)

    D0: uint256 = self.get_D(xp, amp, N_COINS)

    total_supply: uint256 = StableSwapNG(pool).totalSupply()
    D1: uint256 = D0 - _burn_amount * D0 / total_supply
    new_y: uint256 = self.get_y_D(amp, i, xp, D1, N_COINS)
    ys: uint256 = (D0 + D1) / (2 * N_COINS)

    base_fee: uint256 = StableSwapNG(pool).fee() * N_COINS / (4 * (N_COINS - 1))
    fee_multiplier: uint256 = StableSwapNG(pool).offpeg_fee_multiplier()
    xp_reduced: DynArray[uint256, MAX_COINS] = xp
    xp_j: uint256 = 0
    xavg: uint256 = 0
    dynamic_fee: uint256 = 0

    for j in range(MAX_COINS):

        if j == N_COINS:
            break

        dx_expected: uint256 = 0
        xp_j = xp[j]
        if convert(j, int128) == i:
            dx_expected = xp_j * D1 / D0 - new_y
            xavg = (xp[j] + new_y) / 2
        else:
            dx_expected = xp_j - xp_j * D1 / D0
            xavg = xp[j]

        dynamic_fee = self._dynamic_fee(xavg, ys, base_fee, fee_multiplier)
        xp_reduced[j] = xp_j - dynamic_fee * dx_expected / FEE_DENOMINATOR

    dy: uint256 = xp_reduced[i] - self.get_y_D(amp, i, xp_reduced, D1, N_COINS)
    dy = (dy - 1) * PRECISION / rates[i]  # Withdraw less to account for rounding errors

    return dy


@view
@external
def dynamic_fee(i: int128, j: int128, pool:address) -> uint256:
    """
    @notice Return the fee for swapping between `i` and `j`
    @param i Index value for the coin to send
    @param j Index value of the coin to recieve
    @return Swap fee expressed as an integer with 1e10 precision
    """
    N_COINS: uint256 = StableSwapNG(pool).N_COINS()
    fee: uint256 = StableSwapNG(pool).fee()
    fee_multiplier: uint256 = StableSwapNG(pool).offpeg_fee_multiplier()

    rates: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    balances: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    xp: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    rates, balances, xp = self._get_rates_balances_xp(pool, N_COINS)

    return self._dynamic_fee(xp[i], xp[j], fee, fee_multiplier)


# ----------------------------- Utility Methods ------------------------------


@view
@internal
def _has_static_fee(pool: address) -> bool:

    success: bool = False
    response: Bytes[32] = b""
    success, response = raw_call(
        pool,
        concat(
            method_id("dynamic_fee(int128,int128)"),
            convert(1, bytes32),
            convert(0, bytes32)
        ),
        max_outsize=32,
        revert_on_failure=False,
        is_static_call=True
    )

    return success


@view
@internal
def _get_dx(
    i: int128,
    j: int128,
    dy: uint256,
    pool: address,
    static_fee: bool,
    N_COINS: uint256
) -> uint256:

    rates: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    balances: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    xp: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    rates, balances, xp = self._get_rates_balances_xp(pool, N_COINS)

    amp: uint256 = StableSwapNG(pool).A() * A_PRECISION
    D: uint256 = self.get_D(xp, amp, N_COINS)

    base_fee: uint256 = StableSwapNG(pool).fee()
    dy_with_fee: uint256 = dy * rates[j] / PRECISION + 1

    fee: uint256 = base_fee
    if not static_fee:
        fee_multiplier: uint256 = StableSwapNG(pool).offpeg_fee_multiplier()
        fee = self._dynamic_fee(xp[i], xp[j], base_fee, fee_multiplier)

    y: uint256 = xp[j] - dy_with_fee * FEE_DENOMINATOR / (FEE_DENOMINATOR - fee)
    x: uint256 = self.get_y(j, i, y, xp, amp, D, N_COINS)
    return (x - xp[i]) * PRECISION / rates[i]


@view
@internal
def _dynamic_fee(xpi: uint256, xpj: uint256, _fee: uint256, _fee_multiplier: uint256) -> uint256:

    if _fee_multiplier <= FEE_DENOMINATOR:
        return _fee

    xps2: uint256 = (xpi + xpj) ** 2
    return (
        (_fee_multiplier * _fee) /
        ((_fee_multiplier - FEE_DENOMINATOR) * 4 * xpi * xpj / xps2 + FEE_DENOMINATOR)
    )


@internal
@view
def _calc_token_amount(
    _amounts: DynArray[uint256, MAX_COINS],
    _is_deposit: bool,
    pool: address,
    pool_lp_token: address,
    n_coins: uint256,
) -> uint256:

    amp: uint256 = StableSwapNG(pool).A() * A_PRECISION

    rates: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    old_balances: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    xp: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])

    pool_is_ng: bool = raw_call(
        pool,
        method_id("D_ma_time()"),
        revert_on_failure=False,
        is_static_call=True
    )
    use_dynamic_fees: bool = True
    if pool_is_ng:
        rates, old_balances, xp = self._get_rates_balances_xp(pool, n_coins)
    else:
        use_dynamic_fees = False
        for i in range(n_coins, bound=MAX_COINS):
            rates.append(
                10 ** (36 - convert(ERC20Detailed(StableSwapNG(pool).coins(i)).decimals(), uint256))
            )
            old_balances.append(StableSwapNG(pool).balances(i))
            xp.append(rates[i] * old_balances[i] / PRECISION)

    # Initial invariant
    D0: uint256 = self.get_D(xp, amp, n_coins)

    total_supply: uint256 = StableSwapNG(pool_lp_token).totalSupply()
    new_balances: DynArray[uint256, MAX_COINS] = old_balances
    for i in range(n_coins, bound=MAX_COINS):
        amount: uint256 = _amounts[i]
        if _is_deposit:
            new_balances[i] += amount
        else:
            new_balances[i] -= amount

    # Invariant after change
    for idx in range(n_coins, bound=MAX_COINS):
        xp[idx] = rates[idx] * new_balances[idx] / PRECISION
    D1: uint256 = self.get_D(xp, amp, n_coins)

    # We need to recalculate the invariant accounting for fees
    # to calculate fair user's share
    D2: uint256 = D1
    fee_multiplier: uint256 = 0
    _dynamic_fee_i: uint256 = 0
    if total_supply > 0:

        # Only account for fees if we are not the first to deposit
        base_fee: uint256 = StableSwapNG(pool).fee() * n_coins / (4 * (n_coins - 1))
        if use_dynamic_fees:
            fee_multiplier = StableSwapNG(pool).offpeg_fee_multiplier()

        xs: uint256 = 0
        ys: uint256 = (D0 + D1) / n_coins

        for i in range(n_coins, bound=MAX_COINS):

            ideal_balance: uint256 = D1 * old_balances[i] / D0
            difference: uint256 = 0
            new_balance: uint256 = new_balances[i]
            if ideal_balance > new_balance:
                difference = ideal_balance - new_balance
            else:
                difference = new_balance - ideal_balance

            xs = rates[i] * (old_balances[i] + new_balance) / PRECISION

            # use dynamic fees only if pool is NG
            if use_dynamic_fees:
                _dynamic_fee_i = self._dynamic_fee(xs, ys, base_fee, fee_multiplier)
                new_balances[i] -= _dynamic_fee_i * difference / FEE_DENOMINATOR
            else:
                new_balances[i] -= base_fee * difference / FEE_DENOMINATOR

        for idx in range(n_coins, bound=MAX_COINS):
            xp[idx] = rates[idx] * new_balances[idx] / PRECISION

        D2 = self.get_D(xp, amp, n_coins)
    else:
        return D1  # Take the dust if there was any

    diff: uint256 = 0
    if _is_deposit:
        diff = D2 - D0
    else:
        diff = D0 - D2
    return diff * total_supply / D0


@internal
@view
def _base_calc_token_amount(
    dx: uint256,
    base_i: int128,
    base_n_coins: uint256,
    base_pool: address,
    base_pool_lp_token: address,
    is_deposit: bool,
) -> uint256:

    base_inputs: DynArray[uint256, MAX_COINS] = [0, 0, 0, 0, 0, 0, 0, 0]
    base_inputs[base_i] = dx

    return self._calc_token_amount(
        base_inputs,
        is_deposit,
        base_pool,
        base_pool_lp_token,
        base_n_coins
    )


@internal
@pure
def newton_y(b: uint256, c: uint256, D: uint256, _y: uint256) -> uint256:

    y_prev: uint256 = 0
    y: uint256 = _y

    for _i in range(255):
        y_prev = y
        y = (y*y + c) / (2 * y + b - D)
        # Equality with the precision of 1
        if y > y_prev:
            if y - y_prev <= 1:
                return y
        else:
            if y_prev - y <= 1:
                return y
    raise


@view
@internal
def get_y(
    i: int128,
    j: int128,
    x: uint256,
    xp: DynArray[uint256, MAX_COINS],
    _amp: uint256,
    _D: uint256,
    N_COINS: uint256
) -> uint256:
    """
    Calculate x[j] if one makes x[i] = x

    Done by solving quadratic equation iteratively.
    x_1**2 + x_1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n + 1) / (n ** (2 * n) * prod' * A)
    x_1**2 + b*x_1 = c

    x_1 = (x_1**2 + c) / (2*x_1 + b)
    """
    # x in the input is converted to the same price/precision

    assert i != j       # dev: same coin
    assert j >= 0       # dev: j below zero
    assert j < convert(N_COINS, int128)  # dev: j above N_COINS

    # should be unreachable, but good for safety
    assert i >= 0
    assert i < convert(N_COINS, int128)

    amp: uint256 = _amp
    D: uint256 = _D
    S_: uint256 = 0
    _x: uint256 = 0
    c: uint256 = D
    Ann: uint256 = amp * N_COINS

    for _i in range(MAX_COINS):

        if _i == N_COINS:
            break

        if  convert(_i, int128) == i:
            _x = x
        elif convert(_i, int128) != j:
            _x = xp[_i]
        else:
            continue
        S_ += _x
        c = c * D / (_x * N_COINS)

    c = c * D * A_PRECISION / (Ann * N_COINS)
    b: uint256 = S_ + D * A_PRECISION / Ann  # - D
    y: uint256 = D

    return self.newton_y(b, c, D, y)


@pure
@internal
def get_D(_xp: DynArray[uint256, MAX_COINS], _amp: uint256, N_COINS: uint256) -> uint256:
    """
    D invariant calculation in non-overflowing integer operations
    iteratively

    A * sum(x_i) * n**n + D = A * D * n**n + D**(n+1) / (n**n * prod(x_i))

    Converging solution:
    D[j+1] = (A * n**n * sum(x_i) - D[j]**(n+1) / (n**n prod(x_i))) / (A * n**n - 1)
    """
    S: uint256 = 0
    for i in range(MAX_COINS):
        if i == N_COINS:
            break
        S += _xp[i]

    if S == 0:
        return 0

    D: uint256 = S
    Ann: uint256 = _amp * N_COINS

    for i in range(255):

        D_P: uint256 = D
        for x in _xp:
            D_P = D_P * D / x
        D_P /= pow_mod256(N_COINS, N_COINS)
        Dprev: uint256 = D

        D = (Ann * S / A_PRECISION + D_P * N_COINS) * D / ((Ann - A_PRECISION) * D / A_PRECISION + (N_COINS + 1) * D_P)
        # Equality with the precision of 1
        if D > Dprev:
            if D - Dprev <= 1:
                return D
        else:
            if Dprev - D <= 1:
                return D
    # convergence typically occurs in 4 rounds or less, this should be unreachable!
    # if it does happen the pool is borked and LPs can withdraw via `remove_liquidity`
    raise


@pure
@internal
def get_y_D(
    A: uint256,
    i: int128,
    xp: DynArray[uint256, MAX_COINS],
    D: uint256,
    N_COINS: uint256
) -> uint256:
    """
    Calculate x[i] if one reduces D from being calculated for xp to D

    Done by solving quadratic equation iteratively.
    x_1**2 + x_1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n + 1) / (n ** (2 * n) * prod' * A)
    x_1**2 + b*x_1 = c

    x_1 = (x_1**2 + c) / (2*x_1 + b)
    """
    # x in the input is converted to the same price/precision

    N_COINS_128: int128 = convert(N_COINS, int128)
    assert i >= 0  # dev: i below zero
    assert i < N_COINS_128  # dev: i above N_COINS

    S_: uint256 = 0
    _x: uint256 = 0
    y_prev: uint256 = 0
    c: uint256 = D
    Ann: uint256 = A * N_COINS

    for _i in range(MAX_COINS):

        if _i == N_COINS:
            break

        if _i != convert(i, uint256):
            _x = xp[_i]
        else:
            continue
        S_ += _x
        c = c * D / (_x * N_COINS)

    c = c * D * A_PRECISION / (Ann * N_COINS)
    b: uint256 = S_ + D * A_PRECISION / Ann
    y: uint256 = D

    return self.newton_y(b, c, D, y)


@view
@internal
def _get_rates_balances_xp(pool: address, N_COINS: uint256) -> (
    DynArray[uint256, MAX_COINS],
    DynArray[uint256, MAX_COINS],
    DynArray[uint256, MAX_COINS],
):

    rates: DynArray[uint256, MAX_COINS] = StableSwapNG(pool).stored_rates()
    balances: DynArray[uint256, MAX_COINS] = StableSwapNG(pool).get_balances()
    xp: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS])
    for idx in range(MAX_COINS):
        if idx == N_COINS:
            break
        xp.append(rates[idx] * balances[idx] / PRECISION)

    return rates, balances, xp

Contract Security Audit

Contract ABI

API
[{"stateMutability":"view","type":"function","name":"get_dx","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dy","type":"uint256"},{"name":"pool","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dx","type":"uint256"},{"name":"pool","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dx_underlying","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dy","type":"uint256"},{"name":"pool","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dy_underlying","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dx","type":"uint256"},{"name":"pool","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"_amounts","type":"uint256[]"},{"name":"_is_deposit","type":"bool"},{"name":"pool","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"_burn_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"pool","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"dynamic_fee","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"pool","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"VERSION","inputs":[],"outputs":[{"name":"","type":"string"}]}]

6130b5610011610000396130b5610000f360003560e01c60026007820660011b6130a701601e39600051565b63ffa1ad74811861182e57346130a25760208060805260056040527f312e322e3000000000000000000000000000000000000000000000000000000060605260408160800181518152602082015160208201528051806020830101601f82600003163682375050601f19601f8251602001011690509050810190506080f361182e565b6383aa796a811861015d576084361034176130a25760043580600f0b81186130a257610cc05260243580600f0b81186130a257610ce0526064358060a01c6130a257610d0052610d00516329357750610d40526020610d406004610d5c845afa61010c573d600060003e3d6000fd5b60203d106130a257610d40905051610d20526020610cc05161054052610ce0516105605260443561058052610d00516105a05260006105c052610d20516105e052610158610d406120be565b610d40f35b63c02c60a6811861182e576084361034176130a25760043580600f0b81186130a2576110005260243580600f0b81186130a257611020526064358060a01c6130a25761104052611040516329357750611080526020611080600461109c845afa6101cc573d600060003e3d6000fd5b60203d106130a257611080905051611060526110605180607f1c6130a2576001810380600f0b81186130a257905061108052611040516371511a5e6110c05260206110c060046110dc845afa610227573d600060003e3d6000fd5b60203d106130a2576110c0518060a01c6130a257611100526111009050516110a0526110405163c66106576110e05260016111005260206110e060246110fc845afa610278573d600060003e3d6000fd5b60203d106130a2576110e0518060a01c6130a257611120526111209050516110c05260006110e05260006112005260006113205261104051604052611060516060526102c5611440611834565b611440805160208160051b01806110e0828560045afa5050506101208101805160208160051b0180611200828560045afa505050506102408101805160208160051b0180611320828560045afa505050505060a03661144037611000511561034b57611000516110805180820380600f0b81186130a257905090506114605260016114a0525b611020511561037857611020516110805180820380600f0b81186130a257905090506114805260016114c0525b611000516103e55761100051611320518110156130a25760051b61134001516044356110e051156130a257600060051b61110001518082028115838383041417156130a25790509050670de0b6b3a7640000810490508082018281106130a2579050905061144052610522565b611020516104ce5761104051633da575a1611500526020611500600461151c845afa610416573d600060003e3d6000fd5b60203d106130a2576115009050516114e052604435610e005261146051610e20526114e051610e40526110a051610e60526110c051610e80526001610ea052610460611500612e40565b6115005160026110e051106130a257600160051b61110001518082028115838383041417156130a25790509050670de0b6b3a7640000810490506114405261144051600261132051106130a257600160051b61134001518082018281106130a2579050905061144052610522565b60206110a051635e0d443f6114e052611460516115005261148051611520526044356115405260206114e060646114fc845afa610510573d600060003e3d6000fd5b60203d106130a2576114e0905061085c565b6110405163f446c1d0611500526020611500600461151c845afa61054b573d600060003e3d6000fd5b60203d106130a257611500905051606481028160648204186130a25790506114e0526113205160208160051b018060408261132060045afa5050506114e0516101605261106051610180526105a1611520611a0c565b61152051611500526114a051610120526114c0516101405261144051610160526113205160208160051b01806101808261132060045afa5050506114e0516102a052611500516102c052611060516102e0526105fe611540611e7b565b61154051611520526114c051611320518110156130a25760051b6113400151611520518082038281116130a25790509050600181038181116130a2579050611540526110405163ddca3f43611580526020611580600461159c845afa610669573d600060003e3d6000fd5b60203d106130a2576115809050516115605261104051638edfdd5f6115a05260206115a060046115bc845afa6106a4573d600060003e3d6000fd5b60203d106130a2576115a0905051611580526114a051611320518110156130a25760051b6113400151611440518082018281106130a257905090508060011c90506040526114c051611320518110156130a25760051b6113400151611520518082018281106130a257905090508060011c9050606052611560516080526115805160a0526107336115c0611c8f565b6115c0516115a052611540516115a051611540518082028115838383041417156130a257905090506402540be400810490508082038281116130a2579050905061154052611020516107ca5761154051670de0b6b3a7640000810281670de0b6b3a76400008204186130a25790506110e051156130a257600060051b611100015180156130a2578082049050905061154052610856565b6110a05163cc2b27d76115c05261154051670de0b6b3a7640000810281670de0b6b3a76400008204186130a257905060026110e051106130a257600160051b611100015180156130a257808204905090506115e052611480516116005260206115c060446115dc845afa610843573d600060003e3d6000fd5b60203d106130a2576115c0905051611540525b60206115405bf361182e565b630c601c2c811861182e576084361034176130a25760043580600f0b81186130a2576105405260243580600f0b81186130a257610560526064358060a01c6130a257610580526105805163293577506105c05260206105c060046105dc845afa6108d1573d600060003e3d6000fd5b60203d106130a2576105c09050516105a05260006105c05260006106e052600061080052610580516040526105a05160605261090e610920611834565b610920805160208160051b01806105c0828560045afa5050506101208101805160208160051b01806106e0828560045afa505050506102408101805160208160051b0180610800828560045afa50505050506105805163f446c1d0610940526020610940600461095c845afa610989573d600060003e3d6000fd5b60203d106130a257610940905051606481028160648204186130a2579050610920526108005160208160051b018060408261080060045afa50505061092051610160526105a051610180526109df610960611a0c565b610960516109405261054051610800518110156130a25760051b6108200151604435610540516105c0518110156130a25760051b6105e001518082028115838383041417156130a25790509050670de0b6b3a7640000810490508082018281106130a25790509050610960526105405161012052610560516101405261096051610160526108005160208160051b01806101808261080060045afa505050610920516102a052610940516102c0526105a0516102e052610aa06109a0611e7b565b6109a0516109805261056051610800518110156130a25760051b6108200151610980518082038281116130a25790509050600181038181116130a25790506109a0526105805163ddca3f436109e05260206109e060046109fc845afa610b0b573d600060003e3d6000fd5b60203d106130a2576109e09050516109c05261058051638edfdd5f610a00526020610a006004610a1c845afa610b46573d600060003e3d6000fd5b60203d106130a257610a009050516109e05261054051610800518110156130a25760051b6108200151610960518082018281106130a257905090508060011c905060405261056051610800518110156130a25760051b6108200151610980518082018281106130a257905090508060011c90506060526109c0516080526109e05160a052610bd5610a20611c8f565b610a20516109a0518082028115838383041417156130a257905090506402540be40081049050610a00526109a051610a00518082038281116130a25790509050670de0b6b3a7640000810281670de0b6b3a76400008204186130a2579050610560516105c0518110156130a25760051b6105e0015180156130a25780820490509050610a20526020610a20f361182e565b63d6fc10ab811861182e576084361034176130a25760043580600f0b81186130a2576110005260243580600f0b81186130a257611020526064358060a01c6130a25761104052611040516371511a5e611080526020611080600461109c845afa610cd5573d600060003e3d6000fd5b60203d106130a257611080518060a01c6130a2576110c0526110c09050516110605261104051633da575a16110a05260206110a060046110bc845afa610d20573d600060003e3d6000fd5b60203d106130a2576110a0905051611080526110405163293577506110c05260206110c060046110dc845afa610d5b573d600060003e3d6000fd5b60203d106130a2576110c09050516110a05261106051604052610d7f6110e0612424565b6110e0516110c0526110405163c6610657611100526001611120526020611100602461111c845afa610db6573d600060003e3d6000fd5b60203d106130a257611100518060a01c6130a257611140526111409050516110e052600161100051611020518082811882841202189050905012610e7f576023611100527f4e6f742061204d657461706f6f6c20537761702e20557365204261736520706f611120527f6f6c2e00000000000000000000000000000000000000000000000000000000006111405261110050611100518061112001601f826000031636823750506308c379a06110c05260206110e052601f19601f6111005101166044016110dcfd5b61100051610f1657604435610e0052611020516001810380600f0b81186130a2579050610e205261108051610e405261106051610e60526110e051610e80526000610ea052610ecf611120612e40565b611120516111005260206000610540526001610560526111005161058052611040516105a05260006105c0526110a0516105e052610f0e6111206120be565b611120610fab565b60016105405260006105605260443561058052611040516105a05260006105c0526110a0516105e052610f4a6111206120be565b611120516111005260206110605163cc2b27d7611120526111005161114052611000516001810380600f0b81186130a2579050611160526020611120604461113c845afa610f9d573d600060003e3d6000fd5b60203d106130a25761112090505bf361182e565b63fb79eb278118611084576084361034176130a25760043560040160088135116130a257803560208160051b018083610e00375050506024358060011c6130a257610f20526044358060a01c6130a257610f40526020610e005160208160051b018061054082610e0060045afa505050610f205161066052610f405161068052610f40516106a052610f40516329357750610f60526020610f606004610f7c845afa611062573d600060003e3d6000fd5b60203d106130a257610f609050516106c05261107f610fa06124d7565b610fa0f35b63a63530bd811861182e576064361034176130a25760043580600f0b81186130a2576105405260243580600f0b81186130a257610560526044358060a01c6130a257610580526105805163293577506105c05260206105c060046105dc845afa6110f3573d600060003e3d6000fd5b60203d106130a2576105c09050516105a0526105805163ddca3f436105e05260206105e060046105fc845afa61112e573d600060003e3d6000fd5b60203d106130a2576105e09050516105c05261058051638edfdd5f610600526020610600600461061c845afa611169573d600060003e3d6000fd5b60203d106130a2576106009050516105e052600061060052600061072052600061084052610580516040526105a0516060526111a6610960611834565b610960805160208160051b0180610600828560045afa5050506101208101805160208160051b0180610720828560045afa505050506102408101805160208160051b0180610840828560045afa5050505050602061054051610840518110156130a25760051b610860015160405261056051610840518110156130a25760051b61086001516060526105c0516080526105e05160a052611247610960611c8f565b610960f361182e565b63b54e9f05811861182e576064361034176130a25760243580600f0b81186130a257610540526044358060a01c6130a257610560526105605163f446c1d06105a05260206105a060046105bc845afa6112ae573d600060003e3d6000fd5b60203d106130a2576105a0905051606481028160648204186130a2579050610580526105605163293577506105c05260206105c060046105dc845afa6112f9573d600060003e3d6000fd5b60203d106130a2576105c09050516105a05260006105c05260006106e052600061080052610560516040526105a051606052611336610920611834565b610920805160208160051b01806105c0828560045afa5050506101208101805160208160051b01806106e0828560045afa505050506102408101805160208160051b0180610800828560045afa50505050506108005160208160051b018060408261080060045afa50505061058051610160526105a051610180526113bc610940611a0c565b6109405161092052610560516318160ddd610960526020610960600461097c845afa6113ed573d600060003e3d6000fd5b60203d106130a2576109609050516109405261092051600435610920518082028115838383041417156130a257905090506109405180156130a257808204905090508082038281116130a2579050905061096052610580516101205261054051610140526108005160208160051b01806101608261080060045afa50505061096051610280526105a0516102a0526114866109a0612eb7565b6109a0516109805261092051610960518082018281106130a257905090506105a0518060011b818160011c186130a257905080156130a257808204905090506109a0526105605163ddca3f436109e05260206109e060046109fc845afa6114f2573d600060003e3d6000fd5b60203d106130a2576109e09050516105a0518082028115838383041417156130a257905090506105a051600181038181116130a25790508060021b818160021c186130a257905080156130a257808204905090506109c05261056051638edfdd5f610a00526020610a006004610a1c845afa611573573d600060003e3d6000fd5b60203d106130a257610a009050516109e0526108005160208160051b0180610a008261080060045afa505050606036610b203760006008905b80610b80526105a051610b8051186115c35761175c565b6000610ba052610b8051610800518110156130a25760051b6108200151610b205261054051610b805180607f1c6130a2571861167457610b2051610960518082028115838383041417156130a257905090506109205180156130a25780820490509050610980518082038281116130a25790509050610ba052610b8051610800518110156130a25760051b6108200151610980518082018281106130a257905090508060011c9050610b40526116d3565b610b2051610b2051610960518082028115838383041417156130a257905090506109205180156130a257808204905090508082038281116130a25790509050610ba052610b8051610800518110156130a25760051b6108200151610b40525b610b40516040526109a0516060526109c0516080526109e05160a0526116fa610bc0611c8f565b610bc051610b6052610b2051610b6051610ba0518082028115838383041417156130a257905090506402540be400810490508082038281116130a25790509050610b8051610a00518110156130a25760051b610a2001526001018181186115ac575b505061054051610a00518110156130a25760051b610a20015161058051610120526105405161014052610a005160208160051b018061016082610a0060045afa50505061096051610280526105a0516102a0526117ba610ba0612eb7565b610ba0518082038281116130a25790509050610b8052610b8051600181038181116130a2579050670de0b6b3a7640000810281670de0b6b3a76400008204186130a2579050610540516105c0518110156130a25760051b6105e0015180156130a25780820490509050610b80526020610b80f35b60006000fd5b60405163fd0684b16101a0526101406101a060046101bc845afa61185d573d600060003e3d6000fd5b60403d106130a2576101a0516101a00160088151116130a257805160208160051b0180610300828560045afa505050506103009050805160208160051b01806080828560045afa505050506040516314f059796102c0526101406102c060046102dc845afa6118d1573d600060003e3d6000fd5b60403d106130a2576102c0516102c00160088151116130a257805160208160051b0180610420828560045afa505050506104209050805160208160051b01806101a0828560045afa5050505060006102c05260006008905b806103e0526060516103e0511861193f576119b5565b6102c051600781116130a2576103e0516080518110156130a25760051b60a001516103e0516101a0518110156130a25760051b6101c001518082028115838383041417156130a25790509050670de0b6b3a7640000810490508160051b6102e00152600181016102c05250600101818118611929575b505060805160208160051b01808382608060045afa5050506101a05160208160051b0161012083018181836101a060045afa505050506102c05160208160051b0161024083018181836102c060045afa5050505050565b60006101a05260006008905b806101c052610180516101c05118611a2f57611a65565b6101a0516101c0516040518110156130a25760051b606001518082018281106130a257905090506101a052600101818118611a18575b50506101a051611a79576000815250611c8d565b6101a0516101c05261016051610180518082028115838383041417156130a257905090506101e052600060ff905b80610200526101c051610220526000604051600881116130a2578015611b1157905b8060051b6060015161024052610220516101c0518082028115838383041417156130a257905090506102405180156130a2578082049050905061022052600101818118611ac9575b50506102205161018051610180510a80156130a25780820490509050610220526101c051610240526101e0516101a0518082028115838383041417156130a2579050905060648104905061022051610180518082028115838383041417156130a257905090508082018281106130a257905090506101c0518082028115838383041417156130a257905090506101e051606481038181116130a25790506101c0518082028115838383041417156130a2579050905060648104905061018051600181018181106130a2579050610220518082028115838383041417156130a257905090508082018281106130a2579050905080156130a257808204905090506101c052610240516101c05111611c50576001610240516101c0518082038281116130a2579050905011611c7b576101c0518352505050611c8d56611c7b565b60016101c051610240518082038281116130a2579050905011611c7b576101c0518352505050611c8d565b600101818118611aa757505060006000fd5b565b6402540be40060a05111611ca857608051815250611d7a565b6040516060518082018281106130a257905090506fffffffffffffffffffffffffffffffff81116130a2576002810a905060c05260a0516080518082028115838383041417156130a2579050905060a0516402540be40081038181116130a25790508060021b818160021c186130a25790506040518082028115838383041417156130a257905090506060518082028115838383041417156130a2579050905060c05180156130a257808204905090506402540be40081018181106130a257905080156130a257808204905090508152505b565b600060c05260a05160e052600060ff905b806101005260e05160c05260e05160e0518082028115838383041417156130a257905090506060518082018281106130a2579050905060e0518060011b818160011c186130a25790506040518082018281106130a257905090506080518082038281116130a2579050905080156130a2578082049050905060e05260c05160e05111611e3f57600160c05160e0518082038281116130a2579050905011611e675760e0518352505050611e7956611e67565b600160e05160c0518082038281116130a2579050905011611e675760e0518352505050611e79565b600101818118611d8d57505060006000fd5b565b6101405161012051146130a257600061014051126130a2576102e05180607f1c6130a2576101405112156130a257600061012051126130a2576102e05180607f1c6130a2576101205112156130a2576102a051610300526102c05161032052604036610340376103205161038052610300516102e0518082028115838383041417156130a257905090506103a05260006008905b806103c0526102e0516103c05118611f2657611ff0565b610120516103c05180607f1c6130a25718611f48576101605161036052611f81565b610140516103c05180607f1c6130a25714611fe5576103c051610180518110156130a25760051b6101a0015161036052611f8156611fe5565b61034051610360518082018281106130a257905090506103405261038051610320518082028115838383041417156130a25790509050610360516102e0518082028115838383041417156130a2579050905080156130a25780820490509050610380525b600101818118611f0f575b505061038051610320518082028115838383041417156130a25790509050606481028160648204186130a25790506103a0516102e0518082028115838383041417156130a2579050905080156130a25780820490509050610380526103405161032051606481028160648204186130a25790506103a05180156130a257808204905090508082018281106130a257905090506103c052610320516103e0526103c05160405261038051606052610320516080526103e05160a0526120b5610400611d7c565b61040051815250565b6000610600526000610720526000610840526105a0516040526105e0516060526120e9610960611834565b610960805160208160051b0180610600828560045afa5050506101208101805160208160051b0180610720828560045afa505050506102408101805160208160051b0180610840828560045afa50505050506105a05163f446c1d0610980526020610980600461099c845afa612164573d600060003e3d6000fd5b60203d106130a257610980905051606481028160648204186130a2579050610960526108405160208160051b018060408261084060045afa50505061096051610160526105e051610180526121ba6109a0611a0c565b6109a051610980526105a05163ddca3f436109c05260206109c060046109dc845afa6121eb573d600060003e3d6000fd5b60203d106130a2576109c09050516109a0526105805161056051610600518110156130a25760051b61062001518082028115838383041417156130a25790509050670de0b6b3a764000081049050600181018181106130a25790506109c0526109a0516109e0526105c0516122eb576105a051638edfdd5f610a20526020610a206004610a3c845afa612283573d600060003e3d6000fd5b60203d106130a257610a20905051610a005261054051610840518110156130a25760051b610860015160405261056051610840518110156130a25760051b61086001516060526109a051608052610a005160a0526122e2610a20611c8f565b610a20516109e0525b61056051610840518110156130a25760051b61086001516109c0516402540be4008102816402540be4008204186130a25790506109e051806402540be400036402540be40081116130a257905080156130a257808204905090508082038281116130a25790509050610a005261056051610120526105405161014052610a0051610160526108405160208160051b01806101808261084060045afa505050610960516102a052610980516102c0526105e0516102e0526123ac610a40611e7b565b610a4051610a2052610a205161054051610840518110156130a25760051b61086001518082038281116130a25790509050670de0b6b3a7640000810281670de0b6b3a76400008204186130a257905061054051610600518110156130a25760051b610620015180156130a25780820490509050815250565b6040366060376040515a6000600460c0527f76a9cd3e0000000000000000000000000000000000000000000000000000000060e05260c0805160208201836101200181518152505080830192505050600181610120015260208101905060008161012001526020810190508061010052610100505060206101a0610100516101208585fa905090506060523d602081183d6020100218610180526101808051608052602081015160a05250606051815250565b6106805163f446c1d0610700526020610700600461071c845afa612500573d600060003e3d6000fd5b60203d106130a257610700905051606481028160648204186130a25790506106e052600061070052600061082052600061094052610680515a6004610a80527f9c4258c400000000000000000000000000000000000000000000000000000000610aa052610a805060006000610a8051610aa08585fa90509050610a60526001610a8052610a6051612755576000610a805260006106c051600881116130a257801561274e57905b80610aa05261070051600781116130a2576106805163c6610657610ac052610aa051610ae0526020610ac06024610adc845afa6125ea573d600060003e3d6000fd5b60203d106130a257610ac0518060a01c6130a257610b0052610b0090505163313ce567610b20526020610b206004610b3c845afa61262d573d600060003e3d6000fd5b60203d106130a257610b20518060081c6130a257610b6052610b6090505180602403602481116130a2579050604d81116130a25780600a0a90508160051b610720015260018101610700525061082051600781116130a25761068051634903b0d1610ac052610aa051610ae0526020610ac06024610adc845afa6126b6573d600060003e3d6000fd5b60203d106130a257610ac09050518160051b610840015260018101610820525061094051600781116130a257610aa051610700518110156130a25760051b6107200151610aa051610820518110156130a25760051b61084001518082028115838383041417156130a25790509050670de0b6b3a7640000810490508160051b61096001526001810161094052506001018181186125a8575b50506127c1565b610680516040526106c05160605261276e610aa0611834565b610aa0805160208160051b0180610700828560045afa5050506101208101805160208160051b0180610820828560045afa505050506102408101805160208160051b0180610940828560045afa50505050505b6109405160208160051b018060408261094060045afa5050506106e051610160526106c051610180526127f5610ac0611a0c565b610ac051610aa0526106a0516318160ddd610ae0526020610ae06004610afc845afa612826573d600060003e3d6000fd5b60203d106130a257610ae0905051610ac0526108205160208160051b0180610ae08261082060045afa50505060006106c051600881116130a25780156128fb57905b80610c0052610c0051610540518110156130a25760051b6105600151610c2052610660516128c257610c0051610ae0518110156130a25760051b610b00018051610c20518082038281116130a257905090508152506128f0565b610c0051610ae0518110156130a25760051b610b00018051610c20518082018281106130a257905090508152505b600101818118612868575b505060006106c051600881116130a257801561298957905b80610c0052610c0051610700518110156130a25760051b6107200151610c0051610ae0518110156130a25760051b610b0001518082028115838383041417156130a25790509050670de0b6b3a764000081049050610c0051610940518110156130a25760051b6109600152600101818118612913575b50506109405160208160051b018060408261094060045afa5050506106e051610160526106c051610180526129bf610c20611a0c565b610c2051610c0052610c0051610c2052604036610c4037610ac05115612db9576106805163ddca3f43610ca0526020610ca06004610cbc845afa612a08573d600060003e3d6000fd5b60203d106130a257610ca09050516106c0518082028115838383041417156130a257905090506106c051600181038181116130a25790508060021b818160021c186130a257905080156130a25780820490509050610c8052610a805115612aa55761068051638edfdd5f610ca0526020610ca06004610cbc845afa612a92573d600060003e3d6000fd5b60203d106130a257610ca0905051610c40525b6000610ca052610aa051610c00518082018281106130a257905090506106c05180156130a25780820490509050610cc05260006106c051600881116130a2578015612ce857905b80610ce052610c0051610ce051610820518110156130a25760051b61084001518082028115838383041417156130a25790509050610aa05180156130a25780820490509050610d00526000610d2052610ce051610ae0518110156130a25760051b610b000151610d4052610d4051610d005111612b8257610d4051610d00518082038281116130a25790509050610d2052612b9d565b610d0051610d40518082038281116130a25790509050610d20525b610ce051610700518110156130a25760051b6107200151610ce051610820518110156130a25760051b6108400151610d40518082018281106130a257905090508082028115838383041417156130a25790509050670de0b6b3a764000081049050610ca052610a8051612c5e57610ce051610ae0518110156130a25760051b610b00018051610c8051610d20518082028115838383041417156130a257905090506402540be400810490508082038281116130a25790509050815250612cdd565b610ca051604052610cc051606052610c8051608052610c405160a052612c85610d60611c8f565b610d6051610c6052610ce051610ae0518110156130a25760051b610b00018051610c6051610d20518082028115838383041417156130a257905090506402540be400810490508082038281116130a257905090508152505b600101818118612aec575b505060006106c051600881116130a2578015612d7657905b80610ce052610ce051610700518110156130a25760051b6107200151610ce051610ae0518110156130a25760051b610b0001518082028115838383041417156130a25790509050670de0b6b3a764000081049050610ce051610940518110156130a25760051b6109600152600101818118612d00575b50506109405160208160051b018060408261094060045afa5050506106e051610160526106c05161018052612dac610ce0611a0c565b610ce051610c2052612dc5565b610c0051815250612e3e565b6000610c805261066051612df257610aa051610c20518082038281116130a25790509050610c8052612e0d565b610c2051610aa0518082038281116130a25790509050610c80525b610c8051610ac0518082028115838383041417156130a25790509050610aa05180156130a257808204905090508152505b565b61010036610ee0376008610ec052610e0051610e2051610ec0518110156130a25760051b610ee00152610ec05160208160051b018061054082610ec060045afa505050610ea05161066052610e605161068052610e80516106a052610e40516106c052612eae610fe06124d7565b610fe051815250565b6102a05180607f1c6130a2576102c052600061014051126130a2576102c0516101405112156130a2576060366102e0376102805161034052610120516102a0518082028115838383041417156130a257905090506103605260006008905b80610380526102a0516103805118612f2c57612fd4565b61014051600081126130a2576103805114612fc95761038051610160518110156130a25760051b610180015161030052612f6556612fc9565b6102e051610300518082018281106130a257905090506102e05261034051610280518082028115838383041417156130a25790509050610300516102a0518082028115838383041417156130a2579050905080156130a25780820490509050610340525b600101818118612f15575b505061034051610280518082028115838383041417156130a25790509050606481028160648204186130a2579050610360516102a0518082028115838383041417156130a2579050905080156130a25780820490509050610340526102e05161028051606481028160648204186130a25790506103605180156130a257808204905090508082018281106130a2579050905061038052610280516103a0526103805160405261034051606052610280516080526103a05160a0526130996103c0611d7c565b6103c051815250565b600080fd182e0c660fb10862009d1250001a841930b5810e00a16576797065728300030a0014

Deployed Bytecode

0x60003560e01c60026007820660011b6130a701601e39600051565b63ffa1ad74811861182e57346130a25760208060805260056040527f312e322e3000000000000000000000000000000000000000000000000000000060605260408160800181518152602082015160208201528051806020830101601f82600003163682375050601f19601f8251602001011690509050810190506080f361182e565b6383aa796a811861015d576084361034176130a25760043580600f0b81186130a257610cc05260243580600f0b81186130a257610ce0526064358060a01c6130a257610d0052610d00516329357750610d40526020610d406004610d5c845afa61010c573d600060003e3d6000fd5b60203d106130a257610d40905051610d20526020610cc05161054052610ce0516105605260443561058052610d00516105a05260006105c052610d20516105e052610158610d406120be565b610d40f35b63c02c60a6811861182e576084361034176130a25760043580600f0b81186130a2576110005260243580600f0b81186130a257611020526064358060a01c6130a25761104052611040516329357750611080526020611080600461109c845afa6101cc573d600060003e3d6000fd5b60203d106130a257611080905051611060526110605180607f1c6130a2576001810380600f0b81186130a257905061108052611040516371511a5e6110c05260206110c060046110dc845afa610227573d600060003e3d6000fd5b60203d106130a2576110c0518060a01c6130a257611100526111009050516110a0526110405163c66106576110e05260016111005260206110e060246110fc845afa610278573d600060003e3d6000fd5b60203d106130a2576110e0518060a01c6130a257611120526111209050516110c05260006110e05260006112005260006113205261104051604052611060516060526102c5611440611834565b611440805160208160051b01806110e0828560045afa5050506101208101805160208160051b0180611200828560045afa505050506102408101805160208160051b0180611320828560045afa505050505060a03661144037611000511561034b57611000516110805180820380600f0b81186130a257905090506114605260016114a0525b611020511561037857611020516110805180820380600f0b81186130a257905090506114805260016114c0525b611000516103e55761100051611320518110156130a25760051b61134001516044356110e051156130a257600060051b61110001518082028115838383041417156130a25790509050670de0b6b3a7640000810490508082018281106130a2579050905061144052610522565b611020516104ce5761104051633da575a1611500526020611500600461151c845afa610416573d600060003e3d6000fd5b60203d106130a2576115009050516114e052604435610e005261146051610e20526114e051610e40526110a051610e60526110c051610e80526001610ea052610460611500612e40565b6115005160026110e051106130a257600160051b61110001518082028115838383041417156130a25790509050670de0b6b3a7640000810490506114405261144051600261132051106130a257600160051b61134001518082018281106130a2579050905061144052610522565b60206110a051635e0d443f6114e052611460516115005261148051611520526044356115405260206114e060646114fc845afa610510573d600060003e3d6000fd5b60203d106130a2576114e0905061085c565b6110405163f446c1d0611500526020611500600461151c845afa61054b573d600060003e3d6000fd5b60203d106130a257611500905051606481028160648204186130a25790506114e0526113205160208160051b018060408261132060045afa5050506114e0516101605261106051610180526105a1611520611a0c565b61152051611500526114a051610120526114c0516101405261144051610160526113205160208160051b01806101808261132060045afa5050506114e0516102a052611500516102c052611060516102e0526105fe611540611e7b565b61154051611520526114c051611320518110156130a25760051b6113400151611520518082038281116130a25790509050600181038181116130a2579050611540526110405163ddca3f43611580526020611580600461159c845afa610669573d600060003e3d6000fd5b60203d106130a2576115809050516115605261104051638edfdd5f6115a05260206115a060046115bc845afa6106a4573d600060003e3d6000fd5b60203d106130a2576115a0905051611580526114a051611320518110156130a25760051b6113400151611440518082018281106130a257905090508060011c90506040526114c051611320518110156130a25760051b6113400151611520518082018281106130a257905090508060011c9050606052611560516080526115805160a0526107336115c0611c8f565b6115c0516115a052611540516115a051611540518082028115838383041417156130a257905090506402540be400810490508082038281116130a2579050905061154052611020516107ca5761154051670de0b6b3a7640000810281670de0b6b3a76400008204186130a25790506110e051156130a257600060051b611100015180156130a2578082049050905061154052610856565b6110a05163cc2b27d76115c05261154051670de0b6b3a7640000810281670de0b6b3a76400008204186130a257905060026110e051106130a257600160051b611100015180156130a257808204905090506115e052611480516116005260206115c060446115dc845afa610843573d600060003e3d6000fd5b60203d106130a2576115c0905051611540525b60206115405bf361182e565b630c601c2c811861182e576084361034176130a25760043580600f0b81186130a2576105405260243580600f0b81186130a257610560526064358060a01c6130a257610580526105805163293577506105c05260206105c060046105dc845afa6108d1573d600060003e3d6000fd5b60203d106130a2576105c09050516105a05260006105c05260006106e052600061080052610580516040526105a05160605261090e610920611834565b610920805160208160051b01806105c0828560045afa5050506101208101805160208160051b01806106e0828560045afa505050506102408101805160208160051b0180610800828560045afa50505050506105805163f446c1d0610940526020610940600461095c845afa610989573d600060003e3d6000fd5b60203d106130a257610940905051606481028160648204186130a2579050610920526108005160208160051b018060408261080060045afa50505061092051610160526105a051610180526109df610960611a0c565b610960516109405261054051610800518110156130a25760051b6108200151604435610540516105c0518110156130a25760051b6105e001518082028115838383041417156130a25790509050670de0b6b3a7640000810490508082018281106130a25790509050610960526105405161012052610560516101405261096051610160526108005160208160051b01806101808261080060045afa505050610920516102a052610940516102c0526105a0516102e052610aa06109a0611e7b565b6109a0516109805261056051610800518110156130a25760051b6108200151610980518082038281116130a25790509050600181038181116130a25790506109a0526105805163ddca3f436109e05260206109e060046109fc845afa610b0b573d600060003e3d6000fd5b60203d106130a2576109e09050516109c05261058051638edfdd5f610a00526020610a006004610a1c845afa610b46573d600060003e3d6000fd5b60203d106130a257610a009050516109e05261054051610800518110156130a25760051b6108200151610960518082018281106130a257905090508060011c905060405261056051610800518110156130a25760051b6108200151610980518082018281106130a257905090508060011c90506060526109c0516080526109e05160a052610bd5610a20611c8f565b610a20516109a0518082028115838383041417156130a257905090506402540be40081049050610a00526109a051610a00518082038281116130a25790509050670de0b6b3a7640000810281670de0b6b3a76400008204186130a2579050610560516105c0518110156130a25760051b6105e0015180156130a25780820490509050610a20526020610a20f361182e565b63d6fc10ab811861182e576084361034176130a25760043580600f0b81186130a2576110005260243580600f0b81186130a257611020526064358060a01c6130a25761104052611040516371511a5e611080526020611080600461109c845afa610cd5573d600060003e3d6000fd5b60203d106130a257611080518060a01c6130a2576110c0526110c09050516110605261104051633da575a16110a05260206110a060046110bc845afa610d20573d600060003e3d6000fd5b60203d106130a2576110a0905051611080526110405163293577506110c05260206110c060046110dc845afa610d5b573d600060003e3d6000fd5b60203d106130a2576110c09050516110a05261106051604052610d7f6110e0612424565b6110e0516110c0526110405163c6610657611100526001611120526020611100602461111c845afa610db6573d600060003e3d6000fd5b60203d106130a257611100518060a01c6130a257611140526111409050516110e052600161100051611020518082811882841202189050905012610e7f576023611100527f4e6f742061204d657461706f6f6c20537761702e20557365204261736520706f611120527f6f6c2e00000000000000000000000000000000000000000000000000000000006111405261110050611100518061112001601f826000031636823750506308c379a06110c05260206110e052601f19601f6111005101166044016110dcfd5b61100051610f1657604435610e0052611020516001810380600f0b81186130a2579050610e205261108051610e405261106051610e60526110e051610e80526000610ea052610ecf611120612e40565b611120516111005260206000610540526001610560526111005161058052611040516105a05260006105c0526110a0516105e052610f0e6111206120be565b611120610fab565b60016105405260006105605260443561058052611040516105a05260006105c0526110a0516105e052610f4a6111206120be565b611120516111005260206110605163cc2b27d7611120526111005161114052611000516001810380600f0b81186130a2579050611160526020611120604461113c845afa610f9d573d600060003e3d6000fd5b60203d106130a25761112090505bf361182e565b63fb79eb278118611084576084361034176130a25760043560040160088135116130a257803560208160051b018083610e00375050506024358060011c6130a257610f20526044358060a01c6130a257610f40526020610e005160208160051b018061054082610e0060045afa505050610f205161066052610f405161068052610f40516106a052610f40516329357750610f60526020610f606004610f7c845afa611062573d600060003e3d6000fd5b60203d106130a257610f609050516106c05261107f610fa06124d7565b610fa0f35b63a63530bd811861182e576064361034176130a25760043580600f0b81186130a2576105405260243580600f0b81186130a257610560526044358060a01c6130a257610580526105805163293577506105c05260206105c060046105dc845afa6110f3573d600060003e3d6000fd5b60203d106130a2576105c09050516105a0526105805163ddca3f436105e05260206105e060046105fc845afa61112e573d600060003e3d6000fd5b60203d106130a2576105e09050516105c05261058051638edfdd5f610600526020610600600461061c845afa611169573d600060003e3d6000fd5b60203d106130a2576106009050516105e052600061060052600061072052600061084052610580516040526105a0516060526111a6610960611834565b610960805160208160051b0180610600828560045afa5050506101208101805160208160051b0180610720828560045afa505050506102408101805160208160051b0180610840828560045afa5050505050602061054051610840518110156130a25760051b610860015160405261056051610840518110156130a25760051b61086001516060526105c0516080526105e05160a052611247610960611c8f565b610960f361182e565b63b54e9f05811861182e576064361034176130a25760243580600f0b81186130a257610540526044358060a01c6130a257610560526105605163f446c1d06105a05260206105a060046105bc845afa6112ae573d600060003e3d6000fd5b60203d106130a2576105a0905051606481028160648204186130a2579050610580526105605163293577506105c05260206105c060046105dc845afa6112f9573d600060003e3d6000fd5b60203d106130a2576105c09050516105a05260006105c05260006106e052600061080052610560516040526105a051606052611336610920611834565b610920805160208160051b01806105c0828560045afa5050506101208101805160208160051b01806106e0828560045afa505050506102408101805160208160051b0180610800828560045afa50505050506108005160208160051b018060408261080060045afa50505061058051610160526105a051610180526113bc610940611a0c565b6109405161092052610560516318160ddd610960526020610960600461097c845afa6113ed573d600060003e3d6000fd5b60203d106130a2576109609050516109405261092051600435610920518082028115838383041417156130a257905090506109405180156130a257808204905090508082038281116130a2579050905061096052610580516101205261054051610140526108005160208160051b01806101608261080060045afa50505061096051610280526105a0516102a0526114866109a0612eb7565b6109a0516109805261092051610960518082018281106130a257905090506105a0518060011b818160011c186130a257905080156130a257808204905090506109a0526105605163ddca3f436109e05260206109e060046109fc845afa6114f2573d600060003e3d6000fd5b60203d106130a2576109e09050516105a0518082028115838383041417156130a257905090506105a051600181038181116130a25790508060021b818160021c186130a257905080156130a257808204905090506109c05261056051638edfdd5f610a00526020610a006004610a1c845afa611573573d600060003e3d6000fd5b60203d106130a257610a009050516109e0526108005160208160051b0180610a008261080060045afa505050606036610b203760006008905b80610b80526105a051610b8051186115c35761175c565b6000610ba052610b8051610800518110156130a25760051b6108200151610b205261054051610b805180607f1c6130a2571861167457610b2051610960518082028115838383041417156130a257905090506109205180156130a25780820490509050610980518082038281116130a25790509050610ba052610b8051610800518110156130a25760051b6108200151610980518082018281106130a257905090508060011c9050610b40526116d3565b610b2051610b2051610960518082028115838383041417156130a257905090506109205180156130a257808204905090508082038281116130a25790509050610ba052610b8051610800518110156130a25760051b6108200151610b40525b610b40516040526109a0516060526109c0516080526109e05160a0526116fa610bc0611c8f565b610bc051610b6052610b2051610b6051610ba0518082028115838383041417156130a257905090506402540be400810490508082038281116130a25790509050610b8051610a00518110156130a25760051b610a2001526001018181186115ac575b505061054051610a00518110156130a25760051b610a20015161058051610120526105405161014052610a005160208160051b018061016082610a0060045afa50505061096051610280526105a0516102a0526117ba610ba0612eb7565b610ba0518082038281116130a25790509050610b8052610b8051600181038181116130a2579050670de0b6b3a7640000810281670de0b6b3a76400008204186130a2579050610540516105c0518110156130a25760051b6105e0015180156130a25780820490509050610b80526020610b80f35b60006000fd5b60405163fd0684b16101a0526101406101a060046101bc845afa61185d573d600060003e3d6000fd5b60403d106130a2576101a0516101a00160088151116130a257805160208160051b0180610300828560045afa505050506103009050805160208160051b01806080828560045afa505050506040516314f059796102c0526101406102c060046102dc845afa6118d1573d600060003e3d6000fd5b60403d106130a2576102c0516102c00160088151116130a257805160208160051b0180610420828560045afa505050506104209050805160208160051b01806101a0828560045afa5050505060006102c05260006008905b806103e0526060516103e0511861193f576119b5565b6102c051600781116130a2576103e0516080518110156130a25760051b60a001516103e0516101a0518110156130a25760051b6101c001518082028115838383041417156130a25790509050670de0b6b3a7640000810490508160051b6102e00152600181016102c05250600101818118611929575b505060805160208160051b01808382608060045afa5050506101a05160208160051b0161012083018181836101a060045afa505050506102c05160208160051b0161024083018181836102c060045afa5050505050565b60006101a05260006008905b806101c052610180516101c05118611a2f57611a65565b6101a0516101c0516040518110156130a25760051b606001518082018281106130a257905090506101a052600101818118611a18575b50506101a051611a79576000815250611c8d565b6101a0516101c05261016051610180518082028115838383041417156130a257905090506101e052600060ff905b80610200526101c051610220526000604051600881116130a2578015611b1157905b8060051b6060015161024052610220516101c0518082028115838383041417156130a257905090506102405180156130a2578082049050905061022052600101818118611ac9575b50506102205161018051610180510a80156130a25780820490509050610220526101c051610240526101e0516101a0518082028115838383041417156130a2579050905060648104905061022051610180518082028115838383041417156130a257905090508082018281106130a257905090506101c0518082028115838383041417156130a257905090506101e051606481038181116130a25790506101c0518082028115838383041417156130a2579050905060648104905061018051600181018181106130a2579050610220518082028115838383041417156130a257905090508082018281106130a2579050905080156130a257808204905090506101c052610240516101c05111611c50576001610240516101c0518082038281116130a2579050905011611c7b576101c0518352505050611c8d56611c7b565b60016101c051610240518082038281116130a2579050905011611c7b576101c0518352505050611c8d565b600101818118611aa757505060006000fd5b565b6402540be40060a05111611ca857608051815250611d7a565b6040516060518082018281106130a257905090506fffffffffffffffffffffffffffffffff81116130a2576002810a905060c05260a0516080518082028115838383041417156130a2579050905060a0516402540be40081038181116130a25790508060021b818160021c186130a25790506040518082028115838383041417156130a257905090506060518082028115838383041417156130a2579050905060c05180156130a257808204905090506402540be40081018181106130a257905080156130a257808204905090508152505b565b600060c05260a05160e052600060ff905b806101005260e05160c05260e05160e0518082028115838383041417156130a257905090506060518082018281106130a2579050905060e0518060011b818160011c186130a25790506040518082018281106130a257905090506080518082038281116130a2579050905080156130a2578082049050905060e05260c05160e05111611e3f57600160c05160e0518082038281116130a2579050905011611e675760e0518352505050611e7956611e67565b600160e05160c0518082038281116130a2579050905011611e675760e0518352505050611e79565b600101818118611d8d57505060006000fd5b565b6101405161012051146130a257600061014051126130a2576102e05180607f1c6130a2576101405112156130a257600061012051126130a2576102e05180607f1c6130a2576101205112156130a2576102a051610300526102c05161032052604036610340376103205161038052610300516102e0518082028115838383041417156130a257905090506103a05260006008905b806103c0526102e0516103c05118611f2657611ff0565b610120516103c05180607f1c6130a25718611f48576101605161036052611f81565b610140516103c05180607f1c6130a25714611fe5576103c051610180518110156130a25760051b6101a0015161036052611f8156611fe5565b61034051610360518082018281106130a257905090506103405261038051610320518082028115838383041417156130a25790509050610360516102e0518082028115838383041417156130a2579050905080156130a25780820490509050610380525b600101818118611f0f575b505061038051610320518082028115838383041417156130a25790509050606481028160648204186130a25790506103a0516102e0518082028115838383041417156130a2579050905080156130a25780820490509050610380526103405161032051606481028160648204186130a25790506103a05180156130a257808204905090508082018281106130a257905090506103c052610320516103e0526103c05160405261038051606052610320516080526103e05160a0526120b5610400611d7c565b61040051815250565b6000610600526000610720526000610840526105a0516040526105e0516060526120e9610960611834565b610960805160208160051b0180610600828560045afa5050506101208101805160208160051b0180610720828560045afa505050506102408101805160208160051b0180610840828560045afa50505050506105a05163f446c1d0610980526020610980600461099c845afa612164573d600060003e3d6000fd5b60203d106130a257610980905051606481028160648204186130a2579050610960526108405160208160051b018060408261084060045afa50505061096051610160526105e051610180526121ba6109a0611a0c565b6109a051610980526105a05163ddca3f436109c05260206109c060046109dc845afa6121eb573d600060003e3d6000fd5b60203d106130a2576109c09050516109a0526105805161056051610600518110156130a25760051b61062001518082028115838383041417156130a25790509050670de0b6b3a764000081049050600181018181106130a25790506109c0526109a0516109e0526105c0516122eb576105a051638edfdd5f610a20526020610a206004610a3c845afa612283573d600060003e3d6000fd5b60203d106130a257610a20905051610a005261054051610840518110156130a25760051b610860015160405261056051610840518110156130a25760051b61086001516060526109a051608052610a005160a0526122e2610a20611c8f565b610a20516109e0525b61056051610840518110156130a25760051b61086001516109c0516402540be4008102816402540be4008204186130a25790506109e051806402540be400036402540be40081116130a257905080156130a257808204905090508082038281116130a25790509050610a005261056051610120526105405161014052610a0051610160526108405160208160051b01806101808261084060045afa505050610960516102a052610980516102c0526105e0516102e0526123ac610a40611e7b565b610a4051610a2052610a205161054051610840518110156130a25760051b61086001518082038281116130a25790509050670de0b6b3a7640000810281670de0b6b3a76400008204186130a257905061054051610600518110156130a25760051b610620015180156130a25780820490509050815250565b6040366060376040515a6000600460c0527f76a9cd3e0000000000000000000000000000000000000000000000000000000060e05260c0805160208201836101200181518152505080830192505050600181610120015260208101905060008161012001526020810190508061010052610100505060206101a0610100516101208585fa905090506060523d602081183d6020100218610180526101808051608052602081015160a05250606051815250565b6106805163f446c1d0610700526020610700600461071c845afa612500573d600060003e3d6000fd5b60203d106130a257610700905051606481028160648204186130a25790506106e052600061070052600061082052600061094052610680515a6004610a80527f9c4258c400000000000000000000000000000000000000000000000000000000610aa052610a805060006000610a8051610aa08585fa90509050610a60526001610a8052610a6051612755576000610a805260006106c051600881116130a257801561274e57905b80610aa05261070051600781116130a2576106805163c6610657610ac052610aa051610ae0526020610ac06024610adc845afa6125ea573d600060003e3d6000fd5b60203d106130a257610ac0518060a01c6130a257610b0052610b0090505163313ce567610b20526020610b206004610b3c845afa61262d573d600060003e3d6000fd5b60203d106130a257610b20518060081c6130a257610b6052610b6090505180602403602481116130a2579050604d81116130a25780600a0a90508160051b610720015260018101610700525061082051600781116130a25761068051634903b0d1610ac052610aa051610ae0526020610ac06024610adc845afa6126b6573d600060003e3d6000fd5b60203d106130a257610ac09050518160051b610840015260018101610820525061094051600781116130a257610aa051610700518110156130a25760051b6107200151610aa051610820518110156130a25760051b61084001518082028115838383041417156130a25790509050670de0b6b3a7640000810490508160051b61096001526001810161094052506001018181186125a8575b50506127c1565b610680516040526106c05160605261276e610aa0611834565b610aa0805160208160051b0180610700828560045afa5050506101208101805160208160051b0180610820828560045afa505050506102408101805160208160051b0180610940828560045afa50505050505b6109405160208160051b018060408261094060045afa5050506106e051610160526106c051610180526127f5610ac0611a0c565b610ac051610aa0526106a0516318160ddd610ae0526020610ae06004610afc845afa612826573d600060003e3d6000fd5b60203d106130a257610ae0905051610ac0526108205160208160051b0180610ae08261082060045afa50505060006106c051600881116130a25780156128fb57905b80610c0052610c0051610540518110156130a25760051b6105600151610c2052610660516128c257610c0051610ae0518110156130a25760051b610b00018051610c20518082038281116130a257905090508152506128f0565b610c0051610ae0518110156130a25760051b610b00018051610c20518082018281106130a257905090508152505b600101818118612868575b505060006106c051600881116130a257801561298957905b80610c0052610c0051610700518110156130a25760051b6107200151610c0051610ae0518110156130a25760051b610b0001518082028115838383041417156130a25790509050670de0b6b3a764000081049050610c0051610940518110156130a25760051b6109600152600101818118612913575b50506109405160208160051b018060408261094060045afa5050506106e051610160526106c051610180526129bf610c20611a0c565b610c2051610c0052610c0051610c2052604036610c4037610ac05115612db9576106805163ddca3f43610ca0526020610ca06004610cbc845afa612a08573d600060003e3d6000fd5b60203d106130a257610ca09050516106c0518082028115838383041417156130a257905090506106c051600181038181116130a25790508060021b818160021c186130a257905080156130a25780820490509050610c8052610a805115612aa55761068051638edfdd5f610ca0526020610ca06004610cbc845afa612a92573d600060003e3d6000fd5b60203d106130a257610ca0905051610c40525b6000610ca052610aa051610c00518082018281106130a257905090506106c05180156130a25780820490509050610cc05260006106c051600881116130a2578015612ce857905b80610ce052610c0051610ce051610820518110156130a25760051b61084001518082028115838383041417156130a25790509050610aa05180156130a25780820490509050610d00526000610d2052610ce051610ae0518110156130a25760051b610b000151610d4052610d4051610d005111612b8257610d4051610d00518082038281116130a25790509050610d2052612b9d565b610d0051610d40518082038281116130a25790509050610d20525b610ce051610700518110156130a25760051b6107200151610ce051610820518110156130a25760051b6108400151610d40518082018281106130a257905090508082028115838383041417156130a25790509050670de0b6b3a764000081049050610ca052610a8051612c5e57610ce051610ae0518110156130a25760051b610b00018051610c8051610d20518082028115838383041417156130a257905090506402540be400810490508082038281116130a25790509050815250612cdd565b610ca051604052610cc051606052610c8051608052610c405160a052612c85610d60611c8f565b610d6051610c6052610ce051610ae0518110156130a25760051b610b00018051610c6051610d20518082028115838383041417156130a257905090506402540be400810490508082038281116130a257905090508152505b600101818118612aec575b505060006106c051600881116130a2578015612d7657905b80610ce052610ce051610700518110156130a25760051b6107200151610ce051610ae0518110156130a25760051b610b0001518082028115838383041417156130a25790509050670de0b6b3a764000081049050610ce051610940518110156130a25760051b6109600152600101818118612d00575b50506109405160208160051b018060408261094060045afa5050506106e051610160526106c05161018052612dac610ce0611a0c565b610ce051610c2052612dc5565b610c0051815250612e3e565b6000610c805261066051612df257610aa051610c20518082038281116130a25790509050610c8052612e0d565b610c2051610aa0518082038281116130a25790509050610c80525b610c8051610ac0518082028115838383041417156130a25790509050610aa05180156130a257808204905090508152505b565b61010036610ee0376008610ec052610e0051610e2051610ec0518110156130a25760051b610ee00152610ec05160208160051b018061054082610ec060045afa505050610ea05161066052610e605161068052610e80516106a052610e40516106c052612eae610fe06124d7565b610fe051815250565b6102a05180607f1c6130a2576102c052600061014051126130a2576102c0516101405112156130a2576060366102e0376102805161034052610120516102a0518082028115838383041417156130a257905090506103605260006008905b80610380526102a0516103805118612f2c57612fd4565b61014051600081126130a2576103805114612fc95761038051610160518110156130a25760051b610180015161030052612f6556612fc9565b6102e051610300518082018281106130a257905090506102e05261034051610280518082028115838383041417156130a25790509050610300516102a0518082028115838383041417156130a2579050905080156130a25780820490509050610340525b600101818118612f15575b505061034051610280518082028115838383041417156130a25790509050606481028160648204186130a2579050610360516102a0518082028115838383041417156130a2579050905080156130a25780820490509050610340526102e05161028051606481028160648204186130a25790506103605180156130a257808204905090508082018281106130a2579050905061038052610280516103a0526103805160405261034051606052610280516080526103a05160a0526130996103c0611d7c565b6103c051815250565b600080fd182e0c660fb10862009d1250001a

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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.