ETH Price: $1,787.69 (+9.77%)
 

Overview

ETH Balance

1 wei

Eth Value

Less Than $0.01 (@ $1,787.69/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0xd4ac7d0d7457e6e66c6055ef729f00d8ecec41fa6694357e839423b89e7079c5 Exchange(pending)2025-04-20 1:26:043 days ago1745112364IN
0xF0d4c12A...d26C58b8D
0 ETH(Pending)(Pending)
0x3656b7bdf287cf094e1f6e51d94c65b184a82d95f0a422eb5ccb6d5f8e5bb63c Exchange(pending)2025-04-20 1:23:353 days ago1745112215IN
0xF0d4c12A...d26C58b8D
0.00074 ETH(Pending)(Pending)
Exchange214810332024-12-25 17:39:11118 days ago1735148351IN
0xF0d4c12A...d26C58b8D
0 ETH0.002974476.42217868
Exchange214797472024-12-25 13:20:23118 days ago1735132823IN
0xF0d4c12A...d26C58b8D
0 ETH0.001538064.10108097
Exchange214788692024-12-25 10:23:47118 days ago1735122227IN
0xF0d4c12A...d26C58b8D
0 ETH0.002212795.9196879
Exchange213369102024-12-05 14:31:59138 days ago1733409119IN
0xF0d4c12A...d26C58b8D
0 ETH0.0103225627.65900192
Exchange213368892024-12-05 14:27:47138 days ago1733408867IN
0xF0d4c12A...d26C58b8D
0 ETH0.010396526.38935527
Exchange213231622024-12-03 16:26:47140 days ago1733243207IN
0xF0d4c12A...d26C58b8D
0 ETH0.0155289433.68213933
Exchange213230592024-12-03 16:05:59140 days ago1733241959IN
0xF0d4c12A...d26C58b8D
0 ETH0.0174638637.88058795
Exchange211207222024-11-05 10:02:35169 days ago1730800955IN
0xF0d4c12A...d26C58b8D
0 ETH0.001723424.60732727
Exchange207593912024-09-15 23:45:23219 days ago1726443923IN
0xF0d4c12A...d26C58b8D
0 ETH0.000171341
Exchange207383122024-09-13 1:09:35222 days ago1726189775IN
0xF0d4c12A...d26C58b8D
0 ETH0.000627161.89793458
Exchange206449962024-08-31 0:32:59235 days ago1725064379IN
0xF0d4c12A...d26C58b8D
0 ETH0.000309960.85752735
Exchange206449932024-08-31 0:32:23235 days ago1725064343IN
0xF0d4c12A...d26C58b8D
0 ETH0.00028890.80321333
Exchange206320102024-08-29 4:58:59237 days ago1724907539IN
0xF0d4c12A...d26C58b8D
0 ETH0.000137560.73
Exchange205838682024-08-22 11:32:59243 days ago1724326379IN
0xF0d4c12A...d26C58b8D
0 ETH0.000375761.04317541
Exchange205828882024-08-22 8:15:35244 days ago1724314535IN
0xF0d4c12A...d26C58b8D
0 ETH0.000437651.05627804
Exchange205811512024-08-22 2:25:11244 days ago1724293511IN
0xF0d4c12A...d26C58b8D
0 ETH0.000188010.99769288
Exchange205759292024-08-21 8:53:47245 days ago1724230427IN
0xF0d4c12A...d26C58b8D
0 ETH0.000476021.29051293
Exchange205526312024-08-18 2:49:47248 days ago1723949387IN
0xF0d4c12A...d26C58b8D
0 ETH0.000368820.81679359
Exchange205523302024-08-18 1:49:23248 days ago1723945763IN
0xF0d4c12A...d26C58b8D
0 ETH0.00037880.8424464
Exchange205449672024-08-17 1:08:47249 days ago1723856927IN
0xF0d4c12A...d26C58b8D
0 ETH0.000447630.99135099
Exchange205411322024-08-16 12:16:23249 days ago1723810583IN
0xF0d4c12A...d26C58b8D
0 ETH0.000707561.56505479
Exchange205411262024-08-16 12:15:11249 days ago1723810511IN
0xF0d4c12A...d26C58b8D
0 ETH0.000707331.56454476
Exchange205411202024-08-16 12:13:59249 days ago1723810439IN
0xF0d4c12A...d26C58b8D
0 ETH0.000613571.37231096
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Exchange223259642025-04-22 17:12:5916 hrs ago1745341979
0xF0d4c12A...d26C58b8D
0.016949 ETH
Exchange223259642025-04-22 17:12:5916 hrs ago1745341979
0xF0d4c12A...d26C58b8D
0.016949 ETH
Exchange223138392025-04-21 0:37:592 days ago1745195879
0xF0d4c12A...d26C58b8D
0.0632098 ETH
Exchange223138392025-04-21 0:37:592 days ago1745195879
0xF0d4c12A...d26C58b8D
0.0632098 ETH
Exchange223116942025-04-20 17:26:112 days ago1745169971
0xF0d4c12A...d26C58b8D
0.00329572 ETH
Exchange223116942025-04-20 17:26:112 days ago1745169971
0xF0d4c12A...d26C58b8D
0.00329572 ETH
Exchange223113522025-04-20 16:17:472 days ago1745165867
0xF0d4c12A...d26C58b8D
0.011964 ETH
Exchange223113522025-04-20 16:17:472 days ago1745165867
0xF0d4c12A...d26C58b8D
0.011964 ETH
Exchange223093372025-04-20 9:31:473 days ago1745141507
0xF0d4c12A...d26C58b8D
0.013958 ETH
Exchange223093372025-04-20 9:31:473 days ago1745141507
0xF0d4c12A...d26C58b8D
0.013958 ETH
Transfer223086592025-04-20 7:15:593 days ago1745133359
0xF0d4c12A...d26C58b8D
0.9266127 ETH
Transfer223086592025-04-20 7:15:593 days ago1745133359
0xF0d4c12A...d26C58b8D
0.9266127 ETH
Exchange223080772025-04-20 5:19:113 days ago1745126351
0xF0d4c12A...d26C58b8D
0.0997 ETH
Exchange223080772025-04-20 5:19:113 days ago1745126351
0xF0d4c12A...d26C58b8D
0.0997 ETH
Transfer223074062025-04-20 3:03:593 days ago1745118239
0xF0d4c12A...d26C58b8D
6.10581491 ETH
Transfer223074062025-04-20 3:03:593 days ago1745118239
0xF0d4c12A...d26C58b8D
6.10581491 ETH
Exchange223009982025-04-19 5:35:474 days ago1745040947
0xF0d4c12A...d26C58b8D
1.85442 ETH
Exchange223009982025-04-19 5:35:474 days ago1745040947
0xF0d4c12A...d26C58b8D
1.85442 ETH
Exchange223000592025-04-19 2:27:114 days ago1745029631
0xF0d4c12A...d26C58b8D
0.08973 ETH
Exchange223000592025-04-19 2:27:114 days ago1745029631
0xF0d4c12A...d26C58b8D
0.08973 ETH
Transfer222996102025-04-19 0:56:474 days ago1745024207
0xF0d4c12A...d26C58b8D
0.38003833 ETH
Transfer222996102025-04-19 0:56:474 days ago1745024207
0xF0d4c12A...d26C58b8D
0.38003833 ETH
Exchange222969032025-04-18 15:53:474 days ago1744991627
0xF0d4c12A...d26C58b8D
0.0115022 ETH
Exchange222969032025-04-18 15:53:474 days ago1744991627
0xF0d4c12A...d26C58b8D
0.0115022 ETH
Exchange222958012025-04-18 12:11:594 days ago1744978319
0xF0d4c12A...d26C58b8D
13.631981 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CurveRouter 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 CurveRouter 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

interface stETH:
    def submit(_refferer: address): payable

interface frxETHMinter:
    def submit(): payable

interface wstETH:
    def getWstETHByStETH(_stETHAmount: uint256) -> uint256: view
    def getStETHByWstETH(_wstETHAmount: uint256) -> uint256: view
    def wrap(_stETHAmount: uint256) -> uint256: nonpayable
    def unwrap(_wstETHAmount: uint256) -> uint256: nonpayable

interface sfrxETH:
    def convertToShares(assets: uint256) -> uint256: view
    def convertToAssets(shares: uint256) -> uint256: view
    def deposit(assets: uint256, receiver: address) -> uint256: nonpayable
    def redeem(shares: uint256, receiver: address, owner: address) -> uint256: nonpayable

interface wBETH:
    def deposit(referral: address): payable
    def exchangeRate() -> uint256: view

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

interface Synthetix:
    def exchangeAtomically(sourceCurrencyKey: bytes32, sourceAmount: uint256, destinationCurrencyKey: bytes32, trackingCode: bytes32, minAmount: uint256) -> uint256: nonpayable

interface SynthetixExchanger:
    def getAmountsForAtomicExchange(sourceAmount: uint256, sourceCurrencyKey: bytes32, destinationCurrencyKey: bytes32) -> AtomicAmountAndFee: 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 AtomicAmountAndFee:
    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
STETH_ADDRESS: constant(address) = 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84
WSTETH_ADDRESS: constant(address) = 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0
FRXETH_ADDRESS: constant(address) = 0x5E8422345238F34275888049021821E8E08CAa1f
SFRXETH_ADDRESS: constant(address) = 0xac3E018457B222d93114458476f3E3416Abbe38F
WBETH_ADDRESS: constant(address) = 0xa2E3356610840701BDf5611a53974510Ae27E2e1
WETH_ADDRESS: immutable(address)


# SNX
# https://github.com/Synthetixio/synthetix-docs/blob/master/content/addresses.md
SNX_ADDRESS_RESOLVER: constant(address) = 0x823bE81bbF96BEc0e25CA13170F5AaCb5B79ba83
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]):
    self.is_approved[WSTETH_ADDRESS][WSTETH_ADDRESS] = True
    self.is_approved[SFRXETH_ADDRESS][SFRXETH_ADDRESS] = True

    WETH_ADDRESS = _weth
    STABLE_CALC = StableCalc(_stable_calc)
    CRYPTO_CALC = CryptoCalc(_crypto_calc)

    for _snx_coin in _snx_coins:
        self.is_approved[_snx_coin][0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F] = 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, ETH -> stETH or ETH -> frxETH, stETH <-> wstETH, frxETH <-> sfrxETH, ETH -> wBETH
                        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 only needed 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)
            elif input_token == ETH_ADDRESS and output_token == STETH_ADDRESS:
                stETH(swap).submit(0x0000000000000000000000000000000000000000, value=amount)
            elif input_token == ETH_ADDRESS and output_token == FRXETH_ADDRESS:
                frxETHMinter(swap).submit(value=amount)
            elif input_token == STETH_ADDRESS and output_token == WSTETH_ADDRESS:
                wstETH(swap).wrap(amount)
            elif input_token == WSTETH_ADDRESS and output_token == STETH_ADDRESS:
                wstETH(swap).unwrap(amount)
            elif input_token == FRXETH_ADDRESS and output_token == SFRXETH_ADDRESS:
                sfrxETH(swap).deposit(amount, self)
            elif input_token == SFRXETH_ADDRESS and output_token == FRXETH_ADDRESS:
                sfrxETH(swap).redeem(amount, self, self)
            elif input_token == ETH_ADDRESS and output_token == WBETH_ADDRESS:
                wBETH(swap).deposit(0xeCb456EA5365865EbAb8a2661B0c503410e9B347, value=amount)
            else:
                raise "Swap type 8 is only for ETH <-> WETH, ETH -> stETH or ETH -> frxETH, stETH <-> wstETH, frxETH <-> sfrxETH, ETH -> wBETH"
        elif params[2] == 9:
            Synthetix(swap).exchangeAtomically(self.snx_currency_keys[input_token], amount, self.snx_currency_keys[output_token], SNX_TRACKING_CODE, 0)
        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, ETH -> stETH or ETH -> frxETH, stETH <-> wstETH, frxETH <-> sfrxETH, ETH -> wBETH
                        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 or \
                    (input_token == ETH_ADDRESS and output_token == STETH_ADDRESS) or \
                    (input_token == ETH_ADDRESS and output_token == FRXETH_ADDRESS):
                # ETH <--> WETH rate is 1:1
                # ETH ---> stETH rate is 1:1
                # ETH ---> frxETH rate is 1:1
                pass
            elif input_token == WSTETH_ADDRESS:
                amount = wstETH(swap).getStETHByWstETH(amount)
            elif output_token == WSTETH_ADDRESS:
                amount = wstETH(swap).getWstETHByStETH(amount)
            elif input_token == SFRXETH_ADDRESS:
                amount = sfrxETH(swap).convertToAssets(amount)
            elif output_token == SFRXETH_ADDRESS:
                amount = sfrxETH(swap).convertToShares(amount)
            elif output_token == WBETH_ADDRESS:
                amount = amount * 10**18 / wBETH(swap).exchangeRate()
            else:
                raise "Swap type 8 is only for ETH <-> WETH, ETH -> stETH or ETH -> frxETH, stETH <-> wstETH, frxETH <-> sfrxETH, ETH -> wBETH"
        elif params[2] == 9:
            snx_exchanger: address = SynthetixAddressResolver(SNX_ADDRESS_RESOLVER).getAddress(SNX_EXCHANGER_NAME)
            atomic_amount_and_fee: AtomicAmountAndFee = SynthetixExchanger(snx_exchanger).getAmountsForAtomicExchange(
                amount, self.snx_currency_keys[input_token], self.snx_currency_keys[output_token]
            )
            amount = atomic_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 output 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, ETH -> stETH or ETH -> frxETH, stETH <-> wstETH, frxETH <-> sfrxETH, ETH -> wBETH
                        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). Should be a zap address for double 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 or \
                    (input_token == ETH_ADDRESS and output_token == STETH_ADDRESS) or \
                    (input_token == ETH_ADDRESS and output_token == FRXETH_ADDRESS):
                # ETH <--> WETH rate is 1:1
                # ETH ---> stETH rate is 1:1
                # ETH ---> frxETH rate is 1:1
                pass
            elif input_token == WSTETH_ADDRESS:
                amount = wstETH(swap).getWstETHByStETH(amount)
            elif output_token == WSTETH_ADDRESS:
                amount = wstETH(swap).getStETHByWstETH(amount)
            elif input_token == SFRXETH_ADDRESS:
                amount = sfrxETH(swap).convertToShares(amount)
            elif output_token == SFRXETH_ADDRESS:
                amount = sfrxETH(swap).convertToAssets(amount)
            elif output_token == WBETH_ADDRESS:
                amount = amount * wBETH(swap).exchangeRate() / 10**18
            else:
                raise "Swap type 8 is only for ETH <-> WETH, ETH -> stETH or ETH -> frxETH, stETH <-> wstETH, frxETH <-> sfrxETH, ETH -> wBETH"
        elif params[2] == 9:
            snx_exchanger: address = SynthetixAddressResolver(SNX_ADDRESS_RESOLVER).getAddress(SNX_EXCHANGER_NAME)
            atomic_amount_and_fee: AtomicAmountAndFee = SynthetixExchanger(snx_exchanger).getAmountsForAtomicExchange(
                10**18, self.snx_currency_keys[input_token], self.snx_currency_keys[output_token]
            )
            amount = amount * 10**18 / atomic_amount_and_fee.amountReceived
        else:
            raise "Bad swap type"

    return amount

