ETH Price: $3,690.63 (-4.45%)

Contract

0xF0d4c12A5768D806021F80a262B4d39d26C58b8D

Overview

ETH Balance

1 wei

ETH Value

Less Than $0.01 (@ $3,690.63/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Exchange1290391632024-12-08 16:58:2343 hrs ago1733677103IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000011162920.00140107
Exchange1289645352024-12-06 23:30:473 days ago1733527847IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000031994630.00140216
Exchange1289627862024-12-06 22:32:293 days ago1733524349IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000017368390.0014015
Exchange1286131972024-11-28 20:19:3111 days ago1732825171IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000226759260.00140036
Exchange1285751052024-11-27 23:09:4712 days ago1732748987IN
0xF0d4c12A...d26C58b8D
0 ETH0.000001201540.00103566
Exchange1284066882024-11-24 1:35:5316 days ago1732412153IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000008174780.0014007
Exchange1283132902024-11-21 21:42:3718 days ago1732225357IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000007460210.00140765
Exchange1283129972024-11-21 21:32:5118 days ago1732224771IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000004645670.00140582
Exchange1280340722024-11-15 10:35:2125 days ago1731666921IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000011090530.00140111
Exchange1277101192024-11-07 22:36:5532 days ago1731019015IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000009186940.00140077
Exchange1276192322024-11-05 20:07:2134 days ago1730837241IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000025783050.0014005
Exchange1275116202024-11-03 8:20:1737 days ago1730622017IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000006050870.00140086
Exchange1272572432024-10-28 11:01:0343 days ago1730113263IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000010512190.00140356
Exchange1272566582024-10-28 10:41:3343 days ago1730112093IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000011013580.00140375
Exchange1272453532024-10-28 4:24:4343 days ago1730089483IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000006492880.00140565
Exchange1269666052024-10-21 17:33:0749 days ago1729531987IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000007424510.00177408
Exchange1269661362024-10-21 17:17:2949 days ago1729531049IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000007410020.00179538
Exchange1264596232024-10-09 23:53:4361 days ago1728518023IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000085675640.01384086
Exchange1264591322024-10-09 23:37:2161 days ago1728517041IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000090249840.01453314
Exchange1264483572024-10-09 17:38:1161 days ago1728495491IN
0xF0d4c12A...d26C58b8D
0 ETH0.000003487080.00667341
Exchange1264482192024-10-09 17:33:3561 days ago1728495215IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000035968580.00655953
Exchange1264481472024-10-09 17:31:1161 days ago1728495071IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000034312470.00637509
Exchange1264481132024-10-09 17:30:0361 days ago1728495003IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000033613160.00643896
Exchange1264480412024-10-09 17:27:3961 days ago1728494859IN
0xF0d4c12A...d26C58b8D
0 ETH0.000003356990.00625252
Exchange1264480052024-10-09 17:26:2761 days ago1728494787IN
0xF0d4c12A...d26C58b8D
0 ETH0.0000033774020.00620062
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
1285751052024-11-27 23:09:4712 days ago1732748987
0xF0d4c12A...d26C58b8D
0.200554305948265 ETH
1285751052024-11-27 23:09:4712 days ago1732748987
0xF0d4c12A...d26C58b8D
0.200554305948265 ETH
1260702692024-09-30 23:35:1570 days ago1727739315
0xF0d4c12A...d26C58b8D
0.001984762283583 ETH
1260702692024-09-30 23:35:1570 days ago1727739315
0xF0d4c12A...d26C58b8D
0.001984762283583 ETH
1260701912024-09-30 23:32:3970 days ago1727739159
0xF0d4c12A...d26C58b8D
0.005938773792752 ETH
1260701912024-09-30 23:32:3970 days ago1727739159
0xF0d4c12A...d26C58b8D
0.005938773792752 ETH
1240730552024-08-15 18:01:27116 days ago1723744887
0xF0d4c12A...d26C58b8D
0.202085542400027 ETH
1240730552024-08-15 18:01:27116 days ago1723744887
0xF0d4c12A...d26C58b8D
0.202085542400027 ETH
1236205162024-08-05 6:36:49127 days ago1722839809
0xF0d4c12A...d26C58b8D
0.3 ETH
1236205162024-08-05 6:36:49127 days ago1722839809
0xF0d4c12A...d26C58b8D
0.3 ETH
1225758212024-07-12 2:13:39151 days ago1720750419
0xF0d4c12A...d26C58b8D
0.167616847172419 ETH
1225758212024-07-12 2:13:39151 days ago1720750419
0xF0d4c12A...d26C58b8D
0.167616847172419 ETH
1224590282024-07-09 9:20:33154 days ago1720516833
0xF0d4c12A...d26C58b8D
0.01613379861537 ETH
1224590282024-07-09 9:20:33154 days ago1720516833
0xF0d4c12A...d26C58b8D
0.01613379861537 ETH
1224541582024-07-09 6:38:13154 days ago1720507093
0xF0d4c12A...d26C58b8D
0.00681162795503 ETH
1224541582024-07-09 6:38:13154 days ago1720507093
0xF0d4c12A...d26C58b8D
0.00681162795503 ETH
1224383042024-07-08 21:49:45154 days ago1720475385
0xF0d4c12A...d26C58b8D
0.000384341347077 ETH
1224383042024-07-08 21:49:45154 days ago1720475385
0xF0d4c12A...d26C58b8D
0.000384341347077 ETH
1224343332024-07-08 19:37:23154 days ago1720467443
0xF0d4c12A...d26C58b8D
0.000393202762285 ETH
1224343332024-07-08 19:37:23154 days ago1720467443
0xF0d4c12A...d26C58b8D
0.000393202762285 ETH
1224307142024-07-08 17:36:45154 days ago1720460205
0xF0d4c12A...d26C58b8D
0.167704197778224 ETH
1224307142024-07-08 17:36:45154 days ago1720460205
0xF0d4c12A...d26C58b8D
0.167704197778224 ETH
1224252282024-07-08 14:33:53154 days ago1720449233
0xF0d4c12A...d26C58b8D
0.009502153659542 ETH
1224252282024-07-08 14:33:53154 days ago1720449233
0xF0d4c12A...d26C58b8D
0.009502153659542 ETH
1224233732024-07-08 13:32:03154 days ago1720445523
0xF0d4c12A...d26C58b8D
0.065369201114171 ETH
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CurveRouterOptimism v1.0

Compiler Version
vyper:0.3.7

Optimization Enabled:
N/A

Other Settings:
default evmVersion, None license

Contract Source Code (Vyper language format)

# @version 0.3.7

"""
@title CurveRouterOptimism 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

# SNX
interface SnxCoin:
    def currencyKey() -> bytes32: nonpayable

interface Synthetix:
    def exchangeWithTracking(sourceCurrencyKey: bytes32, sourceAmount: uint256, destinationCurrencyKey: bytes32, rewardAddress: address, trackingCode: bytes32) -> uint256: nonpayable

interface SynthetixExchanger:
    def getAmountsForExchange(sourceAmount: uint256, sourceCurrencyKey: bytes32, destinationCurrencyKey: bytes32) -> AmountAndFee: view

interface SynthetixAddressResolver:
    def getAddress(name: bytes32) -> address: view

# 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)

# SNX
# https://github.com/Synthetixio/synthetix-docs/blob/master/content/addresses.md
SNX_ADDRESS_RESOLVER: constant(address) = 0x95A6a3f44a70172E7d50a9e28c85Dfd712756B8C
SNX_TRACKING_CODE: constant(bytes32) = 0x4355525645000000000000000000000000000000000000000000000000000000  # CURVE
SNX_EXCHANGER_NAME: constant(bytes32) = 0x45786368616E6765720000000000000000000000000000000000000000000000  # Exchanger
snx_currency_keys: HashMap[address, bytes32]

# 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, _snx_coins: address[4]):
    WETH_ADDRESS = _weth
    STABLE_CALC = StableCalc(_stable_calc)
    CRYPTO_CALC = CryptoCalc(_crypto_calc)

    for _snx_coin in _snx_coins:
        self.is_approved[_snx_coin][0x8700dAec35aF8Ff88c16BdF0418774CB3D7599B4] = True
        self.snx_currency_keys[_snx_coin] = SnxCoin(_snx_coin).currencyKey()


@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
                        9. for SNX swaps (sUSD, sEUR, sETH, sBTC)

                        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"
        elif params[2] == 9:
            Synthetix(swap).exchangeWithTracking(self.snx_currency_keys[input_token], amount, self.snx_currency_keys[output_token], empty(address), SNX_TRACKING_CODE)
        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
                        9. for SNX swaps (sUSD, sEUR, sETH, sBTC)

                        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"
        elif params[2] == 9:
            snx_exchanger: address = SynthetixAddressResolver(SNX_ADDRESS_RESOLVER).getAddress(SNX_EXCHANGER_NAME)
            amount_and_fee: AmountAndFee = SynthetixExchanger(snx_exchanger).getAmountsForExchange(
                amount, self.snx_currency_keys[input_token], self.snx_currency_keys[output_token]
            )
            amount = amount_and_fee.amountReceived
        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
                        9. for SNX swaps (sUSD, sEUR, sETH, sBTC)

                        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"
        elif params[2] == 9:
            snx_exchanger: address = SynthetixAddressResolver(SNX_ADDRESS_RESOLVER).getAddress(SNX_EXCHANGER_NAME)
            amount_and_fee: AmountAndFee = SynthetixExchanger(snx_exchanger).getAmountsForExchange(
                10**18, self.snx_currency_keys[input_token], self.snx_currency_keys[output_token]
            )
            amount = amount * 10**18 / amount_and_fee.amountReceived
        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"},{"name":"_snx_coins","type":"address[4]"}],"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"}]}]

60206130216000396000518060a01c61301c5760405260206130416000396000518060a01c61301c5760605260206130616000396000518060a01c61301c5760805260206130816000396000518060a01c61301c5760a05260206130a16000396000518060a01c61301c5760c05260206130c16000396000518060a01c61301c5760e05260206130e16000396000518060a01c61301c57610100523461301c57604051612eb552606051612ed552608051612ef55260006004905b8060051b60a00151610120526001600261012051602052600052604060002080738700daec35af8ff88c16bdf0418774cb3d7599b460205260005260406000209050556101205163dbd06c85610140526020610140600461015c6000855af1610128573d600060003e3d6000fd5b60203d1061301c576101409050516001610120516020526000526040600020556001018181186100ba575050612eb561016661000039612f15610000f36003361161000c57612ea1565b60003560e01c63371dc4478118610037576104c43610612ea35760a0366101a037336102405261011a565b635c9c18e281186100a5576105643610612ea3576104c4358060a01c612ea3576101a0526104e4358060a01c612ea3576101c052610504358060a01c612ea3576101e052610524358060a01c612ea35761020052610544358060a01c612ea35761022052336102405261011a565b63c872a3c581186111c3576105843610612ea3576104c4358060a01c612ea3576101a0526104e4358060a01c612ea3576101c052610504358060a01c612ea3576101e052610524358060a01c612ea35761020052610544358060a01c612ea35761022052610564358060a01c612ea357610240525b6004358060a01c612ea3576040526024358060a01c612ea3576060526044358060a01c612ea3576080526064358060a01c612ea35760a0526084358060a01c612ea35760c05260a4358060a01c612ea35760e05260c4358060a01c612ea3576101005260e4358060a01c612ea35761012052610104358060a01c612ea35761014052610124358060a01c612ea35761016052610144358060a01c612ea35761018052600054600114612ea357600160005560405161026052600061028052610484356102a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610260511861020d576102a0513418612ea35761028b565b34612ea357610260516323b872dd6102c052336102e05230610300526102a0516103205260206102c060646102dc6000855af161024f573d600060003e3d6000fd5b3d61026657803b15612ea35760016103405261027f565b60203d10612ea3576102c0518060011c612ea357610340525b61034090505115612ea3575b600160058101905b806102c0526102c0518060011b818160011c18612ea357905060018103818111612ea3579050600a8111612ea35760051b604001516102e0526102c05160018103818111612ea357905060048111612ea35760051b6101a00151610300526102c0518060011b818160011c18612ea3579050600a8111612ea35760051b604001516102805260a06102c05160018103818111612ea357905060048111612ea357026101640180356103205260208101356103405260408101356103605260608101356103805260808101356103a052506002610260516020526000526040600020806102e0516020526000526040600020905054610436576102605163095ea7b36103c0526102e0516103e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6104005260206103c060446103dc6000855af16103e3573d600060003e3d6000fd5b3d6103f357600161042052610404565b6103c0518060011c612ea357610420525b61042090505115612ea35760016002610260516020526000526040600020806102e05160205260005260406000209050555b60006103c05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610463576102a0516103c0525b600161036051186105da57600161038051186104e1576102e051633df021246103e0526103205180607f1c612ea357610400526103405180607f1c612ea357610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6103c051855af16104db573d600060003e3d6000fd5b50610e49565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610506576001610522565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b61057c576102e051635b41b9086103e052610320516104005261034051610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6000855af1610576573d600060003e3d6000fd5b50610e49565b6102e05163394747c56103e052610320516104005261034051610420526102a05161044052600061046052600161048052803b15612ea35760006103e060a46103fc6103c051855af16105d4573d600060003e3d6000fd5b50610e49565b600261036051186106b05760016103805118610658576102e05163a6417ed66103e0526103205180607f1c612ea357610400526103405180607f1c612ea357610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6103c051855af1610652573d600060003e3d6000fd5b50610e49565b6102e0516365b2489b6103e052610320516104005261034051610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6103c051855af16106aa573d600060003e3d6000fd5b50610e49565b600361036051186107e15760016103805118610734576102e051637981c43e6103e05261030051610400526103205180607f1c612ea357610420526103405180607f1c612ea357610440526102a05161046052600061048052803b15612ea35760006103e060a46103fc6000855af161072e573d600060003e3d6000fd5b50610e49565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610759576001610775565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b6103e0526102e051632bf78c61610400526103005161042052610320516104405261034051610460526102a0516104805260006104a0526103e0516104c052803b15612ea357600061040060c461041c6103c051855af16107db573d600060003e3d6000fd5b50610e49565b60046103605118610a045760026103a05118610866576040366103e0376102a0516103205160018111612ea35760051b6103e001526102e051630b4c7e4d610420526103e051610440526104005161046052600061048052803b15612ea3576000610420606461043c6103c051855af1610860573d600060003e3d6000fd5b50610e49565b60036103a051186108e8576060366103e0376102a0516103205160028111612ea35760051b6103e001526102e051634515cef3610440526103e051610460526104005161048052610420516104a05260006104c052803b15612ea3576000610440608461045c6103c051855af16108e2573d600060003e3d6000fd5b50610e49565b60046103a05118610972576080366103e0376102a0516103205160038111612ea35760051b6103e001526102e05163029b2f34610460526103e05161048052610400516104a052610420516104c052610440516104e052600061050052803b15612ea357600061046060a461047c6103c051855af161096c573d600060003e3d6000fd5b50610e49565b60056103a05118610e495760a0366103e0376102a0516103205160048111612ea35760051b6103e001526102e0516384738499610480526103e0516104a052610400516104c052610420516104e05261044051610500526104605161052052600061054052803b15612ea357600061048060c461049c6103c051855af16109fe573d600060003e3d6000fd5b50610e49565b60056103605118610a8c576060366103e0376102a0516103205160028111612ea35760051b6103e001526102e051632b6e993a610440526103e051610460526104005161048052610420516104a05260006104c05260016104e052803b15612ea357600061044060a461045c6103c051855af1610a86573d600060003e3d6000fd5b50610e49565b60066103605118610b465760016103805118610af8576102e051631a4d01d26103e0526102a051610400526103405180607f1c612ea35761042052600061044052803b15612ea35760006103e060646103fc6000855af1610af2573d600060003e3d6000fd5b50610e49565b6102e05163f1dc3cc96103e0526102a051610400526103405161042052600061044052803b15612ea35760006103e060646103fc6000855af1610b40573d600060003e3d6000fd5b50610e49565b60076103605118610bb2576102e05163517a55a36103e0526102a051610400526103405180607f1c612ea3576104205260006104405260016104605260206103e060846103fc6000855af1610ba0573d600060003e3d6000fd5b60203d10612ea3576103e05050610e49565b60086103605118610d3c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610bf1576020612eb5600039600051610280511815610bf4565b60005b610d02576020612eb56000396000516102605118610c2c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511815610c2f565b60005b610cc25760246103e0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610400527f5745544800000000000000000000000000000000000000000000000000000000610420526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd610e49565b6102e051632e1a7d4d6103e0526102a05161040052803b15612ea35760006103e060246103fc6000855af1610cfc573d600060003e3d6000fd5b50610e49565b6102e05163d0e30db06103e052803b15612ea35760006103e060046103fc6102a051855af1610d36573d600060003e3d6000fd5b50610e49565b60096103605118610de3576102e0516330ead7606103e052600161026051602052600052604060002054610400526102a05161042052600161028051602052600052604060002054610440526000610460527f43555256450000000000000000000000000000000000000000000000000000006104805260206103e060a46103fc6000855af1610dd1573d600060003e3d6000fd5b60203d10612ea3576103e05050610e49565b600d6103e0527f4261642073776170207479706500000000000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118610e7157476102a052610eb2565b610280516370a082316103e052306104005260206103e060246103fc845afa610e9f573d600060003e3d6000fd5b60203d10612ea3576103e09050516102a0525b6102a051610f205760106103e0527f5265636569766564206e6f7468696e6700000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b60056102c05118610f32576001610f64565b6102c0518060011b818160011c18612ea357905060018101818110612ea3579050600a8111612ea35760051b60400151155b15610f6e57610f81565b6102805161026052600101818118610293575b50506102a05160018103818111612ea35790506102a0526104a4356102a051101561100c5760086102c0527f536c6970706167650000000000000000000000000000000000000000000000006102e0526102c0506102c051806102e001601f826000031636823750506308c379a06102805260206102a052601f19601f6102c051011660440161029cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511861105c5760006102c0526102c050600060006102c0516102e06102a051610240515af16110d3573d600060003e3d6000fd6110d3565b6102805163a9059cbb6102c052610240516102e0526102a0516103005260206102c060446102dc6000855af1611097573d600060003e3d6000fd5b3d6110ae57803b15612ea3576001610320526110c7565b60203d10612ea3576102c0518060011c612ea357610320525b61032090505115612ea3575b61024051337f56d0661e240dfb199ef196e16e6f42473990366314f0226ac978f7be3cd9ee836040516102c0526060516102e0526080516103005260a0516103205260c0516103405260e051610360526101005161038052610120516103a052610140516103c052610160516103e052610180516104005260a06101646104203760a06102046104c03760a06102a46105603760a06103446106003760a06103e46106a0376101a051610740526101c051610760526101e05161078052610200516107a052610220516107c052610484356107e0526102a051610800526105606102c0a360206102a06000600055f35b6381889a2c81186111e3576104a43610612ea35760a0366101a037611248565b63637653cb8118611ed7576105443610612ea3576104a4358060a01c612ea3576101a0526104c4358060a01c612ea3576101c0526104e4358060a01c612ea3576101e052610504358060a01c612ea35761020052610524358060a01c612ea357610220525b6004358060a01c612ea3576040526024358060a01c612ea3576060526044358060a01c612ea3576080526064358060a01c612ea35760a0526084358060a01c612ea35760c05260a4358060a01c612ea35760e05260c4358060a01c612ea3576101005260e4358060a01c612ea35761012052610104358060a01c612ea35761014052610124358060a01c612ea35761016052610144358060a01c612ea3576101805234612ea357604051610240526000610260526104843561028052600160058101905b806102a0526102a0518060011b818160011c18612ea357905060018103818111612ea3579050600a8111612ea35760051b604001516102c0526102a05160018103818111612ea357905060048111612ea35760051b6101a001516102e0526102a0518060011b818160011c18612ea3579050600a8111612ea35760051b604001516102605260a06102a05160018103818111612ea357905060048111612ea357026101640180356103005260208101356103205260408101356103405260608101356103605260808101356103805250600161034051186114b2576001610360511861145a576102c051635e0d443f6103a0526103005180607f1c612ea3576103c0526103205180607f1c612ea3576103e052610280516104005260206103a060646103bc845afa611443573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b6102c05163556d6e9f6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa61149b573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b600261034051186115885760016103605118611530576102c0516307211ef76103a0526103005180607f1c612ea3576103c0526103205180607f1c612ea3576103e052610280516104005260206103a060646103bc845afa611519573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b6102c0516385f11d1e6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa611571573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b600361034051186116665760016103605118611606576102e0516307211ef76103a0526103005180607f1c612ea3576103c0526103205180607f1c612ea3576103e052610280516104005260206103a060646103bc845afa6115ef573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b6102c05163e9737ee26103a0526102e0516103c052610300516103e0526103205161040052610280516104205260206103a060846103bc845afa61164f573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b610340516004811861167957600161167f565b60058118155b90506119a957610340516006811861169857600161169e565b60078118155b90506118f65760086103405118611773576020612eb560003960005161024051186116ca5760016116dc565b6020612eb56000396000516102605118155b611e585760246103a0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e206103c0527f57455448000000000000000000000000000000000000000000000000000000006103e0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd611e5856611e58565b6009610340511861188c576321f8a7216103c0527f45786368616e67657200000000000000000000000000000000000000000000006103e05260206103c060246103dc7395a6a3f44a70172e7d50a9e28c85dfd712756b8c5afa6117dc573d600060003e3d6000fd5b60203d10612ea3576103c0518060a01c612ea35761040052610400516103a0526103a05163f450aa3461042052610280516104405260016102405160205260005260406000205461046052600161026051602052600052604060002054610480526060610420606461043c845afa611859573d600060003e3d6000fd5b60603d10612ea357610420905080516103c05260208101516103e052604081015161040052506103c05161028052611e58565b600d6103a0527f42616420737761702074797065000000000000000000000000000000000000006103c0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd611e58565b60016103605118611959576102c05163cc2b27d76103c052610280516103e0526103205180607f1c612ea3576104005260206103c060446103dc845afa611942573d600060003e3d6000fd5b60203d10612ea3576103c090505161028052611e58565b6102c051634fb08c5e6103c052610280516103e052610320516104005260206103c060446103dc845afa611992573d600060003e3d6000fd5b60203d10612ea3576103c090505161028052611e58565b60016103605118611a9057610140366103c037610280516103005160098111612ea35760051b6103c001526020612ed56000396000516379ccdf49610500526102c0516105205261026051610540526103c051610560526103e05161058052610400516105a052610420516105c052610440516105e052610460516106005261048051610620526104a051610640526104c051610660526104e05161068052610380516106a05260016106c05260016106e05260206105006101e461051c845afa611a79573d600060003e3d6000fd5b60203d10612ea35761050090505161028052611e58565b60026103805118611b6b576040366103c037610280516103005160018111612ea35760051b6103c0015260026103605118611b15576102c051638d8ea727610400526103c051610420526103e051610440526020610400604461041c845afa611afe573d600060003e3d6000fd5b60203d10612ea35761040090505161028052611e58565b6102c05163ed8e84f3610400526103c051610420526103e051610440526001610460526020610400606461041c845afa611b54573d600060003e3d6000fd5b60203d10612ea35761040090505161028052611e58565b60036103805118611c56576060366103c037610280516103005160028111612ea35760051b6103c0015260026103605118611bf8576102c051635b6f1b5a610420526103c051610440526103e0516104605261040051610480526020610420606461043c845afa611be1573d600060003e3d6000fd5b60203d10612ea35761042090505161028052611e58565b6102c051633883e119610420526103c051610440526103e05161046052610400516104805260016104a0526020610420608461043c845afa611c3f573d600060003e3d6000fd5b60203d10612ea35761042090505161028052611e58565b60046103805118611d51576080366103c037610280516103005160038111612ea35760051b6103c0015260026103605118611ceb576102c051631a805185610440526103c051610460526103e05161048052610400516104a052610420516104c0526020610440608461045c845afa611cd4573d600060003e3d6000fd5b60203d10612ea35761044090505161028052611e58565b6102c05163cf701ff7610440526103c051610460526103e05161048052610400516104a052610420516104c05260016104e052602061044060a461045c845afa611d3a573d600060003e3d6000fd5b60203d10612ea35761044090505161028052611e58565b60056103805118611e585760a0366103c037610280516103005160048111612ea35760051b6103c0015260026103605118611dee576102c0516309379690610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052602061046060a461047c845afa611dd7573d600060003e3d6000fd5b60203d10612ea35761046090505161028052611e58565b6102c051637ede89c5610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052600161052052602061046060c461047c845afa611e45573d600060003e3d6000fd5b60203d10612ea357610460905051610280525b60056102a05118611e6a576001611e9c565b6102a0518060011b818160011c18612ea357905060018101818110612ea3579050600a8111612ea35760051b60400151155b15611ea657611eb9565b610260516102405260010181811861130c575b50506102805160018103818111612ea35790506102a05260206102a0f35b63c07b53538118611ef8576105443610612ea357610140366102403761201d565b6381fc0ca58118611f68576105e43610612ea357610544358060a01c612ea35761024052610564358060a01c612ea35761026052610584358060a01c612ea357610280526105a4358060a01c612ea3576102a0526105c4358060a01c612ea3576102c05260a0366102e03761201d565b6390e7e2058118612e9f576106843610612ea357610544358060a01c612ea35761024052610564358060a01c612ea35761026052610584358060a01c612ea357610280526105a4358060a01c612ea3576102a0526105c4358060a01c612ea3576102c0526105e4358060a01c612ea3576102e052610604358060a01c612ea35761030052610624358060a01c612ea35761032052610644358060a01c612ea35761034052610664358060a01c612ea357610360525b6004358060a01c612ea3576040526024358060a01c612ea3576060526044358060a01c612ea3576080526064358060a01c612ea35760a0526084358060a01c612ea35760c05260a4358060a01c612ea35760e05260c4358060a01c612ea3576101005260e4358060a01c612ea35761012052610104358060a01c612ea35761014052610124358060a01c612ea35761016052610144358060a01c612ea357610180526104a4358060a01c612ea3576101a0526104c4358060a01c612ea3576101c0526104e4358060a01c612ea3576101e052610504358060a01c612ea35761020052610524358060a01c612ea3576102205234612ea3576104843561038052600160058101905b806103a0526103a0518060060360068111612ea35790506103c0526103c0518060011b818160011c18612ea357905060018103818111612ea3579050600a8111612ea35760051b604001516103e0526103e05161218057612e8c565b6103c05160018103818111612ea35790508060011b818160011c18612ea3579050600a8111612ea35760051b60400151610400526103c0518060011b818160011c18612ea3579050600a8111612ea35760051b60400151610420526103c05160018103818111612ea357905060048111612ea35760051b6101a00151610440526103c05160018103818111612ea357905060048111612ea35760051b6102400151610460526103c05160018103818111612ea357905060048111612ea35760051b6102e001516104805260a06103c05160018103818111612ea357905060048111612ea357026101640180356104a05260208101356104c05260408101356104e05260608101356105005260808101356105205250610520516105405260016104e051186124a757600161050051186123c1576104605161233a576020612ed560003960005163158819d46105605261044051610580526104a05180607f1c612ea3576105a0526104c05180607f1c612ea3576105c052610380516105e0526105405161060052602061056060a461057c845afa612323573d600060003e3d6000fd5b60203d10612ea35761056090505161038052612e8c565b6020612ed560003960005163571f00b56105605261044051610580526104a05180607f1c612ea3576105a0526104c05180607f1c612ea3576105c052610380516105e05261054051610600526104605161062052602061056060c461057c845afa6123aa573d600060003e3d6000fd5b60203d10612ea35761056090505161038052612e8c565b61050051600281186123d45760016123da565b60038118155b905061243857610440516337ed3a7a610560526104a051610580526104c0516105a052610380516105c0526020610560606461057c845afa612421573d600060003e3d6000fd5b60203d10612ea35761056090505161038052612e8c565b6020612ef560003960005163ca4bc71461058052610440516105a0526104a0516105c0526104c0516105e05261038051610600526105405161062052602061058060a461059c845afa612490573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6104e051600281186124ba5760016124c0565b60038118155b9050612cf0576104e051600481186124d95760016124df565b60058118155b9050612c3d576104e051600681186124f85760016124fe565b60078118155b905061278a5760086104e051186125d3576020612eb5600039600051610400511861252a57600161253c565b6020612eb56000396000516104205118155b612e8c576024610560527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610580527f57455448000000000000000000000000000000000000000000000000000000006105a05261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd612e8c56612e8c565b60096104e05118612720576321f8a721610580527f45786368616e67657200000000000000000000000000000000000000000000006105a0526020610580602461059c7395a6a3f44a70172e7d50a9e28c85dfd712756b8c5afa61263c573d600060003e3d6000fd5b60203d10612ea357610580518060a01c612ea3576105c0526105c051610560526105605163f450aa346105e052670de0b6b3a764000061060052600161040051602052600052604060002054610620526001610420516020526000526040600020546106405260606105e060646105fc845afa6126be573d600060003e3d6000fd5b60603d10612ea3576105e0905080516105805260208101516105a05260408101516105c0525061038051670de0b6b3a7640000810281670de0b6b3a7640000820418612ea3579050610580518015612ea3578082049050905061038052612e8c565b600d610560527f42616420737761702074797065000000000000000000000000000000000000006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd612e8c565b60016105005118612871576101403661058037610380516104c05160098111612ea35760051b61058001526020612ed56000396000516379ccdf496106c0526103e0516106e052610400516107005261058051610720526105a051610740526105c051610760526105e05161078052610600516107a052610620516107c052610640516107e052610660516108005261068051610820526106a05161084052610540516108605260006108805260016108a05260206106c06101e46106dc845afa61285a573d600060003e3d6000fd5b60203d10612ea3576106c090505161038052612e8c565b6002610540511861294c5760403661058037610380516104c05160018111612ea35760051b6105800152600261050051186128f6576103e051638d8ea7276105c052610580516105e0526105a0516106005260206105c060446105dc845afa6128df573d600060003e3d6000fd5b60203d10612ea3576105c090505161038052612e8c565b6103e05163ed8e84f36105c052610580516105e0526105a0516106005260006106205260206105c060646105dc845afa612935573d600060003e3d6000fd5b60203d10612ea3576105c090505161038052612e8c565b60036105405118612a375760603661058037610380516104c05160028111612ea35760051b6105800152600261050051186129d9576103e051635b6f1b5a6105e05261058051610600526105a051610620526105c0516106405260206105e060646105fc845afa6129c2573d600060003e3d6000fd5b60203d10612ea3576105e090505161038052612e8c565b6103e051633883e1196105e05261058051610600526105a051610620526105c0516106405260006106605260206105e060846105fc845afa612a20573d600060003e3d6000fd5b60203d10612ea3576105e090505161038052612e8c565b60046105405118612b325760803661058037610380516104c05160038111612ea35760051b610580015260026105005118612acc576103e051631a8051856106005261058051610620526105a051610640526105c051610660526105e051610680526020610600608461061c845afa612ab5573d600060003e3d6000fd5b60203d10612ea35761060090505161038052612e8c565b6103e05163cf701ff76106005261058051610620526105a051610640526105c051610660526105e0516106805260006106a052602061060060a461061c845afa612b1b573d600060003e3d6000fd5b60203d10612ea35761060090505161038052612e8c565b60056105405118612e8c5760a03661058037610380516104c05160048111612ea35760051b610580015260026105005118612bcf576103e05163093796906106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c052602061062060a461063c845afa612bb8573d600060003e3d6000fd5b60203d10612ea35761062090505161038052612e8c565b6103e051637ede89c56106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c05260006106e052602061062060c461063c845afa612c26573d600060003e3d6000fd5b60203d10612ea35761062090505161038052612e8c565b60016105005118612ca0576103e05163cc2b27d761058052610380516105a0526104a05180607f1c612ea3576105c0526020610580604461059c845afa612c89573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6103e051634fb08c5e61058052610380516105a0526104a0516105c0526020610580604461059c845afa612cd9573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b60016105005118612e115761046051612d82576020612ed5600039600051638fd3218f61058052610440516105a0526104a05180607f1c612ea3576105c0526104c05180607f1c612ea3576105e05261038051610600526105405161062052602061058060a461059c845afa612d6b573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6020612ed5600039600051634933a86461058052610440516105a0526104a05180607f1c612ea3576105c0526104c05180607f1c612ea3576105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa612dfa573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6020612ef5600039600051638ca1565361058052610440516105a0526104a0516105c0526104c0516105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa612e79573d600060003e3d6000fd5b60203d10612ea357610580905051610380525b6001018181186121245750506020610380f35b505b005b600080fda165767970657283000307000b005b600080fd0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc0000000000000000000000008c6f28f2f1a3c87f0f938b96d27520d9751ec8d9000000000000000000000000fbc4198702e81ae77c06d58f81b629bdf36f0a71000000000000000000000000e405de8f52ba7559f9df3c368500b6e6ae6cee49000000000000000000000000298b9b95708152ff6968aafd889c6586e9169f1d

Deployed Bytecode

0x6003361161000c57612ea1565b60003560e01c63371dc4478118610037576104c43610612ea35760a0366101a037336102405261011a565b635c9c18e281186100a5576105643610612ea3576104c4358060a01c612ea3576101a0526104e4358060a01c612ea3576101c052610504358060a01c612ea3576101e052610524358060a01c612ea35761020052610544358060a01c612ea35761022052336102405261011a565b63c872a3c581186111c3576105843610612ea3576104c4358060a01c612ea3576101a0526104e4358060a01c612ea3576101c052610504358060a01c612ea3576101e052610524358060a01c612ea35761020052610544358060a01c612ea35761022052610564358060a01c612ea357610240525b6004358060a01c612ea3576040526024358060a01c612ea3576060526044358060a01c612ea3576080526064358060a01c612ea35760a0526084358060a01c612ea35760c05260a4358060a01c612ea35760e05260c4358060a01c612ea3576101005260e4358060a01c612ea35761012052610104358060a01c612ea35761014052610124358060a01c612ea35761016052610144358060a01c612ea35761018052600054600114612ea357600160005560405161026052600061028052610484356102a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610260511861020d576102a0513418612ea35761028b565b34612ea357610260516323b872dd6102c052336102e05230610300526102a0516103205260206102c060646102dc6000855af161024f573d600060003e3d6000fd5b3d61026657803b15612ea35760016103405261027f565b60203d10612ea3576102c0518060011c612ea357610340525b61034090505115612ea3575b600160058101905b806102c0526102c0518060011b818160011c18612ea357905060018103818111612ea3579050600a8111612ea35760051b604001516102e0526102c05160018103818111612ea357905060048111612ea35760051b6101a00151610300526102c0518060011b818160011c18612ea3579050600a8111612ea35760051b604001516102805260a06102c05160018103818111612ea357905060048111612ea357026101640180356103205260208101356103405260408101356103605260608101356103805260808101356103a052506002610260516020526000526040600020806102e0516020526000526040600020905054610436576102605163095ea7b36103c0526102e0516103e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6104005260206103c060446103dc6000855af16103e3573d600060003e3d6000fd5b3d6103f357600161042052610404565b6103c0518060011c612ea357610420525b61042090505115612ea35760016002610260516020526000526040600020806102e05160205260005260406000209050555b60006103c05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610463576102a0516103c0525b600161036051186105da57600161038051186104e1576102e051633df021246103e0526103205180607f1c612ea357610400526103405180607f1c612ea357610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6103c051855af16104db573d600060003e3d6000fd5b50610e49565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610506576001610522565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b61057c576102e051635b41b9086103e052610320516104005261034051610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6000855af1610576573d600060003e3d6000fd5b50610e49565b6102e05163394747c56103e052610320516104005261034051610420526102a05161044052600061046052600161048052803b15612ea35760006103e060a46103fc6103c051855af16105d4573d600060003e3d6000fd5b50610e49565b600261036051186106b05760016103805118610658576102e05163a6417ed66103e0526103205180607f1c612ea357610400526103405180607f1c612ea357610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6103c051855af1610652573d600060003e3d6000fd5b50610e49565b6102e0516365b2489b6103e052610320516104005261034051610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6103c051855af16106aa573d600060003e3d6000fd5b50610e49565b600361036051186107e15760016103805118610734576102e051637981c43e6103e05261030051610400526103205180607f1c612ea357610420526103405180607f1c612ea357610440526102a05161046052600061048052803b15612ea35760006103e060a46103fc6000855af161072e573d600060003e3d6000fd5b50610e49565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610759576001610775565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b6103e0526102e051632bf78c61610400526103005161042052610320516104405261034051610460526102a0516104805260006104a0526103e0516104c052803b15612ea357600061040060c461041c6103c051855af16107db573d600060003e3d6000fd5b50610e49565b60046103605118610a045760026103a05118610866576040366103e0376102a0516103205160018111612ea35760051b6103e001526102e051630b4c7e4d610420526103e051610440526104005161046052600061048052803b15612ea3576000610420606461043c6103c051855af1610860573d600060003e3d6000fd5b50610e49565b60036103a051186108e8576060366103e0376102a0516103205160028111612ea35760051b6103e001526102e051634515cef3610440526103e051610460526104005161048052610420516104a05260006104c052803b15612ea3576000610440608461045c6103c051855af16108e2573d600060003e3d6000fd5b50610e49565b60046103a05118610972576080366103e0376102a0516103205160038111612ea35760051b6103e001526102e05163029b2f34610460526103e05161048052610400516104a052610420516104c052610440516104e052600061050052803b15612ea357600061046060a461047c6103c051855af161096c573d600060003e3d6000fd5b50610e49565b60056103a05118610e495760a0366103e0376102a0516103205160048111612ea35760051b6103e001526102e0516384738499610480526103e0516104a052610400516104c052610420516104e05261044051610500526104605161052052600061054052803b15612ea357600061048060c461049c6103c051855af16109fe573d600060003e3d6000fd5b50610e49565b60056103605118610a8c576060366103e0376102a0516103205160028111612ea35760051b6103e001526102e051632b6e993a610440526103e051610460526104005161048052610420516104a05260006104c05260016104e052803b15612ea357600061044060a461045c6103c051855af1610a86573d600060003e3d6000fd5b50610e49565b60066103605118610b465760016103805118610af8576102e051631a4d01d26103e0526102a051610400526103405180607f1c612ea35761042052600061044052803b15612ea35760006103e060646103fc6000855af1610af2573d600060003e3d6000fd5b50610e49565b6102e05163f1dc3cc96103e0526102a051610400526103405161042052600061044052803b15612ea35760006103e060646103fc6000855af1610b40573d600060003e3d6000fd5b50610e49565b60076103605118610bb2576102e05163517a55a36103e0526102a051610400526103405180607f1c612ea3576104205260006104405260016104605260206103e060846103fc6000855af1610ba0573d600060003e3d6000fd5b60203d10612ea3576103e05050610e49565b60086103605118610d3c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610bf1576020612eb5600039600051610280511815610bf4565b60005b610d02576020612eb56000396000516102605118610c2c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511815610c2f565b60005b610cc25760246103e0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610400527f5745544800000000000000000000000000000000000000000000000000000000610420526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd610e49565b6102e051632e1a7d4d6103e0526102a05161040052803b15612ea35760006103e060246103fc6000855af1610cfc573d600060003e3d6000fd5b50610e49565b6102e05163d0e30db06103e052803b15612ea35760006103e060046103fc6102a051855af1610d36573d600060003e3d6000fd5b50610e49565b60096103605118610de3576102e0516330ead7606103e052600161026051602052600052604060002054610400526102a05161042052600161028051602052600052604060002054610440526000610460527f43555256450000000000000000000000000000000000000000000000000000006104805260206103e060a46103fc6000855af1610dd1573d600060003e3d6000fd5b60203d10612ea3576103e05050610e49565b600d6103e0527f4261642073776170207479706500000000000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118610e7157476102a052610eb2565b610280516370a082316103e052306104005260206103e060246103fc845afa610e9f573d600060003e3d6000fd5b60203d10612ea3576103e09050516102a0525b6102a051610f205760106103e0527f5265636569766564206e6f7468696e6700000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b60056102c05118610f32576001610f64565b6102c0518060011b818160011c18612ea357905060018101818110612ea3579050600a8111612ea35760051b60400151155b15610f6e57610f81565b6102805161026052600101818118610293575b50506102a05160018103818111612ea35790506102a0526104a4356102a051101561100c5760086102c0527f536c6970706167650000000000000000000000000000000000000000000000006102e0526102c0506102c051806102e001601f826000031636823750506308c379a06102805260206102a052601f19601f6102c051011660440161029cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511861105c5760006102c0526102c050600060006102c0516102e06102a051610240515af16110d3573d600060003e3d6000fd6110d3565b6102805163a9059cbb6102c052610240516102e0526102a0516103005260206102c060446102dc6000855af1611097573d600060003e3d6000fd5b3d6110ae57803b15612ea3576001610320526110c7565b60203d10612ea3576102c0518060011c612ea357610320525b61032090505115612ea3575b61024051337f56d0661e240dfb199ef196e16e6f42473990366314f0226ac978f7be3cd9ee836040516102c0526060516102e0526080516103005260a0516103205260c0516103405260e051610360526101005161038052610120516103a052610140516103c052610160516103e052610180516104005260a06101646104203760a06102046104c03760a06102a46105603760a06103446106003760a06103e46106a0376101a051610740526101c051610760526101e05161078052610200516107a052610220516107c052610484356107e0526102a051610800526105606102c0a360206102a06000600055f35b6381889a2c81186111e3576104a43610612ea35760a0366101a037611248565b63637653cb8118611ed7576105443610612ea3576104a4358060a01c612ea3576101a0526104c4358060a01c612ea3576101c0526104e4358060a01c612ea3576101e052610504358060a01c612ea35761020052610524358060a01c612ea357610220525b6004358060a01c612ea3576040526024358060a01c612ea3576060526044358060a01c612ea3576080526064358060a01c612ea35760a0526084358060a01c612ea35760c05260a4358060a01c612ea35760e05260c4358060a01c612ea3576101005260e4358060a01c612ea35761012052610104358060a01c612ea35761014052610124358060a01c612ea35761016052610144358060a01c612ea3576101805234612ea357604051610240526000610260526104843561028052600160058101905b806102a0526102a0518060011b818160011c18612ea357905060018103818111612ea3579050600a8111612ea35760051b604001516102c0526102a05160018103818111612ea357905060048111612ea35760051b6101a001516102e0526102a0518060011b818160011c18612ea3579050600a8111612ea35760051b604001516102605260a06102a05160018103818111612ea357905060048111612ea357026101640180356103005260208101356103205260408101356103405260608101356103605260808101356103805250600161034051186114b2576001610360511861145a576102c051635e0d443f6103a0526103005180607f1c612ea3576103c0526103205180607f1c612ea3576103e052610280516104005260206103a060646103bc845afa611443573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b6102c05163556d6e9f6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa61149b573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b600261034051186115885760016103605118611530576102c0516307211ef76103a0526103005180607f1c612ea3576103c0526103205180607f1c612ea3576103e052610280516104005260206103a060646103bc845afa611519573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b6102c0516385f11d1e6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa611571573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b600361034051186116665760016103605118611606576102e0516307211ef76103a0526103005180607f1c612ea3576103c0526103205180607f1c612ea3576103e052610280516104005260206103a060646103bc845afa6115ef573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b6102c05163e9737ee26103a0526102e0516103c052610300516103e0526103205161040052610280516104205260206103a060846103bc845afa61164f573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b610340516004811861167957600161167f565b60058118155b90506119a957610340516006811861169857600161169e565b60078118155b90506118f65760086103405118611773576020612eb560003960005161024051186116ca5760016116dc565b6020612eb56000396000516102605118155b611e585760246103a0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e206103c0527f57455448000000000000000000000000000000000000000000000000000000006103e0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd611e5856611e58565b6009610340511861188c576321f8a7216103c0527f45786368616e67657200000000000000000000000000000000000000000000006103e05260206103c060246103dc7395a6a3f44a70172e7d50a9e28c85dfd712756b8c5afa6117dc573d600060003e3d6000fd5b60203d10612ea3576103c0518060a01c612ea35761040052610400516103a0526103a05163f450aa3461042052610280516104405260016102405160205260005260406000205461046052600161026051602052600052604060002054610480526060610420606461043c845afa611859573d600060003e3d6000fd5b60603d10612ea357610420905080516103c05260208101516103e052604081015161040052506103c05161028052611e58565b600d6103a0527f42616420737761702074797065000000000000000000000000000000000000006103c0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd611e58565b60016103605118611959576102c05163cc2b27d76103c052610280516103e0526103205180607f1c612ea3576104005260206103c060446103dc845afa611942573d600060003e3d6000fd5b60203d10612ea3576103c090505161028052611e58565b6102c051634fb08c5e6103c052610280516103e052610320516104005260206103c060446103dc845afa611992573d600060003e3d6000fd5b60203d10612ea3576103c090505161028052611e58565b60016103605118611a9057610140366103c037610280516103005160098111612ea35760051b6103c001526020612ed56000396000516379ccdf49610500526102c0516105205261026051610540526103c051610560526103e05161058052610400516105a052610420516105c052610440516105e052610460516106005261048051610620526104a051610640526104c051610660526104e05161068052610380516106a05260016106c05260016106e05260206105006101e461051c845afa611a79573d600060003e3d6000fd5b60203d10612ea35761050090505161028052611e58565b60026103805118611b6b576040366103c037610280516103005160018111612ea35760051b6103c0015260026103605118611b15576102c051638d8ea727610400526103c051610420526103e051610440526020610400604461041c845afa611afe573d600060003e3d6000fd5b60203d10612ea35761040090505161028052611e58565b6102c05163ed8e84f3610400526103c051610420526103e051610440526001610460526020610400606461041c845afa611b54573d600060003e3d6000fd5b60203d10612ea35761040090505161028052611e58565b60036103805118611c56576060366103c037610280516103005160028111612ea35760051b6103c0015260026103605118611bf8576102c051635b6f1b5a610420526103c051610440526103e0516104605261040051610480526020610420606461043c845afa611be1573d600060003e3d6000fd5b60203d10612ea35761042090505161028052611e58565b6102c051633883e119610420526103c051610440526103e05161046052610400516104805260016104a0526020610420608461043c845afa611c3f573d600060003e3d6000fd5b60203d10612ea35761042090505161028052611e58565b60046103805118611d51576080366103c037610280516103005160038111612ea35760051b6103c0015260026103605118611ceb576102c051631a805185610440526103c051610460526103e05161048052610400516104a052610420516104c0526020610440608461045c845afa611cd4573d600060003e3d6000fd5b60203d10612ea35761044090505161028052611e58565b6102c05163cf701ff7610440526103c051610460526103e05161048052610400516104a052610420516104c05260016104e052602061044060a461045c845afa611d3a573d600060003e3d6000fd5b60203d10612ea35761044090505161028052611e58565b60056103805118611e585760a0366103c037610280516103005160048111612ea35760051b6103c0015260026103605118611dee576102c0516309379690610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052602061046060a461047c845afa611dd7573d600060003e3d6000fd5b60203d10612ea35761046090505161028052611e58565b6102c051637ede89c5610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052600161052052602061046060c461047c845afa611e45573d600060003e3d6000fd5b60203d10612ea357610460905051610280525b60056102a05118611e6a576001611e9c565b6102a0518060011b818160011c18612ea357905060018101818110612ea3579050600a8111612ea35760051b60400151155b15611ea657611eb9565b610260516102405260010181811861130c575b50506102805160018103818111612ea35790506102a05260206102a0f35b63c07b53538118611ef8576105443610612ea357610140366102403761201d565b6381fc0ca58118611f68576105e43610612ea357610544358060a01c612ea35761024052610564358060a01c612ea35761026052610584358060a01c612ea357610280526105a4358060a01c612ea3576102a0526105c4358060a01c612ea3576102c05260a0366102e03761201d565b6390e7e2058118612e9f576106843610612ea357610544358060a01c612ea35761024052610564358060a01c612ea35761026052610584358060a01c612ea357610280526105a4358060a01c612ea3576102a0526105c4358060a01c612ea3576102c0526105e4358060a01c612ea3576102e052610604358060a01c612ea35761030052610624358060a01c612ea35761032052610644358060a01c612ea35761034052610664358060a01c612ea357610360525b6004358060a01c612ea3576040526024358060a01c612ea3576060526044358060a01c612ea3576080526064358060a01c612ea35760a0526084358060a01c612ea35760c05260a4358060a01c612ea35760e05260c4358060a01c612ea3576101005260e4358060a01c612ea35761012052610104358060a01c612ea35761014052610124358060a01c612ea35761016052610144358060a01c612ea357610180526104a4358060a01c612ea3576101a0526104c4358060a01c612ea3576101c0526104e4358060a01c612ea3576101e052610504358060a01c612ea35761020052610524358060a01c612ea3576102205234612ea3576104843561038052600160058101905b806103a0526103a0518060060360068111612ea35790506103c0526103c0518060011b818160011c18612ea357905060018103818111612ea3579050600a8111612ea35760051b604001516103e0526103e05161218057612e8c565b6103c05160018103818111612ea35790508060011b818160011c18612ea3579050600a8111612ea35760051b60400151610400526103c0518060011b818160011c18612ea3579050600a8111612ea35760051b60400151610420526103c05160018103818111612ea357905060048111612ea35760051b6101a00151610440526103c05160018103818111612ea357905060048111612ea35760051b6102400151610460526103c05160018103818111612ea357905060048111612ea35760051b6102e001516104805260a06103c05160018103818111612ea357905060048111612ea357026101640180356104a05260208101356104c05260408101356104e05260608101356105005260808101356105205250610520516105405260016104e051186124a757600161050051186123c1576104605161233a576020612ed560003960005163158819d46105605261044051610580526104a05180607f1c612ea3576105a0526104c05180607f1c612ea3576105c052610380516105e0526105405161060052602061056060a461057c845afa612323573d600060003e3d6000fd5b60203d10612ea35761056090505161038052612e8c565b6020612ed560003960005163571f00b56105605261044051610580526104a05180607f1c612ea3576105a0526104c05180607f1c612ea3576105c052610380516105e05261054051610600526104605161062052602061056060c461057c845afa6123aa573d600060003e3d6000fd5b60203d10612ea35761056090505161038052612e8c565b61050051600281186123d45760016123da565b60038118155b905061243857610440516337ed3a7a610560526104a051610580526104c0516105a052610380516105c0526020610560606461057c845afa612421573d600060003e3d6000fd5b60203d10612ea35761056090505161038052612e8c565b6020612ef560003960005163ca4bc71461058052610440516105a0526104a0516105c0526104c0516105e05261038051610600526105405161062052602061058060a461059c845afa612490573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6104e051600281186124ba5760016124c0565b60038118155b9050612cf0576104e051600481186124d95760016124df565b60058118155b9050612c3d576104e051600681186124f85760016124fe565b60078118155b905061278a5760086104e051186125d3576020612eb5600039600051610400511861252a57600161253c565b6020612eb56000396000516104205118155b612e8c576024610560527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610580527f57455448000000000000000000000000000000000000000000000000000000006105a05261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd612e8c56612e8c565b60096104e05118612720576321f8a721610580527f45786368616e67657200000000000000000000000000000000000000000000006105a0526020610580602461059c7395a6a3f44a70172e7d50a9e28c85dfd712756b8c5afa61263c573d600060003e3d6000fd5b60203d10612ea357610580518060a01c612ea3576105c0526105c051610560526105605163f450aa346105e052670de0b6b3a764000061060052600161040051602052600052604060002054610620526001610420516020526000526040600020546106405260606105e060646105fc845afa6126be573d600060003e3d6000fd5b60603d10612ea3576105e0905080516105805260208101516105a05260408101516105c0525061038051670de0b6b3a7640000810281670de0b6b3a7640000820418612ea3579050610580518015612ea3578082049050905061038052612e8c565b600d610560527f42616420737761702074797065000000000000000000000000000000000000006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd612e8c565b60016105005118612871576101403661058037610380516104c05160098111612ea35760051b61058001526020612ed56000396000516379ccdf496106c0526103e0516106e052610400516107005261058051610720526105a051610740526105c051610760526105e05161078052610600516107a052610620516107c052610640516107e052610660516108005261068051610820526106a05161084052610540516108605260006108805260016108a05260206106c06101e46106dc845afa61285a573d600060003e3d6000fd5b60203d10612ea3576106c090505161038052612e8c565b6002610540511861294c5760403661058037610380516104c05160018111612ea35760051b6105800152600261050051186128f6576103e051638d8ea7276105c052610580516105e0526105a0516106005260206105c060446105dc845afa6128df573d600060003e3d6000fd5b60203d10612ea3576105c090505161038052612e8c565b6103e05163ed8e84f36105c052610580516105e0526105a0516106005260006106205260206105c060646105dc845afa612935573d600060003e3d6000fd5b60203d10612ea3576105c090505161038052612e8c565b60036105405118612a375760603661058037610380516104c05160028111612ea35760051b6105800152600261050051186129d9576103e051635b6f1b5a6105e05261058051610600526105a051610620526105c0516106405260206105e060646105fc845afa6129c2573d600060003e3d6000fd5b60203d10612ea3576105e090505161038052612e8c565b6103e051633883e1196105e05261058051610600526105a051610620526105c0516106405260006106605260206105e060846105fc845afa612a20573d600060003e3d6000fd5b60203d10612ea3576105e090505161038052612e8c565b60046105405118612b325760803661058037610380516104c05160038111612ea35760051b610580015260026105005118612acc576103e051631a8051856106005261058051610620526105a051610640526105c051610660526105e051610680526020610600608461061c845afa612ab5573d600060003e3d6000fd5b60203d10612ea35761060090505161038052612e8c565b6103e05163cf701ff76106005261058051610620526105a051610640526105c051610660526105e0516106805260006106a052602061060060a461061c845afa612b1b573d600060003e3d6000fd5b60203d10612ea35761060090505161038052612e8c565b60056105405118612e8c5760a03661058037610380516104c05160048111612ea35760051b610580015260026105005118612bcf576103e05163093796906106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c052602061062060a461063c845afa612bb8573d600060003e3d6000fd5b60203d10612ea35761062090505161038052612e8c565b6103e051637ede89c56106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c05260006106e052602061062060c461063c845afa612c26573d600060003e3d6000fd5b60203d10612ea35761062090505161038052612e8c565b60016105005118612ca0576103e05163cc2b27d761058052610380516105a0526104a05180607f1c612ea3576105c0526020610580604461059c845afa612c89573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6103e051634fb08c5e61058052610380516105a0526104a0516105c0526020610580604461059c845afa612cd9573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b60016105005118612e115761046051612d82576020612ed5600039600051638fd3218f61058052610440516105a0526104a05180607f1c612ea3576105c0526104c05180607f1c612ea3576105e05261038051610600526105405161062052602061058060a461059c845afa612d6b573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6020612ed5600039600051634933a86461058052610440516105a0526104a05180607f1c612ea3576105c0526104c05180607f1c612ea3576105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa612dfa573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6020612ef5600039600051638ca1565361058052610440516105a0526104a0516105c0526104c0516105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa612e79573d600060003e3d6000fd5b60203d10612ea357610580905051610380525b6001018181186121245750506020610380f35b505b005b600080fda165767970657283000307000b0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc

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

0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc0000000000000000000000008c6f28f2f1a3c87f0f938b96d27520d9751ec8d9000000000000000000000000fbc4198702e81ae77c06d58f81b629bdf36f0a71000000000000000000000000e405de8f52ba7559f9df3c368500b6e6ae6cee49000000000000000000000000298b9b95708152ff6968aafd889c6586e9169f1d

-----Decoded View---------------
Arg [0] : _weth (address): 0x4200000000000000000000000000000000000006
Arg [1] : _stable_calc (address): 0xCA8d0747B5573D69653C3aC22242e6341C36e4b4
Arg [2] : _crypto_calc (address): 0xA72C85C258A81761433B4e8da60505Fe3Dd551CC
Arg [3] : _snx_coins (address[4]): 0x8c6f28f2F1A3C87F0f938b96d27520d9751ec8d9,0xFBc4198702E81aE77c06D58f81b629BDf36f0a71,0xE405de8F52ba7559f9df3C368500B6E6ae6Cee49,0x298B9B95708152ff6968aafd889c6586e9169f1D

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000004200000000000000000000000000000000000006
Arg [1] : 000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4
Arg [2] : 000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc
Arg [3] : 0000000000000000000000008c6f28f2f1a3c87f0f938b96d27520d9751ec8d9
Arg [4] : 000000000000000000000000fbc4198702e81ae77c06d58f81b629bdf36f0a71
Arg [5] : 000000000000000000000000e405de8f52ba7559f9df3c368500b6e6ae6cee49
Arg [6] : 000000000000000000000000298b9b95708152ff6968aafd889c6586e9169f1d


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.