FTM Price: $0.582588 (+1.53%)
Gas: 3 GWei
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Exchange835420442024-06-23 9:52:2045 mins ago1719136340IN
0xF0d4c12A...d26C58b8D
0 FTM0.04722036110
Exchange835209072024-06-23 3:00:367 hrs ago1719111636IN
0xF0d4c12A...d26C58b8D
0 FTM0.000820534.14057616
Exchange834745082024-06-22 13:24:0821 hrs ago1719062648IN
0xF0d4c12A...d26C58b8D
0 FTM0.002565656.3635508
Exchange834447052024-06-22 3:29:3931 hrs ago1719026979IN
0xF0d4c12A...d26C58b8D
0 FTM0.003537119
Exchange834429592024-06-22 2:44:4531 hrs ago1719024285IN
0xF0d4c12A...d26C58b8D
0 FTM0.001914129
Exchange834202662024-06-21 18:36:0740 hrs ago1718994967IN
0xF0d4c12A...d26C58b8D
0 FTM0.018065432
Exchange834114412024-06-21 15:34:5343 hrs ago1718984093IN
0xF0d4c12A...d26C58b8D
0 FTM0.0070018516
Exchange833719402024-06-21 3:47:042 days ago1718941624IN
0xF0d4c12A...d26C58b8D
0 FTM0.0157745930.12788084
Exchange832895472024-06-20 7:32:143 days ago1718868734IN
0xF0d4c12A...d26C58b8D
0 FTM0.0503728899
Exchange831687072024-06-18 22:23:154 days ago1718749395IN
0xF0d4c12A...d26C58b8D
0 FTM0.04538688110
Exchange831677302024-06-18 21:58:064 days ago1718747886IN
0xF0d4c12A...d26C58b8D
0 FTM0.04556013110
Exchange830917112024-06-17 17:45:255 days ago1718646325IN
0xF0d4c12A...d26C58b8D
0 FTM0.0056222928.42788832
Exchange830909432024-06-17 17:29:135 days ago1718645353IN
0xF0d4c12A...d26C58b8D
0 FTM0.0050710828.90166475
Exchange830908332024-06-17 17:27:025 days ago1718645222IN
0xF0d4c12A...d26C58b8D
0 FTM0.0061546328.90166475
Exchange830149292024-06-16 15:35:156 days ago1718552115IN
0xF0d4c12A...d26C58b8D
0 FTM0.0041573219.50835082
Exchange830094582024-06-16 14:01:426 days ago1718546502IN
0xF0d4c12A...d26C58b8D
0 FTM0.0101071220
Exchange830008812024-06-16 11:09:296 days ago1718536169IN
0xF0d4c12A...d26C58b8D
0 FTM0.05416158110
Exchange829999242024-06-16 10:51:376 days ago1718535097IN
0xF0d4c12A...d26C58b8D
0 FTM0.08376544110
Exchange829863082024-06-16 6:01:587 days ago1718517718IN
0xF0d4c12A...d26C58b8D
0 FTM0.0143524422
Exchange829853292024-06-16 5:39:557 days ago1718516395IN
0xF0d4c12A...d26C58b8D
0 FTM0.0068746524
Exchange829673512024-06-15 21:58:417 days ago1718488721IN
0xF0d4c12A...d26C58b8D
0 FTM0.0234879957
Exchange829671692024-06-15 21:54:187 days ago1718488458IN
0xF0d4c12A...d26C58b8D
0 FTM0.0223191457
Exchange829608442024-06-15 19:33:307 days ago1718480010IN
0xF0d4c12A...d26C58b8D
0 FTM0.0287121938
Exchange829606462024-06-15 19:27:537 days ago1718479673IN
0xF0d4c12A...d26C58b8D
0 FTM0.0078789238
Exchange829539012024-06-15 16:33:267 days ago1718469206IN
0xF0d4c12A...d26C58b8D
0 FTM0.023166356
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To Value
816361442024-05-26 18:59:1227 days ago1716749952
0xF0d4c12A...d26C58b8D
1 FTM
814846382024-05-24 0:29:3430 days ago1716510574
0xF0d4c12A...d26C58b8D
26.9714249 FTM
814846382024-05-24 0:29:3430 days ago1716510574
0xF0d4c12A...d26C58b8D
26.8714249 FTM
764113022024-02-27 10:44:38116 days ago1709030678
0xF0d4c12A...d26C58b8D
74.14424836 FTM
764113022024-02-27 10:44:38116 days ago1709030678
0xF0d4c12A...d26C58b8D
74.14424836 FTM
763305042024-02-26 6:41:55118 days ago1708929715
0xF0d4c12A...d26C58b8D
0.01 FTM
716511612023-11-28 18:11:10207 days ago1701195070
0xF0d4c12A...d26C58b8D
2 FTM
716505652023-11-28 17:45:34207 days ago1701193534
0xF0d4c12A...d26C58b8D
2 FTM
716503962023-11-28 17:38:28207 days ago1701193108
0xF0d4c12A...d26C58b8D
1 FTM
716498592023-11-28 17:14:08207 days ago1701191648
0xF0d4c12A...d26C58b8D
5 FTM
716497762023-11-28 17:10:57207 days ago1701191457
0xF0d4c12A...d26C58b8D
5 FTM
716495782023-11-28 17:01:17207 days ago1701190877
0xF0d4c12A...d26C58b8D
1 FTM
716493452023-11-28 16:52:01207 days ago1701190321
0xF0d4c12A...d26C58b8D
1 FTM
708186672023-11-18 20:20:39217 days ago1700338839
0xF0d4c12A...d26C58b8D
1 FTM
707625222023-11-17 16:58:47218 days ago1700240327
0xF0d4c12A...d26C58b8D
0.01 FTM
707607472023-11-17 16:05:36218 days ago1700237136
0xF0d4c12A...d26C58b8D
0.01 FTM
706640812023-11-15 17:43:32220 days ago1700070212
0xF0d4c12A...d26C58b8D
1 FTM
706638852023-11-15 17:37:33220 days ago1700069853
0xF0d4c12A...d26C58b8D
0.41290309 FTM
706634622023-11-15 17:23:02220 days ago1700068982
0xF0d4c12A...d26C58b8D
0.87677864 FTM
706634622023-11-15 17:23:02220 days ago1700068982
0xF0d4c12A...d26C58b8D
0.87677864 FTM
706632972023-11-15 17:17:33220 days ago1700068653
0xF0d4c12A...d26C58b8D
0.95471665 FTM
706632972023-11-15 17:17:33220 days ago1700068653
0xF0d4c12A...d26C58b8D
0.95471665 FTM
706036402023-11-14 10:21:41222 days ago1699957301
0xF0d4c12A...d26C58b8D
0.12890198 FTM
704585052023-11-11 4:43:56225 days ago1699677836
0xF0d4c12A...d26C58b8D
4.53668164 FTM
704583472023-11-11 4:38:31225 days ago1699677511
0xF0d4c12A...d26C58b8D
4.16786474 FTM
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CurveRouterSidechain v1.0

Compiler Version
vyper:0.3.7

Optimization Enabled:
N/A

Other Settings:
None license

Contract Source Code (Vyper language format)

# @version 0.3.7

"""
@title CurveRouterSidechain v1.0
@author Curve.Fi
@license Copyright (c) Curve.Fi, 2020-2023 - all rights reserved
@notice Performs up to 5 swaps in a single transaction, can do estimations with get_dy and get_dx
"""

from vyper.interfaces import ERC20

interface StablePool:
    def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256): payable
    def exchange_underlying(i: int128, j: int128, dx: uint256, min_dy: uint256): payable
    def get_dy(i: int128, j: int128, amount: uint256) -> uint256: view
    def get_dy_underlying(i: int128, j: int128, amount: uint256) -> uint256: view
    def coins(i: uint256) -> address: view
    def calc_withdraw_one_coin(token_amount: uint256, i: int128) -> uint256: view
    def remove_liquidity_one_coin(token_amount: uint256, i: int128, min_amount: uint256): nonpayable

interface CryptoPool:
    def exchange(i: uint256, j: uint256, dx: uint256, min_dy: uint256): payable
    def exchange_underlying(i: uint256, j: uint256, dx: uint256, min_dy: uint256): payable
    def get_dy(i: uint256, j: uint256, amount: uint256) -> uint256: view
    def get_dy_underlying(i: uint256, j: uint256, amount: uint256) -> uint256: view
    def calc_withdraw_one_coin(token_amount: uint256, i: uint256) -> uint256: view
    def remove_liquidity_one_coin(token_amount: uint256, i: uint256, min_amount: uint256): nonpayable

interface CryptoPoolETH:
    def exchange(i: uint256, j: uint256, dx: uint256, min_dy: uint256, use_eth: bool): payable

interface LendingBasePoolMetaZap:
    def exchange_underlying(pool: address, i: int128, j: int128, dx: uint256, min_dy: uint256): nonpayable

interface CryptoMetaZap:
    def get_dy(pool: address, i: uint256, j: uint256, dx: uint256) -> uint256: view
    def exchange(pool: address, i: uint256, j: uint256, dx: uint256, min_dy: uint256, use_eth: bool): payable

interface StablePool2Coins:
    def add_liquidity(amounts: uint256[2], min_mint_amount: uint256): payable
    def calc_token_amount(amounts: uint256[2], is_deposit: bool) -> uint256: view

interface CryptoPool2Coins:
    def calc_token_amount(amounts: uint256[2]) -> uint256: view

interface StablePool3Coins:
    def add_liquidity(amounts: uint256[3], min_mint_amount: uint256): payable
    def calc_token_amount(amounts: uint256[3], is_deposit: bool) -> uint256: view

interface CryptoPool3Coins:
    def calc_token_amount(amounts: uint256[3]) -> uint256: view