Contract Security Audit

Contract ABI

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

6020613ace6000396000518060a01c613ac9576040526020613aee6000396000518060a01c613ac9576060526020613b0e6000396000518060a01c613ac9576080526020613b2e6000396000518060a01c613ac95760a0526020613b4e6000396000518060a01c613ac95760c0526020613b6e6000396000518060a01c613ac95760e0526020613b8e6000396000518060a01c613ac9576101005234613ac95760016002737f39c581f595b53c5cb19bd0b3f8da6c935e2ca0602052600052604060002080737f39c581f595b53c5cb19bd0b3f8da6c935e2ca060205260005260406000209050556001600273ac3e018457b222d93114458476f3e3416abbe38f60205260005260406000208073ac3e018457b222d93114458476f3e3416abbe38f60205260005260406000209050556040516138d2526060516138f2526080516139125260006004905b8060051b60a0015161012052600160026101205160205260005260406000208073c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f60205260005260406000209050556101205163dbd06c85610140526020610140600461015c6000855af16101b8573d600060003e3d6000fd5b60203d10613ac95761014090505160016101205160205260005260406000205560010181811861014a5750506138d26101f661000039613932610000f36003361161000c576138be565b60003560e01c63371dc4478118610037576104c436106138c05760a0366101a037336102405261011a565b635c9c18e281186100a55761056436106138c0576104c4358060a01c6138c0576101a0526104e4358060a01c6138c0576101c052610504358060a01c6138c0576101e052610524358060a01c6138c05761020052610544358060a01c6138c05761022052336102405261011a565b63c872a3c581186115e05761058436106138c0576104c4358060a01c6138c0576101a0526104e4358060a01c6138c0576101c052610504358060a01c6138c0576101e052610524358060a01c6138c05761020052610544358060a01c6138c05761022052610564358060a01c6138c057610240525b6004358060a01c6138c0576040526024358060a01c6138c0576060526044358060a01c6138c0576080526064358060a01c6138c05760a0526084358060a01c6138c05760c05260a4358060a01c6138c05760e05260c4358060a01c6138c0576101005260e4358060a01c6138c05761012052610104358060a01c6138c05761014052610124358060a01c6138c05761016052610144358060a01c6138c057610180526000546001146138c057600160005560405161026052600061028052610484356102a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610260511861020d576102a05134186138c05761028b565b346138c057610260516323b872dd6102c052336102e05230610300526102a0516103205260206102c060646102dc6000855af161024f573d600060003e3d6000fd5b3d61026657803b156138c05760016103405261027f565b60203d106138c0576102c0518060011c6138c057610340525b610340905051156138c0575b600160058101905b806102c0526102c0518060011b818160011c186138c0579050600181038181116138c0579050600a81116138c05760051b604001516102e0526102c051600181038181116138c0579050600481116138c05760051b6101a00151610300526102c0518060011b818160011c186138c0579050600a81116138c05760051b604001516102805260a06102c051600181038181116138c0579050600481116138c057026101640180356103205260208101356103405260408101356103605260608101356103805260808101356103a052506002610260516020526000526040600020806102e0516020526000526040600020905054610436576102605163095ea7b36103c0526102e0516103e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6104005260206103c060446103dc6000855af16103e3573d600060003e3d6000fd5b3d6103f357600161042052610404565b6103c0518060011c6138c057610420525b610420905051156138c05760016002610260516020526000526040600020806102e05160205260005260406000209050555b60006103c05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610463576102a0516103c0525b600161036051186105da57600161038051186104e1576102e051633df021246103e0526103205180607f1c6138c057610400526103405180607f1c6138c057610420526102a05161044052600061046052803b156138c05760006103e060846103fc6103c051855af16104db573d600060003e3d6000fd5b50611266565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610506576001610522565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b61057c576102e051635b41b9086103e052610320516104005261034051610420526102a05161044052600061046052803b156138c05760006103e060846103fc6000855af1610576573d600060003e3d6000fd5b50611266565b6102e05163394747c56103e052610320516104005261034051610420526102a05161044052600061046052600161048052803b156138c05760006103e060a46103fc6103c051855af16105d4573d600060003e3d6000fd5b50611266565b600261036051186106b05760016103805118610658576102e05163a6417ed66103e0526103205180607f1c6138c057610400526103405180607f1c6138c057610420526102a05161044052600061046052803b156138c05760006103e060846103fc6103c051855af1610652573d600060003e3d6000fd5b50611266565b6102e0516365b2489b6103e052610320516104005261034051610420526102a05161044052600061046052803b156138c05760006103e060846103fc6103c051855af16106aa573d600060003e3d6000fd5b50611266565b600361036051186107e15760016103805118610734576102e051637981c43e6103e05261030051610400526103205180607f1c6138c057610420526103405180607f1c6138c057610440526102a05161046052600061048052803b156138c05760006103e060a46103fc6000855af161072e573d600060003e3d6000fd5b50611266565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610759576001610775565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b6103e0526102e051632bf78c61610400526103005161042052610320516104405261034051610460526102a0516104805260006104a0526103e0516104c052803b156138c057600061040060c461041c6103c051855af16107db573d600060003e3d6000fd5b50611266565b60046103605118610a045760026103a05118610866576040366103e0376102a05161032051600181116138c05760051b6103e001526102e051630b4c7e4d610420526103e051610440526104005161046052600061048052803b156138c0576000610420606461043c6103c051855af1610860573d600060003e3d6000fd5b50611266565b60036103a051186108e8576060366103e0376102a05161032051600281116138c05760051b6103e001526102e051634515cef3610440526103e051610460526104005161048052610420516104a05260006104c052803b156138c0576000610440608461045c6103c051855af16108e2573d600060003e3d6000fd5b50611266565b60046103a05118610972576080366103e0376102a05161032051600381116138c05760051b6103e001526102e05163029b2f34610460526103e05161048052610400516104a052610420516104c052610440516104e052600061050052803b156138c057600061046060a461047c6103c051855af161096c573d600060003e3d6000fd5b50611266565b60056103a051186112665760a0366103e0376102a05161032051600481116138c05760051b6103e001526102e0516384738499610480526103e0516104a052610400516104c052610420516104e05261044051610500526104605161052052600061054052803b156138c057600061048060c461049c6103c051855af16109fe573d600060003e3d6000fd5b50611266565b60056103605118610a8c576060366103e0376102a05161032051600281116138c05760051b6103e001526102e051632b6e993a610440526103e051610460526104005161048052610420516104a05260006104c05260016104e052803b156138c057600061044060a461045c6103c051855af1610a86573d600060003e3d6000fd5b50611266565b60066103605118610b465760016103805118610af8576102e051631a4d01d26103e0526102a051610400526103405180607f1c6138c05761042052600061044052803b156138c05760006103e060646103fc6000855af1610af2573d600060003e3d6000fd5b50611266565b6102e05163f1dc3cc96103e0526102a051610400526103405161042052600061044052803b156138c05760006103e060646103fc6000855af1610b40573d600060003e3d6000fd5b50611266565b60076103605118610bb2576102e05163517a55a36103e0526102a051610400526103405180607f1c6138c0576104205260006104405260016104605260206103e060846103fc6000855af1610ba0573d600060003e3d6000fd5b60203d106138c0576103e05050611266565b600861036051186111595773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610bf15760206138d2600039600051610280511815610bf4565b60005b61111f5760206138d26000396000516102605118610c2c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511815610c2f565b60005b6110df5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610c715773ae7ab96520de3a18e5e111b5eaab095312d7fe84610280511815610c74565b60005b61109f5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610cb657735e8422345238f34275888049021821e8e08caa1f610280511815610cb9565b60005b6110655773ae7ab96520de3a18e5e111b5eaab095312d7fe846102605118610cfb57737f39c581f595b53c5cb19bd0b3f8da6c935e2ca0610280511815610cfe565b60005b61102057737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06102605118610d405773ae7ab96520de3a18e5e111b5eaab095312d7fe84610280511815610d43565b60005b610fdb57735e8422345238f34275888049021821e8e08caa1f6102605118610d855773ac3e018457b222d93114458476f3e3416abbe38f610280511815610d88565b60005b610f915773ac3e018457b222d93114458476f3e3416abbe38f6102605118610dca57735e8422345238f34275888049021821e8e08caa1f610280511815610dcd565b60005b610f425773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610e0f5773a2e3356610840701bdf5611a53974510ae27e2e1610280511815610e12565b60005b610eef5760776103e0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610400527f574554482c20455448202d3e207374455448206f7220455448202d3e20667278610420527f4554482c207374455448203c2d3e207773744554482c20667278455448203c2d610440527f3e20736672784554482c20455448202d3e207742455448000000000000000000610460526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd611266565b6102e05163f340fa016103e05273ecb456ea5365865ebab8a2661b0c503410e9b34761040052803b156138c05760006103e060246103fc6102a051855af1610f3c573d600060003e3d6000fd5b50611266565b6102e05163ba0876526103e0526102a051610400523061042052306104405260206103e060646103fc6000855af1610f7f573d600060003e3d6000fd5b60203d106138c0576103e05050611266565b6102e051636e553f656103e0526102a05161040052306104205260206103e060446103fc6000855af1610fc9573d600060003e3d6000fd5b60203d106138c0576103e05050611266565b6102e05163de0e9a3e6103e0526102a0516104005260206103e060246103fc6000855af161100e573d600060003e3d6000fd5b60203d106138c0576103e05050611266565b6102e05163ea598cb06103e0526102a0516104005260206103e060246103fc6000855af1611053573d600060003e3d6000fd5b60203d106138c0576103e05050611266565b6102e051635bcb2fc66103e052803b156138c05760006103e060046103fc6102a051855af1611099573d600060003e3d6000fd5b50611266565b6102e05163a1903eab6103e052600061040052803b156138c05760006103e060246103fc6102a051855af16110d9573d600060003e3d6000fd5b50611266565b6102e051632e1a7d4d6103e0526102a05161040052803b156138c05760006103e060246103fc6000855af1611119573d600060003e3d6000fd5b50611266565b6102e05163d0e30db06103e052803b156138c05760006103e060046103fc6102a051855af1611153573d600060003e3d6000fd5b50611266565b60096103605118611200576102e0516344b3e9236103e052600161026051602052600052604060002054610400526102a05161042052600161028051602052600052604060002054610440527f43555256450000000000000000000000000000000000000000000000000000006104605260006104805260206103e060a46103fc6000855af16111ee573d600060003e3d6000fd5b60203d106138c0576103e05050611266565b600d6103e0527f4261642073776170207479706500000000000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511861128e57476102a0526112cf565b610280516370a082316103e052306104005260206103e060246103fc845afa6112bc573d600060003e3d6000fd5b60203d106138c0576103e09050516102a0525b6102a05161133d5760106103e0527f5265636569766564206e6f7468696e6700000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b60056102c0511861134f576001611381565b6102c0518060011b818160011c186138c0579050600181018181106138c0579050600a81116138c05760051b60400151155b1561138b5761139e565b6102805161026052600101818118610293575b50506102a051600181038181116138c05790506102a0526104a4356102a05110156114295760086102c0527f536c6970706167650000000000000000000000000000000000000000000000006102e0526102c0506102c051806102e001601f826000031636823750506308c379a06102805260206102a052601f19601f6102c051011660440161029cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61028051186114795760006102c0526102c050600060006102c0516102e06102a051610240515af16114f0573d600060003e3d6000fd6114f0565b6102805163a9059cbb6102c052610240516102e0526102a0516103005260206102c060446102dc6000855af16114b4573d600060003e3d6000fd5b3d6114cb57803b156138c0576001610320526114e4565b60203d106138c0576102c0518060011c6138c057610320525b610320905051156138c0575b61024051337f56d0661e240dfb199ef196e16e6f42473990366314f0226ac978f7be3cd9ee836040516102c0526060516102e0526080516103005260a0516103205260c0516103405260e051610360526101005161038052610120516103a052610140516103c052610160516103e052610180516104005260a06101646104203760a06102046104c03760a06102a46105603760a06103446106003760a06103e46106a0376101a051610740526101c051610760526101e05161078052610200516107a052610220516107c052610484356107e0526102a051610800526105606102c0a360206102a06000600055f35b6381889a2c8118611600576104a436106138c05760a0366101a037611665565b63637653cb81186125f95761054436106138c0576104a4358060a01c6138c0576101a0526104c4358060a01c6138c0576101c0526104e4358060a01c6138c0576101e052610504358060a01c6138c05761020052610524358060a01c6138c057610220525b6004358060a01c6138c0576040526024358060a01c6138c0576060526044358060a01c6138c0576080526064358060a01c6138c05760a0526084358060a01c6138c05760c05260a4358060a01c6138c05760e05260c4358060a01c6138c0576101005260e4358060a01c6138c05761012052610104358060a01c6138c05761014052610124358060a01c6138c05761016052610144358060a01c6138c05761018052346138c057604051610240526000610260526104843561028052600160058101905b806102a0526102a0518060011b818160011c186138c0579050600181038181116138c0579050600a81116138c05760051b604001516102c0526102a051600181038181116138c0579050600481116138c05760051b6101a001516102e0526102a0518060011b818160011c186138c0579050600a81116138c05760051b604001516102605260a06102a051600181038181116138c0579050600481116138c057026101640180356103005260208101356103205260408101356103405260608101356103605260808101356103805250600161034051186118cf5760016103605118611877576102c051635e0d443f6103a0526103005180607f1c6138c0576103c0526103205180607f1c6138c0576103e052610280516104005260206103a060646103bc845afa611860573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b6102c05163556d6e9f6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa6118b8573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b600261034051186119a5576001610360511861194d576102c0516307211ef76103a0526103005180607f1c6138c0576103c0526103205180607f1c6138c0576103e052610280516104005260206103a060646103bc845afa611936573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b6102c0516385f11d1e6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa61198e573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b60036103405118611a835760016103605118611a23576102e0516307211ef76103a0526103005180607f1c6138c0576103c0526103205180607f1c6138c0576103e052610280516104005260206103a060646103bc845afa611a0c573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b6102c05163e9737ee26103a0526102e0516103c052610300516103e0526103205161040052610280516104205260206103a060846103bc845afa611a6c573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b6103405160048118611a96576001611a9c565b60058118155b90506120cb576103405160068118611ab5576001611abb565b60078118155b90506120185760086103405118611e955760206138d26000396000516102405118611ae7576001611b8f565b60206138d26000396000516102605118611b02576001611b8f565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102405118611b405773ae7ab96520de3a18e5e111b5eaab095312d7fe84610260511815611b43565b60005b611b8c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102405118611b8557735e8422345238f34275888049021821e8e08caa1f610260511815611b8f565b6000611b8f565b60015b61257a57737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06102405118611bf9576102c05163bb2952fc6103a052610280516103c05260206103a060246103bc845afa611be2573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06102605118611c5f576102c05163b0e389006103a052610280516103c05260206103a060246103bc845afa611c48573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b73ac3e018457b222d93114458476f3e3416abbe38f6102405118611cc5576102c0516307a2d13a6103a052610280516103c05260206103a060246103bc845afa611cae573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b73ac3e018457b222d93114458476f3e3416abbe38f6102605118611d2b576102c05163c6e6f5926103a052610280516103c05260206103a060246103bc845afa611d14573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b73a2e3356610840701bdf5611a53974510ae27e2e16102605118611db85761028051670de0b6b3a7640000810281670de0b6b3a76400008204186138c05790506102c051633ba0b9a96103a05260206103a060046103bc845afa611d94573d600060003e3d6000fd5b60203d106138c0576103a090505180156138c057808204905090506102805261257a565b60776103a0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e206103c0527f574554482c20455448202d3e207374455448206f7220455448202d3e206672786103e0527f4554482c207374455448203c2d3e207773744554482c20667278455448203c2d610400527f3e20736672784554482c20455448202d3e207742455448000000000000000000610420526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd61257a5661257a565b60096103405118611fae576321f8a7216103c0527f45786368616e67657200000000000000000000000000000000000000000000006103e05260206103c060246103dc73823be81bbf96bec0e25ca13170f5aacb5b79ba835afa611efe573d600060003e3d6000fd5b60203d106138c0576103c0518060a01c6138c05761040052610400516103a0526103a05163dc703e7361042052610280516104405260016102405160205260005260406000205461046052600161026051602052600052604060002054610480526060610420606461043c845afa611f7b573d600060003e3d6000fd5b60603d106138c057610420905080516103c05260208101516103e052604081015161040052506103c0516102805261257a565b600d6103a0527f42616420737761702074797065000000000000000000000000000000000000006103c0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd61257a565b6001610360511861207b576102c05163cc2b27d76103c052610280516103e0526103205180607f1c6138c0576104005260206103c060446103dc845afa612064573d600060003e3d6000fd5b60203d106138c0576103c09050516102805261257a565b6102c051634fb08c5e6103c052610280516103e052610320516104005260206103c060446103dc845afa6120b4573d600060003e3d6000fd5b60203d106138c0576103c09050516102805261257a565b600161036051186121b257610140366103c0376102805161030051600981116138c05760051b6103c0015260206138f26000396000516379ccdf49610500526102c0516105205261026051610540526103c051610560526103e05161058052610400516105a052610420516105c052610440516105e052610460516106005261048051610620526104a051610640526104c051610660526104e05161068052610380516106a05260016106c05260016106e05260206105006101e461051c845afa61219b573d600060003e3d6000fd5b60203d106138c0576105009050516102805261257a565b6002610380511861228d576040366103c0376102805161030051600181116138c05760051b6103c0015260026103605118612237576102c051638d8ea727610400526103c051610420526103e051610440526020610400604461041c845afa612220573d600060003e3d6000fd5b60203d106138c0576104009050516102805261257a565b6102c05163ed8e84f3610400526103c051610420526103e051610440526001610460526020610400606461041c845afa612276573d600060003e3d6000fd5b60203d106138c0576104009050516102805261257a565b60036103805118612378576060366103c0376102805161030051600281116138c05760051b6103c001526002610360511861231a576102c051635b6f1b5a610420526103c051610440526103e0516104605261040051610480526020610420606461043c845afa612303573d600060003e3d6000fd5b60203d106138c0576104209050516102805261257a565b6102c051633883e119610420526103c051610440526103e05161046052610400516104805260016104a0526020610420608461043c845afa612361573d600060003e3d6000fd5b60203d106138c0576104209050516102805261257a565b60046103805118612473576080366103c0376102805161030051600381116138c05760051b6103c001526002610360511861240d576102c051631a805185610440526103c051610460526103e05161048052610400516104a052610420516104c0526020610440608461045c845afa6123f6573d600060003e3d6000fd5b60203d106138c0576104409050516102805261257a565b6102c05163cf701ff7610440526103c051610460526103e05161048052610400516104a052610420516104c05260016104e052602061044060a461045c845afa61245c573d600060003e3d6000fd5b60203d106138c0576104409050516102805261257a565b6005610380511861257a5760a0366103c0376102805161030051600481116138c05760051b6103c0015260026103605118612510576102c0516309379690610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052602061046060a461047c845afa6124f9573d600060003e3d6000fd5b60203d106138c0576104609050516102805261257a565b6102c051637ede89c5610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052600161052052602061046060c461047c845afa612567573d600060003e3d6000fd5b60203d106138c057610460905051610280525b60056102a0511861258c5760016125be565b6102a0518060011b818160011c186138c0579050600181018181106138c0579050600a81116138c05760051b60400151155b156125c8576125db565b6102605161024052600101818118611729575b505061028051600181038181116138c05790506102a05260206102a0f35b63c07b5353811861261a5761054436106138c057610140366102403761273f565b6381fc0ca5811861268a576105e436106138c057610544358060a01c6138c05761024052610564358060a01c6138c05761026052610584358060a01c6138c057610280526105a4358060a01c6138c0576102a0526105c4358060a01c6138c0576102c05260a0366102e03761273f565b6390e7e20581186138bc5761068436106138c057610544358060a01c6138c05761024052610564358060a01c6138c05761026052610584358060a01c6138c057610280526105a4358060a01c6138c0576102a0526105c4358060a01c6138c0576102c0526105e4358060a01c6138c0576102e052610604358060a01c6138c05761030052610624358060a01c6138c05761032052610644358060a01c6138c05761034052610664358060a01c6138c057610360525b6004358060a01c6138c0576040526024358060a01c6138c0576060526044358060a01c6138c0576080526064358060a01c6138c05760a0526084358060a01c6138c05760c05260a4358060a01c6138c05760e05260c4358060a01c6138c0576101005260e4358060a01c6138c05761012052610104358060a01c6138c05761014052610124358060a01c6138c05761016052610144358060a01c6138c057610180526104a4358060a01c6138c0576101a0526104c4358060a01c6138c0576101c0526104e4358060a01c6138c0576101e052610504358060a01c6138c05761020052610524358060a01c6138c05761022052346138c0576104843561038052600160058101905b806103a0526103a05180600603600681116138c05790506103c0526103c0518060011b818160011c186138c0579050600181038181116138c0579050600a81116138c05760051b604001516103e0526103e0516128a2576138a9565b6103c051600181038181116138c05790508060011b818160011c186138c0579050600a81116138c05760051b60400151610400526103c0518060011b818160011c186138c0579050600a81116138c05760051b60400151610420526103c051600181038181116138c0579050600481116138c05760051b6101a00151610440526103c051600181038181116138c0579050600481116138c05760051b6102400151610460526103c051600181038181116138c0579050600481116138c05760051b6102e001516104805260a06103c051600181038181116138c0579050600481116138c057026101640180356104a05260208101356104c05260408101356104e05260608101356105005260808101356105205250610520516105405260016104e05118612bc95760016105005118612ae35761046051612a5c5760206138f260003960005163158819d46105605261044051610580526104a05180607f1c6138c0576105a0526104c05180607f1c6138c0576105c052610380516105e0526105405161060052602061056060a461057c845afa612a45573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b60206138f260003960005163571f00b56105605261044051610580526104a05180607f1c6138c0576105a0526104c05180607f1c6138c0576105c052610380516105e05261054051610600526104605161062052602061056060c461057c845afa612acc573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b6105005160028118612af6576001612afc565b60038118155b9050612b5a57610440516337ed3a7a610560526104a051610580526104c0516105a052610380516105c0526020610560606461057c845afa612b43573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b602061391260003960005163ca4bc71461058052610440516105a0526104a0516105c0526104c0516105e05261038051610600526105405161062052602061058060a461059c845afa612bb2573d600060003e3d6000fd5b60203d106138c057610580905051610380526138a9565b6104e05160028118612bdc576001612be2565b60038118155b905061370d576104e05160048118612bfb576001612c01565b60058118155b905061365a576104e05160068118612c1a576001612c20565b60078118155b90506131a75760086104e05118612ff05760206138d26000396000516104005118612c4c576001612cf4565b60206138d26000396000516104205118612c67576001612cf4565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104005118612ca55773ae7ab96520de3a18e5e111b5eaab095312d7fe84610420511815612ca8565b60005b612cf15773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104005118612cea57735e8422345238f34275888049021821e8e08caa1f610420511815612cf4565b6000612cf4565b60015b6138a957737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06104005118612d5e576103e05163b0e389006105605261038051610580526020610560602461057c845afa612d47573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06104205118612dc4576103e05163bb2952fc6105605261038051610580526020610560602461057c845afa612dad573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b73ac3e018457b222d93114458476f3e3416abbe38f6104005118612e2a576103e05163c6e6f5926105605261038051610580526020610560602461057c845afa612e13573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b73ac3e018457b222d93114458476f3e3416abbe38f6104205118612e90576103e0516307a2d13a6105605261038051610580526020610560602461057c845afa612e79573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b73a2e3356610840701bdf5611a53974510ae27e2e16104205118612f1357610380516103e051633ba0b9a9610560526020610560600461057c845afa612edb573d600060003e3d6000fd5b60203d106138c0576105609050518082028115838383041417156138c05790509050670de0b6b3a764000081049050610380526138a9565b6077610560527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610580527f574554482c20455448202d3e207374455448206f7220455448202d3e206672786105a0527f4554482c207374455448203c2d3e207773744554482c20667278455448203c2d6105c0527f3e20736672784554482c20455448202d3e2077424554480000000000000000006105e05261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd6138a9566138a9565b60096104e0511861313d576321f8a721610580527f45786368616e67657200000000000000000000000000000000000000000000006105a0526020610580602461059c73823be81bbf96bec0e25ca13170f5aacb5b79ba835afa613059573d600060003e3d6000fd5b60203d106138c057610580518060a01c6138c0576105c0526105c051610560526105605163dc703e736105e052670de0b6b3a764000061060052600161040051602052600052604060002054610620526001610420516020526000526040600020546106405260606105e060646105fc845afa6130db573d600060003e3d6000fd5b60603d106138c0576105e0905080516105805260208101516105a05260408101516105c0525061038051670de0b6b3a7640000810281670de0b6b3a76400008204186138c05790506105805180156138c05780820490509050610380526138a9565b600d610560527f42616420737761702074797065000000000000000000000000000000000000006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd6138a9565b6001610500511861328e576101403661058037610380516104c051600981116138c05760051b610580015260206138f26000396000516379ccdf496106c0526103e0516106e052610400516107005261058051610720526105a051610740526105c051610760526105e05161078052610600516107a052610620516107c052610640516107e052610660516108005261068051610820526106a05161084052610540516108605260006108805260016108a05260206106c06101e46106dc845afa613277573d600060003e3d6000fd5b60203d106138c0576106c0905051610380526138a9565b600261054051186133695760403661058037610380516104c051600181116138c05760051b610580015260026105005118613313576103e051638d8ea7276105c052610580516105e0526105a0516106005260206105c060446105dc845afa6132fc573d600060003e3d6000fd5b60203d106138c0576105c0905051610380526138a9565b6103e05163ed8e84f36105c052610580516105e0526105a0516106005260006106205260206105c060646105dc845afa613352573d600060003e3d6000fd5b60203d106138c0576105c0905051610380526138a9565b600361054051186134545760603661058037610380516104c051600281116138c05760051b6105800152600261050051186133f6576103e051635b6f1b5a6105e05261058051610600526105a051610620526105c0516106405260206105e060646105fc845afa6133df573d600060003e3d6000fd5b60203d106138c0576105e0905051610380526138a9565b6103e051633883e1196105e05261058051610600526105a051610620526105c0516106405260006106605260206105e060846105fc845afa61343d573d600060003e3d6000fd5b60203d106138c0576105e0905051610380526138a9565b6004610540511861354f5760803661058037610380516104c051600381116138c05760051b6105800152600261050051186134e9576103e051631a8051856106005261058051610620526105a051610640526105c051610660526105e051610680526020610600608461061c845afa6134d2573d600060003e3d6000fd5b60203d106138c057610600905051610380526138a9565b6103e05163cf701ff76106005261058051610620526105a051610640526105c051610660526105e0516106805260006106a052602061060060a461061c845afa613538573d600060003e3d6000fd5b60203d106138c057610600905051610380526138a9565b600561054051186138a95760a03661058037610380516104c051600481116138c05760051b6105800152600261050051186135ec576103e05163093796906106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c052602061062060a461063c845afa6135d5573d600060003e3d6000fd5b60203d106138c057610620905051610380526138a9565b6103e051637ede89c56106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c05260006106e052602061062060c461063c845afa613643573d600060003e3d6000fd5b60203d106138c057610620905051610380526138a9565b600161050051186136bd576103e05163cc2b27d761058052610380516105a0526104a05180607f1c6138c0576105c0526020610580604461059c845afa6136a6573d600060003e3d6000fd5b60203d106138c057610580905051610380526138a9565b6103e051634fb08c5e61058052610380516105a0526104a0516105c0526020610580604461059c845afa6136f6573d600060003e3d6000fd5b60203d106138c057610580905051610380526138a9565b6001610500511861382e576104605161379f5760206138f2600039600051638fd3218f61058052610440516105a0526104a05180607f1c6138c0576105c0526104c05180607f1c6138c0576105e05261038051610600526105405161062052602061058060a461059c845afa613788573d600060003e3d6000fd5b60203d106138c057610580905051610380526138a9565b60206138f2600039600051634933a86461058052610440516105a0526104a05180607f1c6138c0576105c0526104c05180607f1c6138c0576105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa613817573d600060003e3d6000fd5b60203d106138c057610580905051610380526138a9565b6020613912600039600051638ca1565361058052610440516105a0526104a0516105c0526104c0516105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa613896573d600060003e3d6000fd5b60203d106138c057610580905051610380525b6001018181186128465750506020610380f35b505b005b600080fda165767970657283000307000b005b600080fd000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc00000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f51000000000000000000000000d71ecff9342a5ced620049e616c5035f1db986200000000000000000000000005e74c9036fb86bd7ecdcb084a0673efc32ea31cb000000000000000000000000fe18be6b3bd88a2d2a7f928d00292e7a9963cfc6

