Overview
ETH Balance
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MetaZapNG
Compiler Version
vyper:0.3.10
Contract Source Code (Vyper language format)
# pragma version 0.3.10 # pragma evm-version paris """ @title MetaZapNG @author Curve.Fi @license Copyright (c) Curve.Fi, 2021 - all rights reserved @notice A generalised zap contract for Stableswap-ng metapools where the base pool is a Stableswap-ng implementation as well. @dev Contract assumes Metapools have 2 coins. """ interface ERC20: def transfer(receiver: address, amount: uint256): nonpayable def transferFrom(_sender: address, receiver: address, amount: uint256): nonpayable def approve(spender: address, amount: uint256): nonpayable def decimals() -> uint256: view def balanceOf(owner: address) -> uint256: view interface StableSwapMetaNG: def add_liquidity( amounts: uint256[META_N_COINS], min_mint_amount: uint256, receiver: address ) -> uint256: nonpayable def remove_liquidity( amount: uint256, min_amounts: uint256[META_N_COINS] ) -> uint256[META_N_COINS]: nonpayable def remove_liquidity_one_coin( token_amount: uint256, i: int128, min_amount: uint256, receiver: address ) -> uint256: nonpayable def remove_liquidity_imbalance( amounts: uint256[META_N_COINS], max_burn_amount: uint256 ) -> uint256: nonpayable def calc_withdraw_one_coin(token_amount: uint256, i: int128) -> uint256: view def calc_token_amount(amounts: uint256[META_N_COINS], deposit: bool) -> uint256: view def coins(i: uint256) -> address: view def BASE_POOL() -> address: view def BASE_POOL_IS_NG() -> bool: view interface StableSwapNG: def N_COINS() -> uint256: view def add_liquidity( amounts: DynArray[uint256, MAX_COINS], min_mint_amount: uint256 ) -> uint256: nonpayable def remove_liquidity( amount: uint256, min_amounts: DynArray[uint256, MAX_COINS] ) -> DynArray[uint256, MAX_COINS]: nonpayable def remove_liquidity_one_coin( token_amount: uint256, i: int128, min_amount: uint256 ) -> uint256: nonpayable def remove_liquidity_imbalance( amounts: DynArray[uint256, MAX_COINS], max_burn_amount: uint256 ) -> uint256: nonpayable def calc_withdraw_one_coin(token_amount: uint256, i: int128) -> uint256: view def calc_token_amount( amounts: DynArray[uint256, MAX_COINS], deposit: bool ) -> uint256: view def coins(i: uint256) -> address: view def fee() -> uint256: view struct BasePool: pool_address: address coins: DynArray[address, MAX_COINS] META_N_COINS: constant(uint256) = 2 MAX_COINS: constant(uint256) = 8 MAX_ALL_COINS: constant(uint256) = MAX_COINS + 1 FEE_DENOMINATOR: constant(uint256) = 10 ** 10 FEE_IMPRECISION: constant(uint256) = 100 * 10 ** 8 # % of the fee # coin -> pool -> is approved to transfer? is_approved: HashMap[address, HashMap[address, bool]] base_pool_coins_spending_approved: HashMap[address, bool] base_pool_registry: HashMap[address, BasePool] @internal @view def get_coins_from_pool(_pool: address) -> DynArray[address, MAX_COINS]: n_coins: uint256 = StableSwapNG(_pool).N_COINS() coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS]) for i in range(n_coins, bound=MAX_COINS): coins.append(StableSwapNG(_pool).coins(i)) return coins @internal def _approve_pool_to_spend_zap_coins( pool: address, coins: DynArray[address, MAX_COINS], ): for i in range(len(coins), bound=MAX_COINS): ERC20(coins[i]).approve(pool, max_value(uint256)) self.base_pool_coins_spending_approved[pool] = True @internal @view def _fetch_base_pool_data(_pool: address) -> (address, DynArray[address, MAX_COINS]): base_pool: address = StableSwapMetaNG(_pool).BASE_POOL() assert base_pool != empty(address) # dev: not a metapool base_coins: DynArray[address, MAX_COINS] = self.get_coins_from_pool(base_pool) return base_pool, base_coins @internal def _base_pool_data(_pool: address) -> (address, DynArray[address, MAX_COINS]): base_pool_data: BasePool = self.base_pool_registry[_pool] if base_pool_data.pool_address == empty(address): base_pool: address = empty(address) base_coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS]) base_pool, base_coins = self._fetch_base_pool_data(_pool) self.base_pool_registry[_pool] = BasePool( {pool_address: base_pool, coins: base_coins} ) return base_pool, base_coins return base_pool_data.pool_address, base_pool_data.coins @view @external def calc_token_amount( _pool: address, _amounts: DynArray[uint256, MAX_ALL_COINS], _is_deposit: bool ) -> uint256: """ @notice Calculate addition or reduction in token supply from a deposit or withdrawal @dev This calculation accounts for slippage, but not fees. Needed to prevent front-running, not for precise calculations! @param _pool Address of the pool to deposit into @param _amounts Amount of each underlying coin being deposited @param _is_deposit set True for deposits, False for withdrawals @return Expected amount of LP tokens received """ meta_amounts: uint256[META_N_COINS] = empty(uint256[META_N_COINS]) base_amounts: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS]) base_pool: address = empty(address) base_coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS]) base_pool, base_coins = self._fetch_base_pool_data(_pool) base_n_coins: uint256 = len(base_coins) meta_amounts[0] = _amounts[0] for i in range(base_n_coins, bound=MAX_COINS): base_amounts.append(_amounts[i + META_N_COINS - 1]) base_tokens: uint256 = StableSwapNG(base_pool).calc_token_amount(base_amounts, _is_deposit) meta_amounts[META_N_COINS - 1] = base_tokens return StableSwapMetaNG(_pool).calc_token_amount(meta_amounts, _is_deposit) @external def add_liquidity( _pool: address, _deposit_amounts: DynArray[uint256, MAX_ALL_COINS], _min_mint_amount: uint256, _receiver: address = msg.sender, ) -> uint256: """ @notice Wrap underlying coins and deposit them into `_pool` @param _pool Address of the pool to deposit into @param _deposit_amounts List of amounts of underlying coins to deposit @param _min_mint_amount Minimum amount of LP tokens to mint from the deposit @param _receiver Address that receives the LP tokens @return Amount of LP tokens received by depositing """ base_amounts: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS]) deposit_base: bool = False # -------------------------- Get base pool data -------------------------- base_pool: address = empty(address) base_coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS]) base_pool, base_coins = self._base_pool_data(_pool) n_all_coins: uint256 = len(base_coins) + 1 if not self.base_pool_coins_spending_approved[base_pool]: self._approve_pool_to_spend_zap_coins(base_pool, base_coins) # ------------------------ Transfer tokens to Zap ------------------------ meta_amounts: uint256[META_N_COINS] = empty(uint256[META_N_COINS]) # Transfer meta-token (token in metapool that is not base pool token) if # any: if _deposit_amounts[0] != 0: coin: address = StableSwapMetaNG(_pool).coins(0) if not self.is_approved[coin][_pool]: ERC20(coin).approve(_pool, max_value(uint256)) self.is_approved[coin][_pool] = True ERC20(coin).transferFrom(msg.sender, self, _deposit_amounts[0]) meta_amounts[0] = _deposit_amounts[0] # Transfer base pool coins (if any): for i in range(n_all_coins, bound=MAX_ALL_COINS): amount: uint256 = _deposit_amounts[i] base_amounts.append(0) if i == 0 or amount == 0: base_amounts.append(0) continue deposit_base = True base_idx: uint256 = i - 1 coin: address = base_coins[base_idx] ERC20(coin).transferFrom(msg.sender, self, amount) base_amounts[base_idx] = amount # ----------------------- Deposit to the base pool ----------------------- if deposit_base: meta_amounts[META_N_COINS - 1] = StableSwapNG(base_pool).add_liquidity(base_amounts, 0) if not self.is_approved[base_pool][_pool]: ERC20(base_pool).approve(_pool, max_value(uint256)) self.is_approved[base_pool][_pool] = True # ----------------------- Deposit to the meta pool ----------------------- return StableSwapMetaNG(_pool).add_liquidity( meta_amounts, _min_mint_amount, _receiver ) @view @external def calc_withdraw_one_coin(_pool: address, _token_amount: uint256, i: int128) -> uint256: """ @notice Calculate the amount received when withdrawing and unwrapping a single coin @param _pool Address of the pool to deposit into @param _token_amount Amount of LP tokens to burn in the withdrawal @param i Index value of the underlying coin to withdraw @return Amount of coin received """ if i < META_N_COINS - 1: return StableSwapMetaNG(_pool).calc_withdraw_one_coin(_token_amount, i) else: base_pool: address = StableSwapMetaNG(_pool).BASE_POOL() assert base_pool != empty(address) # dev: not a metapool! _base_tokens: uint256 = StableSwapMetaNG(_pool).calc_withdraw_one_coin(_token_amount, META_N_COINS - 1) return StableSwapNG(base_pool).calc_withdraw_one_coin( _base_tokens, i - convert(META_N_COINS - 1, int128) ) @external def remove_liquidity( _pool: address, _burn_amount: uint256, _min_amounts: DynArray[uint256, MAX_ALL_COINS], _receiver: address = msg.sender ) -> DynArray[uint256, MAX_ALL_COINS]: """ @notice Withdraw and unwrap coins from the pool @dev Withdrawal amounts are based on current deposit ratios @param _pool Address of the pool to deposit into @param _burn_amount Quantity of LP tokens to burn in the withdrawal @param _min_amounts Minimum amounts of underlying coins to receive @param _receiver Address that receives the LP tokens @return List of amounts of underlying coins that were withdrawn """ ERC20(_pool).transferFrom(msg.sender, self, _burn_amount) base_pool: address = empty(address) base_coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS]) base_pool, base_coins = self._base_pool_data(_pool) base_n_coins: uint256 = len(base_coins) min_amounts_base: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS]) amounts: DynArray[uint256, MAX_ALL_COINS] = empty(DynArray[uint256, MAX_ALL_COINS]) # Withdraw from meta meta_received: uint256[META_N_COINS] = StableSwapMetaNG(_pool).remove_liquidity( _burn_amount, [_min_amounts[0], convert(0, uint256)] ) # Withdraw from base for i in range(base_n_coins, bound=MAX_COINS): min_amounts_base.append(_min_amounts[i + META_N_COINS - 1]) StableSwapNG(base_pool).remove_liquidity(meta_received[1], min_amounts_base) # Transfer all coins out coin: address = StableSwapMetaNG(_pool).coins(0) ERC20(coin).transfer(_receiver, meta_received[0]) amounts.append(meta_received[0]) for i in range(base_n_coins + 1, bound=MAX_ALL_COINS): if i == 0: continue coin = base_coins[i-1] amounts.append(ERC20(coin).balanceOf(self)) ERC20(coin).transfer(_receiver, amounts[i]) return amounts @external def remove_liquidity_one_coin( _pool: address, _burn_amount: uint256, i: int128, _min_amount: uint256, _receiver: address=msg.sender ) -> uint256: """ @notice Withdraw and unwrap a single coin from the pool @param _pool Address of the pool to deposit into @param _burn_amount Amount of LP tokens to burn in the withdrawal @param i Index value of the coin to withdraw @param _min_amount Minimum amount of underlying coin to receive @param _receiver Address that receives the LP tokens @return Amount of underlying coin received """ ERC20(_pool).transferFrom(msg.sender, self, _burn_amount) coin_amount: uint256 = 0 if i == 0: coin_amount = StableSwapMetaNG(_pool).remove_liquidity_one_coin( _burn_amount, i, _min_amount, _receiver ) else: base_pool: address = empty(address) base_coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS]) base_pool, base_coins = self._base_pool_data(_pool) base_n_coins: uint256 = len(base_coins) coin: address = base_coins[i - convert(META_N_COINS - 1, int128)] # Withdraw a base pool coin coin_amount = StableSwapMetaNG(_pool).remove_liquidity_one_coin( _burn_amount, convert(META_N_COINS - 1, int128), 0, self ) coin_amount = StableSwapNG(base_pool).remove_liquidity_one_coin( coin_amount, i - convert(META_N_COINS - 1, int128), _min_amount ) ERC20(coin).transfer(_receiver, coin_amount) return coin_amount @external def remove_liquidity_imbalance( _pool: address, _amounts: DynArray[uint256, MAX_ALL_COINS], _max_burn_amount: uint256, _receiver: address=msg.sender ) -> uint256: """ @notice Withdraw coins from the pool in an imbalanced amount @param _pool Address of the pool to deposit into @param _amounts List of amounts of underlying coins to withdraw @param _max_burn_amount Maximum amount of LP token to burn in the withdrawal @param _receiver Address that receives the LP tokens @return Actual amount of the LP token burned in the withdrawal """ base_pool: address = empty(address) base_coins: DynArray[address, MAX_COINS] = empty(DynArray[address, MAX_COINS]) base_pool, base_coins = self._base_pool_data(_pool) base_n_coins: uint256 = len(base_coins) fee: uint256 = StableSwapNG(base_pool).fee() * base_n_coins / (4 * (base_n_coins - 1)) fee += fee * FEE_IMPRECISION / FEE_DENOMINATOR # Overcharge to account for imprecision # Transfer the LP token in ERC20(_pool).transferFrom(msg.sender, self, _max_burn_amount) withdraw_base: bool = False amounts_base: DynArray[uint256, MAX_COINS] = empty(DynArray[uint256, MAX_COINS]) amounts_meta: uint256[META_N_COINS] = [_amounts[0], 0] # determine amounts to withdraw from base pool for i in range(base_n_coins, bound=MAX_COINS): amount: uint256 = _amounts[META_N_COINS - 1 + i] if amount != 0: amounts_base.append(amount) withdraw_base = True else: amounts_base.append(0) # determine amounts to withdraw from metapool if withdraw_base: amounts_meta[1] = StableSwapNG(base_pool).calc_token_amount(amounts_base, False) amounts_meta[1] += amounts_meta[1] * fee / FEE_DENOMINATOR + 1 # withdraw from metapool and return the remaining LP tokens burn_amount: uint256 = StableSwapMetaNG(_pool).remove_liquidity_imbalance(amounts_meta, _max_burn_amount) ERC20(_pool).transfer(msg.sender, _max_burn_amount - burn_amount) # withdraw from base pool if withdraw_base: StableSwapNG(base_pool).remove_liquidity_imbalance(amounts_base, amounts_meta[1]) coin: address = base_pool leftover: uint256 = ERC20(coin).balanceOf(self) if leftover > 0: # if some base pool LP tokens remain, re-deposit them for the caller if not self.is_approved[coin][_pool]: ERC20(coin).approve(_pool, MAX_UINT256) self.is_approved[coin][_pool] = True burn_amount -= StableSwapMetaNG(_pool).add_liquidity([convert(0, uint256), leftover], 0, msg.sender) # transfer withdrawn base pool tokens to caller for i in range(base_n_coins, bound=MAX_COINS): ERC20(base_coins[i]).transfer(_receiver, amounts_base[i]) # transfer withdrawn metapool tokens to caller if _amounts[0] > 0: coin: address = StableSwapMetaNG(_pool).coins(0) ERC20(coin).transfer(_receiver, _amounts[0]) return burn_amount
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"_pool","type":"address"},{"name":"_amounts","type":"uint256[]"},{"name":"_is_deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_deposit_amounts","type":"uint256[]"},{"name":"_min_mint_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_deposit_amounts","type":"uint256[]"},{"name":"_min_mint_amount","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"_pool","type":"address"},{"name":"_token_amount","type":"uint256"},{"name":"i","type":"int128"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[]"}],"outputs":[{"name":"","type":"uint256[]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[]"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256[]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"_min_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"_min_amount","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_pool","type":"address"},{"name":"_amounts","type":"uint256[]"},{"name":"_max_burn_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_pool","type":"address"},{"name":"_amounts","type":"uint256[]"},{"name":"_max_burn_amount","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]}]
Contract Creation Code
611bb061001161000039611bb0610000f360003560e01c60026007821660011b611ba001601e39600051565b63f558454d811861183b57608436103417611b9b576004358060a01c611b9b576104a0526024356004016009813511611b9b57803560208160051b0180836104c0375050506044358060011c611b9b57610600526060366106203760006107805260006107a0526104a051610220526100946108c06119d0565b6108c080516107805260208101805160208160051b01806107a0828560045afa50505050506107a0516108c0526104c05115611b9b57600060051b6104e001516106205260006108c05160088111611b9b57801561014d57905b806108e0526106605160078111611b9b576108e05160028101818110611b9b57905060018103818111611b9b5790506104c051811015611b9b5760051b6104e001518160051b61068001526001810161066052506001018181186100ee575b505061078051633db06dd8610900526040806109205280610920016000610660518083528060051b60008260088111611b9b5780156101a657905b8060051b61068001518160051b602088010152600101818118610188575b50508201602001915050905081019050610600516109405250602061090061016461091c845afa6101dc573d600060003e3d6000fd5b60203d10611b9b576109009050516108e0526108e0516106405260206104a05163ed8e84f3610900526106205161092052610640516109405261060051610960526020610900606461091c845afa610239573d600060003e3d6000fd5b60203d10611b9b576109009050f361183b565b63fd9de631811861183b57608436103417611b9b57336109e0526102945661183b565b639a01e4d281186107d85760a436103417611b9b576064358060a01c611b9b576109e0525b6004358060a01c611b9b57610880526024356004016009813511611b9b57803560208160051b0180836108a0375050506000610a00526000610b2052604036610b4037610880516104a0526102ea610c80611a76565b610c808051610b405260208101805160208160051b0180610b60828560045afa5050505050610b605160018101818110611b9b579050610c80526001610b405160205260005260406000205461036257610b4051604052610b605160208160051b0180606082610b6060045afa505050610362611924565b604036610ca0376108a05115611b9b57600060051b6108c00151156104ed576108805163c6610657610d00526000610d20526020610d006024610d1c845afa6103b0573d600060003e3d6000fd5b60203d10611b9b57610d00518060a01c611b9b57610d4052610d40905051610ce0526000610ce05160205260005260406000208061088051602052600052604060002090505461048157610ce05163095ea7b3610d005261088051610d20527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610d4052803b15611b9b576000610d006044610d1c6000855af1610459573d600060003e3d6000fd5b5060016000610ce0516020526000526040600020806108805160205260005260406000209050555b610ce0516323b872dd610d005233610d205230610d40526108a05115611b9b57600060051b6108c00151610d6052803b15611b9b576000610d006064610d1c6000855af16104d4573d600060003e3d6000fd5b506108a05115611b9b57600060051b6108c00151610ca0525b6000610c805160098111611b9b57801561062457905b80610ce052610ce0516108a051811015611b9b5760051b6108c00151610d0052610a005160078111611b9b5760008160051b610a20015260018101610a005250610ce051610552576001610558565b610d0051155b1561058257610a005160078111611b9b5760008160051b610a20015260018101610a005250610619565b6001610b2052610ce05160018103818111611b9b579050610d2052610d2051610b6051811015611b9b5760051b610b800151610d4052610d40516323b872dd610d605233610d805230610da052610d0051610dc052803b15611b9b576000610d606064610d7c6000855af16105fc573d600060003e3d6000fd5b50610d0051610d2051610a0051811015611b9b5760051b610a2001525b600101818118610503575b5050610b20511561077d57610b405163b72df5de610ce052604080610d005280610d00016000610a00518083528060051b60008260088111611b9b57801561068657905b8060051b610a2001518160051b602088010152600101818118610668575b505082016020019150509050810190506000610d2052506020610ce0610164610cfc6000855af16106bc573d600060003e3d6000fd5b60203d10611b9b57610ce0905051610cc0526000610b405160205260005260406000208061088051602052600052604060002090505461077d57610b405163095ea7b3610ce05261088051610d00527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610d2052803b15611b9b576000610ce06044610cfc6000855af1610755573d600060003e3d6000fd5b5060016000610b40516020526000526040600020806108805160205260005260406000209050555b602061088051630c3e4b54610ce052610ca051610d0052610cc051610d2052604435610d40526109e051610d60526020610ce06084610cfc6000855af16107c9573d600060003e3d6000fd5b60203d10611b9b57610ce09050f35b6329ed2862811861183b57608436103417611b9b57336108c0526109855661183b565b6341b028f3811861096057606436103417611b9b576004358060a01c611b9b5760405260443580600f0b8118611b9b576060526000606051131561091e576040516371511a5e60a052602060a0600460bc845afa61085e573d600060003e3d6000fd5b60203d10611b9b5760a0518060a01c611b9b5760e05260e090505160805260805115611b9b5760405163cc2b27d760c05260243560e052600161010052602060c0604460dc845afa6108b5573d600060003e3d6000fd5b60203d10611b9b5760c090505160a052602060805163cc2b27d760c05260a05160e0526060516001810380600f0b8118611b9b57905061010052602060c0604460dc845afa610909573d600060003e3d6000fd5b60203d10611b9b5760c0905061095e5661095e565b602060405163cc2b27d760805260243560a05260605160c052602060806044609c845afa610951573d600060003e3d6000fd5b60203d10611b9b57608090505bf35b631e700cbb811861183b5760a436103417611b9b576084358060a01c611b9b576108c0525b6004358060a01c611b9b576108805260443580600f0b8118611b9b576108a052610880516323b872dd6108e0523361090052306109205260243561094052803b15611b9b5760006108e060646108fc6000855af16109e8573d600060003e3d6000fd5b5060006108e0526108a051610a57576108805163081579a561090052602435610920526108a05161094052606435610960526108c051610980526020610900608461091c6000855af1610a40573d600060003e3d6000fd5b60203d10611b9b576109009050516108e052610bc6565b60403661090037610880516104a052610a71610a40611a76565b610a4080516109005260208101805160208160051b0180610920828560045afa505050505061092051610a40526108a0516001810380600f0b8118611b9b57905061092051811015611b9b5760051b6109400151610a60526108805163081579a5610a8052602435610aa0526001610ac0526000610ae05230610b00526020610a806084610a9c6000855af1610b0c573d600060003e3d6000fd5b60203d10611b9b57610a809050516108e05261090051631a4d01d2610a80526108e051610aa0526108a0516001810380600f0b8118611b9b579050610ac052606435610ae0526020610a806064610a9c6000855af1610b70573d600060003e3d6000fd5b60203d10611b9b57610a809050516108e052610a605163a9059cbb610a80526108c051610aa0526108e051610ac052803b15611b9b576000610a806044610a9c6000855af1610bc4573d600060003e3d6000fd5b505b60206108e0f361183b565b638dae1a80811861183b57608436103417611b9b57336109e052610c195661183b565b637f3e155681186110b75760a436103417611b9b576064358060a01c611b9b576109e0525b6004358060a01c611b9b57610880526044356004016009813511611b9b57803560208160051b0180836108a037505050610880516323b872dd610a005233610a205230610a4052602435610a6052803b15611b9b576000610a006064610a1c6000855af1610c8c573d600060003e3d6000fd5b50604036610a0037610880516104a052610ca7610b40611a76565b610b408051610a005260208101805160208160051b0180610a20828560045afa5050505050610a2051610b40526000610b60526000610c805261088051635b36389c610e0052602435610e20526108a05115611b9b57600060051b6108c00151610e40526000610e60526040610e006064610e1c6000855af1610d2f573d600060003e3d6000fd5b60403d10611b9b57610e0090508051610dc0526020810151610de052506000610b405160088111611b9b578015610dc157905b80610e0052610b605160078111611b9b57610e005160028101818110611b9b57905060018103818111611b9b5790506108a051811015611b9b5760051b6108c001518160051b610b80015260018101610b605250600101818118610d62575b5050610a005163d40ddb8c610e00526040610de051610e205280610e405280610e20016000610b60518083528060051b60008260088111611b9b578015610e2257905b8060051b610b8001518160051b602088010152600101818118610e04575b50508201602001915050905081015050610140610e00610164610e1c6000855af1610e52573d600060003e3d6000fd5b60403d10611b9b57610e0051610e00016008815111611b9b57805160208160051b0180610f80828560045afa50505050610f8050506108805163c6610657610e20526000610e40526020610e206024610e3c845afa610eb6573d600060003e3d6000fd5b60203d10611b9b57610e20518060a01c611b9b57610e6052610e60905051610e0052610e005163a9059cbb610e20526109e051610e4052610dc051610e6052803b15611b9b576000610e206044610e3c6000855af1610f1a573d600060003e3d6000fd5b50610c805160088111611b9b57610dc0518160051b610ca0015260018101610c8052506000610b405160018101818110611b9b57905060098111611b9b57801561105657905b80610e2052610e2051610f725761104b565b610e205160018103818111611b9b579050610a2051811015611b9b5760051b610a400151610e0052610c805160088111611b9b57610e00516370a08231610e405230610e60526020610e406024610e5c845afa610fd4573d600060003e3d6000fd5b60203d10611b9b57610e409050518160051b610ca0015260018101610c805250610e005163a9059cbb610e40526109e051610e6052610e2051610c8051811015611b9b5760051b610ca00151610e8052803b15611b9b576000610e406044610e5c6000855af1611049573d600060003e3d6000fd5b505b600101818118610f60575b5050602080610e205280610e20016000610c80518083528060051b60008260098111611b9b5780156110a257905b8060051b610ca001518160051b602088010152600101818118611084575b50508201602001915050905081019050610e20f35b6385267a6e811861183b57608436103417611b9b57336109e0526110ff5661183b565b639941bdec811861183b5760a436103417611b9b576064358060a01c611b9b576109e0525b6004358060a01c611b9b57610880526024356004016009813511611b9b57803560208160051b0180836108a037505050604036610a0037610880516104a052611149610b40611a76565b610b408051610a005260208101805160208160051b0180610a20828560045afa5050505050610a2051610b4052610a005163ddca3f43610b80526020610b806004610b9c845afa61119f573d600060003e3d6000fd5b60203d10611b9b57610b80905051610b4051808202811583838304141715611b9b5790509050610b405160018103818111611b9b5790508060021b818160021c18611b9b5790508015611b9b5780820490509050610b6052610b6051610b60516402540be4008102816402540be400820418611b9b5790506402540be40081049050808201828110611b9b5790509050610b6052610880516323b872dd610b805233610ba05230610bc052604435610be052803b15611b9b576000610b806064610b9c6000855af1611276573d600060003e3d6000fd5b50604036610b80376108a05115611b9b57600060051b6108c00151610cc0526000610ce0526000610b405160088111611b9b57801561134157905b80610d0052610d00518060010160018110611b9b5790506108a051811015611b9b5760051b6108c00151610d2052610d20511561131557610ba05160078111611b9b57610d20518160051b610bc0015260018101610ba052506001610b8052611336565b610ba05160078111611b9b5760008160051b610bc0015260018101610ba052505b6001018181186112b1575b5050610b80511561143357610a0051633db06dd8610d0052604080610d205280610d20016000610ba0518083528060051b60008260088111611b9b5780156113a357905b8060051b610bc001518160051b602088010152600101818118611385575b505082016020019150509050810190506000610d4052506020610d00610164610d1c845afa6113d7573d600060003e3d6000fd5b60203d10611b9b57610d00905051610ce052610ce051610ce051610b6051808202811583838304141715611b9b57905090506402540be4008104905060018101818110611b9b579050808201828110611b9b5790509050610ce0525b6108805163e3103273610d2052610cc051610d4052610ce051610d6052604435610d80526020610d206064610d3c6000855af1611475573d600060003e3d6000fd5b60203d10611b9b57610d20905051610d00526108805163a9059cbb610d205233610d4052604435610d0051808203828111611b9b5790509050610d6052803b15611b9b576000610d206044610d3c6000855af16114d7573d600060003e3d6000fd5b50610b80511561177857610a0051637706db75610d2052604080610d405280610d40016000610ba0518083528060051b60008260088111611b9b57801561153857905b8060051b610bc001518160051b60208801015260010181811861151a575b50508201602001915050905081019050610ce051610d6052506020610d20610164610d3c6000855af1611570573d600060003e3d6000fd5b60203d10611b9b57610d205050610a0051610d2052610d20516370a08231610d605230610d80526020610d606024610d7c845afa6115b3573d600060003e3d6000fd5b60203d10611b9b57610d60905051610d4052610d4051156116e6576000610d205160205260005260406000208061088051602052600052604060002090505461167d57610d205163095ea7b3610d605261088051610d80527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610da052803b15611b9b576000610d606044610d7c6000855af1611655573d600060003e3d6000fd5b5060016000610d20516020526000526040600020806108805160205260005260406000209050555b610d005161088051630c3e4b54610d60526000610d8052610d4051610da0526000610dc05233610de0526020610d606084610d7c6000855af16116c5573d600060003e3d6000fd5b60203d10611b9b57610d60905051808203828111611b9b5790509050610d00525b6000610b405160088111611b9b57801561177557905b80610d6052610d6051610a2051811015611b9b5760051b610a40015163a9059cbb610d80526109e051610da052610d6051610ba051811015611b9b5760051b610bc00151610dc052803b15611b9b576000610d806044610d9c6000855af1611769573d600060003e3d6000fd5b506001018181186116fc575b50505b6108a05115611b9b57600060051b6108c0015115611834576108805163c6610657610d40526000610d60526020610d406024610d5c845afa6117bf573d600060003e3d6000fd5b60203d10611b9b57610d40518060a01c611b9b57610d8052610d80905051610d2052610d205163a9059cbb610d40526109e051610d60526108a05115611b9b57600060051b6108c00151610d8052803b15611b9b576000610d406044610d5c6000855af1611832573d600060003e3d6000fd5b505b6020610d00f35b60006000fd5b6040516329357750608052602060806004609c845afa611866573d600060003e3d6000fd5b60203d10611b9b5760809050516060526000608052600060605160088111611b9b57801561190957905b806101a05260805160078111611b9b5760405163c66106576101c0526101a0516101e05260206101c060246101dc845afa6118d0573d600060003e3d6000fd5b60203d10611b9b576101c0518060a01c611b9b57610200526102009050518160051b60a001526001810160805250600101818118611890575b505060805160208160051b01808382608060045afa50505050565b600060605160088111611b9b5780156119b957905b806101805261018051606051811015611b9b5760051b6080015163095ea7b36101a0526040516101c0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e052803b15611b9b5760006101a060446101bc6000855af16119ad573d600060003e3d6000fd5b50600101818118611939575b505060016001604051602052600052604060002055565b610220516371511a5e610260526020610260600461027c845afa6119f9573d600060003e3d6000fd5b60203d10611b9b57610260518060a01c611b9b576102a0526102a0905051610240526102405115611b9b5761024051604052611a36610380611841565b610380805160208160051b0180610260828560045afa505050506102405181526102605160208160051b016020830181818361026060045afa5050505050565b60026104a05160205260005260406000206000600a905b808301548160051b6104c00152600101818118611a8d575050506104c051611b7457604036610600376104a05161022052611ac96107406119d0565b61074080516106005260208101805160208160051b0180610620828560045afa505050505060026104a05160205260005260406000206106005181556106205160208160051b0160018301600082601f0160051c60098111611b9b578015611b4557905b8060051b610620015181840155600101818118611b2d575b5050505050506106005181526106205160208160051b016020830181818361062060045afa5050505050611b99565b6104c05181526104e05160208160051b01602083018181836104e060045afa50505050505b565b600080fd0bd1024c026f07fb10da001a0bf4183b84191bb0811000a16576797065728300030a0014
Deployed Bytecode
0x60003560e01c60026007821660011b611ba001601e39600051565b63f558454d811861183b57608436103417611b9b576004358060a01c611b9b576104a0526024356004016009813511611b9b57803560208160051b0180836104c0375050506044358060011c611b9b57610600526060366106203760006107805260006107a0526104a051610220526100946108c06119d0565b6108c080516107805260208101805160208160051b01806107a0828560045afa50505050506107a0516108c0526104c05115611b9b57600060051b6104e001516106205260006108c05160088111611b9b57801561014d57905b806108e0526106605160078111611b9b576108e05160028101818110611b9b57905060018103818111611b9b5790506104c051811015611b9b5760051b6104e001518160051b61068001526001810161066052506001018181186100ee575b505061078051633db06dd8610900526040806109205280610920016000610660518083528060051b60008260088111611b9b5780156101a657905b8060051b61068001518160051b602088010152600101818118610188575b50508201602001915050905081019050610600516109405250602061090061016461091c845afa6101dc573d600060003e3d6000fd5b60203d10611b9b576109009050516108e0526108e0516106405260206104a05163ed8e84f3610900526106205161092052610640516109405261060051610960526020610900606461091c845afa610239573d600060003e3d6000fd5b60203d10611b9b576109009050f361183b565b63fd9de631811861183b57608436103417611b9b57336109e0526102945661183b565b639a01e4d281186107d85760a436103417611b9b576064358060a01c611b9b576109e0525b6004358060a01c611b9b57610880526024356004016009813511611b9b57803560208160051b0180836108a0375050506000610a00526000610b2052604036610b4037610880516104a0526102ea610c80611a76565b610c808051610b405260208101805160208160051b0180610b60828560045afa5050505050610b605160018101818110611b9b579050610c80526001610b405160205260005260406000205461036257610b4051604052610b605160208160051b0180606082610b6060045afa505050610362611924565b604036610ca0376108a05115611b9b57600060051b6108c00151156104ed576108805163c6610657610d00526000610d20526020610d006024610d1c845afa6103b0573d600060003e3d6000fd5b60203d10611b9b57610d00518060a01c611b9b57610d4052610d40905051610ce0526000610ce05160205260005260406000208061088051602052600052604060002090505461048157610ce05163095ea7b3610d005261088051610d20527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610d4052803b15611b9b576000610d006044610d1c6000855af1610459573d600060003e3d6000fd5b5060016000610ce0516020526000526040600020806108805160205260005260406000209050555b610ce0516323b872dd610d005233610d205230610d40526108a05115611b9b57600060051b6108c00151610d6052803b15611b9b576000610d006064610d1c6000855af16104d4573d600060003e3d6000fd5b506108a05115611b9b57600060051b6108c00151610ca0525b6000610c805160098111611b9b57801561062457905b80610ce052610ce0516108a051811015611b9b5760051b6108c00151610d0052610a005160078111611b9b5760008160051b610a20015260018101610a005250610ce051610552576001610558565b610d0051155b1561058257610a005160078111611b9b5760008160051b610a20015260018101610a005250610619565b6001610b2052610ce05160018103818111611b9b579050610d2052610d2051610b6051811015611b9b5760051b610b800151610d4052610d40516323b872dd610d605233610d805230610da052610d0051610dc052803b15611b9b576000610d606064610d7c6000855af16105fc573d600060003e3d6000fd5b50610d0051610d2051610a0051811015611b9b5760051b610a2001525b600101818118610503575b5050610b20511561077d57610b405163b72df5de610ce052604080610d005280610d00016000610a00518083528060051b60008260088111611b9b57801561068657905b8060051b610a2001518160051b602088010152600101818118610668575b505082016020019150509050810190506000610d2052506020610ce0610164610cfc6000855af16106bc573d600060003e3d6000fd5b60203d10611b9b57610ce0905051610cc0526000610b405160205260005260406000208061088051602052600052604060002090505461077d57610b405163095ea7b3610ce05261088051610d00527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610d2052803b15611b9b576000610ce06044610cfc6000855af1610755573d600060003e3d6000fd5b5060016000610b40516020526000526040600020806108805160205260005260406000209050555b602061088051630c3e4b54610ce052610ca051610d0052610cc051610d2052604435610d40526109e051610d60526020610ce06084610cfc6000855af16107c9573d600060003e3d6000fd5b60203d10611b9b57610ce09050f35b6329ed2862811861183b57608436103417611b9b57336108c0526109855661183b565b6341b028f3811861096057606436103417611b9b576004358060a01c611b9b5760405260443580600f0b8118611b9b576060526000606051131561091e576040516371511a5e60a052602060a0600460bc845afa61085e573d600060003e3d6000fd5b60203d10611b9b5760a0518060a01c611b9b5760e05260e090505160805260805115611b9b5760405163cc2b27d760c05260243560e052600161010052602060c0604460dc845afa6108b5573d600060003e3d6000fd5b60203d10611b9b5760c090505160a052602060805163cc2b27d760c05260a05160e0526060516001810380600f0b8118611b9b57905061010052602060c0604460dc845afa610909573d600060003e3d6000fd5b60203d10611b9b5760c0905061095e5661095e565b602060405163cc2b27d760805260243560a05260605160c052602060806044609c845afa610951573d600060003e3d6000fd5b60203d10611b9b57608090505bf35b631e700cbb811861183b5760a436103417611b9b576084358060a01c611b9b576108c0525b6004358060a01c611b9b576108805260443580600f0b8118611b9b576108a052610880516323b872dd6108e0523361090052306109205260243561094052803b15611b9b5760006108e060646108fc6000855af16109e8573d600060003e3d6000fd5b5060006108e0526108a051610a57576108805163081579a561090052602435610920526108a05161094052606435610960526108c051610980526020610900608461091c6000855af1610a40573d600060003e3d6000fd5b60203d10611b9b576109009050516108e052610bc6565b60403661090037610880516104a052610a71610a40611a76565b610a4080516109005260208101805160208160051b0180610920828560045afa505050505061092051610a40526108a0516001810380600f0b8118611b9b57905061092051811015611b9b5760051b6109400151610a60526108805163081579a5610a8052602435610aa0526001610ac0526000610ae05230610b00526020610a806084610a9c6000855af1610b0c573d600060003e3d6000fd5b60203d10611b9b57610a809050516108e05261090051631a4d01d2610a80526108e051610aa0526108a0516001810380600f0b8118611b9b579050610ac052606435610ae0526020610a806064610a9c6000855af1610b70573d600060003e3d6000fd5b60203d10611b9b57610a809050516108e052610a605163a9059cbb610a80526108c051610aa0526108e051610ac052803b15611b9b576000610a806044610a9c6000855af1610bc4573d600060003e3d6000fd5b505b60206108e0f361183b565b638dae1a80811861183b57608436103417611b9b57336109e052610c195661183b565b637f3e155681186110b75760a436103417611b9b576064358060a01c611b9b576109e0525b6004358060a01c611b9b57610880526044356004016009813511611b9b57803560208160051b0180836108a037505050610880516323b872dd610a005233610a205230610a4052602435610a6052803b15611b9b576000610a006064610a1c6000855af1610c8c573d600060003e3d6000fd5b50604036610a0037610880516104a052610ca7610b40611a76565b610b408051610a005260208101805160208160051b0180610a20828560045afa5050505050610a2051610b40526000610b60526000610c805261088051635b36389c610e0052602435610e20526108a05115611b9b57600060051b6108c00151610e40526000610e60526040610e006064610e1c6000855af1610d2f573d600060003e3d6000fd5b60403d10611b9b57610e0090508051610dc0526020810151610de052506000610b405160088111611b9b578015610dc157905b80610e0052610b605160078111611b9b57610e005160028101818110611b9b57905060018103818111611b9b5790506108a051811015611b9b5760051b6108c001518160051b610b80015260018101610b605250600101818118610d62575b5050610a005163d40ddb8c610e00526040610de051610e205280610e405280610e20016000610b60518083528060051b60008260088111611b9b578015610e2257905b8060051b610b8001518160051b602088010152600101818118610e04575b50508201602001915050905081015050610140610e00610164610e1c6000855af1610e52573d600060003e3d6000fd5b60403d10611b9b57610e0051610e00016008815111611b9b57805160208160051b0180610f80828560045afa50505050610f8050506108805163c6610657610e20526000610e40526020610e206024610e3c845afa610eb6573d600060003e3d6000fd5b60203d10611b9b57610e20518060a01c611b9b57610e6052610e60905051610e0052610e005163a9059cbb610e20526109e051610e4052610dc051610e6052803b15611b9b576000610e206044610e3c6000855af1610f1a573d600060003e3d6000fd5b50610c805160088111611b9b57610dc0518160051b610ca0015260018101610c8052506000610b405160018101818110611b9b57905060098111611b9b57801561105657905b80610e2052610e2051610f725761104b565b610e205160018103818111611b9b579050610a2051811015611b9b5760051b610a400151610e0052610c805160088111611b9b57610e00516370a08231610e405230610e60526020610e406024610e5c845afa610fd4573d600060003e3d6000fd5b60203d10611b9b57610e409050518160051b610ca0015260018101610c805250610e005163a9059cbb610e40526109e051610e6052610e2051610c8051811015611b9b5760051b610ca00151610e8052803b15611b9b576000610e406044610e5c6000855af1611049573d600060003e3d6000fd5b505b600101818118610f60575b5050602080610e205280610e20016000610c80518083528060051b60008260098111611b9b5780156110a257905b8060051b610ca001518160051b602088010152600101818118611084575b50508201602001915050905081019050610e20f35b6385267a6e811861183b57608436103417611b9b57336109e0526110ff5661183b565b639941bdec811861183b5760a436103417611b9b576064358060a01c611b9b576109e0525b6004358060a01c611b9b57610880526024356004016009813511611b9b57803560208160051b0180836108a037505050604036610a0037610880516104a052611149610b40611a76565b610b408051610a005260208101805160208160051b0180610a20828560045afa5050505050610a2051610b4052610a005163ddca3f43610b80526020610b806004610b9c845afa61119f573d600060003e3d6000fd5b60203d10611b9b57610b80905051610b4051808202811583838304141715611b9b5790509050610b405160018103818111611b9b5790508060021b818160021c18611b9b5790508015611b9b5780820490509050610b6052610b6051610b60516402540be4008102816402540be400820418611b9b5790506402540be40081049050808201828110611b9b5790509050610b6052610880516323b872dd610b805233610ba05230610bc052604435610be052803b15611b9b576000610b806064610b9c6000855af1611276573d600060003e3d6000fd5b50604036610b80376108a05115611b9b57600060051b6108c00151610cc0526000610ce0526000610b405160088111611b9b57801561134157905b80610d0052610d00518060010160018110611b9b5790506108a051811015611b9b5760051b6108c00151610d2052610d20511561131557610ba05160078111611b9b57610d20518160051b610bc0015260018101610ba052506001610b8052611336565b610ba05160078111611b9b5760008160051b610bc0015260018101610ba052505b6001018181186112b1575b5050610b80511561143357610a0051633db06dd8610d0052604080610d205280610d20016000610ba0518083528060051b60008260088111611b9b5780156113a357905b8060051b610bc001518160051b602088010152600101818118611385575b505082016020019150509050810190506000610d4052506020610d00610164610d1c845afa6113d7573d600060003e3d6000fd5b60203d10611b9b57610d00905051610ce052610ce051610ce051610b6051808202811583838304141715611b9b57905090506402540be4008104905060018101818110611b9b579050808201828110611b9b5790509050610ce0525b6108805163e3103273610d2052610cc051610d4052610ce051610d6052604435610d80526020610d206064610d3c6000855af1611475573d600060003e3d6000fd5b60203d10611b9b57610d20905051610d00526108805163a9059cbb610d205233610d4052604435610d0051808203828111611b9b5790509050610d6052803b15611b9b576000610d206044610d3c6000855af16114d7573d600060003e3d6000fd5b50610b80511561177857610a0051637706db75610d2052604080610d405280610d40016000610ba0518083528060051b60008260088111611b9b57801561153857905b8060051b610bc001518160051b60208801015260010181811861151a575b50508201602001915050905081019050610ce051610d6052506020610d20610164610d3c6000855af1611570573d600060003e3d6000fd5b60203d10611b9b57610d205050610a0051610d2052610d20516370a08231610d605230610d80526020610d606024610d7c845afa6115b3573d600060003e3d6000fd5b60203d10611b9b57610d60905051610d4052610d4051156116e6576000610d205160205260005260406000208061088051602052600052604060002090505461167d57610d205163095ea7b3610d605261088051610d80527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610da052803b15611b9b576000610d606044610d7c6000855af1611655573d600060003e3d6000fd5b5060016000610d20516020526000526040600020806108805160205260005260406000209050555b610d005161088051630c3e4b54610d60526000610d8052610d4051610da0526000610dc05233610de0526020610d606084610d7c6000855af16116c5573d600060003e3d6000fd5b60203d10611b9b57610d60905051808203828111611b9b5790509050610d00525b6000610b405160088111611b9b57801561177557905b80610d6052610d6051610a2051811015611b9b5760051b610a40015163a9059cbb610d80526109e051610da052610d6051610ba051811015611b9b5760051b610bc00151610dc052803b15611b9b576000610d806044610d9c6000855af1611769573d600060003e3d6000fd5b506001018181186116fc575b50505b6108a05115611b9b57600060051b6108c0015115611834576108805163c6610657610d40526000610d60526020610d406024610d5c845afa6117bf573d600060003e3d6000fd5b60203d10611b9b57610d40518060a01c611b9b57610d8052610d80905051610d2052610d205163a9059cbb610d40526109e051610d60526108a05115611b9b57600060051b6108c00151610d8052803b15611b9b576000610d406044610d5c6000855af1611832573d600060003e3d6000fd5b505b6020610d00f35b60006000fd5b6040516329357750608052602060806004609c845afa611866573d600060003e3d6000fd5b60203d10611b9b5760809050516060526000608052600060605160088111611b9b57801561190957905b806101a05260805160078111611b9b5760405163c66106576101c0526101a0516101e05260206101c060246101dc845afa6118d0573d600060003e3d6000fd5b60203d10611b9b576101c0518060a01c611b9b57610200526102009050518160051b60a001526001810160805250600101818118611890575b505060805160208160051b01808382608060045afa50505050565b600060605160088111611b9b5780156119b957905b806101805261018051606051811015611b9b5760051b6080015163095ea7b36101a0526040516101c0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e052803b15611b9b5760006101a060446101bc6000855af16119ad573d600060003e3d6000fd5b50600101818118611939575b505060016001604051602052600052604060002055565b610220516371511a5e610260526020610260600461027c845afa6119f9573d600060003e3d6000fd5b60203d10611b9b57610260518060a01c611b9b576102a0526102a0905051610240526102405115611b9b5761024051604052611a36610380611841565b610380805160208160051b0180610260828560045afa505050506102405181526102605160208160051b016020830181818361026060045afa5050505050565b60026104a05160205260005260406000206000600a905b808301548160051b6104c00152600101818118611a8d575050506104c051611b7457604036610600376104a05161022052611ac96107406119d0565b61074080516106005260208101805160208160051b0180610620828560045afa505050505060026104a05160205260005260406000206106005181556106205160208160051b0160018301600082601f0160051c60098111611b9b578015611b4557905b8060051b610620015181840155600101818118611b2d575b5050505050506106005181526106205160208160051b016020830181818361062060045afa5050505050611b99565b6104c05181526104e05160208160051b01602083018181836104e060045afa50505050505b565b600080fd0bd1024c026f07fb10da001a0bf4183b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.