interface StablePool4Coins:
    def add_liquidity(amounts: uint256[4], min_mint_amount: uint256): payable
    def calc_token_amount(amounts: uint256[4], is_deposit: bool) -> uint256: view

interface CryptoPool4Coins:
    def calc_token_amount(amounts: uint256[4]) -> uint256: view

interface StablePool5Coins:
    def add_liquidity(amounts: uint256[5], min_mint_amount: uint256): payable
    def calc_token_amount(amounts: uint256[5], is_deposit: bool) -> uint256: view

interface CryptoPool5Coins:
    def calc_token_amount(amounts: uint256[5]) -> uint256: view

interface LendingStablePool3Coins:
    def add_liquidity(amounts: uint256[3], min_mint_amount: uint256, use_underlying: bool): payable
    def remove_liquidity_one_coin(token_amount: uint256, i: int128, min_amount: uint256, use_underlying: bool) -> uint256: nonpayable

interface Llamma:
    def get_dx(i: uint256, j: uint256, out_amount: uint256) -> uint256: view

interface WETH:
    def deposit(): payable
    def withdraw(_amount: uint256): nonpayable

# Calc zaps
interface StableCalc:
    def calc_token_amount(pool: address, token: address, amounts: uint256[10], n_coins: uint256, deposit: bool, use_underlying: bool) -> uint256: view
    def get_dx(pool: address, i: int128, j: int128, dy: uint256, n_coins: uint256) -> uint256: view
    def get_dx_underlying(pool: address, i: int128, j: int128, dy: uint256, n_coins: uint256) -> uint256: view
    def get_dx_meta(pool: address, i: int128, j: int128, dy: uint256, n_coins: uint256, base_pool: address) -> uint256: view
    def get_dx_meta_underlying(pool: address, i: int128, j: int128, dy: uint256, n_coins: uint256, base_pool: address, base_token: address) -> uint256: view

interface CryptoCalc:
    def get_dx(pool: address, i: uint256, j: uint256, dy: uint256, n_coins: uint256) -> uint256: view
    def get_dx_meta_underlying(pool: address, i: uint256, j: uint256, dy: uint256, n_coins: uint256, base_pool: address, base_token: address) -> uint256: view


struct AmountAndFee:
    amountReceived: uint256
    fee: uint256
    exchangeFeeRate: uint256


event Exchange:
    sender: indexed(address)
    receiver: indexed(address)
    route: address[11]
    swap_params: uint256[5][5]
    pools: address[5]
    in_amount: uint256
    out_amount: uint256


ETH_ADDRESS: constant(address) = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
WETH_ADDRESS: immutable(address)

# Calc zaps
STABLE_CALC: immutable(StableCalc)
CRYPTO_CALC: immutable(CryptoCalc)

is_approved: HashMap[address, HashMap[address, bool]]


@external
@payable
def __default__():
    pass


@external
def __init__( _weth: address, _stable_calc: address, _crypto_calc: address):
    WETH_ADDRESS = _weth
    STABLE_CALC = StableCalc(_stable_calc)
    CRYPTO_CALC = CryptoCalc(_crypto_calc)


@external
@payable
@nonreentrant('lock')
def exchange(
    _route: address[11],
    _swap_params: uint256[5][5],
    _amount: uint256,
    _expected: uint256,
    _pools: address[5]=empty(address[5]),
    _receiver: address=msg.sender
) -> uint256:
    """
    @notice Performs up to 5 swaps in a single transaction.
    @dev Routing and swap params must be determined off-chain. This
         functionality is designed for gas efficiency over ease-of-use.
    @param _route Array of [initial token, pool or zap, token, pool or zap, token, ...]
                  The array is iterated until a pool address of 0x00, then the last
                  given token is transferred to `_receiver`
    @param _swap_params Multidimensional array of [i, j, swap type, pool_type, n_coins] where
                        i is the index of input token
                        j is the index of output token

                        The swap_type should be:
                        1. for `exchange`,
                        2. for `exchange_underlying`,
                        3. for underlying exchange via zap: factory stable metapools with lending base pool `exchange_underlying`
                           and factory crypto-meta pools underlying exchange (`exchange` method in zap)
                        4. for coin -> LP token "exchange" (actually `add_liquidity`),
                        5. for lending pool underlying coin -> LP token "exchange" (actually `add_liquidity`),
                        6. for LP token -> coin "exchange" (actually `remove_liquidity_one_coin`)
                        7. for LP token -> lending or fake pool underlying coin "exchange" (actually `remove_liquidity_one_coin`)
                        8. for ETH <-> WETH

                        pool_type: 1 - stable, 2 - crypto, 3 - tricrypto, 4 - llamma
                        n_coins is the number of coins in pool
    @param _amount The amount of input token (`_route[0]`) to be sent.
    @param _expected The minimum amount received after the final swap.
    @param _pools Array of pools for swaps via zap contracts. This parameter is needed only for swap_type = 3.
    @param _receiver Address to transfer the final output token to.
    @return Received amount of the final output token.
    """
    input_token: address = _route[0]
    output_token: address = empty(address)
    amount: uint256 = _amount

    # validate / transfer initial token
    if input_token == ETH_ADDRESS:
        assert msg.value == amount
    else:
        assert msg.value == 0
        assert ERC20(input_token).transferFrom(msg.sender, self, amount, default_return_value=True)

    for i in range(1, 6):
        # 5 rounds of iteration to perform up to 5 swaps
        swap: address = _route[i*2-1]
        pool: address = _pools[i-1] # Only for Polygon meta-factories underlying swap (swap_type == 6)
        output_token = _route[i*2]
        params: uint256[5] = _swap_params[i-1]  # i, j, swap_type, pool_type, n_coins

        if not self.is_approved[input_token][swap]:
            assert ERC20(input_token).approve(swap, max_value(uint256), default_return_value=True, skip_contract_check=True)
            self.is_approved[input_token][swap] = True

        eth_amount: uint256 = 0
        if input_token == ETH_ADDRESS:
            eth_amount = amount
        # perform the swap according to the swap type
        if params[2] == 1:
            if params[3] == 1:  # stable
                StablePool(swap).exchange(convert(params[0], int128), convert(params[1], int128), amount, 0, value=eth_amount)
            else:  # crypto, tricrypto or llamma
                if input_token == ETH_ADDRESS or output_token == ETH_ADDRESS:
                    CryptoPoolETH(swap).exchange(params[0], params[1], amount, 0, True, value=eth_amount)
                else:
                    CryptoPool(swap).exchange(params[0], params[1], amount, 0)
        elif params[2] == 2:
            if params[3] == 1:  # stable
                StablePool(swap).exchange_underlying(convert(params[0], int128), convert(params[1], int128), amount, 0, value=eth_amount)
            else:  # crypto or tricrypto
                CryptoPool(swap).exchange_underlying(params[0], params[1], amount, 0, value=eth_amount)
        elif params[2] == 3:  # SWAP IS ZAP HERE !!!
            if params[3] == 1:  # stable
                LendingBasePoolMetaZap(swap).exchange_underlying(pool, convert(params[0], int128), convert(params[1], int128), amount, 0)
            else:  # crypto or tricrypto
                use_eth: bool = input_token == ETH_ADDRESS or output_token == ETH_ADDRESS
                CryptoMetaZap(swap).exchange(pool, params[0], params[1], amount, 0, use_eth, value=eth_amount)
        elif params[2] == 4:
            if params[4] == 2:
                amounts: uint256[2] = [0, 0]
                amounts[params[0]] = amount
                StablePool2Coins(swap).add_liquidity(amounts, 0, value=eth_amount)
            elif params[4] == 3:
                amounts: uint256[3] = [0, 0, 0]
                amounts[params[0]] = amount
                StablePool3Coins(swap).add_liquidity(amounts, 0, value=eth_amount)
            elif params[4] == 4:
                amounts: uint256[4] = [0, 0, 0, 0]
                amounts[params[0]] = amount
                StablePool4Coins(swap).add_liquidity(amounts, 0, value=eth_amount)
            elif params[4] == 5:
                amounts: uint256[5] = [0, 0, 0, 0, 0]
                amounts[params[0]] = amount
                StablePool5Coins(swap).add_liquidity(amounts, 0, value=eth_amount)
        elif params[2] == 5:
            amounts: uint256[3] = [0, 0, 0]
            amounts[params[0]] = amount
            LendingStablePool3Coins(swap).add_liquidity(amounts, 0, True, value=eth_amount) # example: aave on Polygon
        elif params[2] == 6:
            if params[3] == 1:  # stable
                StablePool(swap).remove_liquidity_one_coin(amount, convert(params[1], int128), 0)
            else:  # crypto or tricrypto
                CryptoPool(swap).remove_liquidity_one_coin(amount, params[1], 0)  # example: atricrypto3 on Polygon
        elif params[2] == 7:
            LendingStablePool3Coins(swap).remove_liquidity_one_coin(amount, convert(params[1], int128), 0, True) # example: aave on Polygon
        elif params[2] == 8:
            if input_token == ETH_ADDRESS and output_token == WETH_ADDRESS:
                WETH(swap).deposit(value=amount)
            elif input_token == WETH_ADDRESS and output_token == ETH_ADDRESS:
                WETH(swap).withdraw(amount)
            else:
                raise "Swap type 8 is only for ETH <-> WETH"
        else:
            raise "Bad swap type"

        # update the amount received
        if output_token == ETH_ADDRESS:
            amount = self.balance
        else:
            amount = ERC20(output_token).balanceOf(self)

        # sanity check, if the routing data is incorrect we will have a 0 balance and that is bad
        assert amount != 0, "Received nothing"

        # check if this was the last swap
        if i == 5 or _route[i*2+1] == empty(address):
            break
        # if there is another swap, the output token becomes the input for the next round
        input_token = output_token

    amount -= 1  # Change non-zero -> non-zero costs less gas than zero -> non-zero
    assert amount >= _expected, "Slippage"

    # transfer the final token to the receiver
    if output_token == ETH_ADDRESS:
        raw_call(_receiver, b"", value=amount)
    else:
        assert ERC20(output_token).transfer(_receiver, amount, default_return_value=True)

    log Exchange(msg.sender, _receiver, _route, _swap_params, _pools, _amount, amount)

    return amount