Deployed Bytecode

0x6003361161000c576138be565b60003560e01c63371dc4478118610037576104c436106138c05760a0366101a037336102405261011a565b635c9c18e281186100a55761056436106138c0576104c4358060a01c6138c0576101a0526104e4358060a01c6138c0576101c052610504358060a01c6138c0576101e052610524358060a01c6138c05761020052610544358060a01c6138c05761022052336102405261011a565b63c872a3c581186115e05761058436106138c0576104c4358060a01c6138c0576101a0526104e4358060a01c6138c0576101c052610504358060a01c6138c0576101e052610524358060a01c6138c05761020052610544358060a01c6138c05761022052610564358060a01c6138c057610240525b6004358060a01c6138c0576040526024358060a01c6138c0576060526044358060a01c6138c0576080526064358060a01c6138c05760a0526084358060a01c6138c05760c05260a4358060a01c6138c05760e05260c4358060a01c6138c0576101005260e4358060a01c6138c05761012052610104358060a01c6138c05761014052610124358060a01c6138c05761016052610144358060a01c6138c057610180526000546001146138c057600160005560405161026052600061028052610484356102a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610260511861020d576102a05134186138c05761028b565b346138c057610260516323b872dd6102c052336102e05230610300526102a0516103205260206102c060646102dc6000855af161024f573d600060003e3d6000fd5b3d61026657803b156138c05760016103405261027f565b60203d106138c0576102c0518060011c6138c057610340525b610340905051156138c0575b600160058101905b806102c0526102c0518060011b818160011c186138c0579050600181038181116138c0579050600a81116138c05760051b604001516102e0526102c051600181038181116138c0579050600481116138c05760051b6101a00151610300526102c0518060011b818160011c186138c0579050600a81116138c05760051b604001516102805260a06102c051600181038181116138c0579050600481116138c057026101640180356103205260208101356103405260408101356103605260608101356103805260808101356103a052506002610260516020526000526040600020806102e0516020526000526040600020905054610436576102605163095ea7b36103c0526102e0516103e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6104005260206103c060446103dc6000855af16103e3573d600060003e3d6000fd5b3d6103f357600161042052610404565b6103c0518060011c6138c057610420525b610420905051156138c05760016002610260516020526000526040600020806102e05160205260005260406000209050555b60006103c05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610463576102a0516103c0525b600161036051186105da57600161038051186104e1576102e051633df021246103e0526103205180607f1c6138c057610400526103405180607f1c6138c057610420526102a05161044052600061046052803b156138c05760006103e060846103fc6103c051855af16104db573d600060003e3d6000fd5b50611266565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610506576001610522565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b61057c576102e051635b41b9086103e052610320516104005261034051610420526102a05161044052600061046052803b156138c05760006103e060846103fc6000855af1610576573d600060003e3d6000fd5b50611266565b6102e05163394747c56103e052610320516104005261034051610420526102a05161044052600061046052600161048052803b156138c05760006103e060a46103fc6103c051855af16105d4573d600060003e3d6000fd5b50611266565b600261036051186106b05760016103805118610658576102e05163a6417ed66103e0526103205180607f1c6138c057610400526103405180607f1c6138c057610420526102a05161044052600061046052803b156138c05760006103e060846103fc6103c051855af1610652573d600060003e3d6000fd5b50611266565b6102e0516365b2489b6103e052610320516104005261034051610420526102a05161044052600061046052803b156138c05760006103e060846103fc6103c051855af16106aa573d600060003e3d6000fd5b50611266565b600361036051186107e15760016103805118610734576102e051637981c43e6103e05261030051610400526103205180607f1c6138c057610420526103405180607f1c6138c057610440526102a05161046052600061048052803b156138c05760006103e060a46103fc6000855af161072e573d600060003e3d6000fd5b50611266565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610759576001610775565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b6103e0526102e051632bf78c61610400526103005161042052610320516104405261034051610460526102a0516104805260006104a0526103e0516104c052803b156138c057600061040060c461041c6103c051855af16107db573d600060003e3d6000fd5b50611266565b60046103605118610a045760026103a05118610866576040366103e0376102a05161032051600181116138c05760051b6103e001526102e051630b4c7e4d610420526103e051610440526104005161046052600061048052803b156138c0576000610420606461043c6103c051855af1610860573d600060003e3d6000fd5b50611266565b60036103a051186108e8576060366103e0376102a05161032051600281116138c05760051b6103e001526102e051634515cef3610440526103e051610460526104005161048052610420516104a05260006104c052803b156138c0576000610440608461045c6103c051855af16108e2573d600060003e3d6000fd5b50611266565b60046103a05118610972576080366103e0376102a05161032051600381116138c05760051b6103e001526102e05163029b2f34610460526103e05161048052610400516104a052610420516104c052610440516104e052600061050052803b156138c057600061046060a461047c6103c051855af161096c573d600060003e3d6000fd5b50611266565b60056103a051186112665760a0366103e0376102a05161032051600481116138c05760051b6103e001526102e0516384738499610480526103e0516104a052610400516104c052610420516104e05261044051610500526104605161052052600061054052803b156138c057600061048060c461049c6103c051855af16109fe573d600060003e3d6000fd5b50611266565b60056103605118610a8c576060366103e0376102a05161032051600281116138c05760051b6103e001526102e051632b6e993a610440526103e051610460526104005161048052610420516104a05260006104c05260016104e052803b156138c057600061044060a461045c6103c051855af1610a86573d600060003e3d6000fd5b50611266565b60066103605118610b465760016103805118610af8576102e051631a4d01d26103e0526102a051610400526103405180607f1c6138c05761042052600061044052803b156138c05760006103e060646103fc6000855af1610af2573d600060003e3d6000fd5b50611266565b6102e05163f1dc3cc96103e0526102a051610400526103405161042052600061044052803b156138c05760006103e060646103fc6000855af1610b40573d600060003e3d6000fd5b50611266565b60076103605118610bb2576102e05163517a55a36103e0526102a051610400526103405180607f1c6138c0576104205260006104405260016104605260206103e060846103fc6000855af1610ba0573d600060003e3d6000fd5b60203d106138c0576103e05050611266565b600861036051186111595773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610bf15760206138d2600039600051610280511815610bf4565b60005b61111f5760206138d26000396000516102605118610c2c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511815610c2f565b60005b6110df5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610c715773ae7ab96520de3a18e5e111b5eaab095312d7fe84610280511815610c74565b60005b61109f5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610cb657735e8422345238f34275888049021821e8e08caa1f610280511815610cb9565b60005b6110655773ae7ab96520de3a18e5e111b5eaab095312d7fe846102605118610cfb57737f39c581f595b53c5cb19bd0b3f8da6c935e2ca0610280511815610cfe565b60005b61102057737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06102605118610d405773ae7ab96520de3a18e5e111b5eaab095312d7fe84610280511815610d43565b60005b610fdb57735e8422345238f34275888049021821e8e08caa1f6102605118610d855773ac3e018457b222d93114458476f3e3416abbe38f610280511815610d88565b60005b610f915773ac3e018457b222d93114458476f3e3416abbe38f6102605118610dca57735e8422345238f34275888049021821e8e08caa1f610280511815610dcd565b60005b610f425773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610e0f5773a2e3356610840701bdf5611a53974510ae27e2e1610280511815610e12565b60005b610eef5760776103e0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610400527f574554482c20455448202d3e207374455448206f7220455448202d3e20667278610420527f4554482c207374455448203c2d3e207773744554482c20667278455448203c2d610440527f3e20736672784554482c20455448202d3e207742455448000000000000000000610460526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd611266565b6102e05163f340fa016103e05273ecb456ea5365865ebab8a2661b0c503410e9b34761040052803b156138c05760006103e060246103fc6102a051855af1610f3c573d600060003e3d6000fd5b50611266565b6102e05163ba0876526103e0526102a051610400523061042052306104405260206103e060646103fc6000855af1610f7f573d600060003e3d6000fd5b60203d106138c0576103e05050611266565b6102e051636e553f656103e0526102a05161040052306104205260206103e060446103fc6000855af1610fc9573d600060003e3d6000fd5b60203d106138c0576103e05050611266565b6102e05163de0e9a3e6103e0526102a0516104005260206103e060246103fc6000855af161100e573d600060003e3d6000fd5b60203d106138c0576103e05050611266565b6102e05163ea598cb06103e0526102a0516104005260206103e060246103fc6000855af1611053573d600060003e3d6000fd5b60203d106138c0576103e05050611266565b6102e051635bcb2fc66103e052803b156138c05760006103e060046103fc6102a051855af1611099573d600060003e3d6000fd5b50611266565b6102e05163a1903eab6103e052600061040052803b156138c05760006103e060246103fc6102a051855af16110d9573d600060003e3d6000fd5b50611266565b6102e051632e1a7d4d6103e0526102a05161040052803b156138c05760006103e060246103fc6000855af1611119573d600060003e3d6000fd5b50611266565b6102e05163d0e30db06103e052803b156138c05760006103e060046103fc6102a051855af1611153573d600060003e3d6000fd5b50611266565b60096103605118611200576102e0516344b3e9236103e052600161026051602052600052604060002054610400526102a05161042052600161028051602052600052604060002054610440527f43555256450000000000000000000000000000000000000000000000000000006104605260006104805260206103e060a46103fc6000855af16111ee573d600060003e3d6000fd5b60203d106138c0576103e05050611266565b600d6103e0527f4261642073776170207479706500000000000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511861128e57476102a0526112cf565b610280516370a082316103e052306104005260206103e060246103fc845afa6112bc573d600060003e3d6000fd5b60203d106138c0576103e09050516102a0525b6102a05161133d5760106103e0527f5265636569766564206e6f7468696e6700000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b60056102c0511861134f576001611381565b6102c0518060011b818160011c186138c0579050600181018181106138c0579050600a81116138c05760051b60400151155b1561138b5761139e565b6102805161026052600101818118610293575b50506102a051600181038181116138c05790506102a0526104a4356102a05110156114295760086102c0527f536c6970706167650000000000000000000000000000000000000000000000006102e0526102c0506102c051806102e001601f826000031636823750506308c379a06102805260206102a052601f19601f6102c051011660440161029cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61028051186114795760006102c0526102c050600060006102c0516102e06102a051610240515af16114f0573d600060003e3d6000fd6114f0565b6102805163a9059cbb6102c052610240516102e0526102a0516103005260206102c060446102dc6000855af16114b4573d600060003e3d6000fd5b3d6114cb57803b156138c0576001610320526114e4565b60203d106138c0576102c0518060011c6138c057610320525b610320905051156138c0575b61024051337f56d0661e240dfb199ef196e16e6f42473990366314f0226ac978f7be3cd9ee836040516102c0526060516102e0526080516103005260a0516103205260c0516103405260e051610360526101005161038052610120516103a052610140516103c052610160516103e052610180516104005260a06101646104203760a06102046104c03760a06102a46105603760a06103446106003760a06103e46106a0376101a051610740526101c051610760526101e05161078052610200516107a052610220516107c052610484356107e0526102a051610800526105606102c0a360206102a06000600055f35b6381889a2c8118611600576104a436106138c05760a0366101a037611665565b63637653cb81186125f95761054436106138c0576104a4358060a01c6138c0576101a0526104c4358060a01c6138c0576101c0526104e4358060a01c6138c0576101e052610504358060a01c6138c05761020052610524358060a01c6138c057610220525b6004358060a01c6138c0576040526024358060a01c6138c0576060526044358060a01c6138c0576080526064358060a01c6138c05760a0526084358060a01c6138c05760c05260a4358060a01c6138c05760e05260c4358060a01c6138c0576101005260e4358060a01c6138c05761012052610104358060a01c6138c05761014052610124358060a01c6138c05761016052610144358060a01c6138c05761018052346138c057604051610240526000610260526104843561028052600160058101905b806102a0526102a0518060011b818160011c186138c0579050600181038181116138c0579050600a81116138c05760051b604001516102c0526102a051600181038181116138c0579050600481116138c05760051b6101a001516102e0526102a0518060011b818160011c186138c0579050600a81116138c05760051b604001516102605260a06102a051600181038181116138c0579050600481116138c057026101640180356103005260208101356103205260408101356103405260608101356103605260808101356103805250600161034051186118cf5760016103605118611877576102c051635e0d443f6103a0526103005180607f1c6138c0576103c0526103205180607f1c6138c0576103e052610280516104005260206103a060646103bc845afa611860573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b6102c05163556d6e9f6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa6118b8573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b600261034051186119a5576001610360511861194d576102c0516307211ef76103a0526103005180607f1c6138c0576103c0526103205180607f1c6138c0576103e052610280516104005260206103a060646103bc845afa611936573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b6102c0516385f11d1e6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa61198e573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b60036103405118611a835760016103605118611a23576102e0516307211ef76103a0526103005180607f1c6138c0576103c0526103205180607f1c6138c0576103e052610280516104005260206103a060646103bc845afa611a0c573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b6102c05163e9737ee26103a0526102e0516103c052610300516103e0526103205161040052610280516104205260206103a060846103bc845afa611a6c573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b6103405160048118611a96576001611a9c565b60058118155b90506120cb576103405160068118611ab5576001611abb565b60078118155b90506120185760086103405118611e955760206138d26000396000516102405118611ae7576001611b8f565b60206138d26000396000516102605118611b02576001611b8f565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102405118611b405773ae7ab96520de3a18e5e111b5eaab095312d7fe84610260511815611b43565b60005b611b8c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102405118611b8557735e8422345238f34275888049021821e8e08caa1f610260511815611b8f565b6000611b8f565b60015b61257a57737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06102405118611bf9576102c05163bb2952fc6103a052610280516103c05260206103a060246103bc845afa611be2573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06102605118611c5f576102c05163b0e389006103a052610280516103c05260206103a060246103bc845afa611c48573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b73ac3e018457b222d93114458476f3e3416abbe38f6102405118611cc5576102c0516307a2d13a6103a052610280516103c05260206103a060246103bc845afa611cae573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b73ac3e018457b222d93114458476f3e3416abbe38f6102605118611d2b576102c05163c6e6f5926103a052610280516103c05260206103a060246103bc845afa611d14573d600060003e3d6000fd5b60203d106138c0576103a09050516102805261257a565b73a2e3356610840701bdf5611a53974510ae27e2e16102605118611db85761028051670de0b6b3a7640000810281670de0b6b3a76400008204186138c05790506102c051633ba0b9a96103a05260206103a060046103bc845afa611d94573d600060003e3d6000fd5b60203d106138c0576103a090505180156138c057808204905090506102805261257a565b60776103a0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e206103c0527f574554482c20455448202d3e207374455448206f7220455448202d3e206672786103e0527f4554482c207374455448203c2d3e207773744554482c20667278455448203c2d610400527f3e20736672784554482c20455448202d3e207742455448000000000000000000610420526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd61257a5661257a565b60096103405118611fae576321f8a7216103c0527f45786368616e67657200000000000000000000000000000000000000000000006103e05260206103c060246103dc73823be81bbf96bec0e25ca13170f5aacb5b79ba835afa611efe573d600060003e3d6000fd5b60203d106138c0576103c0518060a01c6138c05761040052610400516103a0526103a05163dc703e7361042052610280516104405260016102405160205260005260406000205461046052600161026051602052600052604060002054610480526060610420606461043c845afa611f7b573d600060003e3d6000fd5b60603d106138c057610420905080516103c05260208101516103e052604081015161040052506103c0516102805261257a565b600d6103a0527f42616420737761702074797065000000000000000000000000000000000000006103c0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd61257a565b6001610360511861207b576102c05163cc2b27d76103c052610280516103e0526103205180607f1c6138c0576104005260206103c060446103dc845afa612064573d600060003e3d6000fd5b60203d106138c0576103c09050516102805261257a565b6102c051634fb08c5e6103c052610280516103e052610320516104005260206103c060446103dc845afa6120b4573d600060003e3d6000fd5b60203d106138c0576103c09050516102805261257a565b600161036051186121b257610140366103c0376102805161030051600981116138c05760051b6103c0015260206138f26000396000516379ccdf49610500526102c0516105205261026051610540526103c051610560526103e05161058052610400516105a052610420516105c052610440516105e052610460516106005261048051610620526104a051610640526104c051610660526104e05161068052610380516106a05260016106c05260016106e05260206105006101e461051c845afa61219b573d600060003e3d6000fd5b60203d106138c0576105009050516102805261257a565b6002610380511861228d576040366103c0376102805161030051600181116138c05760051b6103c0015260026103605118612237576102c051638d8ea727610400526103c051610420526103e051610440526020610400604461041c845afa612220573d600060003e3d6000fd5b60203d106138c0576104009050516102805261257a565b6102c05163ed8e84f3610400526103c051610420526103e051610440526001610460526020610400606461041c845afa612276573d600060003e3d6000fd5b60203d106138c0576104009050516102805261257a565b60036103805118612378576060366103c0376102805161030051600281116138c05760051b6103c001526002610360511861231a576102c051635b6f1b5a610420526103c051610440526103e0516104605261040051610480526020610420606461043c845afa612303573d600060003e3d6000fd5b60203d106138c0576104209050516102805261257a565b6102c051633883e119610420526103c051610440526103e05161046052610400516104805260016104a0526020610420608461043c845afa612361573d600060003e3d6000fd5b60203d106138c0576104209050516102805261257a565b60046103805118612473576080366103c0376102805161030051600381116138c05760051b6103c001526002610360511861240d576102c051631a805185610440526103c051610460526103e05161048052610400516104a052610420516104c0526020610440608461045c845afa6123f6573d600060003e3d6000fd5b60203d106138c0576104409050516102805261257a565b6102c05163cf701ff7610440526103c051610460526103e05161048052610400516104a052610420516104c05260016104e052602061044060a461045c845afa61245c573d600060003e3d6000fd5b60203d106138c0576104409050516102805261257a565b6005610380511861257a5760a0366103c0376102805161030051600481116138c05760051b6103c0015260026103605118612510576102c0516309379690610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052602061046060a461047c845afa6124f9573d600060003e3d6000fd5b60203d106138c0576104609050516102805261257a565b6102c051637ede89c5610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052600161052052602061046060c461047c845afa612567573d600060003e3d6000fd5b60203d106138c057610460905051610280525b60056102a0511861258c5760016125be565b6102a0518060011b818160011c186138c0579050600181018181106138c0579050600a81116138c05760051b60400151155b156125c8576125db565b6102605161024052600101818118611729575b505061028051600181038181116138c05790506102a05260206102a0f35b63c07b5353811861261a5761054436106138c057610140366102403761273f565b6381fc0ca5811861268a576105e436106138c057610544358060a01c6138c05761024052610564358060a01c6138c05761026052610584358060a01c6138c057610280526105a4358060a01c6138c0576102a0526105c4358060a01c6138c0576102c05260a0366102e03761273f565b6390e7e20581186138bc5761068436106138c057610544358060a01c6138c05761024052610564358060a01c6138c05761026052610584358060a01c6138c057610280526105a4358060a01c6138c0576102a0526105c4358060a01c6138c0576102c0526105e4358060a01c6138c0576102e052610604358060a01c6138c05761030052610624358060a01c6138c05761032052610644358060a01c6138c05761034052610664358060a01c6138c057610360525b6004358060a01c6138c0576040526024358060a01c6138c0576060526044358060a01c6138c0576080526064358060a01c6138c05760a0526084358060a01c6138c05760c05260a4358060a01c6138c05760e05260c4358060a01c6138c0576101005260e4358060a01c6138c05761012052610104358060a01c6138c05761014052610124358060a01c6138c05761016052610144358060a01c6138c057610180526104a4358060a01c6138c0576101a0526104c4358060a01c6138c0576101c0526104e4358060a01c6138c0576101e052610504358060a01c6138c05761020052610524358060a01c6138c05761022052346138c0576104843561038052600160058101905b806103a0526103a05180600603600681116138c05790506103c0526103c0518060011b818160011c186138c0579050600181038181116138c0579050600a81116138c05760051b604001516103e0526103e0516128a2576138a9565b6103c051600181038181116138c05790508060011b818160011c186138c0579050600a81116138c05760051b60400151610400526103c0518060011b818160011c186138c0579050600a81116138c05760051b60400151610420526103c051600181038181116138c0579050600481116138c05760051b6101a00151610440526103c051600181038181116138c0579050600481116138c05760051b6102400151610460526103c051600181038181116138c0579050600481116138c05760051b6102e001516104805260a06103c051600181038181116138c0579050600481116138c057026101640180356104a05260208101356104c05260408101356104e05260608101356105005260808101356105205250610520516105405260016104e05118612bc95760016105005118612ae35761046051612a5c5760206138f260003960005163158819d46105605261044051610580526104a05180607f1c6138c0576105a0526104c05180607f1c6138c0576105c052610380516105e0526105405161060052602061056060a461057c845afa612a45573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b60206138f260003960005163571f00b56105605261044051610580526104a05180607f1c6138c0576105a0526104c05180607f1c6138c0576105c052610380516105e05261054051610600526104605161062052602061056060c461057c845afa612acc573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b6105005160028118612af6576001612afc565b60038118155b9050612b5a57610440516337ed3a7a610560526104a051610580526104c0516105a052610380516105c0526020610560606461057c845afa612b43573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b602061391260003960005163ca4bc71461058052610440516105a0526104a0516105c0526104c0516105e05261038051610600526105405161062052602061058060a461059c845afa612bb2573d600060003e3d6000fd5b60203d106138c057610580905051610380526138a9565b6104e05160028118612bdc576001612be2565b60038118155b905061370d576104e05160048118612bfb576001612c01565b60058118155b905061365a576104e05160068118612c1a576001612c20565b60078118155b90506131a75760086104e05118612ff05760206138d26000396000516104005118612c4c576001612cf4565b60206138d26000396000516104205118612c67576001612cf4565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104005118612ca55773ae7ab96520de3a18e5e111b5eaab095312d7fe84610420511815612ca8565b60005b612cf15773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104005118612cea57735e8422345238f34275888049021821e8e08caa1f610420511815612cf4565b6000612cf4565b60015b6138a957737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06104005118612d5e576103e05163b0e389006105605261038051610580526020610560602461057c845afa612d47573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06104205118612dc4576103e05163bb2952fc6105605261038051610580526020610560602461057c845afa612dad573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b73ac3e018457b222d93114458476f3e3416abbe38f6104005118612e2a576103e05163c6e6f5926105605261038051610580526020610560602461057c845afa612e13573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b73ac3e018457b222d93114458476f3e3416abbe38f6104205118612e90576103e0516307a2d13a6105605261038051610580526020610560602461057c845afa612e79573d600060003e3d6000fd5b60203d106138c057610560905051610380526138a9565b73a2e3356610840701bdf5611a53974510ae27e2e16104205118612f1357610380516103e051633ba0b9a9610560526020610560600461057c845afa612edb573d600060003e3d6000fd5b60203d106138c0576105609050518082028115838383041417156138c05790509050670de0b6b3a764000081049050610380526138a9565b6077610560527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610580527f574554482c20455448202d3e207374455448206f7220455448202d3e206672786105a0527f4554482c207374455448203c2d3e207773744554482c20667278455448203c2d6105c0527f3e20736672784554482c20455448202d3e2077424554480000000000000000006105e05261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd6138a9566138a9565b60096104e0511861313d576321f8a721610580527f45786368616e67657200000000000000000000000000000000000000000000006105a0526020610580602461059c73823be81bbf96bec0e25ca13170f5aacb5b79ba835afa613059573d600060003e3d6000fd5b60203d106138c057610580518060a01c6138c0576105c0526105c051610560526105605163dc703e736105e052670de0b6b3a764000061060052600161040051602052600052604060002054610620526001610420516020526000526040600020546106405260606105e060646105fc845afa6130db573d600060003e3d6000fd5b60603d106138c0576105e0905080516105805260208101516105a05260408101516105c0525061038051670de0b6b3a7640000810281670de0b6b3a76400008204186138c05790506105805180156138c05780820490509050610380526138a9565b600d610560527f42616420737761702074797065000000000000000000000000000000000000006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd6138a9565b6001610500511861328e576101403661058037610380516104c051600981116138c05760051b610580015260206138f26000396000516379ccdf496106c0526103e0516106e052610400516107005261058051610720526105a051610740526105c051610760526105e05161078052610600516107a052610620516107c052610640516107e052610660516108005261068051610820526106a05161084052610540516108605260006108805260016108a05260206106c06101e46106dc845afa613277573d600060003e3d6000fd5b60203d106138c0576106c0905051610380526138a9565b600261054051186133695760403661058037610380516104c051600181116138c05760051b610580015260026105005118613313576103e051638d8ea7276105c052610580516105e0526105a0516106005260206105c060446105dc845afa6132fc573d600060003e3d6000fd5b60203d106138c0576105c0905051610380526138a9565b6103e05163ed8e84f36105c052610580516105e0526105a0516106005260006106205260206105c060646105dc845afa613352573d600060003e3d6000fd5b60203d106138c0576105c0905051610380526138a9565b600361054051186134545760603661058037610380516104c051600281116138c05760051b6105800152600261050051186133f6576103e051635b6f1b5a6105e05261058051610600526105a051610620526105c0516106405260206105e060646105fc845afa6133df573d600060003e3d6000fd5b60203d106138c0576105e0905051610380526138a9565b6103e051633883e1196105e05261058051610600526105a051610620526105c0516106405260006106605260206105e060846105fc845afa61343d573d600060003e3d6000fd5b60203d106138c0576105e0905051610380526138a9565b6004610540511861354f5760803661058037610380516104c051600381116138c05760051b6105800152600261050051186134e9576103e051631a8051856106005261058051610620526105a051610640526105c051610660526105e051610680526020610600608461061c845afa6134d2573d600060003e3d6000fd5b60203d106138c057610600905051610380526138a9565b6103e05163cf701ff76106005261058051610620526105a051610640526105c051610660526105e0516106805260006106a052602061060060a461061c845afa613538573d600060003e3d6000fd5b60203d106138c057610600905051610380526138a9565b600561054051186138a95760a03661058037610380516104c051600481116138c05760051b6105800152600261050051186135ec576103e05163093796906106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c052602061062060a461063c845afa6135d5573d600060003e3d6000fd5b60203d106138c057610620905051610380526138a9565b6103e051637ede89c56106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c05260006106e052602061062060c461063c845afa613643573d600060003e3d6000fd5b60203d106138c057610620905051610380526138a9565b600161050051186136bd576103e05163cc2b27d761058052610380516105a0526104a05180607f1c6138c0576105c0526020610580604461059c845afa6136a6573d600060003e3d6000fd5b60203d106138c057610580905051610380526138a9565b6103e051634fb08c5e61058052610380516105a0526104a0516105c0526020610580604461059c845afa6136f6573d600060003e3d6000fd5b60203d106138c057610580905051610380526138a9565b6001610500511861382e576104605161379f5760206138f2600039600051638fd3218f61058052610440516105a0526104a05180607f1c6138c0576105c0526104c05180607f1c6138c0576105e05261038051610600526105405161062052602061058060a461059c845afa613788573d600060003e3d6000fd5b60203d106138c057610580905051610380526138a9565b60206138f2600039600051634933a86461058052610440516105a0526104a05180607f1c6138c0576105c0526104c05180607f1c6138c0576105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa613817573d600060003e3d6000fd5b60203d106138c057610580905051610380526138a9565b6020613912600039600051638ca1565361058052610440516105a0526104a0516105c0526104c0516105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa613896573d600060003e3d6000fd5b60203d106138c057610580905051610380525b6001018181186128465750506020610380f35b505b005b600080fda165767970657283000307000b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc

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

