Overview
GLMR Balance
GLMR Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 32 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deploy_plain_poo... | 4046440 | 640 days ago | IN | 0 GLMR | 0.10925573 | ||||
Deploy_plain_poo... | 3871115 | 665 days ago | IN | 0 GLMR | 0.10263961 | ||||
Deploy_plain_poo... | 3871113 | 665 days ago | IN | 0 GLMR | 0.11016275 | ||||
Deploy_plain_poo... | 3849975 | 668 days ago | IN | 0 GLMR | 0.10020336 | ||||
Deploy_plain_poo... | 3841619 | 669 days ago | IN | 0 GLMR | 0.11010723 | ||||
Deploy_plain_poo... | 3841617 | 669 days ago | IN | 0 GLMR | 0.10810407 | ||||
Deploy_plain_poo... | 3835693 | 670 days ago | IN | 0 GLMR | 0.11625351 | ||||
Deploy_plain_poo... | 3835688 | 670 days ago | IN | 0 GLMR | 0.11221314 | ||||
Deploy_plain_poo... | 2750801 | 826 days ago | IN | 0 GLMR | 0.0782784 | ||||
Deploy_plain_poo... | 2176013 | 907 days ago | IN | 0 GLMR | 0.076146 | ||||
Deploy_plain_poo... | 2169190 | 908 days ago | IN | 0 GLMR | 0.08293716 | ||||
Deploy_plain_poo... | 1582362 | 992 days ago | IN | 0 GLMR | 0.0754302 | ||||
Deploy_plain_poo... | 1580744 | 992 days ago | IN | 0 GLMR | 0.0754333 | ||||
Deploy_plain_poo... | 1561923 | 995 days ago | IN | 0 GLMR | 0.0754357 | ||||
Deploy_plain_poo... | 1535127 | 999 days ago | IN | 0 GLMR | 0.0754333 | ||||
Deploy_plain_poo... | 1502374 | 1004 days ago | IN | 0 GLMR | 0.0754417 | ||||
Deploy_plain_poo... | 1460710 | 1010 days ago | IN | 0 GLMR | 0.0948495 | ||||
Deploy_plain_poo... | 1339736 | 1028 days ago | IN | 0 GLMR | 0.0782639 | ||||
Deploy_plain_poo... | 1194846 | 1049 days ago | IN | 0 GLMR | 0.0719785 | ||||
Deploy_plain_poo... | 1194193 | 1049 days ago | IN | 0 GLMR | 0.0759585 | ||||
Deploy_plain_poo... | 1190238 | 1050 days ago | IN | 0 GLMR | 0.0802002 | ||||
Deploy_plain_poo... | 1180899 | 1051 days ago | IN | 0 GLMR | 0.0817148 | ||||
Deploy_plain_poo... | 1180869 | 1051 days ago | IN | 0 GLMR | 0.1124991 | ||||
Deploy_plain_poo... | 1162703 | 1054 days ago | IN | 0 GLMR | 0.07901805 | ||||
Deploy_plain_poo... | 1155606 | 1055 days ago | IN | 0 GLMR | 0.0977732 |
Latest 25 internal transactions (View All)
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.2.16
Contract Source Code (Vyper language format)
# @version 0.2.16 """ @title Curve Sidechain/L2 Factory @license MIT @author Curve.Fi @notice Permissionless pool deployer and registry """ struct PoolArray: base_pool: address implementation: address liquidity_gauge: address coins: address[MAX_PLAIN_COINS] decimals: uint256[MAX_PLAIN_COINS] n_coins: uint256 asset_type: uint256 struct BasePoolArray: implementations: address[10] lp_token: address fee_receiver: address coins: address[MAX_COINS] decimals: uint256 n_coins: uint256 asset_type: uint256 interface AddressProvider: def admin() -> address: view def get_registry() -> address: view interface Registry: def get_lp_token(pool: address) -> address: view def get_n_coins(pool: address) -> uint256: view def get_coins(pool: address) -> address[MAX_COINS]: view def get_pool_from_lp_token(lp_token: address) -> address: view interface ERC20: def balanceOf(_addr: address) -> uint256: view def decimals() -> uint256: view def totalSupply() -> uint256: view def approve(_spender: address, _amount: uint256): nonpayable interface CurvePlainPool: def initialize( _name: String[32], _symbol: String[10], _coins: address[4], _rate_multipliers: uint256[4], _A: uint256, _fee: uint256, ): nonpayable interface CurvePool: def A() -> uint256: view def fee() -> uint256: view def admin_fee() -> uint256: view def balances(i: uint256) -> uint256: view def admin_balances(i: uint256) -> uint256: view def get_virtual_price() -> uint256: view def initialize( _name: String[32], _symbol: String[10], _coin: address, _rate_multiplier: uint256, _A: uint256, _fee: uint256, ): nonpayable def exchange( i: int128, j: int128, dx: uint256, min_dy: uint256, _receiver: address, ) -> uint256: nonpayable interface CurveFactoryMetapool: def coins(i :uint256) -> address: view def decimals() -> uint256: view interface OldFactory: def get_coins(_pool: address) -> address[2]: view interface LiquidityGauge: def initialize(_lp_token: address): nonpayable event BasePoolAdded: base_pool: address event PlainPoolDeployed: coins: address[MAX_PLAIN_COINS] A: uint256 fee: uint256 deployer: address event MetaPoolDeployed: coin: address base_pool: address A: uint256 fee: uint256 deployer: address event LiquidityGaugeDeployed: pool: address gauge: address MAX_COINS: constant(int128) = 8 MAX_PLAIN_COINS: constant(int128) = 4 # max coins in a plain pool ADDRESS_PROVIDER: constant(address) = 0x0000000022D53366457F9d5E68Ec105046FC4383 admin: public(address) future_admin: public(address) manager: public(address) pool_list: public(address[4294967296]) # master list of pools pool_count: public(uint256) # actual length of pool_list pool_data: HashMap[address, PoolArray] base_pool_list: public(address[4294967296]) # master list of pools base_pool_count: public(uint256) # actual length of pool_list base_pool_data: HashMap[address, BasePoolArray] # number of coins -> implementation addresses # for "plain pools" (as opposed to metapools), implementation contracts # are organized according to the number of coins in the pool plain_implementations: public(HashMap[uint256, address[10]]) # fee receiver for plain pools fee_receiver: public(address) gauge_implementation: public(address) # mapping of coins -> pools for trading # a mapping key is generated for each pair of addresses via # `bitwise_xor(convert(a, uint256), convert(b, uint256))` markets: HashMap[uint256, address[4294967296]] market_counts: HashMap[uint256, uint256] @external def __init__(_fee_receiver: address): self.admin = msg.sender self.manager = msg.sender self.fee_receiver = _fee_receiver # <--- Factory Getters ---> @view @external def metapool_implementations(_base_pool: address) -> address[10]: """ @notice Get a list of implementation contracts for metapools targetting the given base pool @dev A base pool is the pool for the LP token contained within the metapool @param _base_pool Address of the base pool @return List of implementation contract addresses """ return self.base_pool_data[_base_pool].implementations @view @external def find_pool_for_coins(_from: address, _to: address, i: uint256 = 0) -> address: """ @notice Find an available pool for exchanging two coins @param _from Address of coin to be sent @param _to Address of coin to be received @param i Index value. When multiple pools are available this value is used to return the n'th address. @return Pool address """ key: uint256 = bitwise_xor(convert(_from, uint256), convert(_to, uint256)) return self.markets[key][i] # <--- Pool Getters ---> @view @external def get_base_pool(_pool: address) -> address: """ @notice Get the base pool for a given factory metapool @param _pool Metapool address @return Address of base pool """ return self.pool_data[_pool].base_pool @view @external def get_n_coins(_pool: address) -> (uint256): """ @notice Get the number of coins in a pool @param _pool Pool address @return Number of coins """ return self.pool_data[_pool].n_coins @view @external def get_meta_n_coins(_pool: address) -> (uint256, uint256): """ @notice Get the number of coins in a metapool @param _pool Pool address @return Number of wrapped coins, number of underlying coins """ base_pool: address = self.pool_data[_pool].base_pool return 2, self.base_pool_data[base_pool].n_coins + 1 @view @external def get_coins(_pool: address) -> address[MAX_PLAIN_COINS]: """ @notice Get the coins within a pool @param _pool Pool address @return List of coin addresses """ return self.pool_data[_pool].coins @view @external def get_underlying_coins(_pool: address) -> address[MAX_COINS]: """ @notice Get the underlying coins within a pool @dev Reverts if a pool does not exist or is not a metapool @param _pool Pool address @return List of coin addresses """ coins: address[MAX_COINS] = empty(address[MAX_COINS]) base_pool: address = self.pool_data[_pool].base_pool assert base_pool != ZERO_ADDRESS # dev: pool is not metapool coins[0] = self.pool_data[_pool].coins[0] for i in range(1, MAX_COINS): coins[i] = self.base_pool_data[base_pool].coins[i - 1] if coins[i] == ZERO_ADDRESS: break return coins @view @external def get_decimals(_pool: address) -> uint256[MAX_PLAIN_COINS]: """ @notice Get decimal places for each coin within a pool @param _pool Pool address @return uint256 list of decimals """ if self.pool_data[_pool].base_pool != ZERO_ADDRESS: decimals: uint256[MAX_PLAIN_COINS] = empty(uint256[MAX_PLAIN_COINS]) decimals = self.pool_data[_pool].decimals decimals[1] = 18 return decimals return self.pool_data[_pool].decimals @view @external def get_underlying_decimals(_pool: address) -> uint256[MAX_COINS]: """ @notice Get decimal places for each underlying coin within a pool @param _pool Pool address @return uint256 list of decimals """ # decimals are tightly packed as a series of uint8 within a little-endian bytes32 # the packed value is stored as uint256 to simplify unpacking via shift and modulo pool_decimals: uint256[MAX_PLAIN_COINS] = empty(uint256[MAX_PLAIN_COINS]) pool_decimals = self.pool_data[_pool].decimals decimals: uint256[MAX_COINS] = empty(uint256[MAX_COINS]) decimals[0] = pool_decimals[0] base_pool: address = self.pool_data[_pool].base_pool packed_decimals: uint256 = self.base_pool_data[base_pool].decimals for i in range(MAX_COINS): unpacked: uint256 = shift(packed_decimals, -8 * i) % 256 if unpacked == 0: break decimals[i+1] = unpacked return decimals @view @external def get_metapool_rates(_pool: address) -> uint256[2]: """ @notice Get rates for coins within a metapool @param _pool Pool address @return Rates for each coin, precision normalized to 10**18 """ rates: uint256[2] = [10**18, 0] rates[1] = CurvePool(self.pool_data[_pool].base_pool).get_virtual_price() return rates @view @external def get_balances(_pool: address) -> uint256[MAX_PLAIN_COINS]: """ @notice Get balances for each coin within a pool @dev For pools using lending, these are the wrapped coin balances @param _pool Pool address @return uint256 list of balances """ if self.pool_data[_pool].base_pool != ZERO_ADDRESS: return [CurvePool(_pool).balances(0), CurvePool(_pool).balances(1), 0, 0] n_coins: uint256 = self.pool_data[_pool].n_coins balances: uint256[MAX_PLAIN_COINS] = empty(uint256[MAX_PLAIN_COINS]) for i in range(MAX_PLAIN_COINS): if i < n_coins: balances[i] = CurvePool(_pool).balances(i) else: balances[i] = 0 return balances @view @external def get_underlying_balances(_pool: address) -> uint256[MAX_COINS]: """ @notice Get balances for each underlying coin within a metapool @param _pool Metapool address @return uint256 list of underlying balances """ underlying_balances: uint256[MAX_COINS] = empty(uint256[MAX_COINS]) underlying_balances[0] = CurvePool(_pool).balances(0) base_total_supply: uint256 = ERC20(self.pool_data[_pool].coins[1]).totalSupply() if base_total_supply > 0: underlying_pct: uint256 = CurvePool(_pool).balances(1) * 10**36 / base_total_supply base_pool: address = self.pool_data[_pool].base_pool assert base_pool != ZERO_ADDRESS # dev: pool is not a metapool n_coins: uint256 = self.base_pool_data[base_pool].n_coins for i in range(MAX_COINS): if i == n_coins: break underlying_balances[i + 1] = CurvePool(base_pool).balances(i) * underlying_pct / 10**36 return underlying_balances @view @external def get_A(_pool: address) -> uint256: """ @notice Get the amplfication co-efficient for a pool @param _pool Pool address @return uint256 A """ return CurvePool(_pool).A() @view @external def get_fees(_pool: address) -> (uint256, uint256): """ @notice Get the fees for a pool @dev Fees are expressed as integers @return Pool fee and admin fee as uint256 with 1e10 precision """ return CurvePool(_pool).fee(), CurvePool(_pool).admin_fee() @view @external def get_admin_balances(_pool: address) -> uint256[MAX_PLAIN_COINS]: """ @notice Get the current admin balances (uncollected fees) for a pool @param _pool Pool address @return List of uint256 admin balances """ n_coins: uint256 = self.pool_data[_pool].n_coins admin_balances: uint256[MAX_PLAIN_COINS] = empty(uint256[MAX_PLAIN_COINS]) for i in range(MAX_PLAIN_COINS): if i == n_coins: break admin_balances[i] = CurvePool(_pool).admin_balances(i) return admin_balances @view @external def get_coin_indices( _pool: address, _from: address, _to: address ) -> (int128, int128, bool): """ @notice Convert coin addresses to indices for use with pool methods @param _pool Pool address @param _from Coin address to be used as `i` within a pool @param _to Coin address to be used as `j` within a pool @return int128 `i`, int128 `j`, boolean indicating if `i` and `j` are underlying coins """ coin: address = self.pool_data[_pool].coins[0] base_pool: address = self.pool_data[_pool].base_pool if coin in [_from, _to] and base_pool != ZERO_ADDRESS: base_lp_token: address = self.pool_data[_pool].coins[1] if base_lp_token in [_from, _to]: # True and False convert to 1 and 0 - a bit of voodoo that # works because we only ever have 2 non-underlying coins if base pool is ZERO_ADDRESS return convert(_to == coin, int128), convert(_from == coin, int128), False found_market: bool = False i: int128 = 0 j: int128 = 0 for x in range(MAX_COINS): if base_pool == ZERO_ADDRESS: if x >= MAX_PLAIN_COINS: raise "No available market" if x != 0: coin = self.pool_data[_pool].coins[x] else: if x != 0: coin = self.base_pool_data[base_pool].coins[x-1] if coin == ZERO_ADDRESS: raise "No available market" if coin == _from: i = x elif coin == _to: j = x else: continue if found_market: # the second time we find a match, break out of the loop break # the first time we find a match, set `found_market` to True found_market = True return i, j, base_pool != ZERO_ADDRESS @view @external def get_gauge(_pool: address) -> address: """ @notice Get the address of the liquidity gauge contract for a factory pool @dev Returns `ZERO_ADDRESS` if a gauge has not been deployed @param _pool Pool address @return Implementation contract address """ return self.pool_data[_pool].liquidity_gauge @view @external def get_implementation_address(_pool: address) -> address: """ @notice Get the address of the implementation contract used for a factory pool @param _pool Pool address @return Implementation contract address """ return self.pool_data[_pool].implementation @view @external def is_meta(_pool: address) -> bool: """ @notice Verify `_pool` is a metapool @param _pool Pool address @return True if `_pool` is a metapool """ return self.pool_data[_pool].base_pool != ZERO_ADDRESS @view @external def get_pool_asset_type(_pool: address) -> uint256: """ @notice Query the asset type of `_pool` @dev 0 = USD, 1 = ETH, 2 = BTC, 3 = Other @param _pool Pool Address @return Integer indicating the pool asset type """ base_pool: address = self.pool_data[_pool].base_pool if base_pool == ZERO_ADDRESS: return self.pool_data[_pool].asset_type else: return self.base_pool_data[base_pool].asset_type @view @external def get_fee_receiver(_pool: address) -> address: base_pool: address = self.pool_data[_pool].base_pool if base_pool == ZERO_ADDRESS: return self.fee_receiver else: return self.base_pool_data[base_pool].fee_receiver # <--- Pool Deployers ---> @external def deploy_plain_pool( _name: String[32], _symbol: String[10], _coins: address[MAX_PLAIN_COINS], _A: uint256, _fee: uint256, _asset_type: uint256 = 0, _implementation_idx: uint256 = 0, ) -> address: """ @notice Deploy a new plain pool @param _name Name of the new plain pool @param _symbol Symbol for the new plain pool - will be concatenated with factory symbol @param _coins List of addresses of the coins being used in the pool. @param _A Amplification co-efficient - a lower value here means less tolerance for imbalance within the pool's assets. Suggested values include: * Uncollateralized algorithmic stablecoins: 5-10 * Non-redeemable, collateralized assets: 100 * Redeemable assets: 200-400 @param _fee Trade fee, given as an integer with 1e10 precision. The minimum fee is 0.04% (4000000), the maximum is 1% (100000000). 50% of the fee is distributed to veCRV holders. @param _asset_type Asset type for pool, as an integer 0 = USD, 1 = ETH, 2 = BTC, 3 = Other @param _implementation_idx Index of the implementation to use. All possible implementations for a pool of N_COINS can be publicly accessed via `plain_implementations(N_COINS)` @return Address of the deployed pool """ # fee must be between 0.04% and 1% assert _fee >= 4000000 and _fee <= 100000000, "Invalid fee" n_coins: uint256 = MAX_PLAIN_COINS rate_multipliers: uint256[MAX_PLAIN_COINS] = empty(uint256[MAX_PLAIN_COINS]) decimals: uint256[MAX_PLAIN_COINS] = empty(uint256[MAX_PLAIN_COINS]) for i in range(MAX_PLAIN_COINS): coin: address = _coins[i] if coin == ZERO_ADDRESS: assert i > 1, "Insufficient coins" n_coins = i break if _coins[i] == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: assert i == 0, "ETH must be first coin" decimals[0] = 18 else: decimals[i] = ERC20(coin).decimals() assert decimals[i] < 19, "Max 18 decimals for coins" rate_multipliers[i] = 10 ** (36 - decimals[i]) for x in range(i, i+MAX_PLAIN_COINS): if x+1 == MAX_PLAIN_COINS: break if _coins[x+1] == ZERO_ADDRESS: break assert coin != _coins[x+1], "Duplicate coins" implementation: address = self.plain_implementations[n_coins][_implementation_idx] assert implementation != ZERO_ADDRESS, "Invalid implementation index" pool: address = create_forwarder_to(implementation) CurvePlainPool(pool).initialize(_name, _symbol, _coins, rate_multipliers, _A, _fee) length: uint256 = self.pool_count self.pool_list[length] = pool self.pool_count = length + 1 self.pool_data[pool].decimals = decimals self.pool_data[pool].n_coins = n_coins self.pool_data[pool].base_pool = ZERO_ADDRESS self.pool_data[pool].implementation = implementation if _asset_type != 0: self.pool_data[pool].asset_type = _asset_type for i in range(MAX_PLAIN_COINS): coin: address = _coins[i] if coin == ZERO_ADDRESS: break self.pool_data[pool].coins[i] = coin raw_call( coin, concat( method_id("approve(address,uint256)"), convert(pool, bytes32), convert(MAX_UINT256, bytes32) ) ) for j in range(MAX_PLAIN_COINS): if i < j: swappable_coin: address = _coins[j] key: uint256 = bitwise_xor(convert(coin, uint256), convert(swappable_coin, uint256)) length = self.market_counts[key] self.markets[key][length] = pool self.market_counts[key] = length + 1 log PlainPoolDeployed(_coins, _A, _fee, msg.sender) return pool @external def deploy_metapool( _base_pool: address, _name: String[32], _symbol: String[10], _coin: address, _A: uint256, _fee: uint256, _implementation_idx: uint256 = 0, ) -> address: """ @notice Deploy a new metapool @param _base_pool Address of the base pool to use within the metapool @param _name Name of the new metapool @param _symbol Symbol for the new metapool - will be concatenated with the base pool symbol @param _coin Address of the coin being used in the metapool @param _A Amplification co-efficient - a higher value here means less tolerance for imbalance within the pool's assets. Suggested values include: * Uncollateralized algorithmic stablecoins: 5-10 * Non-redeemable, collateralized assets: 100 * Redeemable assets: 200-400 @param _fee Trade fee, given as an integer with 1e10 precision. The minimum fee is 0.04% (4000000), the maximum is 1% (100000000). 50% of the fee is distributed to veCRV holders. @param _implementation_idx Index of the implementation to use. All possible implementations for a BASE_POOL can be publicly accessed via `metapool_implementations(BASE_POOL)` @return Address of the deployed pool """ # fee must be between 0.04% and 1% assert _fee >= 4000000 and _fee <= 100000000, "Invalid fee" implementation: address = self.base_pool_data[_base_pool].implementations[_implementation_idx] assert implementation != ZERO_ADDRESS, "Invalid implementation index" # things break if a token has >18 decimals decimals: uint256 = ERC20(_coin).decimals() assert decimals < 19, "Max 18 decimals for coins" pool: address = create_forwarder_to(implementation) CurvePool(pool).initialize(_name, _symbol, _coin, 10 ** (36 - decimals), _A, _fee) ERC20(_coin).approve(pool, MAX_UINT256) # add pool to pool_list length: uint256 = self.pool_count self.pool_list[length] = pool self.pool_count = length + 1 base_lp_token: address = self.base_pool_data[_base_pool].lp_token self.pool_data[pool].decimals = [decimals, 0, 0, 0] self.pool_data[pool].n_coins = 2 self.pool_data[pool].base_pool = _base_pool self.pool_data[pool].coins[0] = _coin self.pool_data[pool].coins[1] = self.base_pool_data[_base_pool].lp_token self.pool_data[pool].implementation = implementation is_finished: bool = False for i in range(MAX_COINS): swappable_coin: address = self.base_pool_data[_base_pool].coins[i] if swappable_coin == ZERO_ADDRESS: is_finished = True swappable_coin = base_lp_token key: uint256 = bitwise_xor(convert(_coin, uint256), convert(swappable_coin, uint256)) length = self.market_counts[key] self.markets[key][length] = pool self.market_counts[key] = length + 1 if is_finished: break log MetaPoolDeployed(_coin, _base_pool, _A, _fee, msg.sender) return pool @external def deploy_gauge(_pool: address) -> address: """ @notice Deploy a liquidity gauge for a factory pool @param _pool Factory pool address to deploy a gauge for @return Address of the deployed gauge """ assert self.pool_data[_pool].coins[0] != ZERO_ADDRESS, "Unknown pool" assert self.pool_data[_pool].liquidity_gauge == ZERO_ADDRESS, "Gauge already deployed" implementation: address = self.gauge_implementation assert implementation != ZERO_ADDRESS, "Gauge implementation not set" gauge: address = create_forwarder_to(implementation) LiquidityGauge(gauge).initialize(_pool) self.pool_data[_pool].liquidity_gauge = gauge log LiquidityGaugeDeployed(_pool, gauge) return gauge # <--- Admin / Guarded Functionality ---> @external def add_base_pool( _base_pool: address, _fee_receiver: address, _asset_type: uint256, _implementations: address[10], ): """ @notice Add a base pool to the registry, which may be used in factory metapools @dev Only callable by admin @param _base_pool Pool address to add @param _fee_receiver Admin fee receiver address for metapools using this base pool @param _asset_type Asset type for pool, as an integer 0 = USD, 1 = ETH, 2 = BTC, 3 = Other @param _implementations List of implementation addresses that can be used with this base pool """ assert msg.sender == self.admin # dev: admin-only function assert self.base_pool_data[_base_pool].coins[0] == ZERO_ADDRESS # dev: pool exists registry: address = AddressProvider(ADDRESS_PROVIDER).get_registry() n_coins: uint256 = Registry(registry).get_n_coins(_base_pool) assert n_coins > 0 # dev: pool not in registry # add pool to pool_list length: uint256 = self.base_pool_count self.base_pool_list[length] = _base_pool self.base_pool_count = length + 1 self.base_pool_data[_base_pool].lp_token = Registry(registry).get_lp_token(_base_pool) self.base_pool_data[_base_pool].n_coins = n_coins self.base_pool_data[_base_pool].fee_receiver = _fee_receiver if _asset_type != 0: self.base_pool_data[_base_pool].asset_type = _asset_type for i in range(10): implementation: address = _implementations[i] if implementation == ZERO_ADDRESS: break self.base_pool_data[_base_pool].implementations[i] = implementation decimals: uint256 = 0 coins: address[MAX_COINS] = Registry(registry).get_coins(_base_pool) for i in range(MAX_COINS): if i == n_coins: break coin: address = coins[i] self.base_pool_data[_base_pool].coins[i] = coin decimals += shift(ERC20(coin).decimals(), convert(i*8, int128)) self.base_pool_data[_base_pool].decimals = decimals log BasePoolAdded(_base_pool) @external def set_metapool_implementations( _base_pool: address, _implementations: address[10], ): """ @notice Set implementation contracts for a metapool @dev Only callable by admin @param _base_pool Pool address to add @param _implementations Implementation address to use when deploying metapools """ assert msg.sender == self.admin # dev: admin-only function assert self.base_pool_data[_base_pool].coins[0] != ZERO_ADDRESS # dev: base pool does not exist for i in range(10): new_imp: address = _implementations[i] current_imp: address = self.base_pool_data[_base_pool].implementations[i] if new_imp == current_imp: if new_imp == ZERO_ADDRESS: break else: self.base_pool_data[_base_pool].implementations[i] = new_imp @external def set_plain_implementations( _n_coins: uint256, _implementations: address[10], ): assert msg.sender == self.admin # dev: admin-only function for i in range(10): new_imp: address = _implementations[i] current_imp: address = self.plain_implementations[_n_coins][i] if new_imp == current_imp: if new_imp == ZERO_ADDRESS: break else: self.plain_implementations[_n_coins][i] = new_imp @external def set_gauge_implementation(_gauge_implementation: address): assert msg.sender == self.admin # dev: admin-only function self.gauge_implementation = _gauge_implementation @external def set_gauge(_pool: address, _gauge: address): assert msg.sender == self.admin # dev: admin-only function assert self.pool_data[_pool].coins[0] != ZERO_ADDRESS, "Unknown pool" self.pool_data[_pool].liquidity_gauge = _gauge log LiquidityGaugeDeployed(_pool, _gauge) @external def batch_set_pool_asset_type(_pools: address[32], _asset_types: uint256[32]): """ @notice Batch set the asset type for factory pools @dev Used to modify asset types that were set incorrectly at deployment """ assert msg.sender in [self.manager, self.admin] # dev: admin-only function for i in range(32): if _pools[i] == ZERO_ADDRESS: break self.pool_data[_pools[i]].asset_type = _asset_types[i] @external def commit_transfer_ownership(_addr: address): """ @notice Transfer ownership of this contract to `addr` @param _addr Address of the new owner """ assert msg.sender == self.admin # dev: admin only self.future_admin = _addr @external def accept_transfer_ownership(): """ @notice Accept a pending ownership transfer @dev Only callable by the new owner """ _admin: address = self.future_admin assert msg.sender == _admin # dev: future admin only self.admin = _admin self.future_admin = ZERO_ADDRESS @external def set_manager(_manager: address): """ @notice Set the manager @dev Callable by the admin or existing manager @param _manager Manager address """ assert msg.sender in [self.manager, self.admin] # dev: admin-only function self.manager = _manager @external def set_fee_receiver(_base_pool: address, _fee_receiver: address): """ @notice Set fee receiver for base and plain pools @param _base_pool Address of base pool to set fee receiver for. For plain pools, leave as `ZERO_ADDRESS`. @param _fee_receiver Address that fees are sent to """ assert msg.sender == self.admin # dev: admin only if _base_pool == ZERO_ADDRESS: self.fee_receiver = _fee_receiver else: self.base_pool_data[_base_pool].fee_receiver = _fee_receiver @external def convert_metapool_fees() -> bool: """ @notice Convert the fees of a metapool and transfer to the metapool's fee receiver @dev All fees are converted to LP token of base pool """ base_pool: address = self.pool_data[msg.sender].base_pool assert base_pool != ZERO_ADDRESS # dev: sender must be metapool coin: address = self.pool_data[msg.sender].coins[0] amount: uint256 = ERC20(coin).balanceOf(self) receiver: address = self.base_pool_data[base_pool].fee_receiver CurvePool(msg.sender).exchange(0, 1, amount, 0, receiver) return True
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"name":"BasePoolAdded","inputs":[{"name":"base_pool","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"PlainPoolDeployed","inputs":[{"name":"coins","type":"address[4]","indexed":false},{"name":"A","type":"uint256","indexed":false},{"name":"fee","type":"uint256","indexed":false},{"name":"deployer","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"MetaPoolDeployed","inputs":[{"name":"coin","type":"address","indexed":false},{"name":"base_pool","type":"address","indexed":false},{"name":"A","type":"uint256","indexed":false},{"name":"fee","type":"uint256","indexed":false},{"name":"deployer","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"LiquidityGaugeDeployed","inputs":[{"name":"pool","type":"address","indexed":false},{"name":"gauge","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_fee_receiver","type":"address"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"metapool_implementations","inputs":[{"name":"_base_pool","type":"address"}],"outputs":[{"name":"","type":"address[10]"}],"gas":21716},{"stateMutability":"view","type":"function","name":"find_pool_for_coins","inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"find_pool_for_coins","inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"get_base_pool","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"address"}],"gas":2663},{"stateMutability":"view","type":"function","name":"get_n_coins","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":2699},{"stateMutability":"view","type":"function","name":"get_meta_n_coins","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"gas":5201},{"stateMutability":"view","type":"function","name":"get_coins","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"address[4]"}],"gas":9164},{"stateMutability":"view","type":"function","name":"get_underlying_coins","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"address[8]"}],"gas":21345},{"stateMutability":"view","type":"function","name":"get_decimals","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[4]"}],"gas":20185},{"stateMutability":"view","type":"function","name":"get_underlying_decimals","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[8]"}],"gas":19730},{"stateMutability":"view","type":"function","name":"get_metapool_rates","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[2]"}],"gas":5281},{"stateMutability":"view","type":"function","name":"get_balances","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[4]"}],"gas":20435},{"stateMutability":"view","type":"function","name":"get_underlying_balances","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[8]"}],"gas":39733},{"stateMutability":"view","type":"function","name":"get_A","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":3135},{"stateMutability":"view","type":"function","name":"get_fees","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"gas":5821},{"stateMutability":"view","type":"function","name":"get_admin_balances","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[4]"}],"gas":13535},{"stateMutability":"view","type":"function","name":"get_coin_indices","inputs":[{"name":"_pool","type":"address"},{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"outputs":[{"name":"","type":"int128"},{"name":"","type":"int128"},{"name":"","type":"bool"}],"gas":33243},{"stateMutability":"view","type":"function","name":"get_gauge","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"address"}],"gas":3089},{"stateMutability":"view","type":"function","name":"get_implementation_address","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"address"}],"gas":3119},{"stateMutability":"view","type":"function","name":"is_meta","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"bool"}],"gas":3152},{"stateMutability":"view","type":"function","name":"get_pool_asset_type","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":5450},{"stateMutability":"view","type":"function","name":"get_fee_receiver","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"address"}],"gas":5480},{"stateMutability":"nonpayable","type":"function","name":"deploy_plain_pool","inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_coins","type":"address[4]"},{"name":"_A","type":"uint256"},{"name":"_fee","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"nonpayable","type":"function","name":"deploy_plain_pool","inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_coins","type":"address[4]"},{"name":"_A","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_asset_type","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"nonpayable","type":"function","name":"deploy_plain_pool","inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_coins","type":"address[4]"},{"name":"_A","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_asset_type","type":"uint256"},{"name":"_implementation_idx","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"nonpayable","type":"function","name":"deploy_metapool","inputs":[{"name":"_base_pool","type":"address"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_coin","type":"address"},{"name":"_A","type":"uint256"},{"name":"_fee","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"nonpayable","type":"function","name":"deploy_metapool","inputs":[{"name":"_base_pool","type":"address"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_coin","type":"address"},{"name":"_A","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_implementation_idx","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"nonpayable","type":"function","name":"deploy_gauge","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"address"}],"gas":93401},{"stateMutability":"nonpayable","type":"function","name":"add_base_pool","inputs":[{"name":"_base_pool","type":"address"},{"name":"_fee_receiver","type":"address"},{"name":"_asset_type","type":"uint256"},{"name":"_implementations","type":"address[10]"}],"outputs":[],"gas":925811},{"stateMutability":"nonpayable","type":"function","name":"set_metapool_implementations","inputs":[{"name":"_base_pool","type":"address"},{"name":"_implementations","type":"address[10]"}],"outputs":[],"gas":382072},{"stateMutability":"nonpayable","type":"function","name":"set_plain_implementations","inputs":[{"name":"_n_coins","type":"uint256"},{"name":"_implementations","type":"address[10]"}],"outputs":[],"gas":379687},{"stateMutability":"nonpayable","type":"function","name":"set_gauge_implementation","inputs":[{"name":"_gauge_implementation","type":"address"}],"outputs":[],"gas":38355},{"stateMutability":"nonpayable","type":"function","name":"set_gauge","inputs":[{"name":"_pool","type":"address"},{"name":"_gauge","type":"address"}],"outputs":[],"gas":43210},{"stateMutability":"nonpayable","type":"function","name":"batch_set_pool_asset_type","inputs":[{"name":"_pools","type":"address[32]"},{"name":"_asset_types","type":"uint256[32]"}],"outputs":[],"gas":1139575},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_addr","type":"address"}],"outputs":[],"gas":38445},{"stateMutability":"nonpayable","type":"function","name":"accept_transfer_ownership","inputs":[],"outputs":[],"gas":58396},{"stateMutability":"nonpayable","type":"function","name":"set_manager","inputs":[{"name":"_manager","type":"address"}],"outputs":[],"gas":41026},{"stateMutability":"nonpayable","type":"function","name":"set_fee_receiver","inputs":[{"name":"_base_pool","type":"address"},{"name":"_fee_receiver","type":"address"}],"outputs":[],"gas":38800},{"stateMutability":"nonpayable","type":"function","name":"convert_metapool_fees","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":12910},{"stateMutability":"view","type":"function","name":"admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3438},{"stateMutability":"view","type":"function","name":"future_admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3468},{"stateMutability":"view","type":"function","name":"manager","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3498},{"stateMutability":"view","type":"function","name":"pool_list","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":3573},{"stateMutability":"view","type":"function","name":"pool_count","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3558},{"stateMutability":"view","type":"function","name":"base_pool_list","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":3633},{"stateMutability":"view","type":"function","name":"base_pool_count","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3618},{"stateMutability":"view","type":"function","name":"plain_implementations","inputs":[{"name":"arg0","type":"uint256"},{"name":"arg1","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":3808},{"stateMutability":"view","type":"function","name":"fee_receiver","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3678},{"stateMutability":"view","type":"function","name":"gauge_implementation","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3708}]
Contract Creation Code
6f7fffffffffffffffffffffffffffffff6040526020612ef3610140396020612ef360c03960c05160a01c612eee5733600055336002556101405164020000000855612ed656600436101561000d57612e85565b600035601c526f7fffffffffffffffffffffffffffffff60405260005134612e8b5763970fa3f38114156100b95760043560a01c612e8b5764020000000660043560e05260c052604060c02080546101605260018101546101805260028101546101a05260038101546101c05260048101546101e05260058101546102005260068101546102205260078101546102405260088101546102605260098101546102805250610140610160f35b63a87df06c8114156100d0576000610140526100f1565b636982eb0b8114156100ec5760206044610140376000506100f1565b610144565b60043560a01c612e8b5760243560a01c612e8b576024356004351861016052600161014051640100000000811015612e8b570264020000000a6101605160e05260c052604060c020015460005260206000f35b636f20d6dd8114156101785760043560a01c612e8b5764010000000460043560e05260c052604060c0205460005260206000f35b63940494f18114156101af5760043560a01c612e8b57600b64010000000460043560e05260c052604060c020015460005260206000f35b63eb73f37d81141561021d5760043560a01c612e8b5764010000000460043560e05260c052604060c02054610140526101a06002815260156402000000066101405160e05260c052604060c020015460018181830110612e8b578082019050905081602001525060406101a0f35b639ac90d3d8114156102735760043560a01c612e8b57600364010000000460043560e05260c052604060c0200180546101605260018101546101805260028101546101a05260038101546101c052506080610160f35b63a77576ef8114156103665760043560a01c612e8b57610100366101403764010000000460043560e05260c052604060c02054610240526000610240511815612e8b57600364010000000460043560e05260c052604060c02001546101405261026060016007818352015b6001610260516001808210612e8b57808203905090506008811015612e8b5702600c6402000000066102405160e05260c052604060c020010154610140610260516008811015612e8b576020020152610140610260516008811015612e8b57602002015161034b5761035c565b5b81516001018083528114156102de575b5050610100610140f35b6352b515558114156104265760043560a01c612e8b57600064010000000460043560e05260c052604060c0205418156103e65760803661014037600764010000000460043560e05260c052604060c0200180546101405260018101546101605260028101546101805260038101546101a052506012610160526080610140f35b600764010000000460043560e05260c052604060c0200180546101605260018101546101805260028101546101a05260038101546101c052506080610160f35b634cb088f181141561058b5760043560a01c612e8b5760803661014037600764010000000460043560e05260c052604060c0200180546101405260018101546101605260028101546101805260038101546101a05250610100366101c037610140516101c05264010000000460043560e05260c052604060c020546102c05260146402000000066102c05160e05260c052604060c02001546102e05261030060006008818352015b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861030051808202821582848305141715612e8b57809050905090506000811215610521576102e051816000031c610528565b6102e051811b5b905061010080820690509050610320526103205161054557610581565b610320516101c06103005160018181830112612e8b57808201905090506008811015612e8b5760200201525b81516001018083528114156104ce575b50506101006101c0f35b6306d8f1608114156105fe5760043560a01c612e8b57670de0b6b3a76400006101405260006101605260206101e0600463bb7b8b806101805261019c64010000000460043560e05260c052604060c020545afa15612e8b57601f3d1115612e8b576000506101e051610160526040610140f35b6392e3cc2d8114156107805760043560a01c612e8b57600064010000000460043560e05260c052604060c0205418156106c25760206101c06024634903b0d16101405260006101605261015c6004355afa15612e8b57601f3d1115612e8b576000506101c0516101e05260206102806024634903b0d16102005260016102205261021c6004355afa15612e8b57601f3d1115612e8b57600050610280516102a0526101e0516102e0526102a0516103005260006103205260006103405260806102e0f35b600b64010000000460043560e05260c052604060c020015461014052608036610160376101e060006004818352015b610140516101e051101561074e5760206102806024634903b0d1610200526101e0516102205261021c6004355afa15612e8b57601f3d1115612e8b57600050610280516101606101e0516004811015612e8b576020020152610766565b60006101606101e0516004811015612e8b5760200201525b5b81516001018083528114156106f1575b50506080610160f35b6359f4f3518114156109a55760043560a01c612e8b57610100366101403760206102c06024634903b0d16102405260006102605261025c6004355afa15612e8b57601f3d1115612e8b576000506102c0516101405260206102c060046318160ddd6102605261027c6001600364010000000460043560e05260c052604060c0200101545afa15612e8b57601f3d1115612e8b576000506102c05161024052600061024051111561099d5760206103006024634903b0d16102805260016102a05261029c6004355afa15612e8b57601f3d1115612e8b57600050610300516ec097ce7bc90715b34b9f1000000000808202821582848304141715612e8b578090509050905061024051808015612e8b578204905090506102605264010000000460043560e05260c052604060c02054610280526000610280511815612e8b5760156402000000066102805160e05260c052604060c02001546102a0526102c060006008818352015b6102a0516102c05114156108fa5761099a565b60206103606024634903b0d16102e0526102c051610300526102fc610280515afa15612e8b57601f3d1115612e8b576000506103605161026051808202821582848304141715612e8b57809050905090506ec097ce7bc90715b34b9f1000000000808204905090506101406102c05160018181830110612e8b57808201905090506008811015612e8b5760200201525b81516001018083528114156108e7575b50505b610100610140f35b6355b30b198114156109f15760043560a01c612e8b5760206101a0600463f446c1d06101405261015c6004355afa15612e8b57601f3d1115612e8b576000506101a05160005260206000f35b637cdb72b0811415610a985760043560a01c612e8b5760206101a0600463ddca3f436101405261015c6004355afa15612e8b57601f3d1115612e8b576000506101a0516101c0526020610240600463fee3f7f96101e0526101fc6004355afa15612e8b57601f3d1115612e8b5760005061024051610260526102808080806101c051815250506020810190508080610260518152505060409050905060c05260c051610280f35b63c11e45b8811415610b545760043560a01c612e8b57600b64010000000460043560e05260c052604060c020015461014052608036610160376101e060006004818352015b610140516101e0511415610af057610b4b565b6020610280602463e2e7d264610200526101e0516102205261021c6004355afa15612e8b57601f3d1115612e8b57600050610280516101606101e0516004811015612e8b5760200201525b8151600101808352811415610add575b50506080610160f35b63eb85226d811415610ed05760043560a01c612e8b5760243560a01c612e8b5760443560a01c612e8b57600364010000000460043560e05260c052604060c02001546101405264010000000460043560e05260c052604060c0205461016052602435610200526044356102205260006101e0526101e061012060006002818352015b610120516020026102000151610140511415610bf55760018352610c06565b5b8151600101808352811415610bd6575b5050506101e05115610c1f576000610160511415610c22565b60005b15610cfb576001600364010000000460043560e05260c052604060c02001015461024052602435610280526044356102a05260006102605261026061012060006002818352015b610120516020026102800151610240511415610c885760018352610c99565b5b8151600101808352811415610c69575b5050506102605115610cfa5761014051604435146102c05261014051602435146102e0526103008080806102c0518152505060208101905080806102e05181525050602081019050808060008152505060609050905060c05260c051610300f35b5b606036610180376101e060006008818352015b61016051610da55760046101e05112610d66576308c379a06103605260206103805260136103a0527f4e6f20617661696c61626c65206d61726b6574000000000000000000000000006103c0526103a050606461037cfd5b60006101e0511815610da05760016101e0516004811015612e8b5702600364010000000460043560e05260c052604060c020010154610140525b610dfb565b60006101e0511815610dfa5760016101e051600180820380607f1d8160801d1415612e8b57809050905090506008811015612e8b5702600c6402000000066101605160e05260c052604060c020010154610140525b5b61014051610e48576308c379a06103605260206103805260136103a0527f4e6f20617661696c61626c65206d61726b6574000000000000000000000000006103c0526103a050606461037cfd5b602435610140511415610e62576101e0516101a052610e82565b604435610140511415610e7c576101e0516101c052610e81565b610e97565b5b6101805115610e9057610ea7565b6001610180525b8151600101808352811415610d0e575b50506103c06101a05181526101c0518160200152600061016051141581604001525060606103c0f35b63daf297b9811415610f075760043560a01c612e8b57600264010000000460043560e05260c052604060c020015460005260206000f35b63510d98a4811415610f3e5760043560a01c612e8b57600164010000000460043560e05260c052604060c020015460005260206000f35b63e4d332a9811415610f765760043560a01c612e8b57600064010000000460043560e05260c052604060c02054141560005260206000f35b6366d3966c811415610ff65760043560a01c612e8b5764010000000460043560e05260c052604060c020546101405261014051610fd257600c64010000000460043560e05260c052604060c020015460005260206000f3610ff4565b60166402000000066101405160e05260c052604060c020015460005260206000f35b005b63154aa8f58114156110655760043560a01c612e8b5764010000000460043560e05260c052604060c020546101405261014051611041576402000000085460005260206000f3611063565b600b6402000000066101405160e05260c052604060c020015460005260206000f35b005b63cd419bb5811415611082576000610200526000610220526110d0565b635c16487b8114156110a5576000610220526020610104610200376000506110d0565b6352f2db698114156110cb576020610104610200376020610124610220376000506110d0565b611a14565b60406004356004016101403760206004356004013511612e8b57602a6024356004016101a037600a6024356004013511612e8b5760443560a01c612e8b5760643560a01c612e8b5760843560a01c612e8b5760a43560a01c612e8b57623d090060e43510611147576305f5e10060e435111561114a565b60005b611193576308c379a061024052602061026052600b610280527f496e76616c6964206665650000000000000000000000000000000000000000006102a05261028050606461025cfd5b600461024052610100366102603761036060006004818352015b6044610360516004811015612e8b576020020135610380526103805161122a576001610360511161121d576308c379a06103a05260206103c05260126103e0527f496e73756666696369656e7420636f696e730000000000000000000000000000610400526103e05060646103bcfd5b61036051610240526114ba565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6044610360516004811015612e8b57602002013514156112b25761036051156112a7576308c379a06103a05260206103c05260166103e0527f455448206d75737420626520666972737420636f696e00000000000000000000610400526103e05060646103bcfd5b60126102e052611357565b6020610400600463313ce5676103a0526103bc610380515afa15612e8b57601f3d1115612e8b57600050610400516102e0610360516004811015612e8b57602002015260136102e0610360516004811015612e8b57602002015110611356576308c379a06103a05260206103c05260196103e0527f4d617820313820646563696d616c7320666f7220636f696e7300000000000000610400526103e05060646103bcfd5b5b604e60246102e0610360516004811015612e8b576020020151808210612e8b57808203905090501015612e8b5760246102e0610360516004811015612e8b576020020151808210612e8b5780820390509050600a0a610260610360516004811015612e8b5760200201526103a0610360516004818352015b60046103a05160018181830110612e8b578082019050905014156113f2576114a7565b60446103a05160018181830110612e8b57808201905090506004811015612e8b576020020135611421576114a7565b60446103a05160018181830110612e8b57808201905090506004811015612e8b576020020135610380511415611496576308c379a06103c05260206103e052600f610400527f4475706c696361746520636f696e730000000000000000000000000000000000610420526104005060646103dcfd5b5b81516001018083528114156113cf575b50505b81516001018083528114156111ad575b5050600161022051600a811015612e8b57026402000000076102405160e05260c052604060c0200154610360526000610360511415611538576308c379a06103805260206103a052601c6103c0527f496e76616c696420696d706c656d656e746174696f6e20696e646578000000006103e0526103c050606461039cfd5b7f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006103a0526103605160601b6103b3527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006103c75260366103a06000f061038052610380513b15612e8b576000600061020461018063a461b3c86103a052806103c05261014080805160200180846103c0018284600060045af115612e8b5750508051820160206001820306601f8201039050602001915050806103e0526101a080805160200180846103c0018284600060045af115612e8b575050506044803561040052806020013561042052806040013561044052806060013561046052506102605161048052610280516104a0526102a0516104c0526102c0516104e052604060c4610500376103bc90506000610380515af115612e8b57640100000003546103a0526103805160016103a051640100000000811015612e8b5702600301556103a05160018181830110612e8b57808201905090506401000000035560076401000000046103805160e05260c052604060c020016102e05181556103005160018201556103205160028201556103405160038201555061024051600b6401000000046103805160e05260c052604060c020015560006401000000046103805160e05260c052604060c020556103605160016401000000046103805160e05260c052604060c0200155600061020051181561176d5761020051600c6401000000046103805160e05260c052604060c02001555b6103c060006004818352015b60446103c0516004811015612e8b5760200201356103e0526103e05161179e57611971565b6103e05160016103c0516004811015612e8b570260036401000000046103805160e05260c052604060c02001015560006004610400527f095ea7b3000000000000000000000000000000000000000000000000000000006104205261040060048060208461046001018260208501600060045af1505080518201915050610380516020826104600101526020810190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602082610460010152602081019050806104605261046090508051602001806105008284600060045af115612e8b575050600060006105005161052060006103e0515af115612e8b5761040060006004818352015b610400516103c051101561194d576044610400516004811015612e8b57602002013561042052610420516103e051186104405264020000000b6104405160e05260c052604060c020546103a0526103805160016103a051640100000000811015612e8b570264020000000a6104405160e05260c052604060c02001556103a05160018181830110612e8b578082019050905064020000000b6104405160e05260c052604060c020555b5b81516001018083528114156118a4575b50505b8151600101808352811415611779575b50507f5b4a28c940282b5bf183df6a046b8119cf6edeb62859f75e835eb7ba834cce8d6103c0808080808060443581525050602081019050808060643581525050602081019050808060843581525050602081019050808060a435815250505050608081019050808060c43581525050602081019050808060e435815250506020810190508080338152505060e0905090506103c0a16103805160005260206000f35b63e339eb4f811415611a2b57600061020052611a4c565b63de7fe3bf811415611a4757602060c461020037600050611a4c565b61202b565b60043560a01c612e8b5760406024356004016101403760206024356004013511612e8b57602a6044356004016101a037600a6044356004013511612e8b5760643560a01c612e8b57623d090060a43510611aaf576305f5e10060a4351115611ab2565b60005b611afb576308c379a061022052602061024052600b610260527f496e76616c6964206665650000000000000000000000000000000000000000006102805261026050606461023cfd5b600161020051600a811015612e8b570264020000000660043560e05260c052604060c0200154610220526000610220511415611b76576308c379a061024052602061026052601c610280527f496e76616c696420696d706c656d656e746174696f6e20696e646578000000006102a05261028050606461025cfd5b60206102c0600463313ce5676102605261027c6064355afa15612e8b57601f3d1115612e8b576000506102c0516102405260136102405110611bf7576308c379a06102605260206102805260196102a0527f4d617820313820646563696d616c7320666f7220636f696e73000000000000006102c0526102a050606461027cfd5b7f602d3d8160093d39f3363d3d373d3d3d363d7300000000000000000000000000610280526102205160601b610293527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006102a75260366102806000f061026052610260513b15612e8b576000600061014460c06398094be061028052806102a05261014080805160200180846102a0018284600060045af115612e8b5750508051820160206001820306601f8201039050602001915050806102c0526101a080805160200180846102a0018284600060045af115612e8b575050506064356102e052604e602461024051808210612e8b57808203905090501015612e8b57602461024051808210612e8b5780820390509050600a0a61030052604060846103203761029c90506000610260515af115612e8b576064353b15612e8b5760006000604463095ea7b361028052610260516102a0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102c05261029c60006064355af115612e8b57640100000003546102805261026051600161028051640100000000811015612e8b5702600301556102805160018181830110612e8b578082019050905064010000000355600a64020000000660043560e05260c052604060c02001546102a05260076401000000046102605160e05260c052604060c02001610240518155600060018201556000600282015560006003820155506002600b6401000000046102605160e05260c052604060c02001556004356401000000046102605160e05260c052604060c0205560643560036401000000046102605160e05260c052604060c0200155600a64020000000660043560e05260c052604060c0200154600160036401000000046102605160e05260c052604060c0200101556102205160016401000000046102605160e05260c052604060c020015560006102c0526102e060006008818352015b60016102e0516008811015612e8b5702600c64020000000660043560e05260c052604060c0200101546103005261030051611f0a5760016102c0526102a051610300525b61030051606435186103205264020000000b6103205160e05260c052604060c020546102805261026051600161028051640100000000811015612e8b570264020000000a6103205160e05260c052604060c02001556102805160018181830110612e8b578082019050905064020000000b6103205160e05260c052604060c020556102c05115611f9957611faa565b5b8151600101808352811415611ec6575b50507f01f31cd2abdeb4e5e10ba500f2db0f937d9e8c735ab04681925441b4ea37eda56102e080808060643581525050602081019050808060043581525050602081019050808060843581525050602081019050808060a435815250506020810190508080338152505060a0905090506102e0a16102605160005260206000f35b6396bebb348114156122665760043560a01c612e8b576000600364010000000460043560e05260c052604060c020015414156120a6576308c379a061014052602061016052600c610180527f556e6b6e6f776e20706f6f6c00000000000000000000000000000000000000006101a05261018050606461015cfd5b600264010000000460043560e05260c052604060c020015415612108576308c379a0610140526020610160526016610180527f476175676520616c7265616479206465706c6f796564000000000000000000006101a05261018050606461015cfd5b64020000000954610140526000610140511415612164576308c379a061016052602061018052601c6101a0527f476175676520696d706c656d656e746174696f6e206e6f7420736574000000006101c0526101a050606461017cfd5b7f602d3d8160093d39f3363d3d373d3d3d363d7300000000000000000000000000610180526101405160601b610193527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006101a75260366101806000f061016052610160513b15612e8b5760006000602463c4d66de8610180526004356101a05261019c6000610160515af115612e8b5761016051600264010000000460043560e05260c052604060c02001557f656bb34c20491970a8c163f3bd62ead82022b379c3924960ec60f6dbfc5aab3b6101808080806004358152505060208101905080806101605181525050604090509050610180a16101605160005260206000f35b632fc056538114156126c45760043560a01c612e8b5760243560a01c612e8b576000610120525b610120516064013560a01c612e8b5760206101205101610120526101406101205110156122b95761228d565b600054331415612e8b57600c64020000000660043560e05260c052604060c0200154612e8b5760206101c0600463a262904b6101605261017c6f22d53366457f9d5e68ec105046fc43835afa15612e8b57601f3d1115612e8b576000506101c051610140526020610200602463940494f1610180526004356101a05261019c610140515afa15612e8b57601f3d1115612e8b5760005061020051610160526000610160511115612e8b576402000000055461018052600435600161018051640100000000811015612e8b570264010000000501556101805160018181830110612e8b5780820190509050640200000005556020610220602463379510496101a0526004356101c0526101bc610140515afa15612e8b57601f3d1115612e8b5760005061022051600a64020000000660043560e05260c052604060c020015561016051601564020000000660043560e05260c052604060c0200155602435600b64020000000660043560e05260c052604060c02001556000604435181561245557604435601664020000000660043560e05260c052604060c02001555b6101a06000600a818352015b60646101a051600a811015612e8b5760200201356101c0526101c051612486576124c1565b6101c05160016101a051600a811015612e8b570264020000000660043560e05260c052604060c02001555b8151600101808352811415612461575b505060006101a0526101006103406024639ac90d3d6102c0526004356102e0526102dc610140515afa15612e8b5760ff3d1115612e8b5760005061034080516101c05280602001516101e0528060400151610200528060600151610220528060800151610240528060a00151610260528060c00151610280528060e001516102a052506102c060006008818352015b610160516102c05114156125635761266c565b6101c06102c0516008811015612e8b5760200201516102e0526102e05160016102c0516008811015612e8b5702600c64020000000660043560e05260c052604060c0200101556101a080516102c0516008808202821582848304141715612e8b57809050905090506040518111612e8b576000811215612615576020610360600463313ce5676103005261031c6102e0515afa15612e8b57601f3d1115612e8b5760005061036051816000031c612646565b6020610360600463313ce5676103005261031c6102e0515afa15612e8b57601f3d1115612e8b5760005061036051811b5b90508181830110612e8b57808201905090508152505b8151600101808352811415612550575b50506101a051601464020000000660043560e05260c052604060c02001557fcc6afdfec79da6be08142ecee25cf14b665961e25d30d8eba45959be9547635f6102c0808080600435815250506020905090506102c0a1005b63cb956b468114156127e55760043560a01c612e8b576000610120525b610120516024013560a01c612e8b57602061012051016101205261014061012051101561270d576126e1565b600054331415612e8b576000600c64020000000660043560e05260c052604060c02001541815612e8b576101406000600a818352015b602461014051600a811015612e8b57602002013561016052600161014051600a811015612e8b570264020000000660043560e05260c052604060c020015461018052610180516101605114156127a557610160516127a0576127e1565b6127d0565b61016051600161014051600a811015612e8b570264020000000660043560e05260c052604060c02001555b5b8151600101808352811415612743575b5050005b639ddbf4b98114156128dc576000610120525b610120516024013560a01c612e8b576020610120510161012052610140610120511015612824576127f8565b600054331415612e8b576101406000600a818352015b602461014051600a811015612e8b57602002013561016052600161014051600a811015612e8b570264020000000760043560e05260c052604060c0200154610180526101805161016051141561289c5761016051612897576128d8565b6128c7565b61016051600161014051600a811015612e8b570264020000000760043560e05260c052604060c02001555b5b815160010180835281141561283a575b5050005b638f03182c8114156129085760043560a01c612e8b57600054331415612e8b5760043564020000000955005b630b2a46438114156129fb5760043560a01c612e8b5760243560a01c612e8b57600054331415612e8b576000600364010000000460043560e05260c052604060c02001541415612997576308c379a061014052602061016052600c610180527f556e6b6e6f776e20706f6f6c00000000000000000000000000000000000000006101a05261018050606461015cfd5b602435600264010000000460043560e05260c052604060c02001557f656bb34c20491970a8c163f3bd62ead82022b379c3924960ec60f6dbfc5aab3b61014080808060043581525050602081019050808060243581525050604090509050610140a1005b637542f078811415612b12576000610120525b610120516004013560a01c612e8b576020610120510161012052610400610120511015612a3a57612a0e565b600254610160526000546101805260006101405261014061012060006002818352015b610120516020026101600151331415612a795760018352612a8a565b5b8151600101808352811415612a5d575b5050506101405115612e8b5761014060006020818352015b6004610140516020811015612e8b576020020135612abf57612b0e565b610404610140516020811015612e8b576020020135600c6401000000046004610140516020811015612e8b57602002013560e05260c052604060c02001555b8151600101808352811415612aa2575b5050005b636b441a40811415612b3a5760043560a01c612e8b57600054331415612e8b57600435600155005b63e5ea47b8811415612b66576001546101405261014051331415612e8b57610140516000556000600155005b639aece83e811415612be05760043560a01c612e8b57600254610160526000546101805260006101405261014061012060006002818352015b610120516020026101600151331415612bbb5760018352612bcc565b5b8151600101808352811415612b9f575b5050506101405115612e8b57600435600255005b6336d2b77a811415612c3e5760043560a01c612e8b5760243560a01c612e8b57600054331415612e8b57600435612c205760243564020000000855612c3c565b602435600b64020000000660043560e05260c052604060c02001555b005b63bcc981d2811415612d35576401000000043360e05260c052604060c02054610140526000610140511815612e8b5760036401000000043360e05260c052604060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa15612e8b57601f3d1115612e8b576000506102205161018052600b6402000000066101405160e05260c052604060c02001546101a05260206102c060a463ddc1f59d6101c05260006101e05260016102005261018051610220526000610240526101a051610260526101dc6000335af115612e8b57601f3d1115612e8b576000506102c050600160005260206000f35b63f851a440811415612d4d5760005460005260206000f35b6317f7182a811415612d655760015460005260206000f35b63481c6a75811415612d7d5760025460005260206000f35b633a1d5d8e811415612da9576001600435640100000000811015612e8b57026003015460005260206000f35b63956aae3a811415612dc5576401000000035460005260206000f35b6322fe5671811415612df5576001600435640100000000811015612e8b5702640100000005015460005260206000f35b63de5e4a3b811415612e11576402000000055460005260206000f35b6331a4f865811415612e4b576001602435600a811015612e8b570264020000000760043560e05260c052604060c020015460005260206000f35b63cab4d3db811415612e67576402000000085460005260206000f35b638df24207811415612e83576402000000095460005260206000f35b505b60006000fd5b600080fd5b610046612ed603610046600039610046612ed6036000f35b600080fd000000000000000000000000114c4042b11a2b16f58fe1bfe847589a122f678a
Deployed Bytecode
0x600436101561000d57612e85565b600035601c526f7fffffffffffffffffffffffffffffff60405260005134612e8b5763970fa3f38114156100b95760043560a01c612e8b5764020000000660043560e05260c052604060c02080546101605260018101546101805260028101546101a05260038101546101c05260048101546101e05260058101546102005260068101546102205260078101546102405260088101546102605260098101546102805250610140610160f35b63a87df06c8114156100d0576000610140526100f1565b636982eb0b8114156100ec5760206044610140376000506100f1565b610144565b60043560a01c612e8b5760243560a01c612e8b576024356004351861016052600161014051640100000000811015612e8b570264020000000a6101605160e05260c052604060c020015460005260206000f35b636f20d6dd8114156101785760043560a01c612e8b5764010000000460043560e05260c052604060c0205460005260206000f35b63940494f18114156101af5760043560a01c612e8b57600b64010000000460043560e05260c052604060c020015460005260206000f35b63eb73f37d81141561021d5760043560a01c612e8b5764010000000460043560e05260c052604060c02054610140526101a06002815260156402000000066101405160e05260c052604060c020015460018181830110612e8b578082019050905081602001525060406101a0f35b639ac90d3d8114156102735760043560a01c612e8b57600364010000000460043560e05260c052604060c0200180546101605260018101546101805260028101546101a05260038101546101c052506080610160f35b63a77576ef8114156103665760043560a01c612e8b57610100366101403764010000000460043560e05260c052604060c02054610240526000610240511815612e8b57600364010000000460043560e05260c052604060c02001546101405261026060016007818352015b6001610260516001808210612e8b57808203905090506008811015612e8b5702600c6402000000066102405160e05260c052604060c020010154610140610260516008811015612e8b576020020152610140610260516008811015612e8b57602002015161034b5761035c565b5b81516001018083528114156102de575b5050610100610140f35b6352b515558114156104265760043560a01c612e8b57600064010000000460043560e05260c052604060c0205418156103e65760803661014037600764010000000460043560e05260c052604060c0200180546101405260018101546101605260028101546101805260038101546101a052506012610160526080610140f35b600764010000000460043560e05260c052604060c0200180546101605260018101546101805260028101546101a05260038101546101c052506080610160f35b634cb088f181141561058b5760043560a01c612e8b5760803661014037600764010000000460043560e05260c052604060c0200180546101405260018101546101605260028101546101805260038101546101a05250610100366101c037610140516101c05264010000000460043560e05260c052604060c020546102c05260146402000000066102c05160e05260c052604060c02001546102e05261030060006008818352015b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861030051808202821582848305141715612e8b57809050905090506000811215610521576102e051816000031c610528565b6102e051811b5b905061010080820690509050610320526103205161054557610581565b610320516101c06103005160018181830112612e8b57808201905090506008811015612e8b5760200201525b81516001018083528114156104ce575b50506101006101c0f35b6306d8f1608114156105fe5760043560a01c612e8b57670de0b6b3a76400006101405260006101605260206101e0600463bb7b8b806101805261019c64010000000460043560e05260c052604060c020545afa15612e8b57601f3d1115612e8b576000506101e051610160526040610140f35b6392e3cc2d8114156107805760043560a01c612e8b57600064010000000460043560e05260c052604060c0205418156106c25760206101c06024634903b0d16101405260006101605261015c6004355afa15612e8b57601f3d1115612e8b576000506101c0516101e05260206102806024634903b0d16102005260016102205261021c6004355afa15612e8b57601f3d1115612e8b57600050610280516102a0526101e0516102e0526102a0516103005260006103205260006103405260806102e0f35b600b64010000000460043560e05260c052604060c020015461014052608036610160376101e060006004818352015b610140516101e051101561074e5760206102806024634903b0d1610200526101e0516102205261021c6004355afa15612e8b57601f3d1115612e8b57600050610280516101606101e0516004811015612e8b576020020152610766565b60006101606101e0516004811015612e8b5760200201525b5b81516001018083528114156106f1575b50506080610160f35b6359f4f3518114156109a55760043560a01c612e8b57610100366101403760206102c06024634903b0d16102405260006102605261025c6004355afa15612e8b57601f3d1115612e8b576000506102c0516101405260206102c060046318160ddd6102605261027c6001600364010000000460043560e05260c052604060c0200101545afa15612e8b57601f3d1115612e8b576000506102c05161024052600061024051111561099d5760206103006024634903b0d16102805260016102a05261029c6004355afa15612e8b57601f3d1115612e8b57600050610300516ec097ce7bc90715b34b9f1000000000808202821582848304141715612e8b578090509050905061024051808015612e8b578204905090506102605264010000000460043560e05260c052604060c02054610280526000610280511815612e8b5760156402000000066102805160e05260c052604060c02001546102a0526102c060006008818352015b6102a0516102c05114156108fa5761099a565b60206103606024634903b0d16102e0526102c051610300526102fc610280515afa15612e8b57601f3d1115612e8b576000506103605161026051808202821582848304141715612e8b57809050905090506ec097ce7bc90715b34b9f1000000000808204905090506101406102c05160018181830110612e8b57808201905090506008811015612e8b5760200201525b81516001018083528114156108e7575b50505b610100610140f35b6355b30b198114156109f15760043560a01c612e8b5760206101a0600463f446c1d06101405261015c6004355afa15612e8b57601f3d1115612e8b576000506101a05160005260206000f35b637cdb72b0811415610a985760043560a01c612e8b5760206101a0600463ddca3f436101405261015c6004355afa15612e8b57601f3d1115612e8b576000506101a0516101c0526020610240600463fee3f7f96101e0526101fc6004355afa15612e8b57601f3d1115612e8b5760005061024051610260526102808080806101c051815250506020810190508080610260518152505060409050905060c05260c051610280f35b63c11e45b8811415610b545760043560a01c612e8b57600b64010000000460043560e05260c052604060c020015461014052608036610160376101e060006004818352015b610140516101e0511415610af057610b4b565b6020610280602463e2e7d264610200526101e0516102205261021c6004355afa15612e8b57601f3d1115612e8b57600050610280516101606101e0516004811015612e8b5760200201525b8151600101808352811415610add575b50506080610160f35b63eb85226d811415610ed05760043560a01c612e8b5760243560a01c612e8b5760443560a01c612e8b57600364010000000460043560e05260c052604060c02001546101405264010000000460043560e05260c052604060c0205461016052602435610200526044356102205260006101e0526101e061012060006002818352015b610120516020026102000151610140511415610bf55760018352610c06565b5b8151600101808352811415610bd6575b5050506101e05115610c1f576000610160511415610c22565b60005b15610cfb576001600364010000000460043560e05260c052604060c02001015461024052602435610280526044356102a05260006102605261026061012060006002818352015b610120516020026102800151610240511415610c885760018352610c99565b5b8151600101808352811415610c69575b5050506102605115610cfa5761014051604435146102c05261014051602435146102e0526103008080806102c0518152505060208101905080806102e05181525050602081019050808060008152505060609050905060c05260c051610300f35b5b606036610180376101e060006008818352015b61016051610da55760046101e05112610d66576308c379a06103605260206103805260136103a0527f4e6f20617661696c61626c65206d61726b6574000000000000000000000000006103c0526103a050606461037cfd5b60006101e0511815610da05760016101e0516004811015612e8b5702600364010000000460043560e05260c052604060c020010154610140525b610dfb565b60006101e0511815610dfa5760016101e051600180820380607f1d8160801d1415612e8b57809050905090506008811015612e8b5702600c6402000000066101605160e05260c052604060c020010154610140525b5b61014051610e48576308c379a06103605260206103805260136103a0527f4e6f20617661696c61626c65206d61726b6574000000000000000000000000006103c0526103a050606461037cfd5b602435610140511415610e62576101e0516101a052610e82565b604435610140511415610e7c576101e0516101c052610e81565b610e97565b5b6101805115610e9057610ea7565b6001610180525b8151600101808352811415610d0e575b50506103c06101a05181526101c0518160200152600061016051141581604001525060606103c0f35b63daf297b9811415610f075760043560a01c612e8b57600264010000000460043560e05260c052604060c020015460005260206000f35b63510d98a4811415610f3e5760043560a01c612e8b57600164010000000460043560e05260c052604060c020015460005260206000f35b63e4d332a9811415610f765760043560a01c612e8b57600064010000000460043560e05260c052604060c02054141560005260206000f35b6366d3966c811415610ff65760043560a01c612e8b5764010000000460043560e05260c052604060c020546101405261014051610fd257600c64010000000460043560e05260c052604060c020015460005260206000f3610ff4565b60166402000000066101405160e05260c052604060c020015460005260206000f35b005b63154aa8f58114156110655760043560a01c612e8b5764010000000460043560e05260c052604060c020546101405261014051611041576402000000085460005260206000f3611063565b600b6402000000066101405160e05260c052604060c020015460005260206000f35b005b63cd419bb5811415611082576000610200526000610220526110d0565b635c16487b8114156110a5576000610220526020610104610200376000506110d0565b6352f2db698114156110cb576020610104610200376020610124610220376000506110d0565b611a14565b60406004356004016101403760206004356004013511612e8b57602a6024356004016101a037600a6024356004013511612e8b5760443560a01c612e8b5760643560a01c612e8b5760843560a01c612e8b5760a43560a01c612e8b57623d090060e43510611147576305f5e10060e435111561114a565b60005b611193576308c379a061024052602061026052600b610280527f496e76616c6964206665650000000000000000000000000000000000000000006102a05261028050606461025cfd5b600461024052610100366102603761036060006004818352015b6044610360516004811015612e8b576020020135610380526103805161122a576001610360511161121d576308c379a06103a05260206103c05260126103e0527f496e73756666696369656e7420636f696e730000000000000000000000000000610400526103e05060646103bcfd5b61036051610240526114ba565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6044610360516004811015612e8b57602002013514156112b25761036051156112a7576308c379a06103a05260206103c05260166103e0527f455448206d75737420626520666972737420636f696e00000000000000000000610400526103e05060646103bcfd5b60126102e052611357565b6020610400600463313ce5676103a0526103bc610380515afa15612e8b57601f3d1115612e8b57600050610400516102e0610360516004811015612e8b57602002015260136102e0610360516004811015612e8b57602002015110611356576308c379a06103a05260206103c05260196103e0527f4d617820313820646563696d616c7320666f7220636f696e7300000000000000610400526103e05060646103bcfd5b5b604e60246102e0610360516004811015612e8b576020020151808210612e8b57808203905090501015612e8b5760246102e0610360516004811015612e8b576020020151808210612e8b5780820390509050600a0a610260610360516004811015612e8b5760200201526103a0610360516004818352015b60046103a05160018181830110612e8b578082019050905014156113f2576114a7565b60446103a05160018181830110612e8b57808201905090506004811015612e8b576020020135611421576114a7565b60446103a05160018181830110612e8b57808201905090506004811015612e8b576020020135610380511415611496576308c379a06103c05260206103e052600f610400527f4475706c696361746520636f696e730000000000000000000000000000000000610420526104005060646103dcfd5b5b81516001018083528114156113cf575b50505b81516001018083528114156111ad575b5050600161022051600a811015612e8b57026402000000076102405160e05260c052604060c0200154610360526000610360511415611538576308c379a06103805260206103a052601c6103c0527f496e76616c696420696d706c656d656e746174696f6e20696e646578000000006103e0526103c050606461039cfd5b7f602d3d8160093d39f3363d3d373d3d3d363d73000000000000000000000000006103a0526103605160601b6103b3527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006103c75260366103a06000f061038052610380513b15612e8b576000600061020461018063a461b3c86103a052806103c05261014080805160200180846103c0018284600060045af115612e8b5750508051820160206001820306601f8201039050602001915050806103e0526101a080805160200180846103c0018284600060045af115612e8b575050506044803561040052806020013561042052806040013561044052806060013561046052506102605161048052610280516104a0526102a0516104c0526102c0516104e052604060c4610500376103bc90506000610380515af115612e8b57640100000003546103a0526103805160016103a051640100000000811015612e8b5702600301556103a05160018181830110612e8b57808201905090506401000000035560076401000000046103805160e05260c052604060c020016102e05181556103005160018201556103205160028201556103405160038201555061024051600b6401000000046103805160e05260c052604060c020015560006401000000046103805160e05260c052604060c020556103605160016401000000046103805160e05260c052604060c0200155600061020051181561176d5761020051600c6401000000046103805160e05260c052604060c02001555b6103c060006004818352015b60446103c0516004811015612e8b5760200201356103e0526103e05161179e57611971565b6103e05160016103c0516004811015612e8b570260036401000000046103805160e05260c052604060c02001015560006004610400527f095ea7b3000000000000000000000000000000000000000000000000000000006104205261040060048060208461046001018260208501600060045af1505080518201915050610380516020826104600101526020810190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602082610460010152602081019050806104605261046090508051602001806105008284600060045af115612e8b575050600060006105005161052060006103e0515af115612e8b5761040060006004818352015b610400516103c051101561194d576044610400516004811015612e8b57602002013561042052610420516103e051186104405264020000000b6104405160e05260c052604060c020546103a0526103805160016103a051640100000000811015612e8b570264020000000a6104405160e05260c052604060c02001556103a05160018181830110612e8b578082019050905064020000000b6104405160e05260c052604060c020555b5b81516001018083528114156118a4575b50505b8151600101808352811415611779575b50507f5b4a28c940282b5bf183df6a046b8119cf6edeb62859f75e835eb7ba834cce8d6103c0808080808060443581525050602081019050808060643581525050602081019050808060843581525050602081019050808060a435815250505050608081019050808060c43581525050602081019050808060e435815250506020810190508080338152505060e0905090506103c0a16103805160005260206000f35b63e339eb4f811415611a2b57600061020052611a4c565b63de7fe3bf811415611a4757602060c461020037600050611a4c565b61202b565b60043560a01c612e8b5760406024356004016101403760206024356004013511612e8b57602a6044356004016101a037600a6044356004013511612e8b5760643560a01c612e8b57623d090060a43510611aaf576305f5e10060a4351115611ab2565b60005b611afb576308c379a061022052602061024052600b610260527f496e76616c6964206665650000000000000000000000000000000000000000006102805261026050606461023cfd5b600161020051600a811015612e8b570264020000000660043560e05260c052604060c0200154610220526000610220511415611b76576308c379a061024052602061026052601c610280527f496e76616c696420696d706c656d656e746174696f6e20696e646578000000006102a05261028050606461025cfd5b60206102c0600463313ce5676102605261027c6064355afa15612e8b57601f3d1115612e8b576000506102c0516102405260136102405110611bf7576308c379a06102605260206102805260196102a0527f4d617820313820646563696d616c7320666f7220636f696e73000000000000006102c0526102a050606461027cfd5b7f602d3d8160093d39f3363d3d373d3d3d363d7300000000000000000000000000610280526102205160601b610293527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006102a75260366102806000f061026052610260513b15612e8b576000600061014460c06398094be061028052806102a05261014080805160200180846102a0018284600060045af115612e8b5750508051820160206001820306601f8201039050602001915050806102c0526101a080805160200180846102a0018284600060045af115612e8b575050506064356102e052604e602461024051808210612e8b57808203905090501015612e8b57602461024051808210612e8b5780820390509050600a0a61030052604060846103203761029c90506000610260515af115612e8b576064353b15612e8b5760006000604463095ea7b361028052610260516102a0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102c05261029c60006064355af115612e8b57640100000003546102805261026051600161028051640100000000811015612e8b5702600301556102805160018181830110612e8b578082019050905064010000000355600a64020000000660043560e05260c052604060c02001546102a05260076401000000046102605160e05260c052604060c02001610240518155600060018201556000600282015560006003820155506002600b6401000000046102605160e05260c052604060c02001556004356401000000046102605160e05260c052604060c0205560643560036401000000046102605160e05260c052604060c0200155600a64020000000660043560e05260c052604060c0200154600160036401000000046102605160e05260c052604060c0200101556102205160016401000000046102605160e05260c052604060c020015560006102c0526102e060006008818352015b60016102e0516008811015612e8b5702600c64020000000660043560e05260c052604060c0200101546103005261030051611f0a5760016102c0526102a051610300525b61030051606435186103205264020000000b6103205160e05260c052604060c020546102805261026051600161028051640100000000811015612e8b570264020000000a6103205160e05260c052604060c02001556102805160018181830110612e8b578082019050905064020000000b6103205160e05260c052604060c020556102c05115611f9957611faa565b5b8151600101808352811415611ec6575b50507f01f31cd2abdeb4e5e10ba500f2db0f937d9e8c735ab04681925441b4ea37eda56102e080808060643581525050602081019050808060043581525050602081019050808060843581525050602081019050808060a435815250506020810190508080338152505060a0905090506102e0a16102605160005260206000f35b6396bebb348114156122665760043560a01c612e8b576000600364010000000460043560e05260c052604060c020015414156120a6576308c379a061014052602061016052600c610180527f556e6b6e6f776e20706f6f6c00000000000000000000000000000000000000006101a05261018050606461015cfd5b600264010000000460043560e05260c052604060c020015415612108576308c379a0610140526020610160526016610180527f476175676520616c7265616479206465706c6f796564000000000000000000006101a05261018050606461015cfd5b64020000000954610140526000610140511415612164576308c379a061016052602061018052601c6101a0527f476175676520696d706c656d656e746174696f6e206e6f7420736574000000006101c0526101a050606461017cfd5b7f602d3d8160093d39f3363d3d373d3d3d363d7300000000000000000000000000610180526101405160601b610193527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006101a75260366101806000f061016052610160513b15612e8b5760006000602463c4d66de8610180526004356101a05261019c6000610160515af115612e8b5761016051600264010000000460043560e05260c052604060c02001557f656bb34c20491970a8c163f3bd62ead82022b379c3924960ec60f6dbfc5aab3b6101808080806004358152505060208101905080806101605181525050604090509050610180a16101605160005260206000f35b632fc056538114156126c45760043560a01c612e8b5760243560a01c612e8b576000610120525b610120516064013560a01c612e8b5760206101205101610120526101406101205110156122b95761228d565b600054331415612e8b57600c64020000000660043560e05260c052604060c0200154612e8b5760206101c0600463a262904b6101605261017c6f22d53366457f9d5e68ec105046fc43835afa15612e8b57601f3d1115612e8b576000506101c051610140526020610200602463940494f1610180526004356101a05261019c610140515afa15612e8b57601f3d1115612e8b5760005061020051610160526000610160511115612e8b576402000000055461018052600435600161018051640100000000811015612e8b570264010000000501556101805160018181830110612e8b5780820190509050640200000005556020610220602463379510496101a0526004356101c0526101bc610140515afa15612e8b57601f3d1115612e8b5760005061022051600a64020000000660043560e05260c052604060c020015561016051601564020000000660043560e05260c052604060c0200155602435600b64020000000660043560e05260c052604060c02001556000604435181561245557604435601664020000000660043560e05260c052604060c02001555b6101a06000600a818352015b60646101a051600a811015612e8b5760200201356101c0526101c051612486576124c1565b6101c05160016101a051600a811015612e8b570264020000000660043560e05260c052604060c02001555b8151600101808352811415612461575b505060006101a0526101006103406024639ac90d3d6102c0526004356102e0526102dc610140515afa15612e8b5760ff3d1115612e8b5760005061034080516101c05280602001516101e0528060400151610200528060600151610220528060800151610240528060a00151610260528060c00151610280528060e001516102a052506102c060006008818352015b610160516102c05114156125635761266c565b6101c06102c0516008811015612e8b5760200201516102e0526102e05160016102c0516008811015612e8b5702600c64020000000660043560e05260c052604060c0200101556101a080516102c0516008808202821582848304141715612e8b57809050905090506040518111612e8b576000811215612615576020610360600463313ce5676103005261031c6102e0515afa15612e8b57601f3d1115612e8b5760005061036051816000031c612646565b6020610360600463313ce5676103005261031c6102e0515afa15612e8b57601f3d1115612e8b5760005061036051811b5b90508181830110612e8b57808201905090508152505b8151600101808352811415612550575b50506101a051601464020000000660043560e05260c052604060c02001557fcc6afdfec79da6be08142ecee25cf14b665961e25d30d8eba45959be9547635f6102c0808080600435815250506020905090506102c0a1005b63cb956b468114156127e55760043560a01c612e8b576000610120525b610120516024013560a01c612e8b57602061012051016101205261014061012051101561270d576126e1565b600054331415612e8b576000600c64020000000660043560e05260c052604060c02001541815612e8b576101406000600a818352015b602461014051600a811015612e8b57602002013561016052600161014051600a811015612e8b570264020000000660043560e05260c052604060c020015461018052610180516101605114156127a557610160516127a0576127e1565b6127d0565b61016051600161014051600a811015612e8b570264020000000660043560e05260c052604060c02001555b5b8151600101808352811415612743575b5050005b639ddbf4b98114156128dc576000610120525b610120516024013560a01c612e8b576020610120510161012052610140610120511015612824576127f8565b600054331415612e8b576101406000600a818352015b602461014051600a811015612e8b57602002013561016052600161014051600a811015612e8b570264020000000760043560e05260c052604060c0200154610180526101805161016051141561289c5761016051612897576128d8565b6128c7565b61016051600161014051600a811015612e8b570264020000000760043560e05260c052604060c02001555b5b815160010180835281141561283a575b5050005b638f03182c8114156129085760043560a01c612e8b57600054331415612e8b5760043564020000000955005b630b2a46438114156129fb5760043560a01c612e8b5760243560a01c612e8b57600054331415612e8b576000600364010000000460043560e05260c052604060c02001541415612997576308c379a061014052602061016052600c610180527f556e6b6e6f776e20706f6f6c00000000000000000000000000000000000000006101a05261018050606461015cfd5b602435600264010000000460043560e05260c052604060c02001557f656bb34c20491970a8c163f3bd62ead82022b379c3924960ec60f6dbfc5aab3b61014080808060043581525050602081019050808060243581525050604090509050610140a1005b637542f078811415612b12576000610120525b610120516004013560a01c612e8b576020610120510161012052610400610120511015612a3a57612a0e565b600254610160526000546101805260006101405261014061012060006002818352015b610120516020026101600151331415612a795760018352612a8a565b5b8151600101808352811415612a5d575b5050506101405115612e8b5761014060006020818352015b6004610140516020811015612e8b576020020135612abf57612b0e565b610404610140516020811015612e8b576020020135600c6401000000046004610140516020811015612e8b57602002013560e05260c052604060c02001555b8151600101808352811415612aa2575b5050005b636b441a40811415612b3a5760043560a01c612e8b57600054331415612e8b57600435600155005b63e5ea47b8811415612b66576001546101405261014051331415612e8b57610140516000556000600155005b639aece83e811415612be05760043560a01c612e8b57600254610160526000546101805260006101405261014061012060006002818352015b610120516020026101600151331415612bbb5760018352612bcc565b5b8151600101808352811415612b9f575b5050506101405115612e8b57600435600255005b6336d2b77a811415612c3e5760043560a01c612e8b5760243560a01c612e8b57600054331415612e8b57600435612c205760243564020000000855612c3c565b602435600b64020000000660043560e05260c052604060c02001555b005b63bcc981d2811415612d35576401000000043360e05260c052604060c02054610140526000610140511815612e8b5760036401000000043360e05260c052604060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa15612e8b57601f3d1115612e8b576000506102205161018052600b6402000000066101405160e05260c052604060c02001546101a05260206102c060a463ddc1f59d6101c05260006101e05260016102005261018051610220526000610240526101a051610260526101dc6000335af115612e8b57601f3d1115612e8b576000506102c050600160005260206000f35b63f851a440811415612d4d5760005460005260206000f35b6317f7182a811415612d655760015460005260206000f35b63481c6a75811415612d7d5760025460005260206000f35b633a1d5d8e811415612da9576001600435640100000000811015612e8b57026003015460005260206000f35b63956aae3a811415612dc5576401000000035460005260206000f35b6322fe5671811415612df5576001600435640100000000811015612e8b5702640100000005015460005260206000f35b63de5e4a3b811415612e11576402000000055460005260206000f35b6331a4f865811415612e4b576001602435600a811015612e8b570264020000000760043560e05260c052604060c020015460005260206000f35b63cab4d3db811415612e67576402000000085460005260206000f35b638df24207811415612e83576402000000095460005260206000f35b505b60006000fd5b600080fd
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000114c4042b11a2b16f58fe1bfe847589a122f678a
-----Decoded View---------------
Arg [0] : _fee_receiver (address): 0x114C4042B11a2b16F58Fe1BFe847589a122F678a
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000114c4042b11a2b16f58fe1bfe847589a122f678a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.