@view
@external
def get_dy(
    _route: address[11],
    _swap_params: uint256[5][5],
    _amount: uint256,
    _pools: address[5]=empty(address[5])
) -> uint256:
    """
    @notice Get amount of the final output token received in an exchange
    @dev Routing and swap params must be determined off-chain. This
         functionality is designed for gas efficiency over ease-of-use.
    @param _route Array of [initial token, pool or zap, token, pool or zap, token, ...]
                  The array is iterated until a pool address of 0x00, then the last
                  given token is transferred to `_receiver`
    @param _swap_params Multidimensional array of [i, j, swap type, pool_type, n_coins] where
                        i is the index of input token
                        j is the index of output token

                        The swap_type should be:
                        1. for `exchange`,
                        2. for `exchange_underlying`,
                        3. for underlying exchange via zap: factory stable metapools with lending base pool `exchange_underlying`
                           and factory crypto-meta pools underlying exchange (`exchange` method in zap)
                        4. for coin -> LP token "exchange" (actually `add_liquidity`),
                        5. for lending pool underlying coin -> LP token "exchange" (actually `add_liquidity`),
                        6. for LP token -> coin "exchange" (actually `remove_liquidity_one_coin`)
                        7. for LP token -> lending or fake pool underlying coin "exchange" (actually `remove_liquidity_one_coin`)
                        8. for ETH <-> WETH

                        pool_type: 1 - stable, 2 - crypto, 3 - tricrypto, 4 - llamma
                        n_coins is the number of coins in pool
    @param _amount The amount of input token (`_route[0]`) to be sent.
    @param _pools Array of pools for swaps via zap contracts. This parameter is needed only for swap_type = 3.
    @return Expected amount of the final output token.
    """
    input_token: address = _route[0]
    output_token: address = empty(address)
    amount: uint256 = _amount

    for i in range(1, 6):
        # 5 rounds of iteration to perform up to 5 swaps
        swap: address = _route[i*2-1]
        pool: address = _pools[i-1] # Only for Polygon meta-factories underlying swap (swap_type == 4)
        output_token = _route[i * 2]
        params: uint256[5] = _swap_params[i-1]  # i, j, swap_type, pool_type, n_coins

        # Calc output amount according to the swap type
        if params[2] == 1:
            if params[3] == 1:  # stable
                amount = StablePool(swap).get_dy(convert(params[0], int128), convert(params[1], int128), amount)
            else:  # crypto or llamma
                amount = CryptoPool(swap).get_dy(params[0], params[1], amount)
        elif params[2] == 2:
            if params[3] == 1:  # stable
                amount = StablePool(swap).get_dy_underlying(convert(params[0], int128), convert(params[1], int128), amount)
            else:  # crypto
                amount = CryptoPool(swap).get_dy_underlying(params[0], params[1], amount)
        elif params[2] == 3:  # SWAP IS ZAP HERE !!!
            if params[3] == 1:  # stable
                amount = StablePool(pool).get_dy_underlying(convert(params[0], int128), convert(params[1], int128), amount)
            else:  # crypto
                amount = CryptoMetaZap(swap).get_dy(pool, params[0], params[1], amount)
        elif params[2] in [4, 5]:
            if params[3] == 1: # stable
                amounts: uint256[10] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
                amounts[params[0]] = amount
                amount = STABLE_CALC.calc_token_amount(swap, output_token, amounts, params[4], True, True)
            else:
                # Tricrypto pools have stablepool interface for calc_token_amount
                if params[4] == 2:
                    amounts: uint256[2] = [0, 0]
                    amounts[params[0]] = amount
                    if params[3] == 2:  # crypto
                        amount = CryptoPool2Coins(swap).calc_token_amount(amounts)
                    else:  # tricrypto
                        amount = StablePool2Coins(swap).calc_token_amount(amounts, True)
                elif params[4] == 3:
                    amounts: uint256[3] = [0, 0, 0]
                    amounts[params[0]] = amount
                    if params[3] == 2:  # crypto
                        amount = CryptoPool3Coins(swap).calc_token_amount(amounts)
                    else:  # tricrypto
                        amount = StablePool3Coins(swap).calc_token_amount(amounts, True)
                elif params[4] == 4:
                    amounts: uint256[4] = [0, 0, 0, 0]
                    amounts[params[0]] = amount
                    if params[3] == 2:  # crypto
                        amount = CryptoPool4Coins(swap).calc_token_amount(amounts)
                    else:  # tricrypto
                        amount = StablePool4Coins(swap).calc_token_amount(amounts, True)
                elif params[4] == 5:
                    amounts: uint256[5] = [0, 0, 0, 0, 0]
                    amounts[params[0]] = amount
                    if params[3] == 2:  # crypto
                        amount = CryptoPool5Coins(swap).calc_token_amount(amounts)
                    else:  # tricrypto
                        amount = StablePool5Coins(swap).calc_token_amount(amounts, True)
        elif params[2] in [6, 7]:
            if params[3] == 1:  # stable
                amount = StablePool(swap).calc_withdraw_one_coin(amount, convert(params[1], int128))
            else:  # crypto
                amount = CryptoPool(swap).calc_withdraw_one_coin(amount, params[1])
        elif params[2] == 8:
            if input_token == WETH_ADDRESS or output_token == WETH_ADDRESS:
                # ETH <--> WETH rate is 1:1
                pass
            else:
                raise "Swap type 8 is only for ETH <-> WETH"
        else:
            raise "Bad swap type"

        # check if this was the last swap
        if i == 5 or _route[i*2+1] == empty(address):
            break
        # if there is another swap, the output token becomes the input for the next round
        input_token = output_token

    return amount - 1


@view
@external
def get_dx(
    _route: address[11],
    _swap_params: uint256[5][5],
    _out_amount: uint256,
    _pools: address[5],
    _base_pools: address[5]=empty(address[5]),
    _base_tokens: address[5]=empty(address[5]),
) -> uint256:
    """
    @notice Calculate the input amount required to receive the desired `_out_amount`
    @dev Routing and swap params must be determined off-chain. This
         functionality is designed for gas efficiency over ease-of-use.
    @param _route Array of [initial token, pool or zap, token, pool or zap, token, ...]
                  The array is iterated until a pool address of 0x00, then the last
                  given token is transferred to `_receiver`
    @param _swap_params Multidimensional array of [i, j, swap type, pool_type, n_coins] where
                        i is the index of input token
                        j is the index of output token

                        The swap_type should be:
                        1. for `exchange`,
                        2. for `exchange_underlying`,
                        3. for underlying exchange via zap: factory stable metapools with lending base pool `exchange_underlying`
                           and factory crypto-meta pools underlying exchange (`exchange` method in zap)
                        4. for coin -> LP token "exchange" (actually `add_liquidity`),
                        5. for lending pool underlying coin -> LP token "exchange" (actually `add_liquidity`),
                        6. for LP token -> coin "exchange" (actually `remove_liquidity_one_coin`)
                        7. for LP token -> lending or fake pool underlying coin "exchange" (actually `remove_liquidity_one_coin`)
                        8. for ETH <-> WETH

                        pool_type: 1 - stable, 2 - crypto, 3 - tricrypto, 4 - llamma
                        n_coins is the number of coins in pool
    @param _out_amount The desired amount of output coin to receive.
    @param _pools Array of pools.
    @param _base_pools Array of base pools (for meta pools).
    @param _base_tokens Array of base lp tokens (for meta pools).
    @return Required amount of input token to send.
    """
    amount: uint256 = _out_amount

    for _i in range(1, 6):
        # 5 rounds of iteration to perform up to 5 swaps
        i: uint256 = 6 - _i
        swap: address = _route[i*2-1]
        if swap == empty(address):
            continue
        input_token: address = _route[(i - 1) * 2]
        output_token: address = _route[i * 2]
        pool: address = _pools[i-1]
        base_pool: address = _base_pools[i-1]
        base_token: address = _base_tokens[i-1]
        params: uint256[5] = _swap_params[i-1]  # i, j, swap_type, pool_type, n_coins
        n_coins: uint256 = params[4]

        # Calc a required input amount according to the swap type
        if params[2] == 1:
            if params[3] == 1:  # stable
                if base_pool == empty(address):  # non-meta
                    amount = STABLE_CALC.get_dx(pool, convert(params[0], int128), convert(params[1], int128), amount, n_coins)
                else:
                    amount = STABLE_CALC.get_dx_meta(pool, convert(params[0], int128), convert(params[1], int128), amount, n_coins, base_pool)
            elif params[3] in [2, 3]:  # crypto or tricrypto
                amount = CRYPTO_CALC.get_dx(pool, params[0], params[1], amount, n_coins)
            else:  # llamma
                amount = Llamma(pool).get_dx(params[0], params[1], amount)
        elif params[2] in [2, 3]:
            if params[3] == 1:  # stable
                if base_pool == empty(address):  # non-meta
                    amount = STABLE_CALC.get_dx_underlying(pool, convert(params[0], int128), convert(params[1], int128), amount, n_coins)
                else:
                    amount = STABLE_CALC.get_dx_meta_underlying(pool, convert(params[0], int128), convert(params[1], int128), amount, n_coins, base_pool, base_token)
            else:  # crypto
                amount = CRYPTO_CALC.get_dx_meta_underlying(pool, params[0], params[1], amount, n_coins, base_pool, base_token)
        elif params[2] in [4, 5]:
            # This is not correct. Should be something like calc_add_one_coin. But tests say that it's precise enough.
            if params[3] == 1:  # stable
                amount = StablePool(swap).calc_withdraw_one_coin(amount, convert(params[0], int128))
            else:  # crypto
                amount = CryptoPool(swap).calc_withdraw_one_coin(amount, params[0])
        elif params[2] in [6, 7]:
            if params[3] == 1: # stable
                amounts: uint256[10] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
                amounts[params[1]] = amount
                amount = STABLE_CALC.calc_token_amount(swap, input_token, amounts, n_coins, False, True)
            else:
                # Tricrypto pools have stablepool interface for calc_token_amount
                if n_coins == 2:
                    amounts: uint256[2] = [0, 0]
                    amounts[params[1]] = amount
                    if params[3] == 2:  # crypto
                        amount = CryptoPool2Coins(swap).calc_token_amount(amounts)  # This is not correct
                    else:  # tricrypto
                        amount = StablePool2Coins(swap).calc_token_amount(amounts, False)
                elif n_coins == 3:
                    amounts: uint256[3] = [0, 0, 0]
                    amounts[params[1]] = amount
                    if params[3] == 2:  # crypto
                        amount = CryptoPool3Coins(swap).calc_token_amount(amounts)  # This is not correct
                    else:  # tricrypto
                        amount = StablePool3Coins(swap).calc_token_amount(amounts, False)
                elif n_coins == 4:
                    amounts: uint256[4] = [0, 0, 0, 0]
                    amounts[params[1]] = amount
                    if params[3] == 2:  # crypto
                        amount = CryptoPool4Coins(swap).calc_token_amount(amounts)  # This is not correct
                    else:  # tricrypto
                        amount = StablePool4Coins(swap).calc_token_amount(amounts, False)
                elif n_coins == 5:
                    amounts: uint256[5] = [0, 0, 0, 0, 0]
                    amounts[params[1]] = amount
                    if params[3] == 2:  # crypto
                        amount = CryptoPool5Coins(swap).calc_token_amount(amounts)  # This is not correct
                    else:  # tricrypto
                        amount = StablePool5Coins(swap).calc_token_amount(amounts, False)
        elif params[2] == 8:
            if input_token == WETH_ADDRESS or output_token == WETH_ADDRESS:
                # ETH <--> WETH rate is 1:1
                pass
            else:
                raise "Swap type 8 is only for ETH <-> WETH"
        else:
            raise "Bad swap type"

    return amount

