Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
1 wei
Eth Value
Less Than $0.01 (@ $3,329.85/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0xd913c71124fcd0ef627b3f8ee6273f0e7ddf02da360098edface2114b41d89a6 | Exchange | (pending) | 17 days ago | IN | 0 ETH | (Pending) | |||
Exchange | 21246295 | 1 hr ago | IN | 0 ETH | 0.00558845 | ||||
Exchange | 21243774 | 9 hrs ago | IN | 0 ETH | 0.00428745 | ||||
Exchange | 21243747 | 9 hrs ago | IN | 0 ETH | 0.00419019 | ||||
Exchange | 21243723 | 9 hrs ago | IN | 0 ETH | 0.00675136 | ||||
Exchange | 21243398 | 10 hrs ago | IN | 0 ETH | 0.0033638 | ||||
Exchange | 21243394 | 10 hrs ago | IN | 0 ETH | 0.00435497 | ||||
Exchange | 21243284 | 11 hrs ago | IN | 0 ETH | 0.00441891 | ||||
Exchange | 21243269 | 11 hrs ago | IN | 0 ETH | 0.00392471 | ||||
Exchange | 21242969 | 12 hrs ago | IN | 0 ETH | 0.00207211 | ||||
Exchange | 21242964 | 12 hrs ago | IN | 0 ETH | 0.00302002 | ||||
Exchange | 21242349 | 14 hrs ago | IN | 0 ETH | 0.00225596 | ||||
Exchange | 21241517 | 17 hrs ago | IN | 0 ETH | 0.00508241 | ||||
Exchange | 21241509 | 17 hrs ago | IN | 0 ETH | 0.00158368 | ||||
Exchange | 21241486 | 17 hrs ago | IN | 0 ETH | 0.00166487 | ||||
Exchange | 21241189 | 18 hrs ago | IN | 0 ETH | 0.00252663 | ||||
Exchange | 21241178 | 18 hrs ago | IN | 0 ETH | 0.00251789 | ||||
Exchange | 21240952 | 18 hrs ago | IN | 0 ETH | 0.00563012 | ||||
Exchange | 21240643 | 20 hrs ago | IN | 0 ETH | 0.00197878 | ||||
Exchange | 21240521 | 20 hrs ago | IN | 0 ETH | 0.00260743 | ||||
Exchange | 21240103 | 21 hrs ago | IN | 0 ETH | 0.00340918 | ||||
Exchange | 21239487 | 23 hrs ago | IN | 0 ETH | 0.00236748 | ||||
Exchange | 21239481 | 23 hrs ago | IN | 0 ETH | 0.00293573 | ||||
Exchange | 21238405 | 27 hrs ago | IN | 0 ETH | 0.00409429 | ||||
Exchange | 21238301 | 27 hrs ago | IN | 0 ETH | 0.00416211 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21245687 | 3 hrs ago | 0.00845024 ETH | ||||
21245687 | 3 hrs ago | 0.00845024 ETH | ||||
21245532 | 3 hrs ago | 0.03806298 ETH | ||||
21245532 | 3 hrs ago | 0.03806298 ETH | ||||
21245497 | 3 hrs ago | 0.08535109 ETH | ||||
21245497 | 3 hrs ago | 0.08535109 ETH | ||||
21244884 | 5 hrs ago | 0.02051184 ETH | ||||
21244884 | 5 hrs ago | 0.02051184 ETH | ||||
21244781 | 6 hrs ago | 0.97882648 ETH | ||||
21244781 | 6 hrs ago | 0.97882648 ETH | ||||
21244353 | 7 hrs ago | 48 ETH | ||||
21244353 | 7 hrs ago | 48 ETH | ||||
21244165 | 8 hrs ago | 0.0416386 ETH | ||||
21244165 | 8 hrs ago | 0.0416386 ETH | ||||
21244123 | 8 hrs ago | 0.01455464 ETH | ||||
21244123 | 8 hrs ago | 0.01455464 ETH | ||||
21243394 | 10 hrs ago | 0.25373175 ETH | ||||
21243394 | 10 hrs ago | 0.25373175 ETH | ||||
21243269 | 11 hrs ago | 0.20609884 ETH | ||||
21243269 | 11 hrs ago | 0.20609884 ETH | ||||
21242772 | 12 hrs ago | 2.9 ETH | ||||
21242772 | 12 hrs ago | 2.9 ETH | ||||
21241529 | 17 hrs ago | 0.01021209 ETH | ||||
21241529 | 17 hrs ago | 0.01021209 ETH | ||||
21241517 | 17 hrs ago | 0.14207959 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
CurveRouter v1.1
Compiler Version
vyper:0.3.10
Contract Source Code (Vyper language format)
# @version 0.3.10 """ @title CurveRouter v1.1 @author Curve.Fi @license Copyright (c) Curve.Fi, 2020-2024 - all rights reserved @notice Performs up to 5 swaps in a single transaction, can do estimations with get_dy and get_dx """ version: public(constant(String[8])) = "1.1.0" # ng pools from vyper.interfaces import ERC20 interface StablePool: def get_dy(i: int128, j: int128, amount: uint256) -> uint256: view def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256): payable def get_dy_underlying(i: int128, j: int128, amount: uint256) -> uint256: view def exchange_underlying(i: int128, j: int128, dx: uint256, min_dy: uint256): payable 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 get_dy(i: uint256, j: uint256, amount: uint256) -> uint256: view def exchange(i: uint256, j: uint256, dx: uint256, min_dy: uint256): payable def get_dy_underlying(i: uint256, j: uint256, amount: uint256) -> uint256: view def exchange_underlying(i: uint256, j: uint256, dx: uint256, min_dy: uint256): payable 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 StableNgPool: def get_dx(i: int128, j: int128, amount: uint256) -> uint256: view def get_dx_underlying(i: int128, j: int128, amount: uint256) -> uint256: view def calc_token_amount(_amounts: DynArray[uint256, 8], _is_deposit: bool) -> uint256: view def add_liquidity(_amounts: DynArray[uint256, 8], _min_mint_amount: uint256) -> uint256: nonpayable interface CryptoNgPool: def get_dx(i: uint256, j: uint256, out_amount: uint256) -> uint256: view interface TriCryptoNgETH: def add_liquidity(amounts: uint256[3], min_mint_amount: uint256, use_eth: bool) -> uint256: payable def remove_liquidity_one_coin(token_amount: uint256, i: uint256, min_amount: uint256, use_eth: bool) -> 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 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 # 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 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 USDE_ADDRESS: constant(address) = 0x4c9EDD5852cd905f086C759E8383e09bff1E68B3 SUSDE_ADDRESS: constant(address) = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497 WETH_ADDRESS: immutable(address) # Calc zaps STABLE_CALC: immutable(StableCalc) CRYPTO_CALC: immutable(CryptoCalc) is_approved: HashMap[address, HashMap[address, bool]] @external @payable def __default__(): pass @external def __init__( _weth: address, _stable_calc: address, _crypto_calc: address): 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) @external @payable @nonreentrant('lock') def exchange( _route: address[11], _swap_params: uint256[5][5], _amount: uint256, _min_dy: 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, USDe -> sUSDe pool_type: 1 - stable, 2 - twocrypto, 3 - tricrypto, 4 - llamma 10 - stable-ng, 20 - twocrypto-ng, 30 - tricrypto-ng n_coins is the number of coins in pool @param _amount The amount of input token (`_route[0]`) to be sent. @param _min_dy 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(5): # 5 rounds of iteration to perform up to 5 swaps swap: address = _route[i * 2 + 1] pool: address = _pools[i] # Only for Polygon meta-factories underlying swap (swap_type == 6) output_token = _route[(i + 1) * 2] params: uint256[5] = _swap_params[i] # i, j, swap_type, pool_type, n_coins # store the initial balance of the output_token output_token_initial_balance: uint256 = self.balance if output_token != ETH_ADDRESS: output_token_initial_balance = ERC20(output_token).balanceOf(self) 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] in [1, 10]: # stable and stable_ng StablePool(swap).exchange(convert(params[0], int128), convert(params[1], int128), amount, 0, value=eth_amount) else: # crypto 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] in [1, 10]: # stable and stable_ng StablePool(swap).exchange_underlying(convert(params[0], int128), convert(params[1], int128), amount, 0, value=eth_amount) else: # crypto CryptoPool(swap).exchange_underlying(params[0], params[1], amount, 0, value=eth_amount) elif params[2] == 3: # SWAP IS ZAP HERE !!! if params[3] in [1, 10]: # stable and stable_ng LendingBasePoolMetaZap(swap).exchange_underlying(pool, convert(params[0], int128), convert(params[1], int128), amount, 0) else: # crypto 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[3] == 10: # stable_ng amounts: DynArray[uint256, 8] = [0, 0, 0, 0, 0, 0, 0, 0] amounts[params[0]] = amount StableNgPool(swap).add_liquidity(amounts, 0) elif params[3] == 30: # tricrypto-ng amounts: uint256[3] = [0, 0, 0] amounts[params[0]] = amount if eth_amount > 0: TriCryptoNgETH(swap).add_liquidity(amounts, 0, True, value=eth_amount) else: StablePool3Coins(swap).add_liquidity(amounts, 0) elif 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] in [1, 10]: # stable and stable_ng StablePool(swap).remove_liquidity_one_coin(amount, convert(params[1], int128), 0) elif params[3] == 30 and output_token == ETH_ADDRESS: # tricrypto-ng & ETH TriCryptoNgETH(swap).remove_liquidity_one_coin(amount, params[1], 0, True) else: # crypto 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) elif input_token == USDE_ADDRESS and output_token == SUSDE_ADDRESS: sfrxETH(swap).deposit(amount, self) else: raise "Swap type 8 is only for ETH <-> WETH, ETH -> stETH or ETH -> frxETH, stETH <-> wstETH, frxETH <-> sfrxETH, ETH -> wBETH, USDe -> sUSDe" 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 change and that is bad assert amount - output_token_initial_balance != 0, "Received nothing" # check if this was the last swap if i == 4 or _route[i * 2 + 3] == 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 >= _min_dy, "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, USDe -> sUSDe pool_type: 1 - stable, 2 - twocrypto, 3 - tricrypto, 4 - llamma 10 - stable-ng, 20 - twocrypto-ng, 30 - tricrypto-ng 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(5): # 5 rounds of iteration to perform up to 5 swaps swap: address = _route[i * 2 + 1] pool: address = _pools[i] # Only for Polygon meta-factories underlying swap (swap_type == 4) output_token = _route[(i + 1) * 2] params: uint256[5] = _swap_params[i] # i, j, swap_type, pool_type, n_coins # Calc output amount according to the swap type if params[2] == 1: if params[3] in [1, 10]: # stable and stable_ng 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] in [1, 10]: # stable and stable_ng 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] in [1, 10]: # stable and stable_ng 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) elif params[3] == 10: # stable_ng amounts: DynArray[uint256, 8] = [0, 0, 0, 0, 0, 0, 0, 0] amounts[params[0]] = amount amount = StableNgPool(swap).calc_token_amount(amounts, 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: # twocrypto amount = CryptoPool2Coins(swap).calc_token_amount(amounts) else: # tricrypto, twocrypto-ng 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: # twocrypto amount = CryptoPool3Coins(swap).calc_token_amount(amounts) else: # tricrypto, tricrypto-ng 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: # twocrypto 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: # twocrypto 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] in [1, 10]: # stable and stable_ng 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() elif output_token == SUSDE_ADDRESS: amount = sfrxETH(swap).convertToShares(amount) else: raise "Swap type 8 is only for ETH <-> WETH, ETH -> stETH or ETH -> frxETH, stETH <-> wstETH, frxETH <-> sfrxETH, ETH -> wBETH, USDe -> sUSDe" else: raise "Bad swap type" # check if this was the last swap if i == 4 or _route[i * 2 + 3] == 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. This method is NOT PRECISE for swap_type = 4, 5, 6, 7. @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, USDe -> sUSDe pool_type: 1 - stable, 2 - twocrypto, 3 - tricrypto, 4 - llamma 10 - stable-ng, 20 - twocrypto-ng, 30 - tricrypto-ng 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(5): # 5 rounds of iteration to perform up to 5 swaps i: uint256 = 4 - _i swap: address = _route[i * 2 + 1] if swap == empty(address): continue input_token: address = _route[i * 2] output_token: address = _route[(i + 1) * 2] pool: address = _pools[i] base_pool: address = _base_pools[i] base_token: address = _base_tokens[i] params: uint256[5] = _swap_params[i] # 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] == 10: # stable-ng amount = StableNgPool(pool).get_dx(convert(params[0], int128), convert(params[1], int128), amount) elif params[3] in [2, 3]: # crypto amount = CRYPTO_CALC.get_dx(pool, params[0], params[1], amount, n_coins) else: # llamma, twocrypto-ng, tricrypto-ng amount = CryptoNgPool(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) elif params[3] == 10: # stable-ng _n: int128 = convert(params[0], int128) _k: int128 = convert(params[1], int128) if _n > 0 and _k > 0: amount = STABLE_CALC.get_dx(base_pool, _n - 1, _k - 1, amount, n_coins - 1) else: amount = StableNgPool(pool).get_dx_underlying(_n, _k, amount) 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] in [1, 10]: # stable and stable_ng 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) elif params[3] == 10: # stable_ng amounts: DynArray[uint256, 8] = [0, 0, 0, 0, 0, 0, 0, 0] amounts[params[1]] = amount amount = StableNgPool(swap).calc_token_amount(amounts, False) 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: # twocrypto amount = CryptoPool2Coins(swap).calc_token_amount(amounts) # This is not correct else: # tricrypto, twocrypto-ng 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: # twocrypto amount = CryptoPool3Coins(swap).calc_token_amount(amounts) # This is not correct else: # tricrypto, tricrypto-ng 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: # twocrypto 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: # twocrypto 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 elif output_token == SUSDE_ADDRESS: amount = sfrxETH(swap).convertToAssets(amount) else: raise "Swap type 8 is only for ETH <-> WETH, ETH -> stETH or ETH -> frxETH, stETH <-> wstETH, frxETH <-> sfrxETH, ETH -> wBETH, USDe -> sUSDe" else: raise "Bad swap type" return amount
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"name":"Exchange","inputs":[{"name":"sender","type":"address","indexed":true},{"name":"receiver","type":"address","indexed":true},{"name":"route","type":"address[11]","indexed":false},{"name":"swap_params","type":"uint256[5][5]","indexed":false},{"name":"pools","type":"address[5]","indexed":false},{"name":"in_amount","type":"uint256","indexed":false},{"name":"out_amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_weth","type":"address"},{"name":"_stable_calc","type":"address"},{"name":"_crypto_calc","type":"address"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_amount","type":"uint256"},{"name":"_min_dy","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":"_min_dy","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":"_min_dy","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"}]},{"stateMutability":"view","type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string"}]}]
Contract Creation Code
613ca05150346100f4576020613d6d5f395f518060a01c6100f4576040526020613d8d5f395f518060a01c6100f4576060526020613dad5f395f518060a01c6100f45760805260016001737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06020525f5260405f2080737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06020525f5260405f209050556001600173ac3e018457b222d93114458476f3e3416abbe38f6020525f5260405f208073ac3e018457b222d93114458476f3e3416abbe38f6020525f5260405f20905055604051613c6052606051613c8052608051613ca052613c606100f861000039613cc0610000f35b5f80fd5f3560e01c60026007820660011b613c5201601e395f51565b6354fd4d5081186100965734613c4e5760208060805260056040527f312e312e3000000000000000000000000000000000000000000000000000000060605260408160800181518152602082015160208201528051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506080f35b635c9c18e28118613c4c57610563361115613c4e576104c4358060a01c613c4e576101a0526104e4358060a01c613c4e576101c052610504358060a01c613c4e576101e052610524358060a01c613c4e5761020052610544358060a01c613c4e5761022052336102405261119356613c4c565b63371dc447811861012f576104c3361115613c4e5760a0366101a0373361024052611193565b63637653cb8118613c4c5761054436103417613c4e576104a4358060a01c613c4e576101a0526104c4358060a01c613c4e576101c0526104e4358060a01c613c4e576101e052610504358060a01c613c4e5761020052610524358060a01c613c4e57610220525b6004358060a01c613c4e576040526024358060a01c613c4e576060526044358060a01c613c4e576080526064358060a01c613c4e5760a0526084358060a01c613c4e5760c05260a4358060a01c613c4e5760e05260c4358060a01c613c4e576101005260e4358060a01c613c4e5761012052610104358060a01c613c4e5761014052610124358060a01c613c4e5761016052610144358060a01c613c4e5761018052604051610240525f6102605261048435610280525f6005905b806102a0526102a0518060011b818160011c18613c4e57905060018101818110613c4e579050600a8111613c4e5760051b604001516102c0526102a05160048111613c4e5760051b6101a001516102e0526102a05160018101818110613c4e5790508060011b818160011c18613c4e579050600a8111613c4e5760051b604001516102605260a06102a05160048111613c4e57026101640180356103005260208101356103205260408101356103405260608101356103605260808101356103805250600161034051186103f8576103605160018118610332576001610338565b600a8118155b9050610393576102c05163556d6e9f6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa61037c573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b6102c051635e0d443f6103c0526103005180607f1c613c4e576103e0526103205180607f1c613c4e5761040052610280516104205260206103c060646103dc845afa6103e1573d5f5f3e3d5ffd5b60203d10613c4e576103c09050516102805261109a565b600261034051186104dc57610360516001811861041657600161041c565b600a8118155b9050610477576102c0516385f11d1e6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa610460573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b6102c0516307211ef76103c0526103005180607f1c613c4e576103e0526103205180607f1c613c4e5761040052610280516104205260206103c060646103dc845afa6104c5573d5f5f3e3d5ffd5b60203d10613c4e576103c09050516102805261109a565b600361034051186105c85761036051600181186104fa576001610500565b600a8118155b9050610563576102c05163e9737ee26103a0526102e0516103c052610300516103e0526103205161040052610280516104205260206103a060846103bc845afa61054c573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b6102e0516307211ef76103c0526103005180607f1c613c4e576103e0526103205180607f1c613c4e5761040052610280516104205260206103c060646103dc845afa6105b1573d5f5f3e3d5ffd5b60203d10613c4e576103c09050516102805261109a565b61034051600481186105db5760016105e1565b60058118155b9050610b765761034051600681186105fa576001610600565b60078118155b9050610ab55760086103405118610a4c576020613c605f395f51610240511861062a5760016106ce565b6020613c605f395f5161026051186106435760016106ce565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61024051186106815773ae7ab96520de3a18e5e111b5eaab095312d7fe84610260511815610683565b5f5b6106cb5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61024051186106c557735e8422345238f34275888049021821e8e08caa1f6102605118156106ce565b5f6106ce565b60015b61109a57737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06102405118610735576102c05163bb2952fc6103a052610280516103c05260206103a060246103bc845afa61071e573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06102605118610798576102c05163b0e389006103a052610280516103c05260206103a060246103bc845afa610781573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b73ac3e018457b222d93114458476f3e3416abbe38f61024051186107fb576102c0516307a2d13a6103a052610280516103c05260206103a060246103bc845afa6107e4573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b73ac3e018457b222d93114458476f3e3416abbe38f610260511861085e576102c05163c6e6f5926103a052610280516103c05260206103a060246103bc845afa610847573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b73a2e3356610840701bdf5611a53974510ae27e2e161026051186108e85761028051670de0b6b3a7640000810281670de0b6b3a7640000820418613c4e5790506102c051633ba0b9a96103a05260206103a060046103bc845afa6108c4573d5f5f3e3d5ffd5b60203d10613c4e576103a09050518015613c4e57808204905090506102805261109a565b739d39a5de30e57443bff2a8307a4256c8797a3497610260511861094b576102c05163c6e6f5926103a052610280516103c05260206103a060246103bc845afa610934573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b60866103a0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e206103c0527f574554482c20455448202d3e207374455448206f7220455448202d3e206672786103e0527f4554482c207374455448203c2d3e207773744554482c20667278455448203c2d610400527f3e20736672784554482c20455448202d3e2077424554482c2055534465202d3e610420527f2073555344650000000000000000000000000000000000000000000000000000610440526103a0506103a051806103c001601f825f031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd61109a5661109a565b600d6103a0527f42616420737761702074797065000000000000000000000000000000000000006103c0526103a0506103a051806103c001601f825f031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd61109a565b6103605160018118610ac8576001610ace565b600a8118155b9050610b21576102c051634fb08c5e6103c052610280516103e052610320516104005260206103c060446103dc845afa610b0a573d5f5f3e3d5ffd5b60203d10613c4e576103c09050516102805261109a565b6102c05163cc2b27d76103e05261028051610400526103205180607f1c613c4e576104205260206103e060446103fc845afa610b5f573d5f5f3e3d5ffd5b60203d10613c4e576103e09050516102805261109a565b60016103605118610c1957610140366103c037610280516103005160098111613c4e5760051b6103c001526020613c805f395f516379ccdf49610500526102c0516105205261026051610540526101406105606101406103c060045afa50610380516106a05260016106c05260016106e05260206105006101e461051c845afa610c02573d5f5f3e3d5ffd5b60203d10613c4e576105009050516102805261109a565b600a6103605118610cea57610100366103e03760086103c05261028051610300516103c051811015613c4e5760051b6103e001526102c051633db06dd86104e0526040806105005280610500015f6103c0518083528060051b5f8260088111613c4e578015610ca257905b8060051b6103e001518160051b602088010152600101818118610c84575b505082016020019150509050810190506001610520525060206104e06101646104fc845afa610cd3573d5f5f3e3d5ffd5b60203d10613c4e576104e09050516102805261109a565b60026103805118610dbf576040366103c037610280516103005160018111613c4e5760051b6103c0015260026103605118610d6c576102c051638d8ea727610400526103c051610420526103e051610440526020610400604461041c845afa610d55573d5f5f3e3d5ffd5b60203d10613c4e576104009050516102805261109a565b6102c05163ed8e84f3610400526103c051610420526103e051610440526001610460526020610400606461041c845afa610da8573d5f5f3e3d5ffd5b60203d10613c4e576104009050516102805261109a565b60036103805118610ea4576060366103c037610280516103005160028111613c4e5760051b6103c0015260026103605118610e49576102c051635b6f1b5a610420526103c051610440526103e0516104605261040051610480526020610420606461043c845afa610e32573d5f5f3e3d5ffd5b60203d10613c4e576104209050516102805261109a565b6102c051633883e119610420526103c051610440526103e05161046052610400516104805260016104a0526020610420608461043c845afa610e8d573d5f5f3e3d5ffd5b60203d10613c4e576104209050516102805261109a565b60046103805118610f99576080366103c037610280516103005160038111613c4e5760051b6103c0015260026103605118610f36576102c051631a805185610440526103c051610460526103e05161048052610400516104a052610420516104c0526020610440608461045c845afa610f1f573d5f5f3e3d5ffd5b60203d10613c4e576104409050516102805261109a565b6102c05163cf701ff7610440526103c051610460526103e05161048052610400516104a052610420516104c05260016104e052602061044060a461045c845afa610f82573d5f5f3e3d5ffd5b60203d10613c4e576104409050516102805261109a565b6005610380511861109a5760a0366103c037610280516103005160048111613c4e5760051b6103c0015260026103605118611033576102c0516309379690610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052602061046060a461047c845afa61101c573d5f5f3e3d5ffd5b60203d10613c4e576104609050516102805261109a565b6102c051637ede89c5610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052600161052052602061046060c461047c845afa611087573d5f5f3e3d5ffd5b60203d10613c4e57610460905051610280525b60046102a051186110ac5760016110de565b6102a0518060011b818160011c18613c4e57905060038101818110613c4e579050600a8111613c4e5760051b60400151155b156110e8576110fb565b6102605161024052600101818118610251575b50506102805160018103818111613c4e5790506102a05260206102a0f3613c4c565b63c872a3c5811861286657610583361115613c4e576104c4358060a01c613c4e576101a0526104e4358060a01c613c4e576101c052610504358060a01c613c4e576101e052610524358060a01c613c4e5761020052610544358060a01c613c4e5761022052610564358060a01c613c4e57610240525b6004358060a01c613c4e576040526024358060a01c613c4e576060526044358060a01c613c4e576080526064358060a01c613c4e5760a0526084358060a01c613c4e5760c05260a4358060a01c613c4e5760e05260c4358060a01c613c4e576101005260e4358060a01c613c4e5761012052610104358060a01c613c4e5761014052610124358060a01c613c4e5761016052610144358060a01c613c4e57610180525f54600214613c4e5760025f55604051610260525f61028052610484356102a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118611283576102a0513418613c4e576112fd565b34613c4e57610260516323b872dd6102c052336102e05230610300526102a0516103205260206102c060646102dc5f855af16112c1573d5f5f3e3d5ffd5b3d6112d857803b15613c4e576001610340526112f1565b60203d10613c4e576102c0518060011c613c4e57610340525b61034090505115613c4e575b5f6005905b806102c0526102c0518060011b818160011c18613c4e57905060018101818110613c4e579050600a8111613c4e5760051b604001516102e0526102c05160048111613c4e5760051b6101a00151610300526102c05160018101818110613c4e5790508060011b818160011c18613c4e579050600a8111613c4e5760051b604001516102805260a06102c05160048111613c4e57026101640180356103205260208101356103405260408101356103605260608101356103805260808101356103a05250476103c05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511461142657610280516370a082316103e052306104005260206103e060246103fc845afa611413573d5f5f3e3d5ffd5b60203d10613c4e576103e09050516103c0525b6001610260516020525f5260405f20806102e0516020525f5260405f209050546114ed576102605163095ea7b36103e0526102e051610400527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6104205260206103e060446103fc5f855af161149e573d5f5f3e3d5ffd5b3d6114ae576001610440526114bf565b6103e0518060011c613c4e57610440525b61044090505115613c4e5760016001610260516020525f5260405f20806102e0516020525f5260405f209050555b5f6103e05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118611519576102a0516103e0525b6001610360511861169457610380516001811861153757600161153d565b600a8118155b90506116315773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118611568576001611584565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b6115d8576102e051635b41b90861040052610320516104205261034051610440526102a051610460525f61048052803b15613c4e575f610400608461041c5f855af16115d2573d5f5f3e3d5ffd5b50612523565b6102e05163394747c561040052610320516104205261034051610440526102a051610460525f6104805260016104a052803b15613c4e575f61040060a461041c6103e051855af161162b573d5f5f3e3d5ffd5b50612523565b6102e051633df02124610420526103205180607f1c613c4e57610440526103405180607f1c613c4e57610460526102a051610480525f6104a052803b15613c4e575f610420608461043c6103e051855af161168e573d5f5f3e3d5ffd5b50612523565b600261036051186117745761038051600181186116b25760016116b8565b600a8118155b9050611711576102e0516365b2489b61040052610320516104205261034051610440526102a051610460525f61048052803b15613c4e575f610400608461041c6103e051855af161170b573d5f5f3e3d5ffd5b50612523565b6102e05163a6417ed6610420526103205180607f1c613c4e57610440526103405180607f1c613c4e57610460526102a051610480525f6104a052803b15613c4e575f610420608461043c6103e051855af161176e573d5f5f3e3d5ffd5b50612523565b600361036051186118ae576103805160018118611792576001611798565b600a8118155b90506118465773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61026051186117c35760016117df565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b610400526102e051632bf78c61610420526103005161044052610320516104605261034051610480526102a0516104a0525f6104c052610400516104e052803b15613c4e575f61042060c461043c6103e051855af1611840573d5f5f3e3d5ffd5b50612523565b6102e051637981c43e6104205261030051610440526103205180607f1c613c4e57610460526103405180607f1c613c4e57610480526102a0516104a0525f6104c052803b15613c4e575f61042060a461043c5f855af16118a8573d5f5f3e3d5ffd5b50612523565b60046103605118611c6b57600a61038051186119855761010036610420376008610400526102a0516103205161040051811015613c4e5760051b61042001526102e05163b72df5de610520526040806105405280610540015f610400518083528060051b5f8260088111613c4e57801561194257905b8060051b61042001518160051b602088010152600101818118611924575b505082016020019150509050810190505f6105605250602061052061016461053c5f855af1611973573d5f5f3e3d5ffd5b60203d10613c4e576105205050612523565b601e6103805118611a6757606036610400376102a0516103205160028111613c4e5760051b61040001526103e05115611a17576102e051632b6e993a610460526104005161048052610420516104a052610440516104c0525f6104e052600161050052602061046060a461047c6103e051855af1611a05573d5f5f3e3d5ffd5b60203d10613c4e576104605050612523565b6102e051634515cef3610460526104005161048052610420516104a052610440516104c0525f6104e052803b15613c4e575f610460608461047c5f855af1611a61573d5f5f3e3d5ffd5b50612523565b60026103a05118611adc57604036610400376102a0516103205160018111613c4e5760051b61040001526102e051630b4c7e4d61044052610400516104605261042051610480525f6104a052803b15613c4e575f610440606461045c6103e051855af1611ad6573d5f5f3e3d5ffd5b50612523565b60036103a05118611b5957606036610400376102a0516103205160028111613c4e5760051b61040001526102e051634515cef3610460526104005161048052610420516104a052610440516104c0525f6104e052803b15613c4e575f610460608461047c6103e051855af1611b53573d5f5f3e3d5ffd5b50612523565b60046103a05118611bde57608036610400376102a0516103205160038111613c4e5760051b61040001526102e05163029b2f3461048052610400516104a052610420516104c052610440516104e05261046051610500525f61052052803b15613c4e575f61048060a461049c6103e051855af1611bd8573d5f5f3e3d5ffd5b50612523565b60056103a051186125235760a036610400376102a0516103205160048111613c4e5760051b61040001526102e05163847384996104a052610400516104c052610420516104e0526104405161050052610460516105205261048051610540525f61056052803b15613c4e575f6104a060c46104bc6103e051855af1611c65573d5f5f3e3d5ffd5b50612523565b60056103605118611cee57606036610400376102a0516103205160028111613c4e5760051b61040001526102e051632b6e993a610460526104005161048052610420516104a052610440516104c0525f6104e052600161050052803b15613c4e575f61046060a461047c6103e051855af1611ce8573d5f5f3e3d5ffd5b50612523565b60066103605118611e35576103805160018118611d0c576001611d12565b600a8118155b9050611de557601e6103805118611d435773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511815611d45565b5f5b611d91576102e05163f1dc3cc9610400526102a0516104205261034051610440525f61046052803b15613c4e575f610400606461041c5f855af1611d8b573d5f5f3e3d5ffd5b50612523565b6102e051638f15b6b5610400526102a0516104205261034051610440525f610460526001610480526020610400608461041c5f855af1611dd3573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b6102e051631a4d01d2610420526102a051610440526103405180607f1c613c4e57610460525f61048052803b15613c4e575f610420606461043c5f855af1611e2f573d5f5f3e3d5ffd5b50612523565b60076103605118611e9c576102e05163517a55a3610400526102a051610420526103405180607f1c613c4e57610440525f610460526001610480526020610400608461041c5f855af1611e8a573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b600861036051186124be5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118611ed9576020613c605f395f51610280511815611edb565b5f5b612488576020613c605f395f516102605118611f115773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511815611f13565b5f5b61244d5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118611f555773ae7ab96520de3a18e5e111b5eaab095312d7fe84610280511815611f57565b5f5b6124125773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118611f9957735e8422345238f34275888049021821e8e08caa1f610280511815611f9b565b5f5b6123dc5773ae7ab96520de3a18e5e111b5eaab095312d7fe846102605118611fdd57737f39c581f595b53c5cb19bd0b3f8da6c935e2ca0610280511815611fdf565b5f5b61239b57737f39c581f595b53c5cb19bd0b3f8da6c935e2ca061026051186120215773ae7ab96520de3a18e5e111b5eaab095312d7fe84610280511815612023565b5f5b61235a57735e8422345238f34275888049021821e8e08caa1f61026051186120655773ac3e018457b222d93114458476f3e3416abbe38f610280511815612067565b5f5b6123145773ac3e018457b222d93114458476f3e3416abbe38f61026051186120a957735e8422345238f34275888049021821e8e08caa1f6102805118156120ab565b5f5b6122c95773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61026051186120ed5773a2e3356610840701bdf5611a53974510ae27e2e16102805118156120ef565b5f5b61227a57734c9edd5852cd905f086c759e8383e09bff1e68b3610260511861213157739d39a5de30e57443bff2a8307a4256c8797a3497610280511815612133565b5f5b612234576086610400527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610420527f574554482c20455448202d3e207374455448206f7220455448202d3e20667278610440527f4554482c207374455448203c2d3e207773744554482c20667278455448203c2d610460527f3e20736672784554482c20455448202d3e2077424554482c2055534465202d3e610480527f20735553446500000000000000000000000000000000000000000000000000006104a05261040050610400518061042001601f825f031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd612523565b6102e051636e553f65610400526102a0516104205230610440526020610400604461041c5f855af1612268573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b6102e05163f340fa016104005273ecb456ea5365865ebab8a2661b0c503410e9b34761042052803b15613c4e575f610400602461041c6102a051855af16122c3573d5f5f3e3d5ffd5b50612523565b6102e05163ba087652610400526102a05161042052306104405230610460526020610400606461041c5f855af1612302573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b6102e051636e553f65610400526102a0516104205230610440526020610400604461041c5f855af1612348573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b6102e05163de0e9a3e610400526102a051610420526020610400602461041c5f855af1612389573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b6102e05163ea598cb0610400526102a051610420526020610400602461041c5f855af16123ca573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b6102e051635bcb2fc661040052803b15613c4e575f610400600461041c6102a051855af161240c573d5f5f3e3d5ffd5b50612523565b6102e05163a1903eab610400525f61042052803b15613c4e575f610400602461041c6102a051855af1612447573d5f5f3e3d5ffd5b50612523565b6102e051632e1a7d4d610400526102a05161042052803b15613c4e575f610400602461041c5f855af1612482573d5f5f3e3d5ffd5b50612523565b6102e05163d0e30db061040052803b15613c4e575f610400600461041c6102a051855af16124b8573d5f5f3e3d5ffd5b50612523565b600d610400527f42616420737761702074797065000000000000000000000000000000000000006104205261040050610400518061042001601f825f031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511861254b57476102a052612589565b610280516370a082316104005230610420526020610400602461041c845afa612576573d5f5f3e3d5ffd5b60203d10613c4e576104009050516102a0525b6102a0516103c051808203828111613c4e5790509050612608576010610400527f5265636569766564206e6f7468696e67000000000000000000000000000000006104205261040050610400518061042001601f825f031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd5b60046102c0511861261a57600161264c565b6102c0518060011b818160011c18613c4e57905060038101818110613c4e579050600a8111613c4e5760051b60400151155b1561265657612669565b6102805161026052600101818118611302575b50506102a05160018103818111613c4e5790506102a0526104a4356102a05110156126f35760086102c0527f536c6970706167650000000000000000000000000000000000000000000000006102e0526102c0506102c051806102e001601f825f031636823750506308c379a06102805260206102a052601f19601f6102c051011660440161029cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511861274657610240516102a0515a5f6102c0526102c0505f5f6102c0516102e0858786f19050905090506127b9573d5f5f3e3d5ffd6127b9565b6102805163a9059cbb6102c052610240516102e0526102a0516103005260206102c060446102dc5f855af161277d573d5f5f3e3d5ffd5b3d61279457803b15613c4e576001610320526127ad565b60203d10613c4e576102c0518060011c613c4e57610320525b61032090505115613c4e575b61024051337f56d0661e240dfb199ef196e16e6f42473990366314f0226ac978f7be3cd9ee836101606102c0610160604060045afa5060a06101646104203760a06102046104c03760a06102a46105603760a06103446106003760a06103e46106a0376101a051610740526101c051610760526101e05161078052610200516107a052610220516107c052610484356107e0526102a051610800526105606102c0a360206102a060035f55f35b6390e7e2058118613c4c5761068436103417613c4e57610544358060a01c613c4e5761024052610564358060a01c613c4e5761026052610584358060a01c613c4e57610280526105a4358060a01c613c4e576102a0526105c4358060a01c613c4e576102c0526105e4358060a01c613c4e576102e052610604358060a01c613c4e5761030052610624358060a01c613c4e5761032052610644358060a01c613c4e5761034052610664358060a01c613c4e57610360525b6004358060a01c613c4e576040526024358060a01c613c4e576060526044358060a01c613c4e576080526064358060a01c613c4e5760a0526084358060a01c613c4e5760c05260a4358060a01c613c4e5760e05260c4358060a01c613c4e576101005260e4358060a01c613c4e5761012052610104358060a01c613c4e5761014052610124358060a01c613c4e5761016052610144358060a01c613c4e57610180526104a4358060a01c613c4e576101a0526104c4358060a01c613c4e576101c0526104e4358060a01c613c4e576101e052610504358060a01c613c4e5761020052610524358060a01c613c4e576102205261048435610380525f6005905b806103a0526103a0518060040360048111613c4e5790506103c0526103c0518060011b818160011c18613c4e57905060018101818110613c4e579050600a8111613c4e5760051b604001516103e0526103e051612a7857613b71565b6103c0518060011b818160011c18613c4e579050600a8111613c4e5760051b60400151610400526103c05160018101818110613c4e5790508060011b818160011c18613c4e579050600a8111613c4e5760051b60400151610420526103c05160048111613c4e5760051b6101a00151610440526103c05160048111613c4e5760051b6102400151610460526103c05160048111613c4e5760051b6102e001516104805260a06103c05160048111613c4e57026101640180356104a05260208101356104c05260408101356104e05260608101356105005260808101356105205250610520516105405260016104e05118612dc95760016105005118612c7b5761046051612bf9576020613c805f395f5163158819d46105605261044051610580526104a05180607f1c613c4e576105a0526104c05180607f1c613c4e576105c052610380516105e0526105405161060052602061056060a461057c845afa612be2573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b6020613c805f395f5163571f00b56105605261044051610580526104a05180607f1c613c4e576105a0526104c05180607f1c613c4e576105c052610380516105e05261054051610600526104605161062052602061056060c461057c845afa612c64573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b600a6105005118612ceb57610440516367df02ca610560526104a05180607f1c613c4e57610580526104c05180607f1c613c4e576105a052610380516105c0526020610560606461057c845afa612cd4573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b6105005160028118612cfe576001612d04565b60038118155b9050612d5f57610440516337ed3a7a610560526104a051610580526104c0516105a052610380516105c0526020610560606461057c845afa612d48573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b6020613ca05f395f5163ca4bc71461058052610440516105a0526104a0516105c0526104c0516105e05261038051610600526105405161062052602061058060a461059c845afa612db2573d5f5f3e3d5ffd5b60203d10613c4e5761058090505161038052613b71565b6104e05160028118612ddc576001612de2565b60038118155b90506138ae576104e05160048118612dfb576001612e01565b60058118155b90506137ed576104e05160068118612e1a576001612e20565b60078118155b90506132cb5760086104e05118613262576020613c605f395f516104005118612e4a576001612eee565b6020613c605f395f516104205118612e63576001612eee565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104005118612ea15773ae7ab96520de3a18e5e111b5eaab095312d7fe84610420511815612ea3565b5f5b612eeb5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104005118612ee557735e8422345238f34275888049021821e8e08caa1f610420511815612eee565b5f612eee565b60015b613b7157737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06104005118612f55576103e05163b0e389006105605261038051610580526020610560602461057c845afa612f3e573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06104205118612fb8576103e05163bb2952fc6105605261038051610580526020610560602461057c845afa612fa1573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b73ac3e018457b222d93114458476f3e3416abbe38f610400511861301b576103e05163c6e6f5926105605261038051610580526020610560602461057c845afa613004573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b73ac3e018457b222d93114458476f3e3416abbe38f610420511861307e576103e0516307a2d13a6105605261038051610580526020610560602461057c845afa613067573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b73a2e3356610840701bdf5611a53974510ae27e2e161042051186130fe57610380516103e051633ba0b9a9610560526020610560600461057c845afa6130c6573d5f5f3e3d5ffd5b60203d10613c4e57610560905051808202811583838304141715613c4e5790509050670de0b6b3a76400008104905061038052613b71565b739d39a5de30e57443bff2a8307a4256c8797a34976104205118613161576103e0516307a2d13a6105605261038051610580526020610560602461057c845afa61314a573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b6086610560527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610580527f574554482c20455448202d3e207374455448206f7220455448202d3e206672786105a0527f4554482c207374455448203c2d3e207773744554482c20667278455448203c2d6105c0527f3e20736672784554482c20455448202d3e2077424554482c2055534465202d3e6105e0527f20735553446500000000000000000000000000000000000000000000000000006106005261056050610560518061058001601f825f031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd613b7156613b71565b600d610560527f42616420737761702074797065000000000000000000000000000000000000006105805261056050610560518061058001601f825f031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd613b71565b6001610500511861336d576101403661058037610380516104c05160098111613c4e5760051b61058001526020613c805f395f516379ccdf496106c0526103e0516106e052610400516107005261014061072061014061058060045afa5061054051610860525f6108805260016108a05260206106c06101e46106dc845afa613356573d5f5f3e3d5ffd5b60203d10613c4e576106c090505161038052613b71565b600a610500511861343d57610100366105a037600861058052610380516104c05161058051811015613c4e5760051b6105a001526103e051633db06dd86106a0526040806106c052806106c0015f610580518083528060051b5f8260088111613c4e5780156133f657905b8060051b6105a001518160051b6020880101526001018181186133d8575b505082016020019150509050810190505f6106e0525060206106a06101646106bc845afa613426573d5f5f3e3d5ffd5b60203d10613c4e576106a090505161038052613b71565b600261054051186135115760403661058037610380516104c05160018111613c4e5760051b6105800152600261050051186134bf576103e051638d8ea7276105c052610580516105e0526105a0516106005260206105c060446105dc845afa6134a8573d5f5f3e3d5ffd5b60203d10613c4e576105c090505161038052613b71565b6103e05163ed8e84f36105c052610580516105e0526105a051610600525f6106205260206105c060646105dc845afa6134fa573d5f5f3e3d5ffd5b60203d10613c4e576105c090505161038052613b71565b600361054051186135f55760603661058037610380516104c05160028111613c4e5760051b61058001526002610500511861359b576103e051635b6f1b5a6105e05261058051610600526105a051610620526105c0516106405260206105e060646105fc845afa613584573d5f5f3e3d5ffd5b60203d10613c4e576105e090505161038052613b71565b6103e051633883e1196105e05261058051610600526105a051610620526105c051610640525f6106605260206105e060846105fc845afa6135de573d5f5f3e3d5ffd5b60203d10613c4e576105e090505161038052613b71565b600461054051186136e95760803661058037610380516104c05160038111613c4e5760051b610580015260026105005118613687576103e051631a8051856106005261058051610620526105a051610640526105c051610660526105e051610680526020610600608461061c845afa613670573d5f5f3e3d5ffd5b60203d10613c4e5761060090505161038052613b71565b6103e05163cf701ff76106005261058051610620526105a051610640526105c051610660526105e051610680525f6106a052602061060060a461061c845afa6136d2573d5f5f3e3d5ffd5b60203d10613c4e5761060090505161038052613b71565b60056105405118613b715760a03661058037610380516104c05160048111613c4e5760051b610580015260026105005118613783576103e05163093796906106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c052602061062060a461063c845afa61376c573d5f5f3e3d5ffd5b60203d10613c4e5761062090505161038052613b71565b6103e051637ede89c56106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c0525f6106e052602061062060c461063c845afa6137d6573d5f5f3e3d5ffd5b60203d10613c4e5761062090505161038052613b71565b6105005160018118613800576001613806565b600a8118155b9050613859576103e051634fb08c5e61058052610380516105a0526104a0516105c0526020610580604461059c845afa613842573d5f5f3e3d5ffd5b60203d10613c4e5761058090505161038052613b71565b6103e05163cc2b27d76105a052610380516105c0526104a05180607f1c613c4e576105e05260206105a060446105bc845afa613897573d5f5f3e3d5ffd5b60203d10613c4e576105a090505161038052613b71565b600161050051186139c5576104605161393b576020613c805f395f51638fd3218f61058052610440516105a0526104a05180607f1c613c4e576105c0526104c05180607f1c613c4e576105e05261038051610600526105405161062052602061058060a461059c845afa613924573d5f5f3e3d5ffd5b60203d10613c4e5761058090505161038052613b71565b6020613c805f395f51634933a86461058052610440516105a0526104a05180607f1c613c4e576105c0526104c05180607f1c613c4e576105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa6139ae573d5f5f3e3d5ffd5b60203d10613c4e5761058090505161038052613b71565b600a6105005118613afb576104a05180607f1c613c4e57610580526104c05180607f1c613c4e576105a0526001610580511215613a02575f613a0b565b60016105a05112155b613a645761044051630e71d1b96105c052610580516105e0526105a05161060052610380516106205260206105c060646105dc845afa613a4d573d5f5f3e3d5ffd5b60203d10613c4e576105c090505161038052613b71565b6020613c805f395f5163158819d46105c052610460516105e052610580516001810380600f0b8118613c4e579050610600526105a0516001810380600f0b8118613c4e5790506106205261038051610640526105405160018103818111613c4e5790506106605260206105c060a46105dc845afa613ae4573d5f5f3e3d5ffd5b60203d10613c4e576105c090505161038052613b71565b6020613ca05f395f51638ca1565361058052610440516105a0526104a0516105c0526104c0516105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa613b5e573d5f5f3e3d5ffd5b60203d10613c4e57610580905051610380525b600101818118612a1c5750506020610380f3613c4c565b6381889a2c8118613c4c576104a436103417613c4e5760a0366101a03761019656613c4c565b63c07b53538118613bd15761054436103417613c4e57610140366102403761291d565b6381fc0ca58118613c4c576105e436103417613c4e57610544358060a01c613c4e5761024052610564358060a01c613c4e5761026052610584358060a01c613c4e57610280526105a4358060a01c613c4e576102a0526105c4358060a01c613c4e576102c05260a0366102e03761291d56613c4c56613c4c565b5b005b5f80fd3c4b3c4b0109111d3b8800183bae84193c60810e1860a16576797065728300030a0015000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc
Deployed Bytecode
0x5f3560e01c60026007820660011b613c5201601e395f51565b6354fd4d5081186100965734613c4e5760208060805260056040527f312e312e3000000000000000000000000000000000000000000000000000000060605260408160800181518152602082015160208201528051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506080f35b635c9c18e28118613c4c57610563361115613c4e576104c4358060a01c613c4e576101a0526104e4358060a01c613c4e576101c052610504358060a01c613c4e576101e052610524358060a01c613c4e5761020052610544358060a01c613c4e5761022052336102405261119356613c4c565b63371dc447811861012f576104c3361115613c4e5760a0366101a0373361024052611193565b63637653cb8118613c4c5761054436103417613c4e576104a4358060a01c613c4e576101a0526104c4358060a01c613c4e576101c0526104e4358060a01c613c4e576101e052610504358060a01c613c4e5761020052610524358060a01c613c4e57610220525b6004358060a01c613c4e576040526024358060a01c613c4e576060526044358060a01c613c4e576080526064358060a01c613c4e5760a0526084358060a01c613c4e5760c05260a4358060a01c613c4e5760e05260c4358060a01c613c4e576101005260e4358060a01c613c4e5761012052610104358060a01c613c4e5761014052610124358060a01c613c4e5761016052610144358060a01c613c4e5761018052604051610240525f6102605261048435610280525f6005905b806102a0526102a0518060011b818160011c18613c4e57905060018101818110613c4e579050600a8111613c4e5760051b604001516102c0526102a05160048111613c4e5760051b6101a001516102e0526102a05160018101818110613c4e5790508060011b818160011c18613c4e579050600a8111613c4e5760051b604001516102605260a06102a05160048111613c4e57026101640180356103005260208101356103205260408101356103405260608101356103605260808101356103805250600161034051186103f8576103605160018118610332576001610338565b600a8118155b9050610393576102c05163556d6e9f6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa61037c573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b6102c051635e0d443f6103c0526103005180607f1c613c4e576103e0526103205180607f1c613c4e5761040052610280516104205260206103c060646103dc845afa6103e1573d5f5f3e3d5ffd5b60203d10613c4e576103c09050516102805261109a565b600261034051186104dc57610360516001811861041657600161041c565b600a8118155b9050610477576102c0516385f11d1e6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa610460573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b6102c0516307211ef76103c0526103005180607f1c613c4e576103e0526103205180607f1c613c4e5761040052610280516104205260206103c060646103dc845afa6104c5573d5f5f3e3d5ffd5b60203d10613c4e576103c09050516102805261109a565b600361034051186105c85761036051600181186104fa576001610500565b600a8118155b9050610563576102c05163e9737ee26103a0526102e0516103c052610300516103e0526103205161040052610280516104205260206103a060846103bc845afa61054c573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b6102e0516307211ef76103c0526103005180607f1c613c4e576103e0526103205180607f1c613c4e5761040052610280516104205260206103c060646103dc845afa6105b1573d5f5f3e3d5ffd5b60203d10613c4e576103c09050516102805261109a565b61034051600481186105db5760016105e1565b60058118155b9050610b765761034051600681186105fa576001610600565b60078118155b9050610ab55760086103405118610a4c576020613c605f395f51610240511861062a5760016106ce565b6020613c605f395f5161026051186106435760016106ce565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61024051186106815773ae7ab96520de3a18e5e111b5eaab095312d7fe84610260511815610683565b5f5b6106cb5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61024051186106c557735e8422345238f34275888049021821e8e08caa1f6102605118156106ce565b5f6106ce565b60015b61109a57737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06102405118610735576102c05163bb2952fc6103a052610280516103c05260206103a060246103bc845afa61071e573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06102605118610798576102c05163b0e389006103a052610280516103c05260206103a060246103bc845afa610781573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b73ac3e018457b222d93114458476f3e3416abbe38f61024051186107fb576102c0516307a2d13a6103a052610280516103c05260206103a060246103bc845afa6107e4573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b73ac3e018457b222d93114458476f3e3416abbe38f610260511861085e576102c05163c6e6f5926103a052610280516103c05260206103a060246103bc845afa610847573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b73a2e3356610840701bdf5611a53974510ae27e2e161026051186108e85761028051670de0b6b3a7640000810281670de0b6b3a7640000820418613c4e5790506102c051633ba0b9a96103a05260206103a060046103bc845afa6108c4573d5f5f3e3d5ffd5b60203d10613c4e576103a09050518015613c4e57808204905090506102805261109a565b739d39a5de30e57443bff2a8307a4256c8797a3497610260511861094b576102c05163c6e6f5926103a052610280516103c05260206103a060246103bc845afa610934573d5f5f3e3d5ffd5b60203d10613c4e576103a09050516102805261109a565b60866103a0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e206103c0527f574554482c20455448202d3e207374455448206f7220455448202d3e206672786103e0527f4554482c207374455448203c2d3e207773744554482c20667278455448203c2d610400527f3e20736672784554482c20455448202d3e2077424554482c2055534465202d3e610420527f2073555344650000000000000000000000000000000000000000000000000000610440526103a0506103a051806103c001601f825f031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd61109a5661109a565b600d6103a0527f42616420737761702074797065000000000000000000000000000000000000006103c0526103a0506103a051806103c001601f825f031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd61109a565b6103605160018118610ac8576001610ace565b600a8118155b9050610b21576102c051634fb08c5e6103c052610280516103e052610320516104005260206103c060446103dc845afa610b0a573d5f5f3e3d5ffd5b60203d10613c4e576103c09050516102805261109a565b6102c05163cc2b27d76103e05261028051610400526103205180607f1c613c4e576104205260206103e060446103fc845afa610b5f573d5f5f3e3d5ffd5b60203d10613c4e576103e09050516102805261109a565b60016103605118610c1957610140366103c037610280516103005160098111613c4e5760051b6103c001526020613c805f395f516379ccdf49610500526102c0516105205261026051610540526101406105606101406103c060045afa50610380516106a05260016106c05260016106e05260206105006101e461051c845afa610c02573d5f5f3e3d5ffd5b60203d10613c4e576105009050516102805261109a565b600a6103605118610cea57610100366103e03760086103c05261028051610300516103c051811015613c4e5760051b6103e001526102c051633db06dd86104e0526040806105005280610500015f6103c0518083528060051b5f8260088111613c4e578015610ca257905b8060051b6103e001518160051b602088010152600101818118610c84575b505082016020019150509050810190506001610520525060206104e06101646104fc845afa610cd3573d5f5f3e3d5ffd5b60203d10613c4e576104e09050516102805261109a565b60026103805118610dbf576040366103c037610280516103005160018111613c4e5760051b6103c0015260026103605118610d6c576102c051638d8ea727610400526103c051610420526103e051610440526020610400604461041c845afa610d55573d5f5f3e3d5ffd5b60203d10613c4e576104009050516102805261109a565b6102c05163ed8e84f3610400526103c051610420526103e051610440526001610460526020610400606461041c845afa610da8573d5f5f3e3d5ffd5b60203d10613c4e576104009050516102805261109a565b60036103805118610ea4576060366103c037610280516103005160028111613c4e5760051b6103c0015260026103605118610e49576102c051635b6f1b5a610420526103c051610440526103e0516104605261040051610480526020610420606461043c845afa610e32573d5f5f3e3d5ffd5b60203d10613c4e576104209050516102805261109a565b6102c051633883e119610420526103c051610440526103e05161046052610400516104805260016104a0526020610420608461043c845afa610e8d573d5f5f3e3d5ffd5b60203d10613c4e576104209050516102805261109a565b60046103805118610f99576080366103c037610280516103005160038111613c4e5760051b6103c0015260026103605118610f36576102c051631a805185610440526103c051610460526103e05161048052610400516104a052610420516104c0526020610440608461045c845afa610f1f573d5f5f3e3d5ffd5b60203d10613c4e576104409050516102805261109a565b6102c05163cf701ff7610440526103c051610460526103e05161048052610400516104a052610420516104c05260016104e052602061044060a461045c845afa610f82573d5f5f3e3d5ffd5b60203d10613c4e576104409050516102805261109a565b6005610380511861109a5760a0366103c037610280516103005160048111613c4e5760051b6103c0015260026103605118611033576102c0516309379690610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052602061046060a461047c845afa61101c573d5f5f3e3d5ffd5b60203d10613c4e576104609050516102805261109a565b6102c051637ede89c5610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052600161052052602061046060c461047c845afa611087573d5f5f3e3d5ffd5b60203d10613c4e57610460905051610280525b60046102a051186110ac5760016110de565b6102a0518060011b818160011c18613c4e57905060038101818110613c4e579050600a8111613c4e5760051b60400151155b156110e8576110fb565b6102605161024052600101818118610251575b50506102805160018103818111613c4e5790506102a05260206102a0f3613c4c565b63c872a3c5811861286657610583361115613c4e576104c4358060a01c613c4e576101a0526104e4358060a01c613c4e576101c052610504358060a01c613c4e576101e052610524358060a01c613c4e5761020052610544358060a01c613c4e5761022052610564358060a01c613c4e57610240525b6004358060a01c613c4e576040526024358060a01c613c4e576060526044358060a01c613c4e576080526064358060a01c613c4e5760a0526084358060a01c613c4e5760c05260a4358060a01c613c4e5760e05260c4358060a01c613c4e576101005260e4358060a01c613c4e5761012052610104358060a01c613c4e5761014052610124358060a01c613c4e5761016052610144358060a01c613c4e57610180525f54600214613c4e5760025f55604051610260525f61028052610484356102a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118611283576102a0513418613c4e576112fd565b34613c4e57610260516323b872dd6102c052336102e05230610300526102a0516103205260206102c060646102dc5f855af16112c1573d5f5f3e3d5ffd5b3d6112d857803b15613c4e576001610340526112f1565b60203d10613c4e576102c0518060011c613c4e57610340525b61034090505115613c4e575b5f6005905b806102c0526102c0518060011b818160011c18613c4e57905060018101818110613c4e579050600a8111613c4e5760051b604001516102e0526102c05160048111613c4e5760051b6101a00151610300526102c05160018101818110613c4e5790508060011b818160011c18613c4e579050600a8111613c4e5760051b604001516102805260a06102c05160048111613c4e57026101640180356103205260208101356103405260408101356103605260608101356103805260808101356103a05250476103c05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511461142657610280516370a082316103e052306104005260206103e060246103fc845afa611413573d5f5f3e3d5ffd5b60203d10613c4e576103e09050516103c0525b6001610260516020525f5260405f20806102e0516020525f5260405f209050546114ed576102605163095ea7b36103e0526102e051610400527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6104205260206103e060446103fc5f855af161149e573d5f5f3e3d5ffd5b3d6114ae576001610440526114bf565b6103e0518060011c613c4e57610440525b61044090505115613c4e5760016001610260516020525f5260405f20806102e0516020525f5260405f209050555b5f6103e05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118611519576102a0516103e0525b6001610360511861169457610380516001811861153757600161153d565b600a8118155b90506116315773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118611568576001611584565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b6115d8576102e051635b41b90861040052610320516104205261034051610440526102a051610460525f61048052803b15613c4e575f610400608461041c5f855af16115d2573d5f5f3e3d5ffd5b50612523565b6102e05163394747c561040052610320516104205261034051610440526102a051610460525f6104805260016104a052803b15613c4e575f61040060a461041c6103e051855af161162b573d5f5f3e3d5ffd5b50612523565b6102e051633df02124610420526103205180607f1c613c4e57610440526103405180607f1c613c4e57610460526102a051610480525f6104a052803b15613c4e575f610420608461043c6103e051855af161168e573d5f5f3e3d5ffd5b50612523565b600261036051186117745761038051600181186116b25760016116b8565b600a8118155b9050611711576102e0516365b2489b61040052610320516104205261034051610440526102a051610460525f61048052803b15613c4e575f610400608461041c6103e051855af161170b573d5f5f3e3d5ffd5b50612523565b6102e05163a6417ed6610420526103205180607f1c613c4e57610440526103405180607f1c613c4e57610460526102a051610480525f6104a052803b15613c4e575f610420608461043c6103e051855af161176e573d5f5f3e3d5ffd5b50612523565b600361036051186118ae576103805160018118611792576001611798565b600a8118155b90506118465773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61026051186117c35760016117df565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b610400526102e051632bf78c61610420526103005161044052610320516104605261034051610480526102a0516104a0525f6104c052610400516104e052803b15613c4e575f61042060c461043c6103e051855af1611840573d5f5f3e3d5ffd5b50612523565b6102e051637981c43e6104205261030051610440526103205180607f1c613c4e57610460526103405180607f1c613c4e57610480526102a0516104a0525f6104c052803b15613c4e575f61042060a461043c5f855af16118a8573d5f5f3e3d5ffd5b50612523565b60046103605118611c6b57600a61038051186119855761010036610420376008610400526102a0516103205161040051811015613c4e5760051b61042001526102e05163b72df5de610520526040806105405280610540015f610400518083528060051b5f8260088111613c4e57801561194257905b8060051b61042001518160051b602088010152600101818118611924575b505082016020019150509050810190505f6105605250602061052061016461053c5f855af1611973573d5f5f3e3d5ffd5b60203d10613c4e576105205050612523565b601e6103805118611a6757606036610400376102a0516103205160028111613c4e5760051b61040001526103e05115611a17576102e051632b6e993a610460526104005161048052610420516104a052610440516104c0525f6104e052600161050052602061046060a461047c6103e051855af1611a05573d5f5f3e3d5ffd5b60203d10613c4e576104605050612523565b6102e051634515cef3610460526104005161048052610420516104a052610440516104c0525f6104e052803b15613c4e575f610460608461047c5f855af1611a61573d5f5f3e3d5ffd5b50612523565b60026103a05118611adc57604036610400376102a0516103205160018111613c4e5760051b61040001526102e051630b4c7e4d61044052610400516104605261042051610480525f6104a052803b15613c4e575f610440606461045c6103e051855af1611ad6573d5f5f3e3d5ffd5b50612523565b60036103a05118611b5957606036610400376102a0516103205160028111613c4e5760051b61040001526102e051634515cef3610460526104005161048052610420516104a052610440516104c0525f6104e052803b15613c4e575f610460608461047c6103e051855af1611b53573d5f5f3e3d5ffd5b50612523565b60046103a05118611bde57608036610400376102a0516103205160038111613c4e5760051b61040001526102e05163029b2f3461048052610400516104a052610420516104c052610440516104e05261046051610500525f61052052803b15613c4e575f61048060a461049c6103e051855af1611bd8573d5f5f3e3d5ffd5b50612523565b60056103a051186125235760a036610400376102a0516103205160048111613c4e5760051b61040001526102e05163847384996104a052610400516104c052610420516104e0526104405161050052610460516105205261048051610540525f61056052803b15613c4e575f6104a060c46104bc6103e051855af1611c65573d5f5f3e3d5ffd5b50612523565b60056103605118611cee57606036610400376102a0516103205160028111613c4e5760051b61040001526102e051632b6e993a610460526104005161048052610420516104a052610440516104c0525f6104e052600161050052803b15613c4e575f61046060a461047c6103e051855af1611ce8573d5f5f3e3d5ffd5b50612523565b60066103605118611e35576103805160018118611d0c576001611d12565b600a8118155b9050611de557601e6103805118611d435773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511815611d45565b5f5b611d91576102e05163f1dc3cc9610400526102a0516104205261034051610440525f61046052803b15613c4e575f610400606461041c5f855af1611d8b573d5f5f3e3d5ffd5b50612523565b6102e051638f15b6b5610400526102a0516104205261034051610440525f610460526001610480526020610400608461041c5f855af1611dd3573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b6102e051631a4d01d2610420526102a051610440526103405180607f1c613c4e57610460525f61048052803b15613c4e575f610420606461043c5f855af1611e2f573d5f5f3e3d5ffd5b50612523565b60076103605118611e9c576102e05163517a55a3610400526102a051610420526103405180607f1c613c4e57610440525f610460526001610480526020610400608461041c5f855af1611e8a573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b600861036051186124be5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118611ed9576020613c605f395f51610280511815611edb565b5f5b612488576020613c605f395f516102605118611f115773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511815611f13565b5f5b61244d5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118611f555773ae7ab96520de3a18e5e111b5eaab095312d7fe84610280511815611f57565b5f5b6124125773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118611f9957735e8422345238f34275888049021821e8e08caa1f610280511815611f9b565b5f5b6123dc5773ae7ab96520de3a18e5e111b5eaab095312d7fe846102605118611fdd57737f39c581f595b53c5cb19bd0b3f8da6c935e2ca0610280511815611fdf565b5f5b61239b57737f39c581f595b53c5cb19bd0b3f8da6c935e2ca061026051186120215773ae7ab96520de3a18e5e111b5eaab095312d7fe84610280511815612023565b5f5b61235a57735e8422345238f34275888049021821e8e08caa1f61026051186120655773ac3e018457b222d93114458476f3e3416abbe38f610280511815612067565b5f5b6123145773ac3e018457b222d93114458476f3e3416abbe38f61026051186120a957735e8422345238f34275888049021821e8e08caa1f6102805118156120ab565b5f5b6122c95773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61026051186120ed5773a2e3356610840701bdf5611a53974510ae27e2e16102805118156120ef565b5f5b61227a57734c9edd5852cd905f086c759e8383e09bff1e68b3610260511861213157739d39a5de30e57443bff2a8307a4256c8797a3497610280511815612133565b5f5b612234576086610400527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610420527f574554482c20455448202d3e207374455448206f7220455448202d3e20667278610440527f4554482c207374455448203c2d3e207773744554482c20667278455448203c2d610460527f3e20736672784554482c20455448202d3e2077424554482c2055534465202d3e610480527f20735553446500000000000000000000000000000000000000000000000000006104a05261040050610400518061042001601f825f031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd612523565b6102e051636e553f65610400526102a0516104205230610440526020610400604461041c5f855af1612268573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b6102e05163f340fa016104005273ecb456ea5365865ebab8a2661b0c503410e9b34761042052803b15613c4e575f610400602461041c6102a051855af16122c3573d5f5f3e3d5ffd5b50612523565b6102e05163ba087652610400526102a05161042052306104405230610460526020610400606461041c5f855af1612302573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b6102e051636e553f65610400526102a0516104205230610440526020610400604461041c5f855af1612348573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b6102e05163de0e9a3e610400526102a051610420526020610400602461041c5f855af1612389573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b6102e05163ea598cb0610400526102a051610420526020610400602461041c5f855af16123ca573d5f5f3e3d5ffd5b60203d10613c4e576104005050612523565b6102e051635bcb2fc661040052803b15613c4e575f610400600461041c6102a051855af161240c573d5f5f3e3d5ffd5b50612523565b6102e05163a1903eab610400525f61042052803b15613c4e575f610400602461041c6102a051855af1612447573d5f5f3e3d5ffd5b50612523565b6102e051632e1a7d4d610400526102a05161042052803b15613c4e575f610400602461041c5f855af1612482573d5f5f3e3d5ffd5b50612523565b6102e05163d0e30db061040052803b15613c4e575f610400600461041c6102a051855af16124b8573d5f5f3e3d5ffd5b50612523565b600d610400527f42616420737761702074797065000000000000000000000000000000000000006104205261040050610400518061042001601f825f031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511861254b57476102a052612589565b610280516370a082316104005230610420526020610400602461041c845afa612576573d5f5f3e3d5ffd5b60203d10613c4e576104009050516102a0525b6102a0516103c051808203828111613c4e5790509050612608576010610400527f5265636569766564206e6f7468696e67000000000000000000000000000000006104205261040050610400518061042001601f825f031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd5b60046102c0511861261a57600161264c565b6102c0518060011b818160011c18613c4e57905060038101818110613c4e579050600a8111613c4e5760051b60400151155b1561265657612669565b6102805161026052600101818118611302575b50506102a05160018103818111613c4e5790506102a0526104a4356102a05110156126f35760086102c0527f536c6970706167650000000000000000000000000000000000000000000000006102e0526102c0506102c051806102e001601f825f031636823750506308c379a06102805260206102a052601f19601f6102c051011660440161029cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511861274657610240516102a0515a5f6102c0526102c0505f5f6102c0516102e0858786f19050905090506127b9573d5f5f3e3d5ffd6127b9565b6102805163a9059cbb6102c052610240516102e0526102a0516103005260206102c060446102dc5f855af161277d573d5f5f3e3d5ffd5b3d61279457803b15613c4e576001610320526127ad565b60203d10613c4e576102c0518060011c613c4e57610320525b61032090505115613c4e575b61024051337f56d0661e240dfb199ef196e16e6f42473990366314f0226ac978f7be3cd9ee836101606102c0610160604060045afa5060a06101646104203760a06102046104c03760a06102a46105603760a06103446106003760a06103e46106a0376101a051610740526101c051610760526101e05161078052610200516107a052610220516107c052610484356107e0526102a051610800526105606102c0a360206102a060035f55f35b6390e7e2058118613c4c5761068436103417613c4e57610544358060a01c613c4e5761024052610564358060a01c613c4e5761026052610584358060a01c613c4e57610280526105a4358060a01c613c4e576102a0526105c4358060a01c613c4e576102c0526105e4358060a01c613c4e576102e052610604358060a01c613c4e5761030052610624358060a01c613c4e5761032052610644358060a01c613c4e5761034052610664358060a01c613c4e57610360525b6004358060a01c613c4e576040526024358060a01c613c4e576060526044358060a01c613c4e576080526064358060a01c613c4e5760a0526084358060a01c613c4e5760c05260a4358060a01c613c4e5760e05260c4358060a01c613c4e576101005260e4358060a01c613c4e5761012052610104358060a01c613c4e5761014052610124358060a01c613c4e5761016052610144358060a01c613c4e57610180526104a4358060a01c613c4e576101a0526104c4358060a01c613c4e576101c0526104e4358060a01c613c4e576101e052610504358060a01c613c4e5761020052610524358060a01c613c4e576102205261048435610380525f6005905b806103a0526103a0518060040360048111613c4e5790506103c0526103c0518060011b818160011c18613c4e57905060018101818110613c4e579050600a8111613c4e5760051b604001516103e0526103e051612a7857613b71565b6103c0518060011b818160011c18613c4e579050600a8111613c4e5760051b60400151610400526103c05160018101818110613c4e5790508060011b818160011c18613c4e579050600a8111613c4e5760051b60400151610420526103c05160048111613c4e5760051b6101a00151610440526103c05160048111613c4e5760051b6102400151610460526103c05160048111613c4e5760051b6102e001516104805260a06103c05160048111613c4e57026101640180356104a05260208101356104c05260408101356104e05260608101356105005260808101356105205250610520516105405260016104e05118612dc95760016105005118612c7b5761046051612bf9576020613c805f395f5163158819d46105605261044051610580526104a05180607f1c613c4e576105a0526104c05180607f1c613c4e576105c052610380516105e0526105405161060052602061056060a461057c845afa612be2573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b6020613c805f395f5163571f00b56105605261044051610580526104a05180607f1c613c4e576105a0526104c05180607f1c613c4e576105c052610380516105e05261054051610600526104605161062052602061056060c461057c845afa612c64573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b600a6105005118612ceb57610440516367df02ca610560526104a05180607f1c613c4e57610580526104c05180607f1c613c4e576105a052610380516105c0526020610560606461057c845afa612cd4573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b6105005160028118612cfe576001612d04565b60038118155b9050612d5f57610440516337ed3a7a610560526104a051610580526104c0516105a052610380516105c0526020610560606461057c845afa612d48573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b6020613ca05f395f5163ca4bc71461058052610440516105a0526104a0516105c0526104c0516105e05261038051610600526105405161062052602061058060a461059c845afa612db2573d5f5f3e3d5ffd5b60203d10613c4e5761058090505161038052613b71565b6104e05160028118612ddc576001612de2565b60038118155b90506138ae576104e05160048118612dfb576001612e01565b60058118155b90506137ed576104e05160068118612e1a576001612e20565b60078118155b90506132cb5760086104e05118613262576020613c605f395f516104005118612e4a576001612eee565b6020613c605f395f516104205118612e63576001612eee565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104005118612ea15773ae7ab96520de3a18e5e111b5eaab095312d7fe84610420511815612ea3565b5f5b612eeb5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104005118612ee557735e8422345238f34275888049021821e8e08caa1f610420511815612eee565b5f612eee565b60015b613b7157737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06104005118612f55576103e05163b0e389006105605261038051610580526020610560602461057c845afa612f3e573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b737f39c581f595b53c5cb19bd0b3f8da6c935e2ca06104205118612fb8576103e05163bb2952fc6105605261038051610580526020610560602461057c845afa612fa1573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b73ac3e018457b222d93114458476f3e3416abbe38f610400511861301b576103e05163c6e6f5926105605261038051610580526020610560602461057c845afa613004573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b73ac3e018457b222d93114458476f3e3416abbe38f610420511861307e576103e0516307a2d13a6105605261038051610580526020610560602461057c845afa613067573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b73a2e3356610840701bdf5611a53974510ae27e2e161042051186130fe57610380516103e051633ba0b9a9610560526020610560600461057c845afa6130c6573d5f5f3e3d5ffd5b60203d10613c4e57610560905051808202811583838304141715613c4e5790509050670de0b6b3a76400008104905061038052613b71565b739d39a5de30e57443bff2a8307a4256c8797a34976104205118613161576103e0516307a2d13a6105605261038051610580526020610560602461057c845afa61314a573d5f5f3e3d5ffd5b60203d10613c4e5761056090505161038052613b71565b6086610560527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610580527f574554482c20455448202d3e207374455448206f7220455448202d3e206672786105a0527f4554482c207374455448203c2d3e207773744554482c20667278455448203c2d6105c0527f3e20736672784554482c20455448202d3e2077424554482c2055534465202d3e6105e0527f20735553446500000000000000000000000000000000000000000000000000006106005261056050610560518061058001601f825f031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd613b7156613b71565b600d610560527f42616420737761702074797065000000000000000000000000000000000000006105805261056050610560518061058001601f825f031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd613b71565b6001610500511861336d576101403661058037610380516104c05160098111613c4e5760051b61058001526020613c805f395f516379ccdf496106c0526103e0516106e052610400516107005261014061072061014061058060045afa5061054051610860525f6108805260016108a05260206106c06101e46106dc845afa613356573d5f5f3e3d5ffd5b60203d10613c4e576106c090505161038052613b71565b600a610500511861343d57610100366105a037600861058052610380516104c05161058051811015613c4e5760051b6105a001526103e051633db06dd86106a0526040806106c052806106c0015f610580518083528060051b5f8260088111613c4e5780156133f657905b8060051b6105a001518160051b6020880101526001018181186133d8575b505082016020019150509050810190505f6106e0525060206106a06101646106bc845afa613426573d5f5f3e3d5ffd5b60203d10613c4e576106a090505161038052613b71565b600261054051186135115760403661058037610380516104c05160018111613c4e5760051b6105800152600261050051186134bf576103e051638d8ea7276105c052610580516105e0526105a0516106005260206105c060446105dc845afa6134a8573d5f5f3e3d5ffd5b60203d10613c4e576105c090505161038052613b71565b6103e05163ed8e84f36105c052610580516105e0526105a051610600525f6106205260206105c060646105dc845afa6134fa573d5f5f3e3d5ffd5b60203d10613c4e576105c090505161038052613b71565b600361054051186135f55760603661058037610380516104c05160028111613c4e5760051b61058001526002610500511861359b576103e051635b6f1b5a6105e05261058051610600526105a051610620526105c0516106405260206105e060646105fc845afa613584573d5f5f3e3d5ffd5b60203d10613c4e576105e090505161038052613b71565b6103e051633883e1196105e05261058051610600526105a051610620526105c051610640525f6106605260206105e060846105fc845afa6135de573d5f5f3e3d5ffd5b60203d10613c4e576105e090505161038052613b71565b600461054051186136e95760803661058037610380516104c05160038111613c4e5760051b610580015260026105005118613687576103e051631a8051856106005261058051610620526105a051610640526105c051610660526105e051610680526020610600608461061c845afa613670573d5f5f3e3d5ffd5b60203d10613c4e5761060090505161038052613b71565b6103e05163cf701ff76106005261058051610620526105a051610640526105c051610660526105e051610680525f6106a052602061060060a461061c845afa6136d2573d5f5f3e3d5ffd5b60203d10613c4e5761060090505161038052613b71565b60056105405118613b715760a03661058037610380516104c05160048111613c4e5760051b610580015260026105005118613783576103e05163093796906106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c052602061062060a461063c845afa61376c573d5f5f3e3d5ffd5b60203d10613c4e5761062090505161038052613b71565b6103e051637ede89c56106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c0525f6106e052602061062060c461063c845afa6137d6573d5f5f3e3d5ffd5b60203d10613c4e5761062090505161038052613b71565b6105005160018118613800576001613806565b600a8118155b9050613859576103e051634fb08c5e61058052610380516105a0526104a0516105c0526020610580604461059c845afa613842573d5f5f3e3d5ffd5b60203d10613c4e5761058090505161038052613b71565b6103e05163cc2b27d76105a052610380516105c0526104a05180607f1c613c4e576105e05260206105a060446105bc845afa613897573d5f5f3e3d5ffd5b60203d10613c4e576105a090505161038052613b71565b600161050051186139c5576104605161393b576020613c805f395f51638fd3218f61058052610440516105a0526104a05180607f1c613c4e576105c0526104c05180607f1c613c4e576105e05261038051610600526105405161062052602061058060a461059c845afa613924573d5f5f3e3d5ffd5b60203d10613c4e5761058090505161038052613b71565b6020613c805f395f51634933a86461058052610440516105a0526104a05180607f1c613c4e576105c0526104c05180607f1c613c4e576105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa6139ae573d5f5f3e3d5ffd5b60203d10613c4e5761058090505161038052613b71565b600a6105005118613afb576104a05180607f1c613c4e57610580526104c05180607f1c613c4e576105a0526001610580511215613a02575f613a0b565b60016105a05112155b613a645761044051630e71d1b96105c052610580516105e0526105a05161060052610380516106205260206105c060646105dc845afa613a4d573d5f5f3e3d5ffd5b60203d10613c4e576105c090505161038052613b71565b6020613c805f395f5163158819d46105c052610460516105e052610580516001810380600f0b8118613c4e579050610600526105a0516001810380600f0b8118613c4e5790506106205261038051610640526105405160018103818111613c4e5790506106605260206105c060a46105dc845afa613ae4573d5f5f3e3d5ffd5b60203d10613c4e576105c090505161038052613b71565b6020613ca05f395f51638ca1565361058052610440516105a0526104a0516105c0526104c0516105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa613b5e573d5f5f3e3d5ffd5b60203d10613c4e57610580905051610380525b600101818118612a1c5750506020610380f3613c4c565b6381889a2c8118613c4c576104a436103417613c4e5760a0366101a03761019656613c4c565b63c07b53538118613bd15761054436103417613c4e57610140366102403761291d565b6381fc0ca58118613c4c576105e436103417613c4e57610544358060a01c613c4e5761024052610564358060a01c613c4e5761026052610584358060a01c613c4e57610280526105a4358060a01c613c4e576102a0526105c4358060a01c613c4e576102c05260a0366102e03761291d56613c4c56613c4c565b5b005b5f80fd3c4b3c4b0109111d3b8800183bae000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc
-----Decoded View---------------
Arg [0] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : _stable_calc (address): 0xCA8d0747B5573D69653C3aC22242e6341C36e4b4
Arg [2] : _crypto_calc (address): 0xA72C85C258A81761433B4e8da60505Fe3Dd551CC
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : 000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4
Arg [2] : 000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc
Loading...
Loading
Loading...
Loading
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.