Overview
ETH Balance
ETH Value
$0.00Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
CurveMetaZap
Compiler Version
vyper:0.3.10
Contract Source Code (Vyper language format)
# pragma version 0.3.10
# pragma evm-version paris
"""
@title CurveMetaZap
@custom:version 1.0.0
@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.
"""
version: public(constant(String[8])) = "1.0.0"
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_amountContract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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"}]},{"stateMutability":"view","type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string"}]}]Contract Creation Code
611c3d61001161000039611c3d610000f360003560e01c6002600b820660011b611c2701601e39600051565b6354fd4d5081186118c25734611c225760208060805260056040527f312e302e3000000000000000000000000000000000000000000000000000000060605260408160800181518152602082015160208201528051806020830101601f82600003163682375050601f19601f8251602001011690509050810190506080f36118c2565b63f558454d81186102cb57608436103417611c22576004358060a01c611c22576104a0526024356004016009813511611c2257803560208160051b0180836104c0375050506044358060011c611c2257610600526060366106203760006107805260006107a0526104a051610220526101176108c0611a57565b6108c080516107805260208101805160208160051b01806107a0828560045afa50505050506107a0516108c0526104c05115611c2257600060051b6104e001516106205260006108c05160088111611c225780156101d057905b806108e0526106605160078111611c22576108e05160028101818110611c2257905060018103818111611c225790506104c051811015611c225760051b6104e001518160051b6106800152600181016106605250600101818118610171575b505061078051633db06dd8610900526040806109205280610920016000610660518083528060051b60008260088111611c2257801561022957905b8060051b61068001518160051b60208801015260010181811861020b575b50508201602001915050905081019050610600516109405250602061090061016461091c845afa61025f573d600060003e3d6000fd5b60203d10611c22576109009050516108e0526108e0516106405260206104a05163ed8e84f3610900526106205161092052610640516109405261060051610960526020610900606461091c845afa6102bc573d600060003e3d6000fd5b60203d10611c22576109009050f35b638dae1a8081186118c257608436103417611c2257336109e052610c79566118c2565b63fd9de63181186118c257608436103417611c2257336109e052610336566118c2565b639a01e4d281186118c25760a436103417611c22576064358060a01c611c22576109e0525b6004358060a01c611c2257610880526024356004016009813511611c2257803560208160051b0180836108a0375050506000610a00526000610b2052604036610b4037610880516104a05261038c610c80611afd565b610c808051610b405260208101805160208160051b0180610b60828560045afa5050505050610b605160018101818110611c22579050610c80526001610b405160205260005260406000205461040457610b4051604052610b605160208160051b0180606082610b6060045afa5050506104046119ab565b604036610ca0376108a05115611c2257600060051b6108c001511561058f576108805163c6610657610d00526000610d20526020610d006024610d1c845afa610452573d600060003e3d6000fd5b60203d10611c2257610d00518060a01c611c2257610d4052610d40905051610ce0526000610ce05160205260005260406000208061088051602052600052604060002090505461052357610ce05163095ea7b3610d005261088051610d20527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610d4052803b15611c22576000610d006044610d1c6000855af16104fb573d600060003e3d6000fd5b5060016000610ce0516020526000526040600020806108805160205260005260406000209050555b610ce0516323b872dd610d005233610d205230610d40526108a05115611c2257600060051b6108c00151610d6052803b15611c22576000610d006064610d1c6000855af1610576573d600060003e3d6000fd5b506108a05115611c2257600060051b6108c00151610ca0525b6000610c805160098111611c225780156106c657905b80610ce052610ce0516108a051811015611c225760051b6108c00151610d0052610a005160078111611c225760008160051b610a20015260018101610a005250610ce0516105f45760016105fa565b610d0051155b1561062457610a005160078111611c225760008160051b610a20015260018101610a0052506106bb565b6001610b2052610ce05160018103818111611c22579050610d2052610d2051610b6051811015611c225760051b610b800151610d4052610d40516323b872dd610d605233610d805230610da052610d0051610dc052803b15611c22576000610d606064610d7c6000855af161069e573d600060003e3d6000fd5b50610d0051610d2051610a0051811015611c225760051b610a2001525b6001018181186105a5575b5050610b20511561081f57610b405163b72df5de610ce052604080610d005280610d00016000610a00518083528060051b60008260088111611c2257801561072857905b8060051b610a2001518160051b60208801015260010181811861070a575b505082016020019150509050810190506000610d2052506020610ce0610164610cfc6000855af161075e573d600060003e3d6000fd5b60203d10611c2257610ce0905051610cc0526000610b405160205260005260406000208061088051602052600052604060002090505461081f57610b405163095ea7b3610ce05261088051610d00527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610d2052803b15611c22576000610ce06044610cfc6000855af16107f7573d600060003e3d6000fd5b5060016000610b40516020526000526040600020806108805160205260005260406000209050555b602061088051630c3e4b54610ce052610ca051610d0052610cc051610d2052604435610d40526109e051610d60526020610ce06084610cfc6000855af161086b573d600060003e3d6000fd5b60203d10611c2257610ce09050f36118c2565b6341b028f381186109e357606436103417611c22576004358060a01c611c225760405260443580600f0b8118611c2257606052600060605113156109a1576040516371511a5e60a052602060a0600460bc845afa6108e1573d600060003e3d6000fd5b60203d10611c225760a0518060a01c611c225760e05260e090505160805260805115611c225760405163cc2b27d760c05260243560e052600161010052602060c0604460dc845afa610938573d600060003e3d6000fd5b60203d10611c225760c090505160a052602060805163cc2b27d760c05260a05160e0526060516001810380600f0b8118611c2257905061010052602060c0604460dc845afa61098c573d600060003e3d6000fd5b60203d10611c225760c090506109e1566109e1565b602060405163cc2b27d760805260243560a05260605160c052602060806044609c845afa6109d4573d600060003e3d6000fd5b60203d10611c2257608090505bf35b631e700cbb81186118c25760a436103417611c22576084358060a01c611c22576108c0525b6004358060a01c611c22576108805260443580600f0b8118611c22576108a052610880516323b872dd6108e0523361090052306109205260243561094052803b15611c225760006108e060646108fc6000855af1610a6b573d600060003e3d6000fd5b5060006108e0526108a051610ada576108805163081579a561090052602435610920526108a05161094052606435610960526108c051610980526020610900608461091c6000855af1610ac3573d600060003e3d6000fd5b60203d10611c22576109009050516108e052610c49565b60403661090037610880516104a052610af4610a40611afd565b610a4080516109005260208101805160208160051b0180610920828560045afa505050505061092051610a40526108a0516001810380600f0b8118611c2257905061092051811015611c225760051b6109400151610a60526108805163081579a5610a8052602435610aa0526001610ac0526000610ae05230610b00526020610a806084610a9c6000855af1610b8f573d600060003e3d6000fd5b60203d10611c2257610a809050516108e05261090051631a4d01d2610a80526108e051610aa0526108a0516001810380600f0b8118611c22579050610ac052606435610ae0526020610a806064610a9c6000855af1610bf3573d600060003e3d6000fd5b60203d10611c2257610a809050516108e052610a605163a9059cbb610a80526108c051610aa0526108e051610ac052803b15611c22576000610a806044610a9c6000855af1610c47573d600060003e3d6000fd5b505b60206108e0f36118c2565b637f3e155681186118c25760a436103417611c22576064358060a01c611c22576109e0525b6004358060a01c611c2257610880526044356004016009813511611c2257803560208160051b0180836108a037505050610880516323b872dd610a005233610a205230610a4052602435610a6052803b15611c22576000610a006064610a1c6000855af1610cec573d600060003e3d6000fd5b50604036610a0037610880516104a052610d07610b40611afd565b610b408051610a005260208101805160208160051b0180610a20828560045afa5050505050610a2051610b40526000610b60526000610c805261088051635b36389c610e0052602435610e20526108a05115611c2257600060051b6108c00151610e40526000610e60526040610e006064610e1c6000855af1610d8f573d600060003e3d6000fd5b60403d10611c2257610e0090508051610dc0526020810151610de052506000610b405160088111611c22578015610e2157905b80610e0052610b605160078111611c2257610e005160028101818110611c2257905060018103818111611c225790506108a051811015611c225760051b6108c001518160051b610b80015260018101610b605250600101818118610dc2575b5050610a005163d40ddb8c610e00526040610de051610e205280610e405280610e20016000610b60518083528060051b60008260088111611c22578015610e8257905b8060051b610b8001518160051b602088010152600101818118610e64575b50508201602001915050905081015050610140610e00610164610e1c6000855af1610eb2573d600060003e3d6000fd5b60403d10611c2257610e0051610e00016008815111611c2257805160208160051b0180610f80828560045afa50505050610f8050506108805163c6610657610e20526000610e40526020610e206024610e3c845afa610f16573d600060003e3d6000fd5b60203d10611c2257610e20518060a01c611c2257610e6052610e60905051610e0052610e005163a9059cbb610e20526109e051610e4052610dc051610e6052803b15611c22576000610e206044610e3c6000855af1610f7a573d600060003e3d6000fd5b50610c805160088111611c2257610dc0518160051b610ca0015260018101610c8052506000610b405160018101818110611c2257905060098111611c225780156110b657905b80610e2052610e2051610fd2576110ab565b610e205160018103818111611c22579050610a2051811015611c225760051b610a400151610e0052610c805160088111611c2257610e00516370a08231610e405230610e60526020610e406024610e5c845afa611034573d600060003e3d6000fd5b60203d10611c2257610e409050518160051b610ca0015260018101610c805250610e005163a9059cbb610e40526109e051610e6052610e2051610c8051811015611c225760051b610ca00151610e8052803b15611c22576000610e406044610e5c6000855af16110a9573d600060003e3d6000fd5b505b600101818118610fc0575b5050602080610e205280610e20016000610c80518083528060051b60008260098111611c2257801561110257905b8060051b610ca001518160051b6020880101526001018181186110e4575b50508201602001915050905081019050610e20f36118c2565b6329ed286281186118c257608436103417611c2257336108c052610a08566118c2565b6385267a6e81186118c257608436103417611c2257336109e052611186566118c2565b639941bdec81186118c25760a436103417611c22576064358060a01c611c22576109e0525b6004358060a01c611c2257610880526024356004016009813511611c2257803560208160051b0180836108a037505050604036610a0037610880516104a0526111d0610b40611afd565b610b408051610a005260208101805160208160051b0180610a20828560045afa5050505050610a2051610b4052610a005163ddca3f43610b80526020610b806004610b9c845afa611226573d600060003e3d6000fd5b60203d10611c2257610b80905051610b4051808202811583838304141715611c225790509050610b405160018103818111611c225790508060021b818160021c18611c225790508015611c225780820490509050610b6052610b6051610b60516402540be4008102816402540be400820418611c225790506402540be40081049050808201828110611c225790509050610b6052610880516323b872dd610b805233610ba05230610bc052604435610be052803b15611c22576000610b806064610b9c6000855af16112fd573d600060003e3d6000fd5b50604036610b80376108a05115611c2257600060051b6108c00151610cc0526000610ce0526000610b405160088111611c225780156113c857905b80610d0052610d00518060010160018110611c225790506108a051811015611c225760051b6108c00151610d2052610d20511561139c57610ba05160078111611c2257610d20518160051b610bc0015260018101610ba052506001610b80526113bd565b610ba05160078111611c225760008160051b610bc0015260018101610ba052505b600101818118611338575b5050610b8051156114ba57610a0051633db06dd8610d0052604080610d205280610d20016000610ba0518083528060051b60008260088111611c2257801561142a57905b8060051b610bc001518160051b60208801015260010181811861140c575b505082016020019150509050810190506000610d4052506020610d00610164610d1c845afa61145e573d600060003e3d6000fd5b60203d10611c2257610d00905051610ce052610ce051610ce051610b6051808202811583838304141715611c2257905090506402540be4008104905060018101818110611c22579050808201828110611c225790509050610ce0525b6108805163e3103273610d2052610cc051610d4052610ce051610d6052604435610d80526020610d206064610d3c6000855af16114fc573d600060003e3d6000fd5b60203d10611c2257610d20905051610d00526108805163a9059cbb610d205233610d4052604435610d0051808203828111611c225790509050610d6052803b15611c22576000610d206044610d3c6000855af161155e573d600060003e3d6000fd5b50610b8051156117ff57610a0051637706db75610d2052604080610d405280610d40016000610ba0518083528060051b60008260088111611c225780156115bf57905b8060051b610bc001518160051b6020880101526001018181186115a1575b50508201602001915050905081019050610ce051610d6052506020610d20610164610d3c6000855af16115f7573d600060003e3d6000fd5b60203d10611c2257610d205050610a0051610d2052610d20516370a08231610d605230610d80526020610d606024610d7c845afa61163a573d600060003e3d6000fd5b60203d10611c2257610d60905051610d4052610d40511561176d576000610d205160205260005260406000208061088051602052600052604060002090505461170457610d205163095ea7b3610d605261088051610d80527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610da052803b15611c22576000610d606044610d7c6000855af16116dc573d600060003e3d6000fd5b5060016000610d20516020526000526040600020806108805160205260005260406000209050555b610d005161088051630c3e4b54610d60526000610d8052610d4051610da0526000610dc05233610de0526020610d606084610d7c6000855af161174c573d600060003e3d6000fd5b60203d10611c2257610d60905051808203828111611c225790509050610d00525b6000610b405160088111611c225780156117fc57905b80610d6052610d6051610a2051811015611c225760051b610a40015163a9059cbb610d80526109e051610da052610d6051610ba051811015611c225760051b610bc00151610dc052803b15611c22576000610d806044610d9c6000855af16117f0573d600060003e3d6000fd5b50600101818118611783575b50505b6108a05115611c2257600060051b6108c00151156118bb576108805163c6610657610d40526000610d60526020610d406024610d5c845afa611846573d600060003e3d6000fd5b60203d10611c2257610d40518060a01c611c2257610d8052610d80905051610d2052610d205163a9059cbb610d40526109e051610d60526108a05115611c2257600060051b6108c00151610d8052803b15611c22576000610d406044610d5c6000855af16118b9573d600060003e3d6000fd5b505b6020610d00f35b60006000fd5b6040516329357750608052602060806004609c845afa6118ed573d600060003e3d6000fd5b60203d10611c225760809050516060526000608052600060605160088111611c2257801561199057905b806101a05260805160078111611c225760405163c66106576101c0526101a0516101e05260206101c060246101dc845afa611957573d600060003e3d6000fd5b60203d10611c22576101c0518060a01c611c2257610200526102009050518160051b60a001526001810160805250600101818118611917575b505060805160208160051b01808382608060045afa50505050565b600060605160088111611c22578015611a4057905b806101805261018051606051811015611c225760051b6080015163095ea7b36101a0526040516101c0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e052803b15611c225760006101a060446101bc6000855af1611a34573d600060003e3d6000fd5b506001018181186119c0575b505060016001604051602052600052604060002055565b610220516371511a5e610260526020610260600461027c845afa611a80573d600060003e3d6000fd5b60203d10611c2257610260518060a01c611c22576102a0526102a0905051610240526102405115611c225761024051604052611abd6103806118c8565b610380805160208160051b0180610260828560045afa505050506102405181526102605160208160051b016020830181818361026060045afa5050505050565b60026104a05160205260005260406000206000600a905b808301548160051b6104c00152600101818118611b14575050506104c051611bfb57604036610600376104a05161022052611b50610740611a57565b61074080516106005260208101805160208160051b0180610620828560045afa505050505060026104a05160205260005260406000206106005181556106205160208160051b0160018301600082601f0160051c60098111611c22578015611bcc57905b8060051b610620015181840155600101818118611bb4575b5050505050506106005181526106205160208160051b016020830181818361062060045afa5050505050611c20565b6104c05181526104e05160208160051b01602083018181836104e060045afa50505050505b565b600080fd0c540311009d18c2111b001a087e02ee1161113e18c284191c3d811600a16576797065728300030a0014
Deployed Bytecode
0x60003560e01c6002600b820660011b611c2701601e39600051565b6354fd4d5081186118c25734611c225760208060805260056040527f312e302e3000000000000000000000000000000000000000000000000000000060605260408160800181518152602082015160208201528051806020830101601f82600003163682375050601f19601f8251602001011690509050810190506080f36118c2565b63f558454d81186102cb57608436103417611c22576004358060a01c611c22576104a0526024356004016009813511611c2257803560208160051b0180836104c0375050506044358060011c611c2257610600526060366106203760006107805260006107a0526104a051610220526101176108c0611a57565b6108c080516107805260208101805160208160051b01806107a0828560045afa50505050506107a0516108c0526104c05115611c2257600060051b6104e001516106205260006108c05160088111611c225780156101d057905b806108e0526106605160078111611c22576108e05160028101818110611c2257905060018103818111611c225790506104c051811015611c225760051b6104e001518160051b6106800152600181016106605250600101818118610171575b505061078051633db06dd8610900526040806109205280610920016000610660518083528060051b60008260088111611c2257801561022957905b8060051b61068001518160051b60208801015260010181811861020b575b50508201602001915050905081019050610600516109405250602061090061016461091c845afa61025f573d600060003e3d6000fd5b60203d10611c22576109009050516108e0526108e0516106405260206104a05163ed8e84f3610900526106205161092052610640516109405261060051610960526020610900606461091c845afa6102bc573d600060003e3d6000fd5b60203d10611c22576109009050f35b638dae1a8081186118c257608436103417611c2257336109e052610c79566118c2565b63fd9de63181186118c257608436103417611c2257336109e052610336566118c2565b639a01e4d281186118c25760a436103417611c22576064358060a01c611c22576109e0525b6004358060a01c611c2257610880526024356004016009813511611c2257803560208160051b0180836108a0375050506000610a00526000610b2052604036610b4037610880516104a05261038c610c80611afd565b610c808051610b405260208101805160208160051b0180610b60828560045afa5050505050610b605160018101818110611c22579050610c80526001610b405160205260005260406000205461040457610b4051604052610b605160208160051b0180606082610b6060045afa5050506104046119ab565b604036610ca0376108a05115611c2257600060051b6108c001511561058f576108805163c6610657610d00526000610d20526020610d006024610d1c845afa610452573d600060003e3d6000fd5b60203d10611c2257610d00518060a01c611c2257610d4052610d40905051610ce0526000610ce05160205260005260406000208061088051602052600052604060002090505461052357610ce05163095ea7b3610d005261088051610d20527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610d4052803b15611c22576000610d006044610d1c6000855af16104fb573d600060003e3d6000fd5b5060016000610ce0516020526000526040600020806108805160205260005260406000209050555b610ce0516323b872dd610d005233610d205230610d40526108a05115611c2257600060051b6108c00151610d6052803b15611c22576000610d006064610d1c6000855af1610576573d600060003e3d6000fd5b506108a05115611c2257600060051b6108c00151610ca0525b6000610c805160098111611c225780156106c657905b80610ce052610ce0516108a051811015611c225760051b6108c00151610d0052610a005160078111611c225760008160051b610a20015260018101610a005250610ce0516105f45760016105fa565b610d0051155b1561062457610a005160078111611c225760008160051b610a20015260018101610a0052506106bb565b6001610b2052610ce05160018103818111611c22579050610d2052610d2051610b6051811015611c225760051b610b800151610d4052610d40516323b872dd610d605233610d805230610da052610d0051610dc052803b15611c22576000610d606064610d7c6000855af161069e573d600060003e3d6000fd5b50610d0051610d2051610a0051811015611c225760051b610a2001525b6001018181186105a5575b5050610b20511561081f57610b405163b72df5de610ce052604080610d005280610d00016000610a00518083528060051b60008260088111611c2257801561072857905b8060051b610a2001518160051b60208801015260010181811861070a575b505082016020019150509050810190506000610d2052506020610ce0610164610cfc6000855af161075e573d600060003e3d6000fd5b60203d10611c2257610ce0905051610cc0526000610b405160205260005260406000208061088051602052600052604060002090505461081f57610b405163095ea7b3610ce05261088051610d00527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610d2052803b15611c22576000610ce06044610cfc6000855af16107f7573d600060003e3d6000fd5b5060016000610b40516020526000526040600020806108805160205260005260406000209050555b602061088051630c3e4b54610ce052610ca051610d0052610cc051610d2052604435610d40526109e051610d60526020610ce06084610cfc6000855af161086b573d600060003e3d6000fd5b60203d10611c2257610ce09050f36118c2565b6341b028f381186109e357606436103417611c22576004358060a01c611c225760405260443580600f0b8118611c2257606052600060605113156109a1576040516371511a5e60a052602060a0600460bc845afa6108e1573d600060003e3d6000fd5b60203d10611c225760a0518060a01c611c225760e05260e090505160805260805115611c225760405163cc2b27d760c05260243560e052600161010052602060c0604460dc845afa610938573d600060003e3d6000fd5b60203d10611c225760c090505160a052602060805163cc2b27d760c05260a05160e0526060516001810380600f0b8118611c2257905061010052602060c0604460dc845afa61098c573d600060003e3d6000fd5b60203d10611c225760c090506109e1566109e1565b602060405163cc2b27d760805260243560a05260605160c052602060806044609c845afa6109d4573d600060003e3d6000fd5b60203d10611c2257608090505bf35b631e700cbb81186118c25760a436103417611c22576084358060a01c611c22576108c0525b6004358060a01c611c22576108805260443580600f0b8118611c22576108a052610880516323b872dd6108e0523361090052306109205260243561094052803b15611c225760006108e060646108fc6000855af1610a6b573d600060003e3d6000fd5b5060006108e0526108a051610ada576108805163081579a561090052602435610920526108a05161094052606435610960526108c051610980526020610900608461091c6000855af1610ac3573d600060003e3d6000fd5b60203d10611c22576109009050516108e052610c49565b60403661090037610880516104a052610af4610a40611afd565b610a4080516109005260208101805160208160051b0180610920828560045afa505050505061092051610a40526108a0516001810380600f0b8118611c2257905061092051811015611c225760051b6109400151610a60526108805163081579a5610a8052602435610aa0526001610ac0526000610ae05230610b00526020610a806084610a9c6000855af1610b8f573d600060003e3d6000fd5b60203d10611c2257610a809050516108e05261090051631a4d01d2610a80526108e051610aa0526108a0516001810380600f0b8118611c22579050610ac052606435610ae0526020610a806064610a9c6000855af1610bf3573d600060003e3d6000fd5b60203d10611c2257610a809050516108e052610a605163a9059cbb610a80526108c051610aa0526108e051610ac052803b15611c22576000610a806044610a9c6000855af1610c47573d600060003e3d6000fd5b505b60206108e0f36118c2565b637f3e155681186118c25760a436103417611c22576064358060a01c611c22576109e0525b6004358060a01c611c2257610880526044356004016009813511611c2257803560208160051b0180836108a037505050610880516323b872dd610a005233610a205230610a4052602435610a6052803b15611c22576000610a006064610a1c6000855af1610cec573d600060003e3d6000fd5b50604036610a0037610880516104a052610d07610b40611afd565b610b408051610a005260208101805160208160051b0180610a20828560045afa5050505050610a2051610b40526000610b60526000610c805261088051635b36389c610e0052602435610e20526108a05115611c2257600060051b6108c00151610e40526000610e60526040610e006064610e1c6000855af1610d8f573d600060003e3d6000fd5b60403d10611c2257610e0090508051610dc0526020810151610de052506000610b405160088111611c22578015610e2157905b80610e0052610b605160078111611c2257610e005160028101818110611c2257905060018103818111611c225790506108a051811015611c225760051b6108c001518160051b610b80015260018101610b605250600101818118610dc2575b5050610a005163d40ddb8c610e00526040610de051610e205280610e405280610e20016000610b60518083528060051b60008260088111611c22578015610e8257905b8060051b610b8001518160051b602088010152600101818118610e64575b50508201602001915050905081015050610140610e00610164610e1c6000855af1610eb2573d600060003e3d6000fd5b60403d10611c2257610e0051610e00016008815111611c2257805160208160051b0180610f80828560045afa50505050610f8050506108805163c6610657610e20526000610e40526020610e206024610e3c845afa610f16573d600060003e3d6000fd5b60203d10611c2257610e20518060a01c611c2257610e6052610e60905051610e0052610e005163a9059cbb610e20526109e051610e4052610dc051610e6052803b15611c22576000610e206044610e3c6000855af1610f7a573d600060003e3d6000fd5b50610c805160088111611c2257610dc0518160051b610ca0015260018101610c8052506000610b405160018101818110611c2257905060098111611c225780156110b657905b80610e2052610e2051610fd2576110ab565b610e205160018103818111611c22579050610a2051811015611c225760051b610a400151610e0052610c805160088111611c2257610e00516370a08231610e405230610e60526020610e406024610e5c845afa611034573d600060003e3d6000fd5b60203d10611c2257610e409050518160051b610ca0015260018101610c805250610e005163a9059cbb610e40526109e051610e6052610e2051610c8051811015611c225760051b610ca00151610e8052803b15611c22576000610e406044610e5c6000855af16110a9573d600060003e3d6000fd5b505b600101818118610fc0575b5050602080610e205280610e20016000610c80518083528060051b60008260098111611c2257801561110257905b8060051b610ca001518160051b6020880101526001018181186110e4575b50508201602001915050905081019050610e20f36118c2565b6329ed286281186118c257608436103417611c2257336108c052610a08566118c2565b6385267a6e81186118c257608436103417611c2257336109e052611186566118c2565b639941bdec81186118c25760a436103417611c22576064358060a01c611c22576109e0525b6004358060a01c611c2257610880526024356004016009813511611c2257803560208160051b0180836108a037505050604036610a0037610880516104a0526111d0610b40611afd565b610b408051610a005260208101805160208160051b0180610a20828560045afa5050505050610a2051610b4052610a005163ddca3f43610b80526020610b806004610b9c845afa611226573d600060003e3d6000fd5b60203d10611c2257610b80905051610b4051808202811583838304141715611c225790509050610b405160018103818111611c225790508060021b818160021c18611c225790508015611c225780820490509050610b6052610b6051610b60516402540be4008102816402540be400820418611c225790506402540be40081049050808201828110611c225790509050610b6052610880516323b872dd610b805233610ba05230610bc052604435610be052803b15611c22576000610b806064610b9c6000855af16112fd573d600060003e3d6000fd5b50604036610b80376108a05115611c2257600060051b6108c00151610cc0526000610ce0526000610b405160088111611c225780156113c857905b80610d0052610d00518060010160018110611c225790506108a051811015611c225760051b6108c00151610d2052610d20511561139c57610ba05160078111611c2257610d20518160051b610bc0015260018101610ba052506001610b80526113bd565b610ba05160078111611c225760008160051b610bc0015260018101610ba052505b600101818118611338575b5050610b8051156114ba57610a0051633db06dd8610d0052604080610d205280610d20016000610ba0518083528060051b60008260088111611c2257801561142a57905b8060051b610bc001518160051b60208801015260010181811861140c575b505082016020019150509050810190506000610d4052506020610d00610164610d1c845afa61145e573d600060003e3d6000fd5b60203d10611c2257610d00905051610ce052610ce051610ce051610b6051808202811583838304141715611c2257905090506402540be4008104905060018101818110611c22579050808201828110611c225790509050610ce0525b6108805163e3103273610d2052610cc051610d4052610ce051610d6052604435610d80526020610d206064610d3c6000855af16114fc573d600060003e3d6000fd5b60203d10611c2257610d20905051610d00526108805163a9059cbb610d205233610d4052604435610d0051808203828111611c225790509050610d6052803b15611c22576000610d206044610d3c6000855af161155e573d600060003e3d6000fd5b50610b8051156117ff57610a0051637706db75610d2052604080610d405280610d40016000610ba0518083528060051b60008260088111611c225780156115bf57905b8060051b610bc001518160051b6020880101526001018181186115a1575b50508201602001915050905081019050610ce051610d6052506020610d20610164610d3c6000855af16115f7573d600060003e3d6000fd5b60203d10611c2257610d205050610a0051610d2052610d20516370a08231610d605230610d80526020610d606024610d7c845afa61163a573d600060003e3d6000fd5b60203d10611c2257610d60905051610d4052610d40511561176d576000610d205160205260005260406000208061088051602052600052604060002090505461170457610d205163095ea7b3610d605261088051610d80527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610da052803b15611c22576000610d606044610d7c6000855af16116dc573d600060003e3d6000fd5b5060016000610d20516020526000526040600020806108805160205260005260406000209050555b610d005161088051630c3e4b54610d60526000610d8052610d4051610da0526000610dc05233610de0526020610d606084610d7c6000855af161174c573d600060003e3d6000fd5b60203d10611c2257610d60905051808203828111611c225790509050610d00525b6000610b405160088111611c225780156117fc57905b80610d6052610d6051610a2051811015611c225760051b610a40015163a9059cbb610d80526109e051610da052610d6051610ba051811015611c225760051b610bc00151610dc052803b15611c22576000610d806044610d9c6000855af16117f0573d600060003e3d6000fd5b50600101818118611783575b50505b6108a05115611c2257600060051b6108c00151156118bb576108805163c6610657610d40526000610d60526020610d406024610d5c845afa611846573d600060003e3d6000fd5b60203d10611c2257610d40518060a01c611c2257610d8052610d80905051610d2052610d205163a9059cbb610d40526109e051610d60526108a05115611c2257600060051b6108c00151610d8052803b15611c22576000610d406044610d5c6000855af16118b9573d600060003e3d6000fd5b505b6020610d00f35b60006000fd5b6040516329357750608052602060806004609c845afa6118ed573d600060003e3d6000fd5b60203d10611c225760809050516060526000608052600060605160088111611c2257801561199057905b806101a05260805160078111611c225760405163c66106576101c0526101a0516101e05260206101c060246101dc845afa611957573d600060003e3d6000fd5b60203d10611c22576101c0518060a01c611c2257610200526102009050518160051b60a001526001810160805250600101818118611917575b505060805160208160051b01808382608060045afa50505050565b600060605160088111611c22578015611a4057905b806101805261018051606051811015611c225760051b6080015163095ea7b36101a0526040516101c0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e052803b15611c225760006101a060446101bc6000855af1611a34573d600060003e3d6000fd5b506001018181186119c0575b505060016001604051602052600052604060002055565b610220516371511a5e610260526020610260600461027c845afa611a80573d600060003e3d6000fd5b60203d10611c2257610260518060a01c611c22576102a0526102a0905051610240526102405115611c225761024051604052611abd6103806118c8565b610380805160208160051b0180610260828560045afa505050506102405181526102605160208160051b016020830181818361026060045afa5050505050565b60026104a05160205260005260406000206000600a905b808301548160051b6104c00152600101818118611b14575050506104c051611bfb57604036610600376104a05161022052611b50610740611a57565b61074080516106005260208101805160208160051b0180610620828560045afa505050505060026104a05160205260005260406000206106005181556106205160208160051b0160018301600082601f0160051c60098111611c22578015611bcc57905b8060051b610620015181840155600101818118611bb4575b5050505050506106005181526106205160208160051b016020830181818361062060045afa5050505050611c20565b6104c05181526104e05160208160051b01602083018181836104e060045afa50505050505b565b600080fd0c540311009d18c2111b001a087e02ee1161113e18c2
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.