Contract Security Audit

Contract ABI

[{"name":"Exchange","inputs":[{"name":"sender","type":"address","indexed":true},{"name":"receiver","type":"address","indexed":true},{"name":"route","type":"address[11]","indexed":false},{"name":"swap_params","type":"uint256[5][5]","indexed":false},{"name":"pools","type":"address[5]","indexed":false},{"name":"in_amount","type":"uint256","indexed":false},{"name":"out_amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_weth","type":"address"},{"name":"_stable_calc","type":"address"},{"name":"_crypto_calc","type":"address"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_amount","type":"uint256"},{"name":"_expected","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_amount","type":"uint256"},{"name":"_expected","type":"uint256"},{"name":"_pools","type":"address[5]"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_amount","type":"uint256"},{"name":"_expected","type":"uint256"},{"name":"_pools","type":"address[5]"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_amount","type":"uint256"},{"name":"_pools","type":"address[5]"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dx","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_out_amount","type":"uint256"},{"name":"_pools","type":"address[5]"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dx","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_out_amount","type":"uint256"},{"name":"_pools","type":"address[5]"},{"name":"_base_pools","type":"address[5]"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dx","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_out_amount","type":"uint256"},{"name":"_pools","type":"address[5]"},{"name":"_base_pools","type":"address[5]"},{"name":"_base_tokens","type":"address[5]"}],"outputs":[{"name":"","type":"uint256"}]}]

