More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 12,908 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exchange | 131451466 | 79 days ago | IN | 0 ETH | 0.000001781746 | ||||
Exchange | 131446064 | 79 days ago | IN | 0 ETH | 0.000001664951 | ||||
Exchange | 131393507 | 81 days ago | IN | 0 ETH | 0.00000063273 | ||||
Exchange | 130959091 | 91 days ago | IN | 0 ETH | 0.000000888858 | ||||
Exchange | 130940793 | 91 days ago | IN | 0 ETH | 0.000008925629 | ||||
Exchange | 130791686 | 94 days ago | IN | 0 ETH | 0.000003205201 | ||||
Exchange | 130496263 | 101 days ago | IN | 0 ETH | 0.000002239287 | ||||
Exchange | 130486596 | 102 days ago | IN | 0 ETH | 0.000000863126 | ||||
Exchange | 130343217 | 105 days ago | IN | 0 ETH | 0.000000826759 | ||||
Exchange | 130123981 | 110 days ago | IN | 0 ETH | 0.000002276181 | ||||
Exchange | 129994790 | 113 days ago | IN | 0 ETH | 0.000002441561 | ||||
Exchange | 129993126 | 113 days ago | IN | 0 ETH | 0.000003905067 | ||||
Exchange | 129899080 | 115 days ago | IN | 0 ETH | 0.0000143324 | ||||
Exchange | 129714456 | 119 days ago | IN | 0 ETH | 0.000002593315 | ||||
Exchange | 129713063 | 119 days ago | IN | 0 ETH | 0.00000236521 | ||||
Exchange | 129695311 | 120 days ago | IN | 0 ETH | 0.00000608335 | ||||
Exchange | 129690266 | 120 days ago | IN | 0 ETH | 0.000001014085 | ||||
Exchange | 129690130 | 120 days ago | IN | 0 ETH | 0.00000106019 | ||||
Exchange | 129688355 | 120 days ago | IN | 0 ETH | 0.00001030003 | ||||
Exchange | 129407539 | 126 days ago | IN | 0 ETH | 0.000000829988 | ||||
Exchange | 129405210 | 127 days ago | IN | 0 ETH | 0.00000172092 | ||||
Exchange | 129403938 | 127 days ago | IN | 0 ETH | 0.000002161698 | ||||
Exchange | 129401801 | 127 days ago | IN | 0 ETH | 0.000043227584 | ||||
Exchange | 129287715 | 129 days ago | IN | 0 ETH | 0.000001263679 | ||||
Exchange | 129275127 | 130 days ago | IN | 0 ETH | 0.000004139383 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
131451466 | 79 days ago | 0.000997177386672 ETH | ||||
131451466 | 79 days ago | 0.000997177386672 ETH | ||||
131446064 | 79 days ago | 0.000330569162504 ETH | ||||
131446064 | 79 days ago | 0.000330569162504 ETH | ||||
131352227 | 81 days ago | 0.000003955386027 ETH | ||||
131352227 | 81 days ago | 0.000003955386027 ETH | ||||
130940793 | 91 days ago | 0.001007474088666 ETH | ||||
130940793 | 91 days ago | 0.001007474088666 ETH | ||||
130791686 | 94 days ago | 0.000217578538926 ETH | ||||
130791686 | 94 days ago | 0.000217578538926 ETH | ||||
130123981 | 110 days ago | 0.000057826454175 ETH | ||||
130123981 | 110 days ago | 0.000057826454175 ETH | ||||
129713063 | 119 days ago | 0.007936075309204 ETH | ||||
129713063 | 119 days ago | 0.007936075309204 ETH | ||||
128575105 | 146 days ago | 0.200554305948265 ETH | ||||
128575105 | 146 days ago | 0.200554305948265 ETH | ||||
126070269 | 204 days ago | 0.001984762283583 ETH | ||||
126070269 | 204 days ago | 0.001984762283583 ETH | ||||
126070191 | 204 days ago | 0.005938773792752 ETH | ||||
126070191 | 204 days ago | 0.005938773792752 ETH | ||||
124073055 | 250 days ago | 0.202085542400027 ETH | ||||
124073055 | 250 days ago | 0.202085542400027 ETH | ||||
123620516 | 260 days ago | 0.3 ETH | ||||
123620516 | 260 days ago | 0.3 ETH | ||||
122575821 | 285 days ago | 0.167616847172419 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
CurveRouterOptimism v1.0
Compiler Version
vyper:0.3.7
Contract Source Code (Vyper language format)
# @version 0.3.7 """ @title CurveRouterOptimism v1.0 @author Curve.Fi @license Copyright (c) Curve.Fi, 2020-2023 - all rights reserved @notice Performs up to 5 swaps in a single transaction, can do estimations with get_dy and get_dx """ from vyper.interfaces import ERC20 interface StablePool: def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256): payable def exchange_underlying(i: int128, j: int128, dx: uint256, min_dy: uint256): payable def get_dy(i: int128, j: int128, amount: uint256) -> uint256: view def get_dy_underlying(i: int128, j: int128, amount: uint256) -> uint256: view def coins(i: uint256) -> address: view def calc_withdraw_one_coin(token_amount: uint256, i: int128) -> uint256: view def remove_liquidity_one_coin(token_amount: uint256, i: int128, min_amount: uint256): nonpayable interface CryptoPool: def exchange(i: uint256, j: uint256, dx: uint256, min_dy: uint256): payable def exchange_underlying(i: uint256, j: uint256, dx: uint256, min_dy: uint256): payable def get_dy(i: uint256, j: uint256, amount: uint256) -> uint256: view def get_dy_underlying(i: uint256, j: uint256, amount: uint256) -> uint256: view def calc_withdraw_one_coin(token_amount: uint256, i: uint256) -> uint256: view def remove_liquidity_one_coin(token_amount: uint256, i: uint256, min_amount: uint256): nonpayable interface CryptoPoolETH: def exchange(i: uint256, j: uint256, dx: uint256, min_dy: uint256, use_eth: bool): payable interface LendingBasePoolMetaZap: def exchange_underlying(pool: address, i: int128, j: int128, dx: uint256, min_dy: uint256): nonpayable interface CryptoMetaZap: def get_dy(pool: address, i: uint256, j: uint256, dx: uint256) -> uint256: view def exchange(pool: address, i: uint256, j: uint256, dx: uint256, min_dy: uint256, use_eth: bool): payable interface StablePool2Coins: def add_liquidity(amounts: uint256[2], min_mint_amount: uint256): payable def calc_token_amount(amounts: uint256[2], is_deposit: bool) -> uint256: view interface CryptoPool2Coins: def calc_token_amount(amounts: uint256[2]) -> uint256: view interface StablePool3Coins: def add_liquidity(amounts: uint256[3], min_mint_amount: uint256): payable def calc_token_amount(amounts: uint256[3], is_deposit: bool) -> uint256: view interface CryptoPool3Coins: def calc_token_amount(amounts: uint256[3]) -> uint256: view interface StablePool4Coins: def add_liquidity(amounts: uint256[4], min_mint_amount: uint256): payable def calc_token_amount(amounts: uint256[4], is_deposit: bool) -> uint256: view interface CryptoPool4Coins: def calc_token_amount(amounts: uint256[4]) -> uint256: view interface StablePool5Coins: def add_liquidity(amounts: uint256[5], min_mint_amount: uint256): payable def calc_token_amount(amounts: uint256[5], is_deposit: bool) -> uint256: view interface CryptoPool5Coins: def calc_token_amount(amounts: uint256[5]) -> uint256: view interface LendingStablePool3Coins: def add_liquidity(amounts: uint256[3], min_mint_amount: uint256, use_underlying: bool): payable def remove_liquidity_one_coin(token_amount: uint256, i: int128, min_amount: uint256, use_underlying: bool) -> uint256: nonpayable interface Llamma: def get_dx(i: uint256, j: uint256, out_amount: uint256) -> uint256: view interface WETH: def deposit(): payable def withdraw(_amount: uint256): nonpayable # SNX interface SnxCoin: def currencyKey() -> bytes32: nonpayable interface Synthetix: def exchangeWithTracking(sourceCurrencyKey: bytes32, sourceAmount: uint256, destinationCurrencyKey: bytes32, rewardAddress: address, trackingCode: bytes32) -> uint256: nonpayable interface SynthetixExchanger: def getAmountsForExchange(sourceAmount: uint256, sourceCurrencyKey: bytes32, destinationCurrencyKey: bytes32) -> AmountAndFee: view interface SynthetixAddressResolver: def getAddress(name: bytes32) -> address: view # Calc zaps interface StableCalc: def calc_token_amount(pool: address, token: address, amounts: uint256[10], n_coins: uint256, deposit: bool, use_underlying: bool) -> uint256: view def get_dx(pool: address, i: int128, j: int128, dy: uint256, n_coins: uint256) -> uint256: view def get_dx_underlying(pool: address, i: int128, j: int128, dy: uint256, n_coins: uint256) -> uint256: view def get_dx_meta(pool: address, i: int128, j: int128, dy: uint256, n_coins: uint256, base_pool: address) -> uint256: view def get_dx_meta_underlying(pool: address, i: int128, j: int128, dy: uint256, n_coins: uint256, base_pool: address, base_token: address) -> uint256: view interface CryptoCalc: def get_dx(pool: address, i: uint256, j: uint256, dy: uint256, n_coins: uint256) -> uint256: view def get_dx_meta_underlying(pool: address, i: uint256, j: uint256, dy: uint256, n_coins: uint256, base_pool: address, base_token: address) -> uint256: view struct AmountAndFee: amountReceived: uint256 fee: uint256 exchangeFeeRate: uint256 event Exchange: sender: indexed(address) receiver: indexed(address) route: address[11] swap_params: uint256[5][5] pools: address[5] in_amount: uint256 out_amount: uint256 ETH_ADDRESS: constant(address) = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE WETH_ADDRESS: immutable(address) # SNX # https://github.com/Synthetixio/synthetix-docs/blob/master/content/addresses.md SNX_ADDRESS_RESOLVER: constant(address) = 0x95A6a3f44a70172E7d50a9e28c85Dfd712756B8C SNX_TRACKING_CODE: constant(bytes32) = 0x4355525645000000000000000000000000000000000000000000000000000000 # CURVE SNX_EXCHANGER_NAME: constant(bytes32) = 0x45786368616E6765720000000000000000000000000000000000000000000000 # Exchanger snx_currency_keys: HashMap[address, bytes32] # Calc zaps STABLE_CALC: immutable(StableCalc) CRYPTO_CALC: immutable(CryptoCalc) is_approved: HashMap[address, HashMap[address, bool]] @external @payable def __default__(): pass @external def __init__( _weth: address, _stable_calc: address, _crypto_calc: address, _snx_coins: address[4]): WETH_ADDRESS = _weth STABLE_CALC = StableCalc(_stable_calc) CRYPTO_CALC = CryptoCalc(_crypto_calc) for _snx_coin in _snx_coins: self.is_approved[_snx_coin][0x8700dAec35aF8Ff88c16BdF0418774CB3D7599B4] = True self.snx_currency_keys[_snx_coin] = SnxCoin(_snx_coin).currencyKey() @external @payable @nonreentrant('lock') def exchange( _route: address[11], _swap_params: uint256[5][5], _amount: uint256, _expected: uint256, _pools: address[5]=empty(address[5]), _receiver: address=msg.sender ) -> uint256: """ @notice Performs up to 5 swaps in a single transaction. @dev Routing and swap params must be determined off-chain. This functionality is designed for gas efficiency over ease-of-use. @param _route Array of [initial token, pool or zap, token, pool or zap, token, ...] The array is iterated until a pool address of 0x00, then the last given token is transferred to `_receiver` @param _swap_params Multidimensional array of [i, j, swap type, pool_type, n_coins] where i is the index of input token j is the index of output token The swap_type should be: 1. for `exchange`, 2. for `exchange_underlying`, 3. for underlying exchange via zap: factory stable metapools with lending base pool `exchange_underlying` and factory crypto-meta pools underlying exchange (`exchange` method in zap) 4. for coin -> LP token "exchange" (actually `add_liquidity`), 5. for lending pool underlying coin -> LP token "exchange" (actually `add_liquidity`), 6. for LP token -> coin "exchange" (actually `remove_liquidity_one_coin`) 7. for LP token -> lending or fake pool underlying coin "exchange" (actually `remove_liquidity_one_coin`) 8. for ETH <-> WETH 9. for SNX swaps (sUSD, sEUR, sETH, sBTC) pool_type: 1 - stable, 2 - crypto, 3 - tricrypto, 4 - llamma n_coins is the number of coins in pool @param _amount The amount of input token (`_route[0]`) to be sent. @param _expected The minimum amount received after the final swap. @param _pools Array of pools for swaps via zap contracts. This parameter is needed only for swap_type = 3. @param _receiver Address to transfer the final output token to. @return Received amount of the final output token. """ input_token: address = _route[0] output_token: address = empty(address) amount: uint256 = _amount # validate / transfer initial token if input_token == ETH_ADDRESS: assert msg.value == amount else: assert msg.value == 0 assert ERC20(input_token).transferFrom(msg.sender, self, amount, default_return_value=True) for i in range(1, 6): # 5 rounds of iteration to perform up to 5 swaps swap: address = _route[i*2-1] pool: address = _pools[i-1] # Only for Polygon meta-factories underlying swap (swap_type == 6) output_token = _route[i*2] params: uint256[5] = _swap_params[i-1] # i, j, swap_type, pool_type, n_coins if not self.is_approved[input_token][swap]: assert ERC20(input_token).approve(swap, max_value(uint256), default_return_value=True, skip_contract_check=True) self.is_approved[input_token][swap] = True eth_amount: uint256 = 0 if input_token == ETH_ADDRESS: eth_amount = amount # perform the swap according to the swap type if params[2] == 1: if params[3] == 1: # stable StablePool(swap).exchange(convert(params[0], int128), convert(params[1], int128), amount, 0, value=eth_amount) else: # crypto, tricrypto or llamma if input_token == ETH_ADDRESS or output_token == ETH_ADDRESS: CryptoPoolETH(swap).exchange(params[0], params[1], amount, 0, True, value=eth_amount) else: CryptoPool(swap).exchange(params[0], params[1], amount, 0) elif params[2] == 2: if params[3] == 1: # stable StablePool(swap).exchange_underlying(convert(params[0], int128), convert(params[1], int128), amount, 0, value=eth_amount) else: # crypto or tricrypto CryptoPool(swap).exchange_underlying(params[0], params[1], amount, 0, value=eth_amount) elif params[2] == 3: # SWAP IS ZAP HERE !!! if params[3] == 1: # stable LendingBasePoolMetaZap(swap).exchange_underlying(pool, convert(params[0], int128), convert(params[1], int128), amount, 0) else: # crypto or tricrypto use_eth: bool = input_token == ETH_ADDRESS or output_token == ETH_ADDRESS CryptoMetaZap(swap).exchange(pool, params[0], params[1], amount, 0, use_eth, value=eth_amount) elif params[2] == 4: if params[4] == 2: amounts: uint256[2] = [0, 0] amounts[params[0]] = amount StablePool2Coins(swap).add_liquidity(amounts, 0, value=eth_amount) elif params[4] == 3: amounts: uint256[3] = [0, 0, 0] amounts[params[0]] = amount StablePool3Coins(swap).add_liquidity(amounts, 0, value=eth_amount) elif params[4] == 4: amounts: uint256[4] = [0, 0, 0, 0] amounts[params[0]] = amount StablePool4Coins(swap).add_liquidity(amounts, 0, value=eth_amount) elif params[4] == 5: amounts: uint256[5] = [0, 0, 0, 0, 0] amounts[params[0]] = amount StablePool5Coins(swap).add_liquidity(amounts, 0, value=eth_amount) elif params[2] == 5: amounts: uint256[3] = [0, 0, 0] amounts[params[0]] = amount LendingStablePool3Coins(swap).add_liquidity(amounts, 0, True, value=eth_amount) # example: aave on Polygon elif params[2] == 6: if params[3] == 1: # stable StablePool(swap).remove_liquidity_one_coin(amount, convert(params[1], int128), 0) else: # crypto or tricrypto CryptoPool(swap).remove_liquidity_one_coin(amount, params[1], 0) # example: atricrypto3 on Polygon elif params[2] == 7: LendingStablePool3Coins(swap).remove_liquidity_one_coin(amount, convert(params[1], int128), 0, True) # example: aave on Polygon elif params[2] == 8: if input_token == ETH_ADDRESS and output_token == WETH_ADDRESS: WETH(swap).deposit(value=amount) elif input_token == WETH_ADDRESS and output_token == ETH_ADDRESS: WETH(swap).withdraw(amount) else: raise "Swap type 8 is only for ETH <-> WETH" elif params[2] == 9: Synthetix(swap).exchangeWithTracking(self.snx_currency_keys[input_token], amount, self.snx_currency_keys[output_token], empty(address), SNX_TRACKING_CODE) else: raise "Bad swap type" # update the amount received if output_token == ETH_ADDRESS: amount = self.balance else: amount = ERC20(output_token).balanceOf(self) # sanity check, if the routing data is incorrect we will have a 0 balance and that is bad assert amount != 0, "Received nothing" # check if this was the last swap if i == 5 or _route[i*2+1] == empty(address): break # if there is another swap, the output token becomes the input for the next round input_token = output_token amount -= 1 # Change non-zero -> non-zero costs less gas than zero -> non-zero assert amount >= _expected, "Slippage" # transfer the final token to the receiver if output_token == ETH_ADDRESS: raw_call(_receiver, b"", value=amount) else: assert ERC20(output_token).transfer(_receiver, amount, default_return_value=True) log Exchange(msg.sender, _receiver, _route, _swap_params, _pools, _amount, amount) return amount @view @external def get_dy( _route: address[11], _swap_params: uint256[5][5], _amount: uint256, _pools: address[5]=empty(address[5]) ) -> uint256: """ @notice Get amount of the final output token received in an exchange @dev Routing and swap params must be determined off-chain. This functionality is designed for gas efficiency over ease-of-use. @param _route Array of [initial token, pool or zap, token, pool or zap, token, ...] The array is iterated until a pool address of 0x00, then the last given token is transferred to `_receiver` @param _swap_params Multidimensional array of [i, j, swap type, pool_type, n_coins] where i is the index of input token j is the index of output token The swap_type should be: 1. for `exchange`, 2. for `exchange_underlying`, 3. for underlying exchange via zap: factory stable metapools with lending base pool `exchange_underlying` and factory crypto-meta pools underlying exchange (`exchange` method in zap) 4. for coin -> LP token "exchange" (actually `add_liquidity`), 5. for lending pool underlying coin -> LP token "exchange" (actually `add_liquidity`), 6. for LP token -> coin "exchange" (actually `remove_liquidity_one_coin`) 7. for LP token -> lending or fake pool underlying coin "exchange" (actually `remove_liquidity_one_coin`) 8. for ETH <-> WETH 9. for SNX swaps (sUSD, sEUR, sETH, sBTC) pool_type: 1 - stable, 2 - crypto, 3 - tricrypto, 4 - llamma n_coins is the number of coins in pool @param _amount The amount of input token (`_route[0]`) to be sent. @param _pools Array of pools for swaps via zap contracts. This parameter is needed only for swap_type = 3. @return Expected amount of the final output token. """ input_token: address = _route[0] output_token: address = empty(address) amount: uint256 = _amount for i in range(1, 6): # 5 rounds of iteration to perform up to 5 swaps swap: address = _route[i*2-1] pool: address = _pools[i-1] # Only for Polygon meta-factories underlying swap (swap_type == 4) output_token = _route[i * 2] params: uint256[5] = _swap_params[i-1] # i, j, swap_type, pool_type, n_coins # Calc output amount according to the swap type if params[2] == 1: if params[3] == 1: # stable amount = StablePool(swap).get_dy(convert(params[0], int128), convert(params[1], int128), amount) else: # crypto or llamma amount = CryptoPool(swap).get_dy(params[0], params[1], amount) elif params[2] == 2: if params[3] == 1: # stable amount = StablePool(swap).get_dy_underlying(convert(params[0], int128), convert(params[1], int128), amount) else: # crypto amount = CryptoPool(swap).get_dy_underlying(params[0], params[1], amount) elif params[2] == 3: # SWAP IS ZAP HERE !!! if params[3] == 1: # stable amount = StablePool(pool).get_dy_underlying(convert(params[0], int128), convert(params[1], int128), amount) else: # crypto amount = CryptoMetaZap(swap).get_dy(pool, params[0], params[1], amount) elif params[2] in [4, 5]: if params[3] == 1: # stable amounts: uint256[10] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] amounts[params[0]] = amount amount = STABLE_CALC.calc_token_amount(swap, output_token, amounts, params[4], True, True) else: # Tricrypto pools have stablepool interface for calc_token_amount if params[4] == 2: amounts: uint256[2] = [0, 0] amounts[params[0]] = amount if params[3] == 2: # crypto amount = CryptoPool2Coins(swap).calc_token_amount(amounts) else: # tricrypto amount = StablePool2Coins(swap).calc_token_amount(amounts, True) elif params[4] == 3: amounts: uint256[3] = [0, 0, 0] amounts[params[0]] = amount if params[3] == 2: # crypto amount = CryptoPool3Coins(swap).calc_token_amount(amounts) else: # tricrypto amount = StablePool3Coins(swap).calc_token_amount(amounts, True) elif params[4] == 4: amounts: uint256[4] = [0, 0, 0, 0] amounts[params[0]] = amount if params[3] == 2: # crypto amount = CryptoPool4Coins(swap).calc_token_amount(amounts) else: # tricrypto amount = StablePool4Coins(swap).calc_token_amount(amounts, True) elif params[4] == 5: amounts: uint256[5] = [0, 0, 0, 0, 0] amounts[params[0]] = amount if params[3] == 2: # crypto amount = CryptoPool5Coins(swap).calc_token_amount(amounts) else: # tricrypto amount = StablePool5Coins(swap).calc_token_amount(amounts, True) elif params[2] in [6, 7]: if params[3] == 1: # stable amount = StablePool(swap).calc_withdraw_one_coin(amount, convert(params[1], int128)) else: # crypto amount = CryptoPool(swap).calc_withdraw_one_coin(amount, params[1]) elif params[2] == 8: if input_token == WETH_ADDRESS or output_token == WETH_ADDRESS: # ETH <--> WETH rate is 1:1 pass else: raise "Swap type 8 is only for ETH <-> WETH" elif params[2] == 9: snx_exchanger: address = SynthetixAddressResolver(SNX_ADDRESS_RESOLVER).getAddress(SNX_EXCHANGER_NAME) amount_and_fee: AmountAndFee = SynthetixExchanger(snx_exchanger).getAmountsForExchange( amount, self.snx_currency_keys[input_token], self.snx_currency_keys[output_token] ) amount = amount_and_fee.amountReceived else: raise "Bad swap type" # check if this was the last swap if i == 5 or _route[i*2+1] == empty(address): break # if there is another swap, the output token becomes the input for the next round input_token = output_token return amount - 1 @view @external def get_dx( _route: address[11], _swap_params: uint256[5][5], _out_amount: uint256, _pools: address[5], _base_pools: address[5]=empty(address[5]), _base_tokens: address[5]=empty(address[5]), ) -> uint256: """ @notice Calculate the input amount required to receive the desired `_out_amount` @dev Routing and swap params must be determined off-chain. This functionality is designed for gas efficiency over ease-of-use. @param _route Array of [initial token, pool or zap, token, pool or zap, token, ...] The array is iterated until a pool address of 0x00, then the last given token is transferred to `_receiver` @param _swap_params Multidimensional array of [i, j, swap type, pool_type, n_coins] where i is the index of input token j is the index of output token The swap_type should be: 1. for `exchange`, 2. for `exchange_underlying`, 3. for underlying exchange via zap: factory stable metapools with lending base pool `exchange_underlying` and factory crypto-meta pools underlying exchange (`exchange` method in zap) 4. for coin -> LP token "exchange" (actually `add_liquidity`), 5. for lending pool underlying coin -> LP token "exchange" (actually `add_liquidity`), 6. for LP token -> coin "exchange" (actually `remove_liquidity_one_coin`) 7. for LP token -> lending or fake pool underlying coin "exchange" (actually `remove_liquidity_one_coin`) 8. for ETH <-> WETH 9. for SNX swaps (sUSD, sEUR, sETH, sBTC) pool_type: 1 - stable, 2 - crypto, 3 - tricrypto, 4 - llamma n_coins is the number of coins in pool @param _out_amount The desired amount of output coin to receive. @param _pools Array of pools. @param _base_pools Array of base pools (for meta pools). @param _base_tokens Array of base lp tokens (for meta pools). @return Required amount of input token to send. """ amount: uint256 = _out_amount for _i in range(1, 6): # 5 rounds of iteration to perform up to 5 swaps i: uint256 = 6 - _i swap: address = _route[i*2-1] if swap == empty(address): continue input_token: address = _route[(i - 1) * 2] output_token: address = _route[i * 2] pool: address = _pools[i-1] base_pool: address = _base_pools[i-1] base_token: address = _base_tokens[i-1] params: uint256[5] = _swap_params[i-1] # i, j, swap_type, pool_type, n_coins n_coins: uint256 = params[4] # Calc a required input amount according to the swap type if params[2] == 1: if params[3] == 1: # stable if base_pool == empty(address): # non-meta amount = STABLE_CALC.get_dx(pool, convert(params[0], int128), convert(params[1], int128), amount, n_coins) else: amount = STABLE_CALC.get_dx_meta(pool, convert(params[0], int128), convert(params[1], int128), amount, n_coins, base_pool) elif params[3] in [2, 3]: # crypto or tricrypto amount = CRYPTO_CALC.get_dx(pool, params[0], params[1], amount, n_coins) else: # llamma amount = Llamma(pool).get_dx(params[0], params[1], amount) elif params[2] in [2, 3]: if params[3] == 1: # stable if base_pool == empty(address): # non-meta amount = STABLE_CALC.get_dx_underlying(pool, convert(params[0], int128), convert(params[1], int128), amount, n_coins) else: amount = STABLE_CALC.get_dx_meta_underlying(pool, convert(params[0], int128), convert(params[1], int128), amount, n_coins, base_pool, base_token) else: # crypto amount = CRYPTO_CALC.get_dx_meta_underlying(pool, params[0], params[1], amount, n_coins, base_pool, base_token) elif params[2] in [4, 5]: # This is not correct. Should be something like calc_add_one_coin. But tests say that it's precise enough. if params[3] == 1: # stable amount = StablePool(swap).calc_withdraw_one_coin(amount, convert(params[0], int128)) else: # crypto amount = CryptoPool(swap).calc_withdraw_one_coin(amount, params[0]) elif params[2] in [6, 7]: if params[3] == 1: # stable amounts: uint256[10] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] amounts[params[1]] = amount amount = STABLE_CALC.calc_token_amount(swap, input_token, amounts, n_coins, False, True) else: # Tricrypto pools have stablepool interface for calc_token_amount if n_coins == 2: amounts: uint256[2] = [0, 0] amounts[params[1]] = amount if params[3] == 2: # crypto amount = CryptoPool2Coins(swap).calc_token_amount(amounts) # This is not correct else: # tricrypto amount = StablePool2Coins(swap).calc_token_amount(amounts, False) elif n_coins == 3: amounts: uint256[3] = [0, 0, 0] amounts[params[1]] = amount if params[3] == 2: # crypto amount = CryptoPool3Coins(swap).calc_token_amount(amounts) # This is not correct else: # tricrypto amount = StablePool3Coins(swap).calc_token_amount(amounts, False) elif n_coins == 4: amounts: uint256[4] = [0, 0, 0, 0] amounts[params[1]] = amount if params[3] == 2: # crypto amount = CryptoPool4Coins(swap).calc_token_amount(amounts) # This is not correct else: # tricrypto amount = StablePool4Coins(swap).calc_token_amount(amounts, False) elif n_coins == 5: amounts: uint256[5] = [0, 0, 0, 0, 0] amounts[params[1]] = amount if params[3] == 2: # crypto amount = CryptoPool5Coins(swap).calc_token_amount(amounts) # This is not correct else: # tricrypto amount = StablePool5Coins(swap).calc_token_amount(amounts, False) elif params[2] == 8: if input_token == WETH_ADDRESS or output_token == WETH_ADDRESS: # ETH <--> WETH rate is 1:1 pass else: raise "Swap type 8 is only for ETH <-> WETH" elif params[2] == 9: snx_exchanger: address = SynthetixAddressResolver(SNX_ADDRESS_RESOLVER).getAddress(SNX_EXCHANGER_NAME) amount_and_fee: AmountAndFee = SynthetixExchanger(snx_exchanger).getAmountsForExchange( 10**18, self.snx_currency_keys[input_token], self.snx_currency_keys[output_token] ) amount = amount * 10**18 / amount_and_fee.amountReceived else: raise "Bad swap type" return amount
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"name":"Exchange","inputs":[{"name":"sender","type":"address","indexed":true},{"name":"receiver","type":"address","indexed":true},{"name":"route","type":"address[11]","indexed":false},{"name":"swap_params","type":"uint256[5][5]","indexed":false},{"name":"pools","type":"address[5]","indexed":false},{"name":"in_amount","type":"uint256","indexed":false},{"name":"out_amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_weth","type":"address"},{"name":"_stable_calc","type":"address"},{"name":"_crypto_calc","type":"address"},{"name":"_snx_coins","type":"address[4]"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_amount","type":"uint256"},{"name":"_expected","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_amount","type":"uint256"},{"name":"_expected","type":"uint256"},{"name":"_pools","type":"address[5]"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_amount","type":"uint256"},{"name":"_expected","type":"uint256"},{"name":"_pools","type":"address[5]"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_amount","type":"uint256"},{"name":"_pools","type":"address[5]"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dx","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_out_amount","type":"uint256"},{"name":"_pools","type":"address[5]"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dx","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_out_amount","type":"uint256"},{"name":"_pools","type":"address[5]"},{"name":"_base_pools","type":"address[5]"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dx","inputs":[{"name":"_route","type":"address[11]"},{"name":"_swap_params","type":"uint256[5][5]"},{"name":"_out_amount","type":"uint256"},{"name":"_pools","type":"address[5]"},{"name":"_base_pools","type":"address[5]"},{"name":"_base_tokens","type":"address[5]"}],"outputs":[{"name":"","type":"uint256"}]}]
Contract Creation Code
60206130216000396000518060a01c61301c5760405260206130416000396000518060a01c61301c5760605260206130616000396000518060a01c61301c5760805260206130816000396000518060a01c61301c5760a05260206130a16000396000518060a01c61301c5760c05260206130c16000396000518060a01c61301c5760e05260206130e16000396000518060a01c61301c57610100523461301c57604051612eb552606051612ed552608051612ef55260006004905b8060051b60a00151610120526001600261012051602052600052604060002080738700daec35af8ff88c16bdf0418774cb3d7599b460205260005260406000209050556101205163dbd06c85610140526020610140600461015c6000855af1610128573d600060003e3d6000fd5b60203d1061301c576101409050516001610120516020526000526040600020556001018181186100ba575050612eb561016661000039612f15610000f36003361161000c57612ea1565b60003560e01c63371dc4478118610037576104c43610612ea35760a0366101a037336102405261011a565b635c9c18e281186100a5576105643610612ea3576104c4358060a01c612ea3576101a0526104e4358060a01c612ea3576101c052610504358060a01c612ea3576101e052610524358060a01c612ea35761020052610544358060a01c612ea35761022052336102405261011a565b63c872a3c581186111c3576105843610612ea3576104c4358060a01c612ea3576101a0526104e4358060a01c612ea3576101c052610504358060a01c612ea3576101e052610524358060a01c612ea35761020052610544358060a01c612ea35761022052610564358060a01c612ea357610240525b6004358060a01c612ea3576040526024358060a01c612ea3576060526044358060a01c612ea3576080526064358060a01c612ea35760a0526084358060a01c612ea35760c05260a4358060a01c612ea35760e05260c4358060a01c612ea3576101005260e4358060a01c612ea35761012052610104358060a01c612ea35761014052610124358060a01c612ea35761016052610144358060a01c612ea35761018052600054600114612ea357600160005560405161026052600061028052610484356102a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610260511861020d576102a0513418612ea35761028b565b34612ea357610260516323b872dd6102c052336102e05230610300526102a0516103205260206102c060646102dc6000855af161024f573d600060003e3d6000fd5b3d61026657803b15612ea35760016103405261027f565b60203d10612ea3576102c0518060011c612ea357610340525b61034090505115612ea3575b600160058101905b806102c0526102c0518060011b818160011c18612ea357905060018103818111612ea3579050600a8111612ea35760051b604001516102e0526102c05160018103818111612ea357905060048111612ea35760051b6101a00151610300526102c0518060011b818160011c18612ea3579050600a8111612ea35760051b604001516102805260a06102c05160018103818111612ea357905060048111612ea357026101640180356103205260208101356103405260408101356103605260608101356103805260808101356103a052506002610260516020526000526040600020806102e0516020526000526040600020905054610436576102605163095ea7b36103c0526102e0516103e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6104005260206103c060446103dc6000855af16103e3573d600060003e3d6000fd5b3d6103f357600161042052610404565b6103c0518060011c612ea357610420525b61042090505115612ea35760016002610260516020526000526040600020806102e05160205260005260406000209050555b60006103c05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610463576102a0516103c0525b600161036051186105da57600161038051186104e1576102e051633df021246103e0526103205180607f1c612ea357610400526103405180607f1c612ea357610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6103c051855af16104db573d600060003e3d6000fd5b50610e49565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610506576001610522565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b61057c576102e051635b41b9086103e052610320516104005261034051610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6000855af1610576573d600060003e3d6000fd5b50610e49565b6102e05163394747c56103e052610320516104005261034051610420526102a05161044052600061046052600161048052803b15612ea35760006103e060a46103fc6103c051855af16105d4573d600060003e3d6000fd5b50610e49565b600261036051186106b05760016103805118610658576102e05163a6417ed66103e0526103205180607f1c612ea357610400526103405180607f1c612ea357610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6103c051855af1610652573d600060003e3d6000fd5b50610e49565b6102e0516365b2489b6103e052610320516104005261034051610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6103c051855af16106aa573d600060003e3d6000fd5b50610e49565b600361036051186107e15760016103805118610734576102e051637981c43e6103e05261030051610400526103205180607f1c612ea357610420526103405180607f1c612ea357610440526102a05161046052600061048052803b15612ea35760006103e060a46103fc6000855af161072e573d600060003e3d6000fd5b50610e49565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610759576001610775565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b6103e0526102e051632bf78c61610400526103005161042052610320516104405261034051610460526102a0516104805260006104a0526103e0516104c052803b15612ea357600061040060c461041c6103c051855af16107db573d600060003e3d6000fd5b50610e49565b60046103605118610a045760026103a05118610866576040366103e0376102a0516103205160018111612ea35760051b6103e001526102e051630b4c7e4d610420526103e051610440526104005161046052600061048052803b15612ea3576000610420606461043c6103c051855af1610860573d600060003e3d6000fd5b50610e49565b60036103a051186108e8576060366103e0376102a0516103205160028111612ea35760051b6103e001526102e051634515cef3610440526103e051610460526104005161048052610420516104a05260006104c052803b15612ea3576000610440608461045c6103c051855af16108e2573d600060003e3d6000fd5b50610e49565b60046103a05118610972576080366103e0376102a0516103205160038111612ea35760051b6103e001526102e05163029b2f34610460526103e05161048052610400516104a052610420516104c052610440516104e052600061050052803b15612ea357600061046060a461047c6103c051855af161096c573d600060003e3d6000fd5b50610e49565b60056103a05118610e495760a0366103e0376102a0516103205160048111612ea35760051b6103e001526102e0516384738499610480526103e0516104a052610400516104c052610420516104e05261044051610500526104605161052052600061054052803b15612ea357600061048060c461049c6103c051855af16109fe573d600060003e3d6000fd5b50610e49565b60056103605118610a8c576060366103e0376102a0516103205160028111612ea35760051b6103e001526102e051632b6e993a610440526103e051610460526104005161048052610420516104a05260006104c05260016104e052803b15612ea357600061044060a461045c6103c051855af1610a86573d600060003e3d6000fd5b50610e49565b60066103605118610b465760016103805118610af8576102e051631a4d01d26103e0526102a051610400526103405180607f1c612ea35761042052600061044052803b15612ea35760006103e060646103fc6000855af1610af2573d600060003e3d6000fd5b50610e49565b6102e05163f1dc3cc96103e0526102a051610400526103405161042052600061044052803b15612ea35760006103e060646103fc6000855af1610b40573d600060003e3d6000fd5b50610e49565b60076103605118610bb2576102e05163517a55a36103e0526102a051610400526103405180607f1c612ea3576104205260006104405260016104605260206103e060846103fc6000855af1610ba0573d600060003e3d6000fd5b60203d10612ea3576103e05050610e49565b60086103605118610d3c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610bf1576020612eb5600039600051610280511815610bf4565b60005b610d02576020612eb56000396000516102605118610c2c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511815610c2f565b60005b610cc25760246103e0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610400527f5745544800000000000000000000000000000000000000000000000000000000610420526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd610e49565b6102e051632e1a7d4d6103e0526102a05161040052803b15612ea35760006103e060246103fc6000855af1610cfc573d600060003e3d6000fd5b50610e49565b6102e05163d0e30db06103e052803b15612ea35760006103e060046103fc6102a051855af1610d36573d600060003e3d6000fd5b50610e49565b60096103605118610de3576102e0516330ead7606103e052600161026051602052600052604060002054610400526102a05161042052600161028051602052600052604060002054610440526000610460527f43555256450000000000000000000000000000000000000000000000000000006104805260206103e060a46103fc6000855af1610dd1573d600060003e3d6000fd5b60203d10612ea3576103e05050610e49565b600d6103e0527f4261642073776170207479706500000000000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118610e7157476102a052610eb2565b610280516370a082316103e052306104005260206103e060246103fc845afa610e9f573d600060003e3d6000fd5b60203d10612ea3576103e09050516102a0525b6102a051610f205760106103e0527f5265636569766564206e6f7468696e6700000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b60056102c05118610f32576001610f64565b6102c0518060011b818160011c18612ea357905060018101818110612ea3579050600a8111612ea35760051b60400151155b15610f6e57610f81565b6102805161026052600101818118610293575b50506102a05160018103818111612ea35790506102a0526104a4356102a051101561100c5760086102c0527f536c6970706167650000000000000000000000000000000000000000000000006102e0526102c0506102c051806102e001601f826000031636823750506308c379a06102805260206102a052601f19601f6102c051011660440161029cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511861105c5760006102c0526102c050600060006102c0516102e06102a051610240515af16110d3573d600060003e3d6000fd6110d3565b6102805163a9059cbb6102c052610240516102e0526102a0516103005260206102c060446102dc6000855af1611097573d600060003e3d6000fd5b3d6110ae57803b15612ea3576001610320526110c7565b60203d10612ea3576102c0518060011c612ea357610320525b61032090505115612ea3575b61024051337f56d0661e240dfb199ef196e16e6f42473990366314f0226ac978f7be3cd9ee836040516102c0526060516102e0526080516103005260a0516103205260c0516103405260e051610360526101005161038052610120516103a052610140516103c052610160516103e052610180516104005260a06101646104203760a06102046104c03760a06102a46105603760a06103446106003760a06103e46106a0376101a051610740526101c051610760526101e05161078052610200516107a052610220516107c052610484356107e0526102a051610800526105606102c0a360206102a06000600055f35b6381889a2c81186111e3576104a43610612ea35760a0366101a037611248565b63637653cb8118611ed7576105443610612ea3576104a4358060a01c612ea3576101a0526104c4358060a01c612ea3576101c0526104e4358060a01c612ea3576101e052610504358060a01c612ea35761020052610524358060a01c612ea357610220525b6004358060a01c612ea3576040526024358060a01c612ea3576060526044358060a01c612ea3576080526064358060a01c612ea35760a0526084358060a01c612ea35760c05260a4358060a01c612ea35760e05260c4358060a01c612ea3576101005260e4358060a01c612ea35761012052610104358060a01c612ea35761014052610124358060a01c612ea35761016052610144358060a01c612ea3576101805234612ea357604051610240526000610260526104843561028052600160058101905b806102a0526102a0518060011b818160011c18612ea357905060018103818111612ea3579050600a8111612ea35760051b604001516102c0526102a05160018103818111612ea357905060048111612ea35760051b6101a001516102e0526102a0518060011b818160011c18612ea3579050600a8111612ea35760051b604001516102605260a06102a05160018103818111612ea357905060048111612ea357026101640180356103005260208101356103205260408101356103405260608101356103605260808101356103805250600161034051186114b2576001610360511861145a576102c051635e0d443f6103a0526103005180607f1c612ea3576103c0526103205180607f1c612ea3576103e052610280516104005260206103a060646103bc845afa611443573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b6102c05163556d6e9f6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa61149b573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b600261034051186115885760016103605118611530576102c0516307211ef76103a0526103005180607f1c612ea3576103c0526103205180607f1c612ea3576103e052610280516104005260206103a060646103bc845afa611519573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b6102c0516385f11d1e6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa611571573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b600361034051186116665760016103605118611606576102e0516307211ef76103a0526103005180607f1c612ea3576103c0526103205180607f1c612ea3576103e052610280516104005260206103a060646103bc845afa6115ef573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b6102c05163e9737ee26103a0526102e0516103c052610300516103e0526103205161040052610280516104205260206103a060846103bc845afa61164f573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b610340516004811861167957600161167f565b60058118155b90506119a957610340516006811861169857600161169e565b60078118155b90506118f65760086103405118611773576020612eb560003960005161024051186116ca5760016116dc565b6020612eb56000396000516102605118155b611e585760246103a0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e206103c0527f57455448000000000000000000000000000000000000000000000000000000006103e0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd611e5856611e58565b6009610340511861188c576321f8a7216103c0527f45786368616e67657200000000000000000000000000000000000000000000006103e05260206103c060246103dc7395a6a3f44a70172e7d50a9e28c85dfd712756b8c5afa6117dc573d600060003e3d6000fd5b60203d10612ea3576103c0518060a01c612ea35761040052610400516103a0526103a05163f450aa3461042052610280516104405260016102405160205260005260406000205461046052600161026051602052600052604060002054610480526060610420606461043c845afa611859573d600060003e3d6000fd5b60603d10612ea357610420905080516103c05260208101516103e052604081015161040052506103c05161028052611e58565b600d6103a0527f42616420737761702074797065000000000000000000000000000000000000006103c0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd611e58565b60016103605118611959576102c05163cc2b27d76103c052610280516103e0526103205180607f1c612ea3576104005260206103c060446103dc845afa611942573d600060003e3d6000fd5b60203d10612ea3576103c090505161028052611e58565b6102c051634fb08c5e6103c052610280516103e052610320516104005260206103c060446103dc845afa611992573d600060003e3d6000fd5b60203d10612ea3576103c090505161028052611e58565b60016103605118611a9057610140366103c037610280516103005160098111612ea35760051b6103c001526020612ed56000396000516379ccdf49610500526102c0516105205261026051610540526103c051610560526103e05161058052610400516105a052610420516105c052610440516105e052610460516106005261048051610620526104a051610640526104c051610660526104e05161068052610380516106a05260016106c05260016106e05260206105006101e461051c845afa611a79573d600060003e3d6000fd5b60203d10612ea35761050090505161028052611e58565b60026103805118611b6b576040366103c037610280516103005160018111612ea35760051b6103c0015260026103605118611b15576102c051638d8ea727610400526103c051610420526103e051610440526020610400604461041c845afa611afe573d600060003e3d6000fd5b60203d10612ea35761040090505161028052611e58565b6102c05163ed8e84f3610400526103c051610420526103e051610440526001610460526020610400606461041c845afa611b54573d600060003e3d6000fd5b60203d10612ea35761040090505161028052611e58565b60036103805118611c56576060366103c037610280516103005160028111612ea35760051b6103c0015260026103605118611bf8576102c051635b6f1b5a610420526103c051610440526103e0516104605261040051610480526020610420606461043c845afa611be1573d600060003e3d6000fd5b60203d10612ea35761042090505161028052611e58565b6102c051633883e119610420526103c051610440526103e05161046052610400516104805260016104a0526020610420608461043c845afa611c3f573d600060003e3d6000fd5b60203d10612ea35761042090505161028052611e58565b60046103805118611d51576080366103c037610280516103005160038111612ea35760051b6103c0015260026103605118611ceb576102c051631a805185610440526103c051610460526103e05161048052610400516104a052610420516104c0526020610440608461045c845afa611cd4573d600060003e3d6000fd5b60203d10612ea35761044090505161028052611e58565b6102c05163cf701ff7610440526103c051610460526103e05161048052610400516104a052610420516104c05260016104e052602061044060a461045c845afa611d3a573d600060003e3d6000fd5b60203d10612ea35761044090505161028052611e58565b60056103805118611e585760a0366103c037610280516103005160048111612ea35760051b6103c0015260026103605118611dee576102c0516309379690610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052602061046060a461047c845afa611dd7573d600060003e3d6000fd5b60203d10612ea35761046090505161028052611e58565b6102c051637ede89c5610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052600161052052602061046060c461047c845afa611e45573d600060003e3d6000fd5b60203d10612ea357610460905051610280525b60056102a05118611e6a576001611e9c565b6102a0518060011b818160011c18612ea357905060018101818110612ea3579050600a8111612ea35760051b60400151155b15611ea657611eb9565b610260516102405260010181811861130c575b50506102805160018103818111612ea35790506102a05260206102a0f35b63c07b53538118611ef8576105443610612ea357610140366102403761201d565b6381fc0ca58118611f68576105e43610612ea357610544358060a01c612ea35761024052610564358060a01c612ea35761026052610584358060a01c612ea357610280526105a4358060a01c612ea3576102a0526105c4358060a01c612ea3576102c05260a0366102e03761201d565b6390e7e2058118612e9f576106843610612ea357610544358060a01c612ea35761024052610564358060a01c612ea35761026052610584358060a01c612ea357610280526105a4358060a01c612ea3576102a0526105c4358060a01c612ea3576102c0526105e4358060a01c612ea3576102e052610604358060a01c612ea35761030052610624358060a01c612ea35761032052610644358060a01c612ea35761034052610664358060a01c612ea357610360525b6004358060a01c612ea3576040526024358060a01c612ea3576060526044358060a01c612ea3576080526064358060a01c612ea35760a0526084358060a01c612ea35760c05260a4358060a01c612ea35760e05260c4358060a01c612ea3576101005260e4358060a01c612ea35761012052610104358060a01c612ea35761014052610124358060a01c612ea35761016052610144358060a01c612ea357610180526104a4358060a01c612ea3576101a0526104c4358060a01c612ea3576101c0526104e4358060a01c612ea3576101e052610504358060a01c612ea35761020052610524358060a01c612ea3576102205234612ea3576104843561038052600160058101905b806103a0526103a0518060060360068111612ea35790506103c0526103c0518060011b818160011c18612ea357905060018103818111612ea3579050600a8111612ea35760051b604001516103e0526103e05161218057612e8c565b6103c05160018103818111612ea35790508060011b818160011c18612ea3579050600a8111612ea35760051b60400151610400526103c0518060011b818160011c18612ea3579050600a8111612ea35760051b60400151610420526103c05160018103818111612ea357905060048111612ea35760051b6101a00151610440526103c05160018103818111612ea357905060048111612ea35760051b6102400151610460526103c05160018103818111612ea357905060048111612ea35760051b6102e001516104805260a06103c05160018103818111612ea357905060048111612ea357026101640180356104a05260208101356104c05260408101356104e05260608101356105005260808101356105205250610520516105405260016104e051186124a757600161050051186123c1576104605161233a576020612ed560003960005163158819d46105605261044051610580526104a05180607f1c612ea3576105a0526104c05180607f1c612ea3576105c052610380516105e0526105405161060052602061056060a461057c845afa612323573d600060003e3d6000fd5b60203d10612ea35761056090505161038052612e8c565b6020612ed560003960005163571f00b56105605261044051610580526104a05180607f1c612ea3576105a0526104c05180607f1c612ea3576105c052610380516105e05261054051610600526104605161062052602061056060c461057c845afa6123aa573d600060003e3d6000fd5b60203d10612ea35761056090505161038052612e8c565b61050051600281186123d45760016123da565b60038118155b905061243857610440516337ed3a7a610560526104a051610580526104c0516105a052610380516105c0526020610560606461057c845afa612421573d600060003e3d6000fd5b60203d10612ea35761056090505161038052612e8c565b6020612ef560003960005163ca4bc71461058052610440516105a0526104a0516105c0526104c0516105e05261038051610600526105405161062052602061058060a461059c845afa612490573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6104e051600281186124ba5760016124c0565b60038118155b9050612cf0576104e051600481186124d95760016124df565b60058118155b9050612c3d576104e051600681186124f85760016124fe565b60078118155b905061278a5760086104e051186125d3576020612eb5600039600051610400511861252a57600161253c565b6020612eb56000396000516104205118155b612e8c576024610560527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610580527f57455448000000000000000000000000000000000000000000000000000000006105a05261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd612e8c56612e8c565b60096104e05118612720576321f8a721610580527f45786368616e67657200000000000000000000000000000000000000000000006105a0526020610580602461059c7395a6a3f44a70172e7d50a9e28c85dfd712756b8c5afa61263c573d600060003e3d6000fd5b60203d10612ea357610580518060a01c612ea3576105c0526105c051610560526105605163f450aa346105e052670de0b6b3a764000061060052600161040051602052600052604060002054610620526001610420516020526000526040600020546106405260606105e060646105fc845afa6126be573d600060003e3d6000fd5b60603d10612ea3576105e0905080516105805260208101516105a05260408101516105c0525061038051670de0b6b3a7640000810281670de0b6b3a7640000820418612ea3579050610580518015612ea3578082049050905061038052612e8c565b600d610560527f42616420737761702074797065000000000000000000000000000000000000006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd612e8c565b60016105005118612871576101403661058037610380516104c05160098111612ea35760051b61058001526020612ed56000396000516379ccdf496106c0526103e0516106e052610400516107005261058051610720526105a051610740526105c051610760526105e05161078052610600516107a052610620516107c052610640516107e052610660516108005261068051610820526106a05161084052610540516108605260006108805260016108a05260206106c06101e46106dc845afa61285a573d600060003e3d6000fd5b60203d10612ea3576106c090505161038052612e8c565b6002610540511861294c5760403661058037610380516104c05160018111612ea35760051b6105800152600261050051186128f6576103e051638d8ea7276105c052610580516105e0526105a0516106005260206105c060446105dc845afa6128df573d600060003e3d6000fd5b60203d10612ea3576105c090505161038052612e8c565b6103e05163ed8e84f36105c052610580516105e0526105a0516106005260006106205260206105c060646105dc845afa612935573d600060003e3d6000fd5b60203d10612ea3576105c090505161038052612e8c565b60036105405118612a375760603661058037610380516104c05160028111612ea35760051b6105800152600261050051186129d9576103e051635b6f1b5a6105e05261058051610600526105a051610620526105c0516106405260206105e060646105fc845afa6129c2573d600060003e3d6000fd5b60203d10612ea3576105e090505161038052612e8c565b6103e051633883e1196105e05261058051610600526105a051610620526105c0516106405260006106605260206105e060846105fc845afa612a20573d600060003e3d6000fd5b60203d10612ea3576105e090505161038052612e8c565b60046105405118612b325760803661058037610380516104c05160038111612ea35760051b610580015260026105005118612acc576103e051631a8051856106005261058051610620526105a051610640526105c051610660526105e051610680526020610600608461061c845afa612ab5573d600060003e3d6000fd5b60203d10612ea35761060090505161038052612e8c565b6103e05163cf701ff76106005261058051610620526105a051610640526105c051610660526105e0516106805260006106a052602061060060a461061c845afa612b1b573d600060003e3d6000fd5b60203d10612ea35761060090505161038052612e8c565b60056105405118612e8c5760a03661058037610380516104c05160048111612ea35760051b610580015260026105005118612bcf576103e05163093796906106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c052602061062060a461063c845afa612bb8573d600060003e3d6000fd5b60203d10612ea35761062090505161038052612e8c565b6103e051637ede89c56106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c05260006106e052602061062060c461063c845afa612c26573d600060003e3d6000fd5b60203d10612ea35761062090505161038052612e8c565b60016105005118612ca0576103e05163cc2b27d761058052610380516105a0526104a05180607f1c612ea3576105c0526020610580604461059c845afa612c89573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6103e051634fb08c5e61058052610380516105a0526104a0516105c0526020610580604461059c845afa612cd9573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b60016105005118612e115761046051612d82576020612ed5600039600051638fd3218f61058052610440516105a0526104a05180607f1c612ea3576105c0526104c05180607f1c612ea3576105e05261038051610600526105405161062052602061058060a461059c845afa612d6b573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6020612ed5600039600051634933a86461058052610440516105a0526104a05180607f1c612ea3576105c0526104c05180607f1c612ea3576105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa612dfa573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6020612ef5600039600051638ca1565361058052610440516105a0526104a0516105c0526104c0516105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa612e79573d600060003e3d6000fd5b60203d10612ea357610580905051610380525b6001018181186121245750506020610380f35b505b005b600080fda165767970657283000307000b005b600080fd0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc0000000000000000000000008c6f28f2f1a3c87f0f938b96d27520d9751ec8d9000000000000000000000000fbc4198702e81ae77c06d58f81b629bdf36f0a71000000000000000000000000e405de8f52ba7559f9df3c368500b6e6ae6cee49000000000000000000000000298b9b95708152ff6968aafd889c6586e9169f1d
Deployed Bytecode
0x6003361161000c57612ea1565b60003560e01c63371dc4478118610037576104c43610612ea35760a0366101a037336102405261011a565b635c9c18e281186100a5576105643610612ea3576104c4358060a01c612ea3576101a0526104e4358060a01c612ea3576101c052610504358060a01c612ea3576101e052610524358060a01c612ea35761020052610544358060a01c612ea35761022052336102405261011a565b63c872a3c581186111c3576105843610612ea3576104c4358060a01c612ea3576101a0526104e4358060a01c612ea3576101c052610504358060a01c612ea3576101e052610524358060a01c612ea35761020052610544358060a01c612ea35761022052610564358060a01c612ea357610240525b6004358060a01c612ea3576040526024358060a01c612ea3576060526044358060a01c612ea3576080526064358060a01c612ea35760a0526084358060a01c612ea35760c05260a4358060a01c612ea35760e05260c4358060a01c612ea3576101005260e4358060a01c612ea35761012052610104358060a01c612ea35761014052610124358060a01c612ea35761016052610144358060a01c612ea35761018052600054600114612ea357600160005560405161026052600061028052610484356102a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610260511861020d576102a0513418612ea35761028b565b34612ea357610260516323b872dd6102c052336102e05230610300526102a0516103205260206102c060646102dc6000855af161024f573d600060003e3d6000fd5b3d61026657803b15612ea35760016103405261027f565b60203d10612ea3576102c0518060011c612ea357610340525b61034090505115612ea3575b600160058101905b806102c0526102c0518060011b818160011c18612ea357905060018103818111612ea3579050600a8111612ea35760051b604001516102e0526102c05160018103818111612ea357905060048111612ea35760051b6101a00151610300526102c0518060011b818160011c18612ea3579050600a8111612ea35760051b604001516102805260a06102c05160018103818111612ea357905060048111612ea357026101640180356103205260208101356103405260408101356103605260608101356103805260808101356103a052506002610260516020526000526040600020806102e0516020526000526040600020905054610436576102605163095ea7b36103c0526102e0516103e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6104005260206103c060446103dc6000855af16103e3573d600060003e3d6000fd5b3d6103f357600161042052610404565b6103c0518060011c612ea357610420525b61042090505115612ea35760016002610260516020526000526040600020806102e05160205260005260406000209050555b60006103c05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610463576102a0516103c0525b600161036051186105da57600161038051186104e1576102e051633df021246103e0526103205180607f1c612ea357610400526103405180607f1c612ea357610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6103c051855af16104db573d600060003e3d6000fd5b50610e49565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610506576001610522565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b61057c576102e051635b41b9086103e052610320516104005261034051610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6000855af1610576573d600060003e3d6000fd5b50610e49565b6102e05163394747c56103e052610320516104005261034051610420526102a05161044052600061046052600161048052803b15612ea35760006103e060a46103fc6103c051855af16105d4573d600060003e3d6000fd5b50610e49565b600261036051186106b05760016103805118610658576102e05163a6417ed66103e0526103205180607f1c612ea357610400526103405180607f1c612ea357610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6103c051855af1610652573d600060003e3d6000fd5b50610e49565b6102e0516365b2489b6103e052610320516104005261034051610420526102a05161044052600061046052803b15612ea35760006103e060846103fc6103c051855af16106aa573d600060003e3d6000fd5b50610e49565b600361036051186107e15760016103805118610734576102e051637981c43e6103e05261030051610400526103205180607f1c612ea357610420526103405180607f1c612ea357610440526102a05161046052600061048052803b15612ea35760006103e060a46103fc6000855af161072e573d600060003e3d6000fd5b50610e49565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610759576001610775565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118155b6103e0526102e051632bf78c61610400526103005161042052610320516104405261034051610460526102a0516104805260006104a0526103e0516104c052803b15612ea357600061040060c461041c6103c051855af16107db573d600060003e3d6000fd5b50610e49565b60046103605118610a045760026103a05118610866576040366103e0376102a0516103205160018111612ea35760051b6103e001526102e051630b4c7e4d610420526103e051610440526104005161046052600061048052803b15612ea3576000610420606461043c6103c051855af1610860573d600060003e3d6000fd5b50610e49565b60036103a051186108e8576060366103e0376102a0516103205160028111612ea35760051b6103e001526102e051634515cef3610440526103e051610460526104005161048052610420516104a05260006104c052803b15612ea3576000610440608461045c6103c051855af16108e2573d600060003e3d6000fd5b50610e49565b60046103a05118610972576080366103e0376102a0516103205160038111612ea35760051b6103e001526102e05163029b2f34610460526103e05161048052610400516104a052610420516104c052610440516104e052600061050052803b15612ea357600061046060a461047c6103c051855af161096c573d600060003e3d6000fd5b50610e49565b60056103a05118610e495760a0366103e0376102a0516103205160048111612ea35760051b6103e001526102e0516384738499610480526103e0516104a052610400516104c052610420516104e05261044051610500526104605161052052600061054052803b15612ea357600061048060c461049c6103c051855af16109fe573d600060003e3d6000fd5b50610e49565b60056103605118610a8c576060366103e0376102a0516103205160028111612ea35760051b6103e001526102e051632b6e993a610440526103e051610460526104005161048052610420516104a05260006104c05260016104e052803b15612ea357600061044060a461045c6103c051855af1610a86573d600060003e3d6000fd5b50610e49565b60066103605118610b465760016103805118610af8576102e051631a4d01d26103e0526102a051610400526103405180607f1c612ea35761042052600061044052803b15612ea35760006103e060646103fc6000855af1610af2573d600060003e3d6000fd5b50610e49565b6102e05163f1dc3cc96103e0526102a051610400526103405161042052600061044052803b15612ea35760006103e060646103fc6000855af1610b40573d600060003e3d6000fd5b50610e49565b60076103605118610bb2576102e05163517a55a36103e0526102a051610400526103405180607f1c612ea3576104205260006104405260016104605260206103e060846103fc6000855af1610ba0573d600060003e3d6000fd5b60203d10612ea3576103e05050610e49565b60086103605118610d3c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102605118610bf1576020612eb5600039600051610280511815610bf4565b60005b610d02576020612eb56000396000516102605118610c2c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511815610c2f565b60005b610cc25760246103e0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610400527f5745544800000000000000000000000000000000000000000000000000000000610420526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd610e49565b6102e051632e1a7d4d6103e0526102a05161040052803b15612ea35760006103e060246103fc6000855af1610cfc573d600060003e3d6000fd5b50610e49565b6102e05163d0e30db06103e052803b15612ea35760006103e060046103fc6102a051855af1610d36573d600060003e3d6000fd5b50610e49565b60096103605118610de3576102e0516330ead7606103e052600161026051602052600052604060002054610400526102a05161042052600161028051602052600052604060002054610440526000610460527f43555256450000000000000000000000000000000000000000000000000000006104805260206103e060a46103fc6000855af1610dd1573d600060003e3d6000fd5b60203d10612ea3576103e05050610e49565b600d6103e0527f4261642073776170207479706500000000000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102805118610e7157476102a052610eb2565b610280516370a082316103e052306104005260206103e060246103fc845afa610e9f573d600060003e3d6000fd5b60203d10612ea3576103e09050516102a0525b6102a051610f205760106103e0527f5265636569766564206e6f7468696e6700000000000000000000000000000000610400526103e0506103e0518061040001601f826000031636823750506308c379a06103a05260206103c052601f19601f6103e05101166044016103bcfd5b60056102c05118610f32576001610f64565b6102c0518060011b818160011c18612ea357905060018101818110612ea3579050600a8111612ea35760051b60400151155b15610f6e57610f81565b6102805161026052600101818118610293575b50506102a05160018103818111612ea35790506102a0526104a4356102a051101561100c5760086102c0527f536c6970706167650000000000000000000000000000000000000000000000006102e0526102c0506102c051806102e001601f826000031636823750506308c379a06102805260206102a052601f19601f6102c051011660440161029cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511861105c5760006102c0526102c050600060006102c0516102e06102a051610240515af16110d3573d600060003e3d6000fd6110d3565b6102805163a9059cbb6102c052610240516102e0526102a0516103005260206102c060446102dc6000855af1611097573d600060003e3d6000fd5b3d6110ae57803b15612ea3576001610320526110c7565b60203d10612ea3576102c0518060011c612ea357610320525b61032090505115612ea3575b61024051337f56d0661e240dfb199ef196e16e6f42473990366314f0226ac978f7be3cd9ee836040516102c0526060516102e0526080516103005260a0516103205260c0516103405260e051610360526101005161038052610120516103a052610140516103c052610160516103e052610180516104005260a06101646104203760a06102046104c03760a06102a46105603760a06103446106003760a06103e46106a0376101a051610740526101c051610760526101e05161078052610200516107a052610220516107c052610484356107e0526102a051610800526105606102c0a360206102a06000600055f35b6381889a2c81186111e3576104a43610612ea35760a0366101a037611248565b63637653cb8118611ed7576105443610612ea3576104a4358060a01c612ea3576101a0526104c4358060a01c612ea3576101c0526104e4358060a01c612ea3576101e052610504358060a01c612ea35761020052610524358060a01c612ea357610220525b6004358060a01c612ea3576040526024358060a01c612ea3576060526044358060a01c612ea3576080526064358060a01c612ea35760a0526084358060a01c612ea35760c05260a4358060a01c612ea35760e05260c4358060a01c612ea3576101005260e4358060a01c612ea35761012052610104358060a01c612ea35761014052610124358060a01c612ea35761016052610144358060a01c612ea3576101805234612ea357604051610240526000610260526104843561028052600160058101905b806102a0526102a0518060011b818160011c18612ea357905060018103818111612ea3579050600a8111612ea35760051b604001516102c0526102a05160018103818111612ea357905060048111612ea35760051b6101a001516102e0526102a0518060011b818160011c18612ea3579050600a8111612ea35760051b604001516102605260a06102a05160018103818111612ea357905060048111612ea357026101640180356103005260208101356103205260408101356103405260608101356103605260808101356103805250600161034051186114b2576001610360511861145a576102c051635e0d443f6103a0526103005180607f1c612ea3576103c0526103205180607f1c612ea3576103e052610280516104005260206103a060646103bc845afa611443573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b6102c05163556d6e9f6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa61149b573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b600261034051186115885760016103605118611530576102c0516307211ef76103a0526103005180607f1c612ea3576103c0526103205180607f1c612ea3576103e052610280516104005260206103a060646103bc845afa611519573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b6102c0516385f11d1e6103a052610300516103c052610320516103e052610280516104005260206103a060646103bc845afa611571573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b600361034051186116665760016103605118611606576102e0516307211ef76103a0526103005180607f1c612ea3576103c0526103205180607f1c612ea3576103e052610280516104005260206103a060646103bc845afa6115ef573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b6102c05163e9737ee26103a0526102e0516103c052610300516103e0526103205161040052610280516104205260206103a060846103bc845afa61164f573d600060003e3d6000fd5b60203d10612ea3576103a090505161028052611e58565b610340516004811861167957600161167f565b60058118155b90506119a957610340516006811861169857600161169e565b60078118155b90506118f65760086103405118611773576020612eb560003960005161024051186116ca5760016116dc565b6020612eb56000396000516102605118155b611e585760246103a0527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e206103c0527f57455448000000000000000000000000000000000000000000000000000000006103e0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd611e5856611e58565b6009610340511861188c576321f8a7216103c0527f45786368616e67657200000000000000000000000000000000000000000000006103e05260206103c060246103dc7395a6a3f44a70172e7d50a9e28c85dfd712756b8c5afa6117dc573d600060003e3d6000fd5b60203d10612ea3576103c0518060a01c612ea35761040052610400516103a0526103a05163f450aa3461042052610280516104405260016102405160205260005260406000205461046052600161026051602052600052604060002054610480526060610420606461043c845afa611859573d600060003e3d6000fd5b60603d10612ea357610420905080516103c05260208101516103e052604081015161040052506103c05161028052611e58565b600d6103a0527f42616420737761702074797065000000000000000000000000000000000000006103c0526103a0506103a051806103c001601f826000031636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd611e58565b60016103605118611959576102c05163cc2b27d76103c052610280516103e0526103205180607f1c612ea3576104005260206103c060446103dc845afa611942573d600060003e3d6000fd5b60203d10612ea3576103c090505161028052611e58565b6102c051634fb08c5e6103c052610280516103e052610320516104005260206103c060446103dc845afa611992573d600060003e3d6000fd5b60203d10612ea3576103c090505161028052611e58565b60016103605118611a9057610140366103c037610280516103005160098111612ea35760051b6103c001526020612ed56000396000516379ccdf49610500526102c0516105205261026051610540526103c051610560526103e05161058052610400516105a052610420516105c052610440516105e052610460516106005261048051610620526104a051610640526104c051610660526104e05161068052610380516106a05260016106c05260016106e05260206105006101e461051c845afa611a79573d600060003e3d6000fd5b60203d10612ea35761050090505161028052611e58565b60026103805118611b6b576040366103c037610280516103005160018111612ea35760051b6103c0015260026103605118611b15576102c051638d8ea727610400526103c051610420526103e051610440526020610400604461041c845afa611afe573d600060003e3d6000fd5b60203d10612ea35761040090505161028052611e58565b6102c05163ed8e84f3610400526103c051610420526103e051610440526001610460526020610400606461041c845afa611b54573d600060003e3d6000fd5b60203d10612ea35761040090505161028052611e58565b60036103805118611c56576060366103c037610280516103005160028111612ea35760051b6103c0015260026103605118611bf8576102c051635b6f1b5a610420526103c051610440526103e0516104605261040051610480526020610420606461043c845afa611be1573d600060003e3d6000fd5b60203d10612ea35761042090505161028052611e58565b6102c051633883e119610420526103c051610440526103e05161046052610400516104805260016104a0526020610420608461043c845afa611c3f573d600060003e3d6000fd5b60203d10612ea35761042090505161028052611e58565b60046103805118611d51576080366103c037610280516103005160038111612ea35760051b6103c0015260026103605118611ceb576102c051631a805185610440526103c051610460526103e05161048052610400516104a052610420516104c0526020610440608461045c845afa611cd4573d600060003e3d6000fd5b60203d10612ea35761044090505161028052611e58565b6102c05163cf701ff7610440526103c051610460526103e05161048052610400516104a052610420516104c05260016104e052602061044060a461045c845afa611d3a573d600060003e3d6000fd5b60203d10612ea35761044090505161028052611e58565b60056103805118611e585760a0366103c037610280516103005160048111612ea35760051b6103c0015260026103605118611dee576102c0516309379690610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052602061046060a461047c845afa611dd7573d600060003e3d6000fd5b60203d10612ea35761046090505161028052611e58565b6102c051637ede89c5610460526103c051610480526103e0516104a052610400516104c052610420516104e0526104405161050052600161052052602061046060c461047c845afa611e45573d600060003e3d6000fd5b60203d10612ea357610460905051610280525b60056102a05118611e6a576001611e9c565b6102a0518060011b818160011c18612ea357905060018101818110612ea3579050600a8111612ea35760051b60400151155b15611ea657611eb9565b610260516102405260010181811861130c575b50506102805160018103818111612ea35790506102a05260206102a0f35b63c07b53538118611ef8576105443610612ea357610140366102403761201d565b6381fc0ca58118611f68576105e43610612ea357610544358060a01c612ea35761024052610564358060a01c612ea35761026052610584358060a01c612ea357610280526105a4358060a01c612ea3576102a0526105c4358060a01c612ea3576102c05260a0366102e03761201d565b6390e7e2058118612e9f576106843610612ea357610544358060a01c612ea35761024052610564358060a01c612ea35761026052610584358060a01c612ea357610280526105a4358060a01c612ea3576102a0526105c4358060a01c612ea3576102c0526105e4358060a01c612ea3576102e052610604358060a01c612ea35761030052610624358060a01c612ea35761032052610644358060a01c612ea35761034052610664358060a01c612ea357610360525b6004358060a01c612ea3576040526024358060a01c612ea3576060526044358060a01c612ea3576080526064358060a01c612ea35760a0526084358060a01c612ea35760c05260a4358060a01c612ea35760e05260c4358060a01c612ea3576101005260e4358060a01c612ea35761012052610104358060a01c612ea35761014052610124358060a01c612ea35761016052610144358060a01c612ea357610180526104a4358060a01c612ea3576101a0526104c4358060a01c612ea3576101c0526104e4358060a01c612ea3576101e052610504358060a01c612ea35761020052610524358060a01c612ea3576102205234612ea3576104843561038052600160058101905b806103a0526103a0518060060360068111612ea35790506103c0526103c0518060011b818160011c18612ea357905060018103818111612ea3579050600a8111612ea35760051b604001516103e0526103e05161218057612e8c565b6103c05160018103818111612ea35790508060011b818160011c18612ea3579050600a8111612ea35760051b60400151610400526103c0518060011b818160011c18612ea3579050600a8111612ea35760051b60400151610420526103c05160018103818111612ea357905060048111612ea35760051b6101a00151610440526103c05160018103818111612ea357905060048111612ea35760051b6102400151610460526103c05160018103818111612ea357905060048111612ea35760051b6102e001516104805260a06103c05160018103818111612ea357905060048111612ea357026101640180356104a05260208101356104c05260408101356104e05260608101356105005260808101356105205250610520516105405260016104e051186124a757600161050051186123c1576104605161233a576020612ed560003960005163158819d46105605261044051610580526104a05180607f1c612ea3576105a0526104c05180607f1c612ea3576105c052610380516105e0526105405161060052602061056060a461057c845afa612323573d600060003e3d6000fd5b60203d10612ea35761056090505161038052612e8c565b6020612ed560003960005163571f00b56105605261044051610580526104a05180607f1c612ea3576105a0526104c05180607f1c612ea3576105c052610380516105e05261054051610600526104605161062052602061056060c461057c845afa6123aa573d600060003e3d6000fd5b60203d10612ea35761056090505161038052612e8c565b61050051600281186123d45760016123da565b60038118155b905061243857610440516337ed3a7a610560526104a051610580526104c0516105a052610380516105c0526020610560606461057c845afa612421573d600060003e3d6000fd5b60203d10612ea35761056090505161038052612e8c565b6020612ef560003960005163ca4bc71461058052610440516105a0526104a0516105c0526104c0516105e05261038051610600526105405161062052602061058060a461059c845afa612490573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6104e051600281186124ba5760016124c0565b60038118155b9050612cf0576104e051600481186124d95760016124df565b60058118155b9050612c3d576104e051600681186124f85760016124fe565b60078118155b905061278a5760086104e051186125d3576020612eb5600039600051610400511861252a57600161253c565b6020612eb56000396000516104205118155b612e8c576024610560527f5377617020747970652038206973206f6e6c7920666f7220455448203c2d3e20610580527f57455448000000000000000000000000000000000000000000000000000000006105a05261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd612e8c56612e8c565b60096104e05118612720576321f8a721610580527f45786368616e67657200000000000000000000000000000000000000000000006105a0526020610580602461059c7395a6a3f44a70172e7d50a9e28c85dfd712756b8c5afa61263c573d600060003e3d6000fd5b60203d10612ea357610580518060a01c612ea3576105c0526105c051610560526105605163f450aa346105e052670de0b6b3a764000061060052600161040051602052600052604060002054610620526001610420516020526000526040600020546106405260606105e060646105fc845afa6126be573d600060003e3d6000fd5b60603d10612ea3576105e0905080516105805260208101516105a05260408101516105c0525061038051670de0b6b3a7640000810281670de0b6b3a7640000820418612ea3579050610580518015612ea3578082049050905061038052612e8c565b600d610560527f42616420737761702074797065000000000000000000000000000000000000006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd612e8c565b60016105005118612871576101403661058037610380516104c05160098111612ea35760051b61058001526020612ed56000396000516379ccdf496106c0526103e0516106e052610400516107005261058051610720526105a051610740526105c051610760526105e05161078052610600516107a052610620516107c052610640516107e052610660516108005261068051610820526106a05161084052610540516108605260006108805260016108a05260206106c06101e46106dc845afa61285a573d600060003e3d6000fd5b60203d10612ea3576106c090505161038052612e8c565b6002610540511861294c5760403661058037610380516104c05160018111612ea35760051b6105800152600261050051186128f6576103e051638d8ea7276105c052610580516105e0526105a0516106005260206105c060446105dc845afa6128df573d600060003e3d6000fd5b60203d10612ea3576105c090505161038052612e8c565b6103e05163ed8e84f36105c052610580516105e0526105a0516106005260006106205260206105c060646105dc845afa612935573d600060003e3d6000fd5b60203d10612ea3576105c090505161038052612e8c565b60036105405118612a375760603661058037610380516104c05160028111612ea35760051b6105800152600261050051186129d9576103e051635b6f1b5a6105e05261058051610600526105a051610620526105c0516106405260206105e060646105fc845afa6129c2573d600060003e3d6000fd5b60203d10612ea3576105e090505161038052612e8c565b6103e051633883e1196105e05261058051610600526105a051610620526105c0516106405260006106605260206105e060846105fc845afa612a20573d600060003e3d6000fd5b60203d10612ea3576105e090505161038052612e8c565b60046105405118612b325760803661058037610380516104c05160038111612ea35760051b610580015260026105005118612acc576103e051631a8051856106005261058051610620526105a051610640526105c051610660526105e051610680526020610600608461061c845afa612ab5573d600060003e3d6000fd5b60203d10612ea35761060090505161038052612e8c565b6103e05163cf701ff76106005261058051610620526105a051610640526105c051610660526105e0516106805260006106a052602061060060a461061c845afa612b1b573d600060003e3d6000fd5b60203d10612ea35761060090505161038052612e8c565b60056105405118612e8c5760a03661058037610380516104c05160048111612ea35760051b610580015260026105005118612bcf576103e05163093796906106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c052602061062060a461063c845afa612bb8573d600060003e3d6000fd5b60203d10612ea35761062090505161038052612e8c565b6103e051637ede89c56106205261058051610640526105a051610660526105c051610680526105e0516106a052610600516106c05260006106e052602061062060c461063c845afa612c26573d600060003e3d6000fd5b60203d10612ea35761062090505161038052612e8c565b60016105005118612ca0576103e05163cc2b27d761058052610380516105a0526104a05180607f1c612ea3576105c0526020610580604461059c845afa612c89573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6103e051634fb08c5e61058052610380516105a0526104a0516105c0526020610580604461059c845afa612cd9573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b60016105005118612e115761046051612d82576020612ed5600039600051638fd3218f61058052610440516105a0526104a05180607f1c612ea3576105c0526104c05180607f1c612ea3576105e05261038051610600526105405161062052602061058060a461059c845afa612d6b573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6020612ed5600039600051634933a86461058052610440516105a0526104a05180607f1c612ea3576105c0526104c05180607f1c612ea3576105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa612dfa573d600060003e3d6000fd5b60203d10612ea35761058090505161038052612e8c565b6020612ef5600039600051638ca1565361058052610440516105a0526104a0516105c0526104c0516105e0526103805161060052610540516106205261046051610640526104805161066052602061058060e461059c845afa612e79573d600060003e3d6000fd5b60203d10612ea357610580905051610380525b6001018181186121245750506020610380f35b505b005b600080fda165767970657283000307000b0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004200000000000000000000000000000000000006000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc0000000000000000000000008c6f28f2f1a3c87f0f938b96d27520d9751ec8d9000000000000000000000000fbc4198702e81ae77c06d58f81b629bdf36f0a71000000000000000000000000e405de8f52ba7559f9df3c368500b6e6ae6cee49000000000000000000000000298b9b95708152ff6968aafd889c6586e9169f1d
-----Decoded View---------------
Arg [0] : _weth (address): 0x4200000000000000000000000000000000000006
Arg [1] : _stable_calc (address): 0xCA8d0747B5573D69653C3aC22242e6341C36e4b4
Arg [2] : _crypto_calc (address): 0xA72C85C258A81761433B4e8da60505Fe3Dd551CC
Arg [3] : _snx_coins (address[4]): 0x8c6f28f2F1A3C87F0f938b96d27520d9751ec8d9,0xFBc4198702E81aE77c06D58f81b629BDf36f0a71,0xE405de8F52ba7559f9df3C368500B6E6ae6Cee49,0x298B9B95708152ff6968aafd889c6586e9169f1D
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000004200000000000000000000000000000000000006
Arg [1] : 000000000000000000000000ca8d0747b5573d69653c3ac22242e6341c36e4b4
Arg [2] : 000000000000000000000000a72c85c258a81761433b4e8da60505fe3dd551cc
Arg [3] : 0000000000000000000000008c6f28f2f1a3c87f0f938b96d27520d9751ec8d9
Arg [4] : 000000000000000000000000fbc4198702e81ae77c06d58f81b629bdf36f0a71
Arg [5] : 000000000000000000000000e405de8f52ba7559f9df3c368500b6e6ae6cee49
Arg [6] : 000000000000000000000000298b9b95708152ff6968aafd889c6586e9169f1d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
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.