000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc00000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f51000000000000000000000000d71ecff9342a5ced620049e616c5035f1db986200000000000000000000000005e74c9036fb86bd7ecdcb084a0673efc32ea31cb000000000000000000000000fe18be6b3bd88a2d2a7f928d00292e7a9963cfc6

-----Decoded View---------------
Arg [0] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : _stable_calc (address): 0xCA8d0747B5573D69653C3aC22242e6341C36e4b4
Arg [2] : _crypto_calc (address): 0xA72C85C258A81761433B4e8da60505Fe3Dd551CC
Arg [3] : _snx_coins (address[4]): 0x57Ab1ec28D129707052df4dF418D58a2D46d5f51,0xD71eCFF9342A5Ced620049e616c5035F1dB98620,0x5e74C9036fb86BD7eCdcb084a0673EFc32eA31cb,0xfE18be6b3Bd88A2D2A7f928d00292E7a9963CfC6

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : 000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4
Arg [2] : 000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc
Arg [3] : 00000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f51
Arg [4] : 000000000000000000000000d71ecff9342a5ced620049e616c5035f1db98620
Arg [5] : 0000000000000000000000005e74c9036fb86bd7ecdcb084a0673efc32ea31cb
Arg [6] : 000000000000000000000000fe18be6b3bd88a2d2a7f928d00292e7a9963cfc6


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
Loading...
Loading
[ 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.