6020612c1b6000396000518060a01c612c16576040526020612c3b6000396000518060a01c612c16576060526020612c5b6000396000518060a01c612c165760805234612c1657604051612ba852606051612bc852608051612be852612ba861006d61000039612c08610000f36003361161000c57612b94565b60003560e01c63371dc4478118610037576104c43610612b965760a0366101a037336102405261011a565b635c9c18e281186100a5576105643610612b96576104c4358060a01c612b96576101a0526104e4358060a01c612b96576101c052610504358060a01c612b96576101e052610524358060a01c612b965761020052610544358060a01c612b965761022052336102405261011a565b63c872a3c5811861111c576105843610612b96576104c4358060a01c612b96576101a0526104e4358060a01c612b96576101c052610504358060a01c612b96576101e052610524358060a01c612b965761020052610544358060a01c612b965761022052610564358060a01c612b9657610240525b6004358060a01c612b96576040526024358060a01c612b96576060526044358060a01c612b96576080526064358060a01c612b965760a0526084358060a01c612b965760c05260a4358060a01c612b965760e05260c4358060a01c612b96576101005260e4358060a01c612b965761012052610104358060a01c612b965761014052610124358060a01c612b965761016052610144358060a01c612b965761018052600054600114612b9657600160005560405161026052600061028052610484356102a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610260511861020d576102a0513418612b965761028b565b34612b9657610260516323b872dd6102c052336102e05230610300526102a0516103205260206102c060646102dc6000855af161024f573d600060003e3d6000fd5b3d61026657803b15612b965760016103405261027f565b60203d10612b96576102c0518060011c612b9657610340525b61034090505115612b96575b600160058101905b806102c0526102c0518060011b818160011c18612b9657905060018103818111612b96579050600a8111612b965760051b604001516102e0526102c05160018103818111612b9657905060048111612b965760051b6101a00151610300526102c0518060011b818160011c18612b96579050600a8111612b965760051b604001516102805260a06102c05160018103818111612b9657905060048111612b9657026101640180356103205260208101356103405260408101356103605260608101356103805260808101356103a052506001610260516020526000526040600020806102e0516020526000526040600020905054610436576102605163095ea7b36103c0526102e0516103e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6104005260206103c060446103dc6000855af16103e3573d600060003e3d6000fd5b3d6103f357600161042052610404565b6103c0518060011c612b9657610420525b61042090505115612b965760016001610260516020526000526040600020806102e05160205260005260406000209050555b60006103c05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610463576102a0516103c0525b600161036051186105da57600161038051186104e1576102e051633df021246103e0526103205180607f1c612b9657610400526103405180607f1c612b9657610420526102a05161044052600061046052803b15612b965760006103e060846103fc6103c051855af16104db573d600060003e3d6000fd5b50610da2565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610506576001610522565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b61057c576102e051635b41b9086103e052610320516104005261034051610420526102a05161044052600061046052803b15612b965760006103e060846103fc6000855af1610576573d600060003e3d6000fd5b50610da2565b6102e05163394747c56103e052610320516104005261034051610420526102a05161044052600061046052600161048052803b15612b965760006103e060a46103fc6103c051855af16105d4573d600060003e3d6000fd5b50610da2565b600261036051186106b05760016103805118610658576102e05163a6417ed66103e0526103205180607f1c612b9657610400526103405180607f1c612b9657610420526102a05161044052600061046052803b15612b965760006103e060846103fc6103c051855af1610652573d600060003e3d6000fd5b50610da2565b6102e0516365b2489b6103e052610320516104005261034051610420526102a05161044052600061046052803b15612b965760006103e060846103fc6103c051855af16106aa573d600060003e3d6000fd5b50610da2565b600361036051186107e15760016103805118610734576102e051637981c43e6103e05261030051610400526103205180607f1c612b9657610420526103405180607f1c612b9657610440526102a05161046052600061048052803b15612b965760006103e060a46103fc6000855af161072e573d600060003e3d6000fd5b50610da2565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610759576001610775565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b6103e0526102e051632bf78c61610400526103005161042052610320516104405261034051610460526102a0516104805260006104a0526103e0516104c052803b15612b9657600061040060c461041c6103c051855af16107db573d600060003e3d6000fd5b50610da2565b60046103605118610a045760026103a05118610866576040366103e0376102a0516103205160018111612b965760051b6103e001526102e051630b4c7e4d610420526103e051610440526104005161046052600061048052803b15612b96576000610420606461043c6103c051855af1610860573d600060003e3d6000fd5b50610da2565b60036103a051186108e8576060366103e0376102a0516103205160028111612b965760051b6103e001526102e051634515cef3610440526103e051610460526104005161048052610420516104a05260006104c052803b15612b96576000610440608461045c6103c051855af16108e2573d600060003e3d6000fd5b50610da2565b60046103a05118610972576080366103e0376102a0516103205160038111612b965760051b6103e001526102e05163029b2f34610460526103e05161048052610400516104a052610420516104c052610440516104e052600061050052803b15612b9657600061046060a461047c6103c051855af161096c573d600060003e3d6000fd5b50610da2565b60056103a05118610da25760a0366103e0376102a0516103205160048111612b965760051b6103e001526102e0516384738499610480526103e0516104a052610400516104c052610420516104e05261044051610500526104605161052052600061054052803b15612b9657600061048060c461049c6103c051855af16109fe573d600060003e3d6000fd5b50610da2565b60056103605118610a8c576060366103e0376102a0516103205160028111612b965760051b6103e001526102e051632b6e993a610440526103e051610460526104005161048052610420516104a05260006104c05260016104e052803b15612b9657600061044060a461045c6103c051855af1610a86573d600060003e3d6000fd5b50610da2565b60066103605118610b465760016103805118610af8576102e051631a4d01d26103e0526102a051610400526103405180607f1c612b965761042052600061044052803b15612b965760006103e060646103fc6000855af1610af2573d600060003e3d6000fd5b50610da2565b6102e05163f1dc3cc96103e0526102a051610400526103405161042052600061044052803b15612b965760006103e060646103fc6000855af1610b40573d600060003e3d6000fd5b50610da2565b60076103605118610bb2576102e05163517a55a36103e0526102a051610400526103405180607f1c612b96576104205260006104405260016104605260206103e060846103fc6000855af1610ba0573d600060003e3d6000fd5b60203d10612b96576103e05050610da2565b60086103605118610d3c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610bf1576020612ba8600039600051610280511815610bf4565b60005b610d02576020612ba86000396000516102605118610c2c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511815610c2f565b60005b610cc25760246103e0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610400527f5745544800000000000000000000000000000000000000000000000000000000610420526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd610da2565b6102e051632e1a7d4d6103e0526102a05161040052803b15612b965760006103e060246103fc6000855af1610cfc573d600060003e3d6000fd5b50610da2565b6102e05163d0e30db06103e052803b15612b965760006103e060046103fc6102a051855af1610d36573d600060003e3d6000fd5b50610da2565b600d6103e0527f4261642073776170207479706500000000000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118610dca57476102a052610e0b565b610280516370a082316103e052306104005260206103e060246103fc845afa610df8573d600060003e3d6000fd5b60203d10612b96576103e09050516102a0525b6102a051610e795760106103e0527f5265636569766564206e6f7468696e6700000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b60056102c05118610e8b576001610ebd565b6102c0518060011b818160011c18612b9657905060018101818110612b96579050600a8111612b965760051b60400151155b15610ec757610eda565b6102805161026052600101818118610293575b50506102a05160018103818111612b965790506102a0526104a4356102a0511015610f655760086102c0527f536c6970706167650000000000000000000000000000000000000000000000006102e0526102c0506102c051806102e001601f826000031636823750506308c379a06102805260206102a052601f19601f6102c051011660440161029cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118610fb55760006102c0526102c050600060006102c0516102e06102a051610240515af161102c573d600060003e3d6000fd61102c565b6102805163a9059cbb6102c052610240516102e0526102a0516103005260206102c060446102dc6000855af1610ff0573d600060003e3d6000fd5b3d61100757803b15612b9657600161032052611020565b60203d10612b96576102c0518060011c612b9657610320525b61032090505115612b96575b61024051337f56d0661e240dfb199ef196e16e6f42473990366314f0226ac978f7be3cd9ee836040516102c0526060516102e0526080516103005260a0516103205260c0516103405260e051610360526101005161038052610120516103a052610140516103c052610160516103e052610180516104005260a06101646104203760a06102046104c03760a06102a46105603760a06103446106003760a06103e46106a0376101a051610740526101c051610760526101e05161078052610200516107a052610220516107c052610484356107e0526102a051610800526105606102c0a360206102a06000600055f35b6381889a2c811861113c576104a43610612b965760a0366101a0376111a1565b63637653cb8118611d17576105443610612b96576104a4358060a01c612b96576101a0526104c4358060a01c612b96576101c0526104e4358060a01c612b96576101e052610504358060a01c612b965761020052610524358060a01c612b9657610220525b6004358060a01c612b96576040526024358060a01c612b96576060526044358060a01c612b96576080526064358060a01c612b965760a0526084358060a01c612b965760c05260a4358060a01c612b965760e05260c4358060a01c612b96576101005260e4358060a01c612b965761012052610104358060a01c612b965761014052610124358060a01c612b965761016052610144358060a01c612b96576101805234612b9657604051610240526000610260526104843561028052600160058101905b806102a0526102a0518060011b818160011c18612b9657905060018103818111612b96579050600a8111612b965760051b604001516102c0526102a05160018103818111612b9657905060048111612b965760051b6101a001516102e0526102a0518060011b818160011c18612b96579050600a8111612b965760051b604001516102605260a06102a05160018103818111612b9657905060048111612b96570261016401803561030052602081013561032052604081013561034052606081013561036052608081013561038052506001610340511861140b57600161036051186113b3576102c051635e0d443f6103a0526103005180607f1c612b96576103c0526103205180607f1c612b96576103e052610280516104005260206103a060646103bc845afa61139c573d600060003e3d6000fd5b60203d10612b96576103a090505161028052611c98565b6102c05163556d6e9f6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa6113f4573d600060003e3d6000fd5b60203d10612b96576103a090505161028052611c98565b600261034051186114e15760016103605118611489576102c0516307211ef76103a0526103005180607f1c612b96576103c0526103205180607f1c612b96576103e052610280516104005260206103a060646103bc845afa611472573d600060003e3d6000fd5b60203d10612b96576103a090505161028052611c98565b6102c0516385f11d1e6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa6114ca573d600060003e3d6000fd5b60203d10612b96576103a090505161028052611c98565b600361034051186115bf576001610360511861155f576102e0516307211ef76103a0526103005180607f1c612b96576103c0526103205180607f1c612b96576103e052610280516104005260206103a060646103bc845afa611548573d600060003e3d6000fd5b60203d10612b96576103a090505161028052611c98565b6102c05163e9737ee26103a0526102e0516103c052610300516103e0526103205161040052610280516104205260206103a060846103bc845afa6115a8573d600060003e3d6000fd5b60203d10612b96576103a090505161028052611c98565b61034051600481186115d25760016115d8565b60058118155b90506117e95761034051600681186115f15760016115f7565b60078118155b905061173657600861034051186116cc576020612ba86000396000516102405118611623576001611635565b6020612ba86000396000516102605118155b611c985760246103a0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e206103c0527f57455448000000000000000000000000000000000000000000000000000000006103e0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd611c9856611c98565b600d6103a0527f42616420737761702074797065000000000000000000000000000000000000006103c0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd611c98565b60016103605118611799576102c05163cc2b27d76103c052610280516103e0526103205180607f1c612b96576104005260206103c060446103dc845afa611782573d600060003e3d6000fd5b60203d10612b96576103c090505161028052611c98565b6102c051634fb08c5e6103c052610280516103e052610320516104005260206103c060446103dc845afa6117d2573d600060003e3d6000fd5b60203d10612b96576103c090505161028052611c98565b600161036051186118d057610140366103c037610280516103005160098111612b965760051b6103c001526020612bc86000396000516379ccdf49610500526102c0516105205261026051610540526103c051610560526103e05161058052610400516105a052610420516105c052610440516105e052610460516106005261048051610620526104a051610640526104c051610660526104e05161068052610380516106a05260016106c05260016106e05260206105006101e461051c845afa6118b9573d600060003e3d6000fd5b60203d10612b965761050090505161028052611c98565b600261038051186119ab576040366103c037610280516103005160018111612b965760051b6103c0015260026103605118611955576102c051638d8ea727610400526103c051610420526103e051610440526020610400604461041c845afa61193e573d600060003e3d6000fd5b60203d10612b965761040090505161028052611c98565b6102c05163ed8e84f3610400526103c051610420526103e051610440526001610460526020610400606461041c845afa611994573d600060003e3d6000fd5b60203d10612b965761040090505161028052611c98565b60036103805118611a96576060366103c037610280516103005160028111612b965760051b6103c0015260026103605118611a38576102c051635b6f1b5a610420526103c051610440526103e0516104605261040051610480526020610420606461043c845afa611a21573d600060003e3d6000fd5b60203d10612b965761042090505161028052611c98565b6102c051633883e119610420526103c051610440526103e05161046052610400516104805260016104a0526020610420608461043c845afa611a7f573d600060003e3d6000fd5b60203d10612b965761042090505161028052611c98565b60046103805118611b91576080366103c037610280516103005160038111612b965760051b6103c0015260026103605118611b2b576102c051631a805185610440526103c051610460526103e05161048052610400516104a052610420516104c0526020610440608461045c845afa611b14573d600060003e3d6000fd5b60203d10612b965761044090505161028052611c98565b6102c05163cf701ff7610440526103c051610460526103e05161048052610400516104a052610420516104c05260016104e052602061044060a461045c845afa611b7a573d600060003e3d6000fd5b60203d10612b965761044090505161028052611c98565b60056103805118611c985760a0366103c037610280516103005160048111612b965760051b6103c0015260026103605118611c2e576102c0516309379690610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052602061046060a461047c845afa611c17573d600060003e3d6000fd5b60203d10612b965761046090505161028052611c98565b6102c051637ede89c5610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052600161052052602061046060c461047c845afa611c85573d600060003e3d6000fd5b60203d10612b9657610460905051610280525b60056102a05118611caa576001611cdc565b6102a0518060011b818160011c18612b9657905060018101818110612b96579050600a8111612b965760051b60400151155b15611ce657611cf9565b6102605161024052600101818118611265575b50506102805160018103818111612b965790506102a05260206102a0f35b63c07b53538118611d38576105443610612b96576101403661024037611e5d565b6381fc0ca58118611da8576105e43610612b9657610544358060a01c612b965761024052610564358060a01c612b965761026052610584358060a01c612b9657610280526105a4358060a01c612b96576102a0526105c4358060a01c612b96576102c05260a0366102e037611e5d565b6390e7e2058118612b92576106843610612b9657610544358060a01c612b965761024052610564358060a01c612b965761026052610584358060a01c612b9657610280526105a4358060a01c612b96576102a0526105c4358060a01c612b96576102c0526105e4358060a01c612b96576102e052610604358060a01c612b965761030052610624358060a01c612b965761032052610644358060a01c612b965761034052610664358060a01c612b9657610360525b6004358060a01c612b96576040526024358060a01c612b96576060526044358060a01c612b96576080526064358060a01c612b965760a0526084358060a01c612b965760c05260a4358060a01c612b965760e05260c4358060a01c612b96576101005260e4358060a01c612b965761012052610104358060a01c612b965761014052610124358060a01c612b965761016052610144358060a01c612b9657610180526104a4358060a01c612b96576101a0526104c4358060a01c612b96576101c0526104e4358060a01c612b96576101e052610504358060a01c612b965761020052610524358060a01c612b96576102205234612b96576104843561038052600160058101905b806103a0526103a0518060060360068111612b965790506103c0526103c0518060011b818160011c18612b9657905060018103818111612b96579050600a8111612b965760051b604001516103e0526103e051611fc057612b7f565b6103c05160018103818111612b965790508060011b818160011c18612b96579050600a8111612b965760051b60400151610400526103c0518060011b818160011c18612b96579050600a8111612b965760051b60400151610420526103c05160018103818111612b9657905060048111612b965760051b6101a00151610440526103c05160018103818111612b9657905060048111612b965760051b6102400151610460526103c05160018103818111612b9657905060048111612b965760051b6102e001516104805260a06103c05160018103818111612b9657905060048111612b9657026101640180356104a05260208101356104c05260408101356104e05260608101356105005260808101356105205250610520516105405260016104e051186122e75760016105005118612201576104605161217a576020612bc860003960005163158819d46105605261044051610580526104a05180607f1c612b96576105a0526104c05180607f1c612b96576105c052610380516105e0526105405161060052602061056060a461057c845afa612163573d600060003e3d6000fd5b60203d10612b965761056090505161038052612b7f565b6020612bc860003960005163571f00b56105605261044051610580526104a05180607f1c612b96576105a0526104c05180607f1c612b96576105c052610380516105e05261054051610600526104605161062052602061056060c461057c845afa6121ea573d600060003e3d6000fd5b60203d10612b965761056090505161038052612b7f565b610500516002811861221457600161221a565b60038118155b905061227857610440516337ed3a7a610560526104a051610580526104c0516105a052610380516105c0526020610560606461057c845afa612261573d600060003e3d6000fd5b60203d10612b965761056090505161038052612b7f565b6020612be860003960005163ca4bc71461058052610440516105a0526104a0516105c0526104c0516105e05261038051610600526105405161062052602061058060a461059c845afa6122d0573d600060003e3d6000fd5b60203d10612b965761058090505161038052612b7f565b6104e051600281186122fa576001612300565b60038118155b90506129e3576104e0516004811861231957600161231f565b60058118155b9050612930576104e0516006811861233857600161233e565b60078118155b905061247d5760086104e05118612413576020612ba8600039600051610400511861236a57600161237c565b6020612ba86000396000516104205118155b612b7f576024610560527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610580527f57455448000000000000000000000000000000000000000000000000000000006105a05261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd612b7f56612b7f565b600d610560527f42616420737761702074797065000000000000000000000000000000000000006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd612b7f565b60016105005118612564576101403661058037610380516104c05160098111612b965760051b61058001526020612bc86000396000516379ccdf496106c0526103e0516106e052610400516107005261058051610720526105a051610740526105c051610760526105e05161078052610600516107a052610620516107c052610640516107e052610660516108005261068051610820526106a05161084052610540516108605260006108805260016108a05260206106c06101e46106dc845afa61254d573d600060003e3d6000fd5b60203d10612b96576106c090505161038052612b7f565b6002610540511861263f5760403661058037610380516104c05160018111612b965760051b6105800152600261050051186125e9576103e051638d8ea7276105c052610580516105e0526105a0516106005260206105c060446105dc845afa6125d2573d600060003e3d6000fd5b60203d10612b96576105c090505161038052612b7f565b6103e05163ed8e84f36105c052610580516105e0526105a0516106005260006106205260206105c060646105dc845afa612628573d600060003e3d6000fd5b60203d10612b96576105c090505161038052612b7f565b6003610540511861272a5760603661058037610380516104c05160028111612b965760051b6105800152600261050051186126cc576103e051635b6f1b5a6105e05261058051610600526105a051610620526105c0516106405260206105e060646105fc845afa6126b5573d600060003e3d6000fd5b60203d10612b96576105e090505161038052612b7f565b6103e051633883e1196105e05261058051610600526105a051610620526105c0516106405260006106605260206105e060846105fc845afa612713573d600060003e3d6000fd5b60203d10612b96576105e090505161038052612b7f565b600461054051186128255760803661058037610380516104c05160038111612b965760051b6105800152600261050051186127bf576103e051631a8051856106005261058051610620526105a051610640526105c051610660526105e051610680526020610600608461061c845afa6127a8573d600060003e3d6000fd5b60203d10612b965761060090505161038052612b7f565b6103e05163cf701ff76106005261058051610620526105a051610640526105c051610660526105e0516106805260006106a052602061060060a461061c845afa61280e573d600060003e3d6000fd5b60203d10612b965761060090505161038052612b7f565b60056105405118612b7f5760a03661058037610380516104c05160048111612b965760051b6105800152600261050051186128c2576103e05163093796906106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c052602061062060a461063c845afa6128ab573d600060003e3d6000fd5b60203d10612b965761062090505161038052612b7f565b6103e051637ede89c56106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c05260006106e052602061062060c461063c845afa612919573d600060003e3d6000fd5b60203d10612b965761062090505161038052612b7f565b60016105005118612993576103e05163cc2b27d761058052610380516105a0526104a05180607f1c612b96576105c0526020610580604461059c845afa61297c573d600060003e3d6000fd5b60203d10612b965761058090505161038052612b7f565b6103e051634fb08c5e61058052610380516105a0526104a0516105c0526020610580604461059c845afa6129cc573d600060003e3d6000fd5b60203d10612b965761058090505161038052612b7f565b60016105005118612b045761046051612a75576020612bc8600039600051638fd3218f61058052610440516105a0526104a05180607f1c612b96576105c0526104c05180607f1c612b96576105e05261038051610600526105405161062052602061058060a461059c845afa612a5e573d600060003e3d6000fd5b60203d10612b965761058090505161038052612b7f565b6020612bc8600039600051634933a86461058052610440516105a0526104a05180607f1c612b96576105c0526104c05180607f1c612b96576105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa612aed573d600060003e3d6000fd5b60203d10612b965761058090505161038052612b7f565b6020612be8600039600051638ca1565361058052610440516105a0526104a0516105c0526104c0516105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa612b6c573d600060003e3d6000fd5b60203d10612b9657610580905051610380525b600101818118611f645750506020610380f35b505b005b600080fda165767970657283000307000b005b600080fd00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc

Deployed Bytecode

0x6003361161000c57612b94565b60003560e01c63371dc4478118610037576104c43610612b965760a0366101a037336102405261011a565b635c9c18e281186100a5576105643610612b96576104c4358060a01c612b96576101a0526104e4358060a01c612b96576101c052610504358060a01c612b96576101e052610524358060a01c612b965761020052610544358060a01c612b965761022052336102405261011a565b63c872a3c5811861111c576105843610612b96576104c4358060a01c612b96576101a0526104e4358060a01c612b96576101c052610504358060a01c612b96576101e052610524358060a01c612b965761020052610544358060a01c612b965761022052610564358060a01c612b9657610240525b6004358060a01c612b96576040526024358060a01c612b96576060526044358060a01c612b96576080526064358060a01c612b965760a0526084358060a01c612b965760c05260a4358060a01c612b965760e05260c4358060a01c612b96576101005260e4358060a01c612b965761012052610104358060a01c612b965761014052610124358060a01c612b965761016052610144358060a01c612b965761018052600054600114612b9657600160005560405161026052600061028052610484356102a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610260511861020d576102a0513418612b965761028b565b34612b9657610260516323b872dd6102c052336102e05230610300526102a0516103205260206102c060646102dc6000855af161024f573d600060003e3d6000fd5b3d61026657803b15612b965760016103405261027f565b60203d10612b96576102c0518060011c612b9657610340525b61034090505115612b96575b600160058101905b806102c0526102c0518060011b818160011c18612b9657905060018103818111612b96579050600a8111612b965760051b604001516102e0526102c05160018103818111612b9657905060048111612b965760051b6101a00151610300526102c0518060011b818160011c18612b96579050600a8111612b965760051b604001516102805260a06102c05160018103818111612b9657905060048111612b9657026101640180356103205260208101356103405260408101356103605260608101356103805260808101356103a052506001610260516020526000526040600020806102e0516020526000526040600020905054610436576102605163095ea7b36103c0526102e0516103e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6104005260206103c060446103dc6000855af16103e3573d600060003e3d6000fd5b3d6103f357600161042052610404565b6103c0518060011c612b9657610420525b61042090505115612b965760016001610260516020526000526040600020806102e05160205260005260406000209050555b60006103c05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610463576102a0516103c0525b600161036051186105da57600161038051186104e1576102e051633df021246103e0526103205180607f1c612b9657610400526103405180607f1c612b9657610420526102a05161044052600061046052803b15612b965760006103e060846103fc6103c051855af16104db573d600060003e3d6000fd5b50610da2565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610506576001610522565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b61057c576102e051635b41b9086103e052610320516104005261034051610420526102a05161044052600061046052803b15612b965760006103e060846103fc6000855af1610576573d600060003e3d6000fd5b50610da2565b6102e05163394747c56103e052610320516104005261034051610420526102a05161044052600061046052600161048052803b15612b965760006103e060a46103fc6103c051855af16105d4573d600060003e3d6000fd5b50610da2565b600261036051186106b05760016103805118610658576102e05163a6417ed66103e0526103205180607f1c612b9657610400526103405180607f1c612b9657610420526102a05161044052600061046052803b15612b965760006103e060846103fc6103c051855af1610652573d600060003e3d6000fd5b50610da2565b6102e0516365b2489b6103e052610320516104005261034051610420526102a05161044052600061046052803b15612b965760006103e060846103fc6103c051855af16106aa573d600060003e3d6000fd5b50610da2565b600361036051186107e15760016103805118610734576102e051637981c43e6103e05261030051610400526103205180607f1c612b9657610420526103405180607f1c612b9657610440526102a05161046052600061048052803b15612b965760006103e060a46103fc6000855af161072e573d600060003e3d6000fd5b50610da2565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610759576001610775565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b6103e0526102e051632bf78c61610400526103005161042052610320516104405261034051610460526102a0516104805260006104a0526103e0516104c052803b15612b9657600061040060c461041c6103c051855af16107db573d600060003e3d6000fd5b50610da2565b60046103605118610a045760026103a05118610866576040366103e0376102a0516103205160018111612b965760051b6103e001526102e051630b4c7e4d610420526103e051610440526104005161046052600061048052803b15612b96576000610420606461043c6103c051855af1610860573d600060003e3d6000fd5b50610da2565b60036103a051186108e8576060366103e0376102a0516103205160028111612b965760051b6103e001526102e051634515cef3610440526103e051610460526104005161048052610420516104a05260006104c052803b15612b96576000610440608461045c6103c051855af16108e2573d600060003e3d6000fd5b50610da2565b60046103a05118610972576080366103e0376102a0516103205160038111612b965760051b6103e001526102e05163029b2f34610460526103e05161048052610400516104a052610420516104c052610440516104e052600061050052803b15612b9657600061046060a461047c6103c051855af161096c573d600060003e3d6000fd5b50610da2565b60056103a05118610da25760a0366103e0376102a0516103205160048111612b965760051b6103e001526102e0516384738499610480526103e0516104a052610400516104c052610420516104e05261044051610500526104605161052052600061054052803b15612b9657600061048060c461049c6103c051855af16109fe573d600060003e3d6000fd5b50610da2565b60056103605118610a8c576060366103e0376102a0516103205160028111612b965760051b6103e001526102e051632b6e993a610440526103e051610460526104005161048052610420516104a05260006104c05260016104e052803b15612b9657600061044060a461045c6103c051855af1610a86573d600060003e3d6000fd5b50610da2565b60066103605118610b465760016103805118610af8576102e051631a4d01d26103e0526102a051610400526103405180607f1c612b965761042052600061044052803b15612b965760006103e060646103fc6000855af1610af2573d600060003e3d6000fd5b50610da2565b6102e05163f1dc3cc96103e0526102a051610400526103405161042052600061044052803b15612b965760006103e060646103fc6000855af1610b40573d600060003e3d6000fd5b50610da2565b60076103605118610bb2576102e05163517a55a36103e0526102a051610400526103405180607f1c612b96576104205260006104405260016104605260206103e060846103fc6000855af1610ba0573d600060003e3d6000fd5b60203d10612b96576103e05050610da2565b60086103605118610d3c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610bf1576020612ba8600039600051610280511815610bf4565b60005b610d02576020612ba86000396000516102605118610c2c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511815610c2f565b60005b610cc25760246103e0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610400527f5745544800000000000000000000000000000000000000000000000000000000610420526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd610da2565b6102e051632e1a7d4d6103e0526102a05161040052803b15612b965760006103e060246103fc6000855af1610cfc573d600060003e3d6000fd5b50610da2565b6102e05163d0e30db06103e052803b15612b965760006103e060046103fc6102a051855af1610d36573d600060003e3d6000fd5b50610da2565b600d6103e0527f4261642073776170207479706500000000000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118610dca57476102a052610e0b565b610280516370a082316103e052306104005260206103e060246103fc845afa610df8573d600060003e3d6000fd5b60203d10612b96576103e09050516102a0525b6102a051610e795760106103e0527f5265636569766564206e6f7468696e6700000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b60056102c05118610e8b576001610ebd565b6102c0518060011b818160011c18612b9657905060018101818110612b96579050600a8111612b965760051b60400151155b15610ec757610eda565b6102805161026052600101818118610293575b50506102a05160018103818111612b965790506102a0526104a4356102a0511015610f655760086102c0527f536c6970706167650000000000000000000000000000000000000000000000006102e0526102c0506102c051806102e001601f826000031636823750506308c379a06102805260206102a052601f19601f6102c051011660440161029cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118610fb55760006102c0526102c050600060006102c0516102e06102a051610240515af161102c573d600060003e3d6000fd61102c565b6102805163a9059cbb6102c052610240516102e0526102a0516103005260206102c060446102dc6000855af1610ff0573d600060003e3d6000fd5b3d61100757803b15612b9657600161032052611020565b60203d10612b96576102c0518060011c612b9657610320525b61032090505115612b96575b61024051337f56d0661e240dfb199ef196e16e6f42473990366314f0226ac978f7be3cd9ee836040516102c0526060516102e0526080516103005260a0516103205260c0516103405260e051610360526101005161038052610120516103a052610140516103c052610160516103e052610180516104005260a06101646104203760a06102046104c03760a06102a46105603760a06103446106003760a06103e46106a0376101a051610740526101c051610760526101e05161078052610200516107a052610220516107c052610484356107e0526102a051610800526105606102c0a360206102a06000600055f35b6381889a2c811861113c576104a43610612b965760a0366101a0376111a1565b63637653cb8118611d17576105443610612b96576104a4358060a01c612b96576101a0526104c4358060a01c612b96576101c0526104e4358060a01c612b96576101e052610504358060a01c612b965761020052610524358060a01c612b9657610220525b6004358060a01c612b96576040526024358060a01c612b96576060526044358060a01c612b96576080526064358060a01c612b965760a0526084358060a01c612b965760c05260a4358060a01c612b965760e05260c4358060a01c612b96576101005260e4358060a01c612b965761012052610104358060a01c612b965761014052610124358060a01c612b965761016052610144358060a01c612b96576101805234612b9657604051610240526000610260526104843561028052600160058101905b806102a0526102a0518060011b818160011c18612b9657905060018103818111612b96579050600a8111612b965760051b604001516102c0526102a05160018103818111612b9657905060048111612b965760051b6101a001516102e0526102a0518060011b818160011c18612b96579050600a8111612b965760051b604001516102605260a06102a05160018103818111612b9657905060048111612b96570261016401803561030052602081013561032052604081013561034052606081013561036052608081013561038052506001610340511861140b57600161036051186113b3576102c051635e0d443f6103a0526103005180607f1c612b96576103c0526103205180607f1c612b96576103e052610280516104005260206103a060646103bc845afa61139c573d600060003e3d6000fd5b60203d10612b96576103a090505161028052611c98565b6102c05163556d6e9f6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa6113f4573d600060003e3d6000fd5b60203d10612b96576103a090505161028052611c98565b600261034051186114e15760016103605118611489576102c0516307211ef76103a0526103005180607f1c612b96576103c0526103205180607f1c612b96576103e052610280516104005260206103a060646103bc845afa611472573d600060003e3d6000fd5b60203d10612b96576103a090505161028052611c98565b6102c0516385f11d1e6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa6114ca573d600060003e3d6000fd5b60203d10612b96576103a090505161028052611c98565b600361034051186115bf576001610360511861155f576102e0516307211ef76103a0526103005180607f1c612b96576103c0526103205180607f1c612b96576103e052610280516104005260206103a060646103bc845afa611548573d600060003e3d6000fd5b60203d10612b96576103a090505161028052611c98565b6102c05163e9737ee26103a0526102e0516103c052610300516103e0526103205161040052610280516104205260206103a060846103bc845afa6115a8573d600060003e3d6000fd5b60203d10612b96576103a090505161028052611c98565b61034051600481186115d25760016115d8565b60058118155b90506117e95761034051600681186115f15760016115f7565b60078118155b905061173657600861034051186116cc576020612ba86000396000516102405118611623576001611635565b6020612ba86000396000516102605118155b611c985760246103a0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e206103c0527f57455448000000000000000000000000000000000000000000000000000000006103e0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd611c9856611c98565b600d6103a0527f42616420737761702074797065000000000000000000000000000000000000006103c0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd611c98565b60016103605118611799576102c05163cc2b27d76103c052610280516103e0526103205180607f1c612b96576104005260206103c060446103dc845afa611782573d600060003e3d6000fd5b60203d10612b96576103c090505161028052611c98565b6102c051634fb08c5e6103c052610280516103e052610320516104005260206103c060446103dc845afa6117d2573d600060003e3d6000fd5b60203d10612b96576103c090505161028052611c98565b600161036051186118d057610140366103c037610280516103005160098111612b965760051b6103c001526020612bc86000396000516379ccdf49610500526102c0516105205261026051610540526103c051610560526103e05161058052610400516105a052610420516105c052610440516105e052610460516106005261048051610620526104a051610640526104c051610660526104e05161068052610380516106a05260016106c05260016106e05260206105006101e461051c845afa6118b9573d600060003e3d6000fd5b60203d10612b965761050090505161028052611c98565b600261038051186119ab576040366103c037610280516103005160018111612b965760051b6103c0015260026103605118611955576102c051638d8ea727610400526103c051610420526103e051610440526020610400604461041c845afa61193e573d600060003e3d6000fd5b60203d10612b965761040090505161028052611c98565b6102c05163ed8e84f3610400526103c051610420526103e051610440526001610460526020610400606461041c845afa611994573d600060003e3d6000fd5b60203d10612b965761040090505161028052611c98565b60036103805118611a96576060366103c037610280516103005160028111612b965760051b6103c0015260026103605118611a38576102c051635b6f1b5a610420526103c051610440526103e0516104605261040051610480526020610420606461043c845afa611a21573d600060003e3d6000fd5b60203d10612b965761042090505161028052611c98565b6102c051633883e119610420526103c051610440526103e05161046052610400516104805260016104a0526020610420608461043c845afa611a7f573d600060003e3d6000fd5b60203d10612b965761042090505161028052611c98565b60046103805118611b91576080366103c037610280516103005160038111612b965760051b6103c0015260026103605118611b2b576102c051631a805185610440526103c051610460526103e05161048052610400516104a052610420516104c0526020610440608461045c845afa611b14573d600060003e3d6000fd5b60203d10612b965761044090505161028052611c98565b6102c05163cf701ff7610440526103c051610460526103e05161048052610400516104a052610420516104c05260016104e052602061044060a461045c845afa611b7a573d600060003e3d6000fd5b60203d10612b965761044090505161028052611c98565b60056103805118611c985760a0366103c037610280516103005160048111612b965760051b6103c0015260026103605118611c2e576102c0516309379690610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052602061046060a461047c845afa611c17573d600060003e3d6000fd5b60203d10612b965761046090505161028052611c98565b6102c051637ede89c5610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052600161052052602061046060c461047c845afa611c85573d600060003e3d6000fd5b60203d10612b9657610460905051610280525b60056102a05118611caa576001611cdc565b6102a0518060011b818160011c18612b9657905060018101818110612b96579050600a8111612b965760051b60400151155b15611ce657611cf9565b6102605161024052600101818118611265575b50506102805160018103818111612b965790506102a05260206102a0f35b63c07b53538118611d38576105443610612b96576101403661024037611e5d565b6381fc0ca58118611da8576105e43610612b9657610544358060a01c612b965761024052610564358060a01c612b965761026052610584358060a01c612b9657610280526105a4358060a01c612b96576102a0526105c4358060a01c612b96576102c05260a0366102e037611e5d565b6390e7e2058118612b92576106843610612b9657610544358060a01c612b965761024052610564358060a01c612b965761026052610584358060a01c612b9657610280526105a4358060a01c612b96576102a0526105c4358060a01c612b96576102c0526105e4358060a01c612b96576102e052610604358060a01c612b965761030052610624358060a01c612b965761032052610644358060a01c612b965761034052610664358060a01c612b9657610360525b6004358060a01c612b96576040526024358060a01c612b96576060526044358060a01c612b96576080526064358060a01c612b965760a0526084358060a01c612b965760c05260a4358060a01c612b965760e05260c4358060a01c612b96576101005260e4358060a01c612b965761012052610104358060a01c612b965761014052610124358060a01c612b965761016052610144358060a01c612b9657610180526104a4358060a01c612b96576101a0526104c4358060a01c612b96576101c0526104e4358060a01c612b96576101e052610504358060a01c612b965761020052610524358060a01c612b96576102205234612b96576104843561038052600160058101905b806103a0526103a0518060060360068111612b965790506103c0526103c0518060011b818160011c18612b9657905060018103818111612b96579050600a8111612b965760051b604001516103e0526103e051611fc057612b7f565b6103c05160018103818111612b965790508060011b818160011c18612b96579050600a8111612b965760051b60400151610400526103c0518060011b818160011c18612b96579050600a8111612b965760051b60400151610420526103c05160018103818111612b9657905060048111612b965760051b6101a00151610440526103c05160018103818111612b9657905060048111612b965760051b6102400151610460526103c05160018103818111612b9657905060048111612b965760051b6102e001516104805260a06103c05160018103818111612b9657905060048111612b9657026101640180356104a05260208101356104c05260408101356104e05260608101356105005260808101356105205250610520516105405260016104e051186122e75760016105005118612201576104605161217a576020612bc860003960005163158819d46105605261044051610580526104a05180607f1c612b96576105a0526104c05180607f1c612b96576105c052610380516105e0526105405161060052602061056060a461057c845afa612163573d600060003e3d6000fd5b60203d10612b965761056090505161038052612b7f565b6020612bc860003960005163571f00b56105605261044051610580526104a05180607f1c612b96576105a0526104c05180607f1c612b96576105c052610380516105e05261054051610600526104605161062052602061056060c461057c845afa6121ea573d600060003e3d6000fd5b60203d10612b965761056090505161038052612b7f565b610500516002811861221457600161221a565b60038118155b905061227857610440516337ed3a7a610560526104a051610580526104c0516105a052610380516105c0526020610560606461057c845afa612261573d600060003e3d6000fd5b60203d10612b965761056090505161038052612b7f565b6020612be860003960005163ca4bc71461058052610440516105a0526104a0516105c0526104c0516105e05261038051610600526105405161062052602061058060a461059c845afa6122d0573d600060003e3d6000fd5b60203d10612b965761058090505161038052612b7f565b6104e051600281186122fa576001612300565b60038118155b90506129e3576104e0516004811861231957600161231f565b60058118155b9050612930576104e0516006811861233857600161233e565b60078118155b905061247d5760086104e05118612413576020612ba8600039600051610400511861236a57600161237c565b6020612ba86000396000516104205118155b612b7f576024610560527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610580527f57455448000000000000000000000000000000000000000000000000000000006105a05261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd612b7f56612b7f565b600d610560527f42616420737761702074797065000000000000000000000000000000000000006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd612b7f565b60016105005118612564576101403661058037610380516104c05160098111612b965760051b61058001526020612bc86000396000516379ccdf496106c0526103e0516106e052610400516107005261058051610720526105a051610740526105c051610760526105e05161078052610600516107a052610620516107c052610640516107e052610660516108005261068051610820526106a05161084052610540516108605260006108805260016108a05260206106c06101e46106dc845afa61254d573d600060003e3d6000fd5b60203d10612b96576106c090505161038052612b7f565b6002610540511861263f5760403661058037610380516104c05160018111612b965760051b6105800152600261050051186125e9576103e051638d8ea7276105c052610580516105e0526105a0516106005260206105c060446105dc845afa6125d2573d600060003e3d6000fd5b60203d10612b96576105c090505161038052612b7f565b6103e05163ed8e84f36105c052610580516105e0526105a0516106005260006106205260206105c060646105dc845afa612628573d600060003e3d6000fd5b60203d10612b96576105c090505161038052612b7f565b6003610540511861272a5760603661058037610380516104c05160028111612b965760051b6105800152600261050051186126cc576103e051635b6f1b5a6105e05261058051610600526105a051610620526105c0516106405260206105e060646105fc845afa6126b5573d600060003e3d6000fd5b60203d10612b96576105e090505161038052612b7f565b6103e051633883e1196105e05261058051610600526105a051610620526105c0516106405260006106605260206105e060846105fc845afa612713573d600060003e3d6000fd5b60203d10612b96576105e090505161038052612b7f565b600461054051186128255760803661058037610380516104c05160038111612b965760051b6105800152600261050051186127bf576103e051631a8051856106005261058051610620526105a051610640526105c051610660526105e051610680526020610600608461061c845afa6127a8573d600060003e3d6000fd5b60203d10612b965761060090505161038052612b7f565b6103e05163cf701ff76106005261058051610620526105a051610640526105c051610660526105e0516106805260006106a052602061060060a461061c845afa61280e573d600060003e3d6000fd5b60203d10612b965761060090505161038052612b7f565b60056105405118612b7f5760a03661058037610380516104c05160048111612b965760051b6105800152600261050051186128c2576103e05163093796906106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c052602061062060a461063c845afa6128ab573d600060003e3d6000fd5b60203d10612b965761062090505161038052612b7f565b6103e051637ede89c56106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c05260006106e052602061062060c461063c845afa612919573d600060003e3d6000fd5b60203d10612b965761062090505161038052612b7f565b60016105005118612993576103e05163cc2b27d761058052610380516105a0526104a05180607f1c612b96576105c0526020610580604461059c845afa61297c573d600060003e3d6000fd5b60203d10612b965761058090505161038052612b7f565b6103e051634fb08c5e61058052610380516105a0526104a0516105c0526020610580604461059c845afa6129cc573d600060003e3d6000fd5b60203d10612b965761058090505161038052612b7f565b60016105005118612b045761046051612a75576020612bc8600039600051638fd3218f61058052610440516105a0526104a05180607f1c612b96576105c0526104c05180607f1c612b96576105e05261038051610600526105405161062052602061058060a461059c845afa612a5e573d600060003e3d6000fd5b60203d10612b965761058090505161038052612b7f565b6020612bc8600039600051634933a86461058052610440516105a0526104a05180607f1c612b96576105c0526104c05180607f1c612b96576105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa612aed573d600060003e3d6000fd5b60203d10612b965761058090505161038052612b7f565b6020612be8600039600051638ca1565361058052610440516105a0526104a0516105c0526104c0516105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa612b6c573d600060003e3d6000fd5b60203d10612b9657610580905051610380525b600101818118611f645750506020610380f35b505b005b600080fda165767970657283000307000b00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc

-----Decoded View---------------
Arg [0] : _weth (address): 0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83
Arg [1] : _stable_calc (address): 0xCA8d0747B5573D69653C3aC22242e6341C36e4b4
Arg [2] : _crypto_calc (address): 0xA72C85C258A81761433B4e8da60505Fe3Dd551CC

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [1] : 000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4
Arg [2] : 000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc


Block Transaction 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
Chain Token Portfolio % Price Amount Value
ETH33.25%$3,495.390.000000000000000001<$0.000001
ARB33.25%$3,495.390.000000000000000001<$0.000001
OP33.25%$3,495.280.000000000000000001<$0.000001
AVAX0.24%$25.430.000000000000000001<$0.000001
FTM
Fantom (FTM)
<0.01%$0.5815630.000000000000000001<$0.000001
MATIC<0.01%$0.5815360.000000000000000001<$0.000001
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.