Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,345 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exchange | 20052007 | 209 days ago | IN | 0 ETH | 0.00077337 | ||||
Remove_liquidity... | 18639436 | 407 days ago | IN | 0 ETH | 0.00308145 | ||||
Exchange | 18215473 | 466 days ago | IN | 0 ETH | 0.00301627 | ||||
Exchange | 16905614 | 650 days ago | IN | 0 ETH | 0.00354381 | ||||
Exchange | 16615110 | 691 days ago | IN | 0 ETH | 0.00303166 | ||||
Remove_liquidity... | 16029083 | 773 days ago | IN | 0 ETH | 0.00217115 | ||||
Exchange | 15876526 | 794 days ago | IN | 0 ETH | 0.00330683 | ||||
Exchange | 15876519 | 794 days ago | IN | 0 ETH | 0.0032781 | ||||
Exchange | 15876514 | 794 days ago | IN | 0 ETH | 0.0026359 | ||||
Exchange | 15876507 | 794 days ago | IN | 0 ETH | 0.00175547 | ||||
Exchange | 15689998 | 820 days ago | IN | 0 ETH | 0.00415005 | ||||
Exchange | 15673778 | 822 days ago | IN | 0 ETH | 0.00129708 | ||||
Exchange | 15637600 | 828 days ago | IN | 0 ETH | 0.00245801 | ||||
Exchange | 15586245 | 835 days ago | IN | 0 ETH | 0.00119677 | ||||
Exchange | 15579152 | 836 days ago | IN | 0 ETH | 0.00101849 | ||||
Exchange | 15564861 | 838 days ago | IN | 0 ETH | 0.00148567 | ||||
Exchange | 15558720 | 839 days ago | IN | 0 ETH | 0.00064115 | ||||
Exchange | 15549903 | 840 days ago | IN | 0 ETH | 0.00086951 | ||||
Exchange | 15540652 | 841 days ago | IN | 0 ETH | 0.00426924 | ||||
Exchange | 15537898 | 842 days ago | IN | 0 ETH | 0.00409302 | ||||
Exchange | 15527987 | 843 days ago | IN | 0 ETH | 0.00385635 | ||||
Exchange | 15525932 | 844 days ago | IN | 0 ETH | 0.00182574 | ||||
Exchange | 15525906 | 844 days ago | IN | 0 ETH | 0.00159284 | ||||
Exchange | 15522513 | 844 days ago | IN | 0 ETH | 0.00236341 | ||||
Exchange | 15501052 | 848 days ago | IN | 0 ETH | 0.00181024 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.3.1
Contract Source Code (Vyper language format)
# @version 0.3.1 """ @title StableSwap @author Curve.Fi @license Copyright (c) Curve.Fi, 2020-2021 - all rights reserved """ from vyper.interfaces import ERC20 interface ERC1271: def isValidSignature(_hash: bytes32, _signature: Bytes[65]) -> bytes32: view event Transfer: sender: indexed(address) receiver: indexed(address) value: uint256 event Approval: owner: indexed(address) spender: indexed(address) value: uint256 event TokenExchange: buyer: indexed(address) sold_id: int128 tokens_sold: uint256 bought_id: int128 tokens_bought: uint256 event AddLiquidity: provider: indexed(address) token_amounts: uint256[N_COINS] fees: uint256[N_COINS] invariant: uint256 token_supply: uint256 event RemoveLiquidity: provider: indexed(address) token_amounts: uint256[N_COINS] fees: uint256[N_COINS] token_supply: uint256 event RemoveLiquidityOne: provider: indexed(address) token_amount: uint256 coin_amount: uint256 token_supply: uint256 event RemoveLiquidityImbalance: provider: indexed(address) token_amounts: uint256[N_COINS] fees: uint256[N_COINS] invariant: uint256 token_supply: uint256 event RampA: old_A: uint256 new_A: uint256 initial_time: uint256 future_time: uint256 event StopRampA: A: uint256 t: uint256 event TransferOwnership: _old_owner: address _new_owner: address N_COINS: constant(int128) = 4 PRECISION: constant(uint256) = 10 ** 18 FEE_DENOMINATOR: constant(uint256) = 10 ** 10 ADMIN_FEE: constant(uint256) = 5000000000 A_PRECISION: constant(uint256) = 100 MAX_A: constant(uint256) = 10 ** 6 MAX_A_CHANGE: constant(uint256) = 10 MIN_RAMP_TIME: constant(uint256) = 86400 EIP712_TYPEHASH: constant(bytes32) = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)") PERMIT_TYPEHASH: constant(bytes32) = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)") # keccak256("isValidSignature(bytes32,bytes)")[:4] << 224 ERC1271_MAGIC_VAL: constant(bytes32) = 0x1626ba7e00000000000000000000000000000000000000000000000000000000 VERSION: constant(String[8]) = "v5.0.0" COINS: immutable(address[N_COINS]) RATE_MULTIPLIERS: immutable(uint256[N_COINS]) NAME: immutable(String[64]) SYMBOL: immutable(String[32]) DOMAIN_SEPARATOR: immutable(bytes32) admin_balances: public(uint256[N_COINS]) fee: public(uint256) # fee * 1e10 initial_A: public(uint256) future_A: public(uint256) initial_A_time: public(uint256) future_A_time: public(uint256) balanceOf: public(HashMap[address, uint256]) allowance: public(HashMap[address, HashMap[address, uint256]]) totalSupply: public(uint256) nonces: public(HashMap[address, uint256]) owner: public(address) future_owner: public(address) @external def __init__( _name: String[64], _symbol: String[32], _coins: address[4], _rate_multipliers: uint256[4], _A: uint256, _fee: uint256, ): """ @notice Contract constructor @param _name Name of the new pool @param _symbol Token symbol @param _coins List of all ERC20 conract addresses of coins @param _rate_multipliers List of number of decimals in coins @param _A Amplification coefficient multiplied by n ** (n - 1) @param _fee Fee to charge for exchanges """ COINS = _coins RATE_MULTIPLIERS = _rate_multipliers A: uint256 = _A * A_PRECISION self.initial_A = A self.future_A = A self.fee = _fee self.owner = msg.sender NAME = _name SYMBOL = _symbol DOMAIN_SEPARATOR = keccak256( _abi_encode(EIP712_TYPEHASH, keccak256(_name), keccak256(VERSION), chain.id, self) ) # fire a transfer event so block explorers identify the contract as an ERC20 log Transfer(ZERO_ADDRESS, self, 0) ### ERC20 Functionality ### @view @external def decimals() -> uint256: """ @notice Get the number of decimals for this token @dev Implemented as a view method to reduce gas costs @return uint256 decimal places """ return 18 @internal def _transfer(_from: address, _to: address, _value: uint256): # # NOTE: vyper does not allow underflows # # so the following subtraction would revert on insufficient balance self.balanceOf[_from] -= _value self.balanceOf[_to] += _value log Transfer(_from, _to, _value) @external def transfer(_to : address, _value : uint256) -> bool: """ @dev Transfer token for a specified address @param _to The address to transfer to. @param _value The amount to be transferred. """ self._transfer(msg.sender, _to, _value) return True @external def transferFrom(_from : address, _to : address, _value : uint256) -> bool: """ @dev Transfer tokens from one address to another. @param _from address The address which you want to send tokens from @param _to address The address which you want to transfer to @param _value uint256 the amount of tokens to be transferred """ self._transfer(_from, _to, _value) _allowance: uint256 = self.allowance[_from][msg.sender] if _allowance != MAX_UINT256: self.allowance[_from][msg.sender] = _allowance - _value return True @external def approve(_spender : address, _value : uint256) -> bool: """ @notice Approve the passed address to transfer the specified amount of tokens on behalf of msg.sender @dev Beware that changing an allowance via this method brings the risk that someone may use both the old and new allowance by unfortunate transaction ordering: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 @param _spender The address which will transfer the funds @param _value The amount of tokens that may be transferred @return bool success """ self.allowance[msg.sender][_spender] = _value log Approval(msg.sender, _spender, _value) return True @external def permit( _owner: address, _spender: address, _value: uint256, _deadline: uint256, _v: uint8, _r: bytes32, _s: bytes32 ) -> bool: """ @notice Approves spender by owner's signature to expend owner's tokens. See https://eips.ethereum.org/EIPS/eip-2612. @dev Inspired by https://github.com/yearn/yearn-vaults/blob/main/contracts/Vault.vy#L753-L793 @dev Supports smart contract wallets which implement ERC1271 https://eips.ethereum.org/EIPS/eip-1271 @param _owner The address which is a source of funds and has signed the Permit. @param _spender The address which is allowed to spend the funds. @param _value The amount of tokens to be spent. @param _deadline The timestamp after which the Permit is no longer valid. @param _v The bytes[64] of the valid secp256k1 signature of permit by owner @param _r The bytes[0:32] of the valid secp256k1 signature of permit by owner @param _s The bytes[32:64] of the valid secp256k1 signature of permit by owner @return True, if transaction completes successfully """ assert _owner != ZERO_ADDRESS assert block.timestamp <= _deadline nonce: uint256 = self.nonces[_owner] digest: bytes32 = keccak256( concat( b"\x19\x01", DOMAIN_SEPARATOR, keccak256(_abi_encode(PERMIT_TYPEHASH, _owner, _spender, _value, nonce, _deadline)) ) ) if _owner.is_contract: sig: Bytes[65] = concat(_abi_encode(_r, _s), slice(convert(_v, bytes32), 31, 1)) # reentrancy not a concern since this is a staticcall assert ERC1271(_owner).isValidSignature(digest, sig) == ERC1271_MAGIC_VAL else: assert ecrecover(digest, convert(_v, uint256), convert(_r, uint256), convert(_s, uint256)) == _owner self.allowance[_owner][_spender] = _value self.nonces[_owner] = nonce + 1 log Approval(_owner, _spender, _value) return True ### StableSwap Functionality ### @view @internal def _balances() -> uint256[N_COINS]: result: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): result[i] = ERC20(COINS[i]).balanceOf(self) - self.admin_balances[i] return result @view @external def balances(i: uint256) -> uint256: """ @notice Get the current balance of a coin within the pool, less the accrued admin fees @param i Index value for the coin to query balance of @return Token balance """ return self._balances()[i] @view @external def get_balances() -> uint256[N_COINS]: return self._balances() @view @internal def _A() -> uint256: """ Handle ramping A up or down """ t1: uint256 = self.future_A_time A1: uint256 = self.future_A if block.timestamp < t1: A0: uint256 = self.initial_A t0: uint256 = self.initial_A_time # Expressions in uint256 cannot have negative numbers, thus "if" if A1 > A0: return A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0) else: return A0 - (A0 - A1) * (block.timestamp - t0) / (t1 - t0) else: # when t1 == 0 or block.timestamp >= t1 return A1 @view @external def admin_fee() -> uint256: return ADMIN_FEE @view @external def A() -> uint256: return self._A() / A_PRECISION @view @external def A_precise() -> uint256: return self._A() @pure @internal def _xp_mem(_rates: uint256[N_COINS], _balances: uint256[N_COINS]) -> uint256[N_COINS]: result: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): result[i] = _rates[i] * _balances[i] / PRECISION return result @pure @internal def get_D(_xp: uint256[N_COINS], _amp: uint256) -> uint256: """ D invariant calculation in non-overflowing integer operations iteratively A * sum(x_i) * n**n + D = A * D * n**n + D**(n+1) / (n**n * prod(x_i)) Converging solution: D[j+1] = (A * n**n * sum(x_i) - D[j]**(n+1) / (n**n prod(x_i))) / (A * n**n - 1) """ S: uint256 = 0 Dprev: uint256 = 0 for x in _xp: S += x if S == 0: return 0 D: uint256 = S Ann: uint256 = _amp * N_COINS for i in range(255): D_P: uint256 = D for x in _xp: D_P = D_P * D / (x * N_COINS) # If division by 0, this will be borked: only withdrawal will work. And that is good Dprev = D D = (Ann * S / A_PRECISION + D_P * N_COINS) * D / ((Ann - A_PRECISION) * D / A_PRECISION + (N_COINS + 1) * D_P) # Equality with the precision of 1 if D > Dprev: if D - Dprev <= 1: return D else: if Dprev - D <= 1: return D # convergence typically occurs in 4 rounds or less, this should be unreachable! # if it does happen the pool is borked and LPs can withdraw via `remove_liquidity` raise @view @internal def get_D_mem(_rates: uint256[N_COINS], _balances: uint256[N_COINS], _amp: uint256) -> uint256: xp: uint256[N_COINS] = self._xp_mem(_rates, _balances) return self.get_D(xp, _amp) @view @external def get_virtual_price() -> uint256: """ @notice The current virtual price of the pool LP token @dev Useful for calculating profits @return LP token virtual price normalized to 1e18 """ amp: uint256 = self._A() balances: uint256[N_COINS] = self._balances() xp: uint256[N_COINS] = self._xp_mem(RATE_MULTIPLIERS, balances) D: uint256 = self.get_D(xp, amp) # D is in the units similar to DAI (e.g. converted to precision 1e18) # When balanced, D = n * x_u - total virtual value of the portfolio return D * PRECISION / self.totalSupply @view @external def calc_token_amount(_amounts: uint256[N_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 _amounts Amount of each coin being deposited @param _is_deposit set True for deposits, False for withdrawals @return Expected amount of LP tokens received """ amp: uint256 = self._A() balances: uint256[N_COINS] = self._balances() D0: uint256 = self.get_D_mem(RATE_MULTIPLIERS, balances, amp) for i in range(N_COINS): amount: uint256 = _amounts[i] if _is_deposit: balances[i] += amount else: balances[i] -= amount D1: uint256 = self.get_D_mem(RATE_MULTIPLIERS, balances, amp) diff: uint256 = 0 if _is_deposit: diff = D1 - D0 else: diff = D0 - D1 return diff * self.totalSupply / D0 @external @nonreentrant('lock') def add_liquidity( _amounts: uint256[N_COINS], _min_mint_amount: uint256, _receiver: address = msg.sender ) -> uint256: """ @notice Deposit coins into the pool @param _amounts List of amounts of coins to deposit @param _min_mint_amount Minimum amount of LP tokens to mint from the deposit @param _receiver Address that owns the minted LP tokens @return Amount of LP tokens received by depositing """ amp: uint256 = self._A() old_balances: uint256[N_COINS] = self._balances() rates: uint256[N_COINS] = RATE_MULTIPLIERS # Initial invariant D0: uint256 = self.get_D_mem(rates, old_balances, amp) total_supply: uint256 = self.totalSupply new_balances: uint256[N_COINS] = old_balances for i in range(N_COINS): amount: uint256 = _amounts[i] if amount > 0: coin: address = COINS[i] initial: uint256 = ERC20(coin).balanceOf(self) response: Bytes[32] = raw_call( coin, concat( method_id("transferFrom(address,address,uint256)"), convert(msg.sender, bytes32), convert(self, bytes32), convert(amount, bytes32), ), max_outsize=32, ) if len(response) > 0: assert convert(response, bool) # dev: failed transfer new_balances[i] += ERC20(coin).balanceOf(self) - initial else: assert total_supply != 0 # dev: initial deposit requires all coins # Invariant after change D1: uint256 = self.get_D_mem(rates, new_balances, amp) assert D1 > D0 # We need to recalculate the invariant accounting for fees # to calculate fair user's share fees: uint256[N_COINS] = empty(uint256[N_COINS]) mint_amount: uint256 = 0 if total_supply > 0: # Only account for fees if we are not the first to deposit base_fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) for i in range(N_COINS): ideal_balance: uint256 = D1 * old_balances[i] / D0 difference: uint256 = 0 new_balance: uint256 = new_balances[i] if ideal_balance > new_balance: difference = ideal_balance - new_balance else: difference = new_balance - ideal_balance fees[i] = base_fee * difference / FEE_DENOMINATOR self.admin_balances[i] += fees[i] * ADMIN_FEE / FEE_DENOMINATOR new_balances[i] -= fees[i] D2: uint256 = self.get_D_mem(rates, new_balances, amp) mint_amount = total_supply * (D2 - D0) / D0 else: mint_amount = D1 # Take the dust if there was any assert mint_amount >= _min_mint_amount, "Slippage screwed you" # Mint pool tokens total_supply += mint_amount self.balanceOf[_receiver] += mint_amount self.totalSupply = total_supply log Transfer(ZERO_ADDRESS, _receiver, mint_amount) log AddLiquidity(msg.sender, _amounts, fees, D1, total_supply) return mint_amount @view @internal def get_y(i: int128, j: int128, x: uint256, xp: uint256[N_COINS]) -> uint256: """ Calculate x[j] if one makes x[i] = x Done by solving quadratic equation iteratively. x_1**2 + x_1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n + 1) / (n ** (2 * n) * prod' * A) x_1**2 + b*x_1 = c x_1 = (x_1**2 + c) / (2*x_1 + b) """ # x in the input is converted to the same price/precision assert i != j # dev: same coin assert j >= 0 # dev: j below zero assert j < N_COINS # dev: j above N_COINS # should be unreachable, but good for safety assert i >= 0 assert i < N_COINS amp: uint256 = self._A() D: uint256 = self.get_D(xp, amp) S_: uint256 = 0 _x: uint256 = 0 y_prev: uint256 = 0 c: uint256 = D Ann: uint256 = amp * N_COINS for _i in range(N_COINS): if _i == i: _x = x elif _i != j: _x = xp[_i] else: continue S_ += _x c = c * D / (_x * N_COINS) c = c * D * A_PRECISION / (Ann * N_COINS) b: uint256 = S_ + D * A_PRECISION / Ann # - D y: uint256 = D for _i in range(255): y_prev = y y = (y*y + c) / (2 * y + b - D) # Equality with the precision of 1 if y > y_prev: if y - y_prev <= 1: return y else: if y_prev - y <= 1: return y raise @view @external def get_dy(i: int128, j: int128, dx: uint256) -> uint256: """ @notice Calculate the current output dy given input dx @dev Index values can be found via the `coins` public getter method @param i Index value for the coin to send @param j Index valie of the coin to recieve @param dx Amount of `i` being exchanged @return Amount of `j` predicted """ rates: uint256[N_COINS] = RATE_MULTIPLIERS xp: uint256[N_COINS] = self._xp_mem(rates, self._balances()) x: uint256 = xp[i] + (dx * rates[i] / PRECISION) y: uint256 = self.get_y(i, j, x, xp) dy: uint256 = xp[j] - y - 1 fee: uint256 = self.fee * dy / FEE_DENOMINATOR return (dy - fee) * PRECISION / rates[j] @external @nonreentrant('lock') def exchange( i: int128, j: int128, _dx: uint256, _min_dy: uint256, _receiver: address = msg.sender, ) -> uint256: """ @notice Perform an exchange between two coins @dev Index values can be found via the `coins` public getter method @param i Index value for the coin to send @param j Index valie of the coin to recieve @param _dx Amount of `i` being exchanged @param _min_dy Minimum amount of `j` to receive @return Actual amount of `j` received """ rates: uint256[N_COINS] = RATE_MULTIPLIERS old_balances: uint256[N_COINS] = self._balances() xp: uint256[N_COINS] = self._xp_mem(rates, old_balances) coin: address = COINS[i] dx: uint256 = ERC20(coin).balanceOf(self) response: Bytes[32] = raw_call( coin, concat( method_id("transferFrom(address,address,uint256)"), convert(msg.sender, bytes32), convert(self, bytes32), convert(_dx, bytes32), ), max_outsize=32, ) if len(response) > 0: assert convert(response, bool) dx = ERC20(coin).balanceOf(self) - dx x: uint256 = xp[i] + dx * rates[i] / PRECISION y: uint256 = self.get_y(i, j, x, xp) dy: uint256 = xp[j] - y - 1 # -1 just in case there were some rounding errors dy_fee: uint256 = dy * self.fee / FEE_DENOMINATOR # Convert all to real units dy = (dy - dy_fee) * PRECISION / rates[j] assert dy >= _min_dy, "Exchange resulted in fewer coins than expected" self.admin_balances[j] += (dy_fee * ADMIN_FEE / FEE_DENOMINATOR) * PRECISION / rates[j] response = raw_call( COINS[j], concat( method_id("transfer(address,uint256)"), convert(_receiver, bytes32), convert(dy, bytes32), ), max_outsize=32, ) if len(response) > 0: assert convert(response, bool) log TokenExchange(msg.sender, i, _dx, j, dy) return dy @external @nonreentrant('lock') def remove_liquidity( _burn_amount: uint256, _min_amounts: uint256[N_COINS], _receiver: address = msg.sender ) -> uint256[N_COINS]: """ @notice Withdraw coins from the pool @dev Withdrawal amounts are based on current deposit ratios @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 withdrawn coins @return List of amounts of coins that were withdrawn """ total_supply: uint256 = self.totalSupply amounts: uint256[N_COINS] = empty(uint256[N_COINS]) balances: uint256[N_COINS] = self._balances() for i in range(N_COINS): value: uint256 = balances[i] * _burn_amount / total_supply assert value >= _min_amounts[i], "Withdrawal resulted in fewer coins than expected" amounts[i] = value response: Bytes[32] = raw_call( COINS[i], concat( method_id("transfer(address,uint256)"), convert(_receiver, bytes32), convert(value, bytes32), ), max_outsize=32, ) if len(response) > 0: assert convert(response, bool) total_supply -= _burn_amount self.balanceOf[msg.sender] -= _burn_amount self.totalSupply = total_supply log Transfer(msg.sender, ZERO_ADDRESS, _burn_amount) log RemoveLiquidity(msg.sender, amounts, empty(uint256[N_COINS]), total_supply) return amounts @external @nonreentrant('lock') def remove_liquidity_imbalance( _amounts: uint256[N_COINS], _max_burn_amount: uint256, _receiver: address = msg.sender ) -> uint256: """ @notice Withdraw coins from the pool in an imbalanced amount @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 withdrawn coins @return Actual amount of the LP token burned in the withdrawal """ amp: uint256 = self._A() old_balances: uint256[N_COINS] = self._balances() rates: uint256[N_COINS] = RATE_MULTIPLIERS D0: uint256 = self.get_D_mem(rates, old_balances, amp) new_balances: uint256[N_COINS] = old_balances for i in range(N_COINS): amount: uint256 = _amounts[i] if amount != 0: new_balances[i] -= amount response: Bytes[32] = raw_call( COINS[i], concat( method_id("transfer(address,uint256)"), convert(_receiver, bytes32), convert(amount, bytes32), ), max_outsize=32, ) if len(response) > 0: assert convert(response, bool) D1: uint256 = self.get_D_mem(rates, new_balances, amp) fees: uint256[N_COINS] = empty(uint256[N_COINS]) base_fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) for i in range(N_COINS): ideal_balance: uint256 = D1 * old_balances[i] / D0 difference: uint256 = 0 new_balance: uint256 = new_balances[i] if ideal_balance > new_balance: difference = ideal_balance - new_balance else: difference = new_balance - ideal_balance fees[i] = base_fee * difference / FEE_DENOMINATOR self.admin_balances[i] += fees[i] * ADMIN_FEE / FEE_DENOMINATOR new_balances[i] -= fees[i] D2: uint256 = self.get_D_mem(rates, new_balances, amp) total_supply: uint256 = self.totalSupply burn_amount: uint256 = ((D0 - D2) * total_supply / D0) + 1 assert burn_amount > 1 # dev: zero tokens burned assert burn_amount <= _max_burn_amount, "Slippage screwed you" total_supply -= burn_amount self.totalSupply = total_supply self.balanceOf[msg.sender] -= burn_amount log Transfer(msg.sender, ZERO_ADDRESS, burn_amount) log RemoveLiquidityImbalance(msg.sender, _amounts, fees, D1, total_supply) return burn_amount @pure @internal def get_y_D(A: uint256, i: int128, xp: uint256[N_COINS], D: uint256) -> uint256: """ Calculate x[i] if one reduces D from being calculated for xp to D Done by solving quadratic equation iteratively. x_1**2 + x_1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n + 1) / (n ** (2 * n) * prod' * A) x_1**2 + b*x_1 = c x_1 = (x_1**2 + c) / (2*x_1 + b) """ # x in the input is converted to the same price/precision assert i >= 0 # dev: i below zero assert i < N_COINS # dev: i above N_COINS S_: uint256 = 0 _x: uint256 = 0 y_prev: uint256 = 0 c: uint256 = D Ann: uint256 = A * N_COINS for _i in range(N_COINS): if _i != i: _x = xp[_i] else: continue S_ += _x c = c * D / (_x * N_COINS) c = c * D * A_PRECISION / (Ann * N_COINS) b: uint256 = S_ + D * A_PRECISION / Ann y: uint256 = D for _i in range(255): y_prev = y y = (y*y + c) / (2 * y + b - D) # Equality with the precision of 1 if y > y_prev: if y - y_prev <= 1: return y else: if y_prev - y <= 1: return y raise @view @internal def _calc_withdraw_one_coin(_burn_amount: uint256, i: int128) -> uint256[2]: # First, need to calculate # * Get current D # * Solve Eqn against y_i for D - _token_amount amp: uint256 = self._A() rates: uint256[N_COINS] = RATE_MULTIPLIERS xp: uint256[N_COINS] = self._xp_mem(rates, self._balances()) D0: uint256 = self.get_D(xp, amp) total_supply: uint256 = self.totalSupply D1: uint256 = D0 - _burn_amount * D0 / total_supply new_y: uint256 = self.get_y_D(amp, i, xp, D1) base_fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) xp_reduced: uint256[N_COINS] = empty(uint256[N_COINS]) for j in range(N_COINS): dx_expected: uint256 = 0 xp_j: uint256 = xp[j] if j == i: dx_expected = xp_j * D1 / D0 - new_y else: dx_expected = xp_j - xp_j * D1 / D0 xp_reduced[j] = xp_j - base_fee * dx_expected / FEE_DENOMINATOR dy: uint256 = xp_reduced[i] - self.get_y_D(amp, i, xp_reduced, D1) dy_0: uint256 = (xp[i] - new_y) * PRECISION / rates[i] # w/o fees dy = (dy - 1) * PRECISION / rates[i] # Withdraw less to account for rounding errors return [dy, dy_0 - dy] @view @external def calc_withdraw_one_coin(_burn_amount: uint256, i: int128) -> uint256: """ @notice Calculate the amount received when withdrawing a single coin @param _burn_amount Amount of LP tokens to burn in the withdrawal @param i Index value of the coin to withdraw @return Amount of coin received """ return self._calc_withdraw_one_coin(_burn_amount, i)[0] @external @nonreentrant('lock') def remove_liquidity_one_coin( _burn_amount: uint256, i: int128, _min_received: uint256, _receiver: address = msg.sender, ) -> uint256: """ @notice Withdraw a single coin from the pool @param _burn_amount Amount of LP tokens to burn in the withdrawal @param i Index value of the coin to withdraw @param _min_received Minimum amount of coin to receive @param _receiver Address that receives the withdrawn coins @return Amount of coin received """ dy: uint256[2] = self._calc_withdraw_one_coin(_burn_amount, i) assert dy[0] >= _min_received, "Not enough coins removed" self.admin_balances[i] += dy[1] * ADMIN_FEE / FEE_DENOMINATOR total_supply: uint256 = self.totalSupply - _burn_amount self.totalSupply = total_supply self.balanceOf[msg.sender] -= _burn_amount log Transfer(msg.sender, ZERO_ADDRESS, _burn_amount) response: Bytes[32] = raw_call( COINS[i], concat( method_id("transfer(address,uint256)"), convert(_receiver, bytes32), convert(dy[0], bytes32), ), max_outsize=32, ) if len(response) > 0: assert convert(response, bool) log RemoveLiquidityOne(msg.sender, _burn_amount, dy[0], total_supply) return dy[0] @external def ramp_A(_future_A: uint256, _future_time: uint256): assert msg.sender == self.owner # dev: only owner assert block.timestamp >= self.initial_A_time + MIN_RAMP_TIME assert _future_time >= block.timestamp + MIN_RAMP_TIME # dev: insufficient time _initial_A: uint256 = self._A() _future_A_p: uint256 = _future_A * A_PRECISION assert _future_A > 0 and _future_A < MAX_A if _future_A_p < _initial_A: assert _future_A_p * MAX_A_CHANGE >= _initial_A else: assert _future_A_p <= _initial_A * MAX_A_CHANGE self.initial_A = _initial_A self.future_A = _future_A_p self.initial_A_time = block.timestamp self.future_A_time = _future_time log RampA(_initial_A, _future_A_p, block.timestamp, _future_time) @external def stop_ramp_A(): assert msg.sender == self.owner # dev: only owner current_A: uint256 = self._A() self.initial_A = current_A self.future_A = current_A self.initial_A_time = block.timestamp self.future_A_time = block.timestamp # now (block.timestamp < t1) is always False, so we return saved A log StopRampA(current_A, block.timestamp) @external def withdraw_admin_fees(): assert msg.sender == self.owner for i in range(N_COINS): amount: uint256 = self.admin_balances[i] if amount != 0: coin: address = COINS[i] raw_call( coin, concat( method_id("transfer(address,uint256)"), convert(msg.sender, bytes32), convert(amount, bytes32) ) ) self.admin_balances[i] = 0 @external def commit_transfer_ownership(_future_owner: address): assert msg.sender == self.owner self.future_owner = _future_owner @external def accept_transfer_ownership(): assert msg.sender == self.future_owner log TransferOwnership(self.owner, msg.sender) self.owner = msg.sender @view @external def version() -> String[8]: """ @notice Get the version of this token contract """ return VERSION @pure @external def coins(_i: uint256) -> address: return COINS[_i] @pure @external def name() -> String[64]: return NAME @pure @external def symbol() -> String[32]: return SYMBOL @pure @external def DOMAIN_SEPARATOR() -> bytes32: return DOMAIN_SEPARATOR
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"name":"Transfer","inputs":[{"name":"sender","type":"address","indexed":true},{"name":"receiver","type":"address","indexed":true},{"name":"value","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true},{"name":"spender","type":"address","indexed":true},{"name":"value","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"TokenExchange","inputs":[{"name":"buyer","type":"address","indexed":true},{"name":"sold_id","type":"int128","indexed":false},{"name":"tokens_sold","type":"uint256","indexed":false},{"name":"bought_id","type":"int128","indexed":false},{"name":"tokens_bought","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[4]","indexed":false},{"name":"fees","type":"uint256[4]","indexed":false},{"name":"invariant","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[4]","indexed":false},{"name":"fees","type":"uint256[4]","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amount","type":"uint256","indexed":false},{"name":"coin_amount","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[4]","indexed":false},{"name":"fees","type":"uint256[4]","indexed":false},{"name":"invariant","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampA","inputs":[{"name":"old_A","type":"uint256","indexed":false},{"name":"new_A","type":"uint256","indexed":false},{"name":"initial_time","type":"uint256","indexed":false},{"name":"future_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"name":"A","type":"uint256","indexed":false},{"name":"t","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"TransferOwnership","inputs":[{"name":"_old_owner","type":"address","indexed":false},{"name":"_new_owner","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_coins","type":"address[4]"},{"name":"_rate_multipliers","type":"uint256[4]"},{"name":"_A","type":"uint256"},{"name":"_fee","type":"uint256"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"transfer","inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"transferFrom","inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"approve","inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"permit","inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_deadline","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_balances","inputs":[],"outputs":[{"name":"","type":"uint256[4]"}]},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"A","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"A_precise","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"_amounts","type":"uint256[4]"},{"name":"_is_deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"_amounts","type":"uint256[4]"},{"name":"_min_mint_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"_amounts","type":"uint256[4]"},{"name":"_min_mint_amount","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"exchange","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"_dx","type":"uint256"},{"name":"_min_dy","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"exchange","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"_dx","type":"uint256"},{"name":"_min_dy","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_burn_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[4]"}],"outputs":[{"name":"","type":"uint256[4]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_burn_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[4]"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256[4]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_amounts","type":"uint256[4]"},{"name":"_max_burn_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_amounts","type":"uint256[4]"},{"name":"_max_burn_amount","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"_burn_amount","type":"uint256"},{"name":"i","type":"int128"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_burn_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"_min_received","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_burn_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"_min_received","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"ramp_A","inputs":[{"name":"_future_A","type":"uint256"},{"name":"_future_time","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"withdraw_admin_fees","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_future_owner","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"accept_transfer_ownership","inputs":[],"outputs":[]},{"stateMutability":"view","type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"pure","type":"function","name":"coins","inputs":[{"name":"_i","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"pure","type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"pure","type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"pure","type":"function","name":"DOMAIN_SEPARATOR","inputs":[],"outputs":[{"name":"","type":"bytes32"}]},{"stateMutability":"view","type":"function","name":"admin_balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"initial_A","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_A","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"initial_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"balanceOf","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"allowance","inputs":[{"name":"arg0","type":"address"},{"name":"arg1","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"nonces","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}]}]
Contract Creation Code
602061445b60803960805161445b016040602082608039608051116144565780602081608039608051602001808260e0395050506020602061445b0160803960805161445b016020602082608039608051116144565780602081608039608051602001808261014039505050604061445b016020816080396080518060a01c61445657610180526020602082016080396080518060a01c614456576101a0526020604082016080396080518060a01c614456576101c0526020606082016080396080518060a01c614456576101e0525061018051610200526101a051610220526101c051610240526101e0516102605260c061445b01602081608039608051610280526020602082016080396080516102a0526020604082016080396080516102c0526020606082016080396080516102e05250602061014061445b0160803960805160648082028215828483041417156144565790509050610300526103005160065561030051600755602061016061445b0160803960805160055533600e5560e0805160200180610320828460045afa90505050610140805160200180610380828460045afa905050507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6104a05260e08051602082012090506104c0527f572f01d824885a118d5d21c74542f263b131d2897955c62a721594f1d7c3b2e26104e0524661050052306105205260a061048052610480805160208201209050610540523060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000610560526020610560a36143af56600436101561000d5761307f565b60046000601c37600051346141515763313ce567811861003257601260e052602060e0f35b63a9059cbb8118610074576004358060a01c61415157610160523360e052610160516101005260243561012052610067613085565b6001610180526020610180f35b6323b872dd8118610148576004358060a01c61415157610160526024358060a01c61415157610180526101605160e0526101805161010052604435610120526100bb613085565b600b6101605160a05260805260406080203360a0526080526040608020546101a0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101a0511461013b576101a0516044358082106141515780820390509050600b6101605160a05260805260406080203360a0526080526040608020555b60016101c05260206101c0f35b63095ea7b381186101c0576004358060a01c6141515760e052602435600b3360a052608052604060802060e05160a05260805260406080205560e051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602435610100526020610100a36001610100526020610100f35b63d505accf8118610536576004358060a01c6141515760e0526024358060a01c61415157610100526084358060081c6141515761012052600060e0511461415157606435421161415157600d60e05160a0526080526040608020546101405260006002610400527f1901000000000000000000000000000000000000000000000000000000000000610420526104006002806020846106000101826020850160045afa5050805182019150506020602038036080396080516020826106000101526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96105405260e0516105605261010051610580526044356105a052610140516105c0526064356105e05260c0610520526105208051602082012090506020826106000101526020810190508061060052610600905080516020820120905061016052600060e0513b1161034a5760e0516101605161018052610120516101a052604060a46101c03760206080608061018060015afa5060805118614151576104aa565b600060a4356102205260c435610240526040610200526102006040806020846102c00101826020850160045afa505080518201915050601f60016020820661026001602082840111614151576020806102808261012060045afa5050818152905090506001806020846102c00101826020850160045afa505080518201915050806102c0526102c09050805160200180610180828460045afa905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e610200526102208060406101605182526020820191508082528083018061018080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810150505050602061020060c461021c60e0515afa610497573d600060003e3d6000fd5b601f3d1115614151576102005118614151575b604435600b60e05160a05260805260406080206101005160a05260805260406080205561014051600181818301106141515780820190509050600d60e05160a0526080526040608020556101005160e0517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925604435610180526020610180a36001610180526020610180f35b634903b0d1811861056b5761054c6101c061310e565b6101c06004356004811015614151576020020151610240526020610240f35b6314f0597981186105ad576105816101c061310e565b6101c080516102405280602001516102605280604001516102805280606001516102a052506080610240f35b63fee3f7f981186105c75764012a05f20060e052602060e0f35b63f446c1d081186105f5576105dd6101606131de565b61016051606480820490509050610180526020610180f35b6376a2f0f0811861061a5761060b6101606131de565b61016051610180526020610180f35b63bb7b8b808118610770576106306102a06131de565b6102a0516102805261064361032061310e565b61032080516102a05280602001516102c05280604001516102e05280606001516103005250610140380360208160803960805160e052602081602001608039608051610100526020816040016080396080516101205260208160600160803960805161014052506102a051610160526102c051610180526102e0516101a052610300516101c0526106d56103a0613319565b6103a0805161032052806020015161034052806040015161036052806060015161038052506103205160e052610340516101005261036051610120526103805161014052610280516101605261072c6103c06133c3565b6103c0516103a0526103a051670de0b6b3a76400008082028215828483041417156141515790509050600c54808015614151578204905090506103c05260206103c0f35b63cf701ff781186109da576084358060011c614151576104a0526107956104e06131de565b6104e0516104c0526107a861056061310e565b61056080516104e052806020015161050052806040015161052052806060015161054052506101403803602081608039608051610280526020816020016080396080516102a0526020816040016080396080516102c0526020816060016080396080516102e052506104e051610300526105005161032052610520516103405261054051610360526104c05161038052610843610580613630565b610580516105605261058060006004818352015b60206105805102600401356105a0526104a05161089e576104e0610580516004811015614151576020020180516105a05180821061415157808203905090508152506108cc565b6104e0610580516004811015614151576020020180516105a051818183011061415157808201905090508152505b81516001018083528114156108575750506101403803602081608039608051610280526020816020016080396080516102a0526020816040016080396080516102c0526020816060016080396080516102e052506104e051610300526105005161032052610520516103405261054051610360526104c051610380526109536105a0613630565b6105a0516105805260006105a0526104a05161098857610560516105805180821061415157808203905090506105a0526109a3565b610580516105605180821061415157808203905090506105a0525b6105a051600c54808202821582848304141715614151579050905061056051808015614151578204905090506105c05260206105c0f35b63029b2f3481186109ef57336104a052610a0a565b63cb49506481186111bc5760a4358060a01c614151576104a0525b600054614151576001600055610a216104e06131de565b6104e0516104c052610a3461056061310e565b61056080516104e05280602001516105005280604001516105205280606001516105405250610140380360208160803960805161056052602081602001608039608051610580526020816040016080396080516105a0526020816060016080396080516105c052506105605161028052610580516102a0526105a0516102c0526105c0516102e0526104e051610300526105005161032052610520516103405261054051610360526104c05161038052610aef610600613630565b610600516105e052600c54610600526104e051610620526105005161064052610520516106605261054051610680526106a060006004818352015b60206106a05102600401356106c05260006106c05111610b54576000610600511461415157610d2c565b60206101c038036106a051600481101561415157602002016080396080516106e0526370a082316107205230610740526020610720602461073c6106e0515afa610ba3573d600060003e3d6000fd5b601f3d111561415157610720516107005260006004610760527f23b872dd00000000000000000000000000000000000000000000000000000000610780526107606004806020846107a00101826020850160045afa505080518201915050336020826107a0010152602081019050306020826107a00101526020810190506106c0516020826107a0010152602081019050806107a0526107a0505060206108606107a0516107c060006106e0515af1610c61573d600060003e3d6000fd5b61084060203d808211610c745781610c76565b805b905090508152805160200180610720828460045afa905050506000610720511115610cb657610740516107205181816020036008021c9050905015614151575b6106206106a0516004811015614151576020020180516370a082316107605230610780526020610760602461077c6106e0515afa610cf9573d600060003e3d6000fd5b601f3d11156141515761076051610700518082106141515780820390509050818183011061415157808201905090508152505b8151600101808352811415610b2a5750506105605161028052610580516102a0526105a0516102c0526105c0516102e05261062051610300526106405161032052610660516103405261068051610360526104c05161038052610d906106c0613630565b6106c0516106a0526105e0516106a05111156141515760a0366106c03760006106005111610dc5576106a0516107405261102d565b60055460048082028215828483041417156141515790509050600c808204905090506107605261078060006004818352015b6106a0516104e061078051600481101561415157602002015180820282158284830414171561415157905090506105e051808015614151578204905090506107a05260006107c0526106206107805160048110156141515760200201516107e0526107e0516107a05111610e84576107e0516107a05180821061415157808203905090506107c052610e9f565b6107a0516107e05180821061415157808203905090506107c0525b610760516107c05180820282158284830414171561415157905090506402540be400808204905090506106c06107805160048110156141515760200201526001610780516004811015614151570260010180546106c061078051600481101561415157602002015164012a05f20080820282158284830414171561415157905090506402540be4008082049050905081818301106141515780820190509050815550610620610780516004811015614151576020020180516106c061078051600481101561415157602002015180821061415157808203905090508152508151600101808352811415610df75750506105605161028052610580516102a0526105a0516102c0526105c0516102e05261062051610300526106405161032052610660516103405261068051610360526104c05161038052610fe16107a0613630565b6107a0516107805261060051610780516105e051808210614151578082039050905080820282158284830414171561415157905090506105e05180801561415157820490509050610740525b6084356107405110156110b1576014610760527f536c697070616765207363726577656420796f750000000000000000000000006107805261076050610760518061078001818260206001820306601f82010390500336823750506308c379a0610720526020610740526107605160206001820306601f820103905060440161073cfd5b61060080516107405181818301106141515780820190509050815250600a6104a05160a05260805260406080208054610740518181830110614151578082019050905081555061060051600c556104a05160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61074051610760526020610760a3337f3f1915775e0c9a38a57a7bb7f1f9005f486fb904e1f84aa215364d567319a58d60043561076052602435610780526044356107a0526064356107c0526106c0516107e0526106e05161080052610700516108205261072051610840526106a051610860526106005161088052610140610760a2610740516107605260206107606000600055f35b635e0d443f8118611468576004358060801d81607f1d18614151576104a0526024358060801d81607f1d18614151576104c05261014038036020816080396080516104e052602081602001608039608051610500526020816040016080396080516105205260208160600160803960805161054052506104e0516106e05261050051610700526105205161072052610540516107405261125d6105e061310e565b6105e080516107605280602001516107805280604001516107a05280606001516107c052506106e05160e052610700516101005261072051610120526107405161014052610760516101605261078051610180526107a0516101a0526107c0516101c0526112cc610660613319565b61066080516105605280602001516105805280604001516105a05280606001516105c052506105606104a05160048110156141515760200201516044356104e06104a05160048110156141515760200201518082028215828483041417156141515790509050670de0b6b3a764000080820490509050818183011061415157808201905090506105e0526104a051610280526104c0516102a0526105e0516102c052610560516102e05261058051610300526105a051610320526105c051610340526113996106206136da565b61062051610600526105606104c051600481101561415157602002015161060051808210614151578082039050905060018082106141515780820390509050610620526005546106205180820282158284830414171561415157905090506402540be400808204905090506106405261062051610640518082106141515780820390509050670de0b6b3a764000080820282158284830414171561415157905090506104e06104c051600481101561415157602002015180801561415157820490509050610660526020610660f35b633df02124811861147d57336104e052611498565b63ddc1f59d8118611b75576084358060a01c614151576104e0525b6004358060801d81607f1d18614151576104a0526024358060801d81607f1d18614151576104c0526000546141515760016000556101403803602081608039608051610500526020816020016080396080516105205260208160400160803960805161054052602081606001608039608051610560525061151a61060061310e565b61060080516105805280602001516105a05280604001516105c05280606001516105e052506105005160e05261052051610100526105405161012052610560516101405261058051610160526105a051610180526105c0516101a0526105e0516101c052611589610680613319565b6106808051610600528060200151610620528060400151610640528060600151610660525060206101c038036104a05160048110156141515760200201608039608051610680526370a082316106c052306106e05260206106c060246106dc610680515afa6115fd573d600060003e3d6000fd5b601f3d1115614151576106c0516106a05260006004610700527f23b872dd00000000000000000000000000000000000000000000000000000000610720526107006004806020846107400101826020850160045afa5050805182019150503360208261074001015260208101905030602082610740010152602081019050604435602082610740010152602081019050806107405261074050506020610800610740516107606000610680515af16116ba573d600060003e3d6000fd5b6107e060203d8082116116cd57816116cf565b805b9050905081528051602001806106c0828460045afa9050505060006106c051111561170f576106e0516106c05181816020036008021c9050905015614151575b6370a082316107005230610720526020610700602461071c610680515afa61173c573d600060003e3d6000fd5b601f3d111561415157610700516106a05180821061415157808203905090506106a0526106006104a05160048110156141515760200201516106a0516105006104a05160048110156141515760200201518082028215828483041417156141515790509050670de0b6b3a76400008082049050905081818301106141515780820190509050610700526104a051610280526104c0516102a052610700516102c052610600516102e0526106205161030052610640516103205261066051610340526118086107406136da565b61074051610720526106006104c051600481101561415157602002015161072051808210614151578082039050905060018082106141515780820390509050610740526107405160055480820282158284830414171561415157905090506402540be400808204905090506107605261074051610760518082106141515780820390509050670de0b6b3a764000080820282158284830414171561415157905090506105006104c0516004811015614151576020020151808015614151578204905090506107405260643561074051101561197957602e610780527f45786368616e676520726573756c74656420696e20666577657220636f696e736107a0527f207468616e2065787065637465640000000000000000000000000000000000006107c0526107805061078051806107a001818260206001820306601f82010390500336823750506308c379a0610740526020610760526107805160206001820306601f820103905060440161075cfd5b60016104c0516004811015614151570260010180546107605164012a05f20080820282158284830414171561415157905090506402540be40080820490509050670de0b6b3a764000080820282158284830414171561415157905090506105006104c0516004811015614151576020020151808015614151578204905090508181830110614151578082019050905081555060006004610780527fa9059cbb000000000000000000000000000000000000000000000000000000006107a0526107806004806020846107c00101826020850160045afa5050805182019150506104e0516020826107c0010152602081019050610740516020826107c0010152602081019050806107c0526107c0505060206108606107c0516107e0600060206101c038036104c051600481101561415157602002016080396080515af1611ac5573d600060003e3d6000fd5b61084060203d808211611ad85781611ada565b805b9050905081528051602001806106c0828460045afa9050505060006106c0511115611b1a576106e0516106c05181816020036008021c9050905015614151575b337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406104a051610780526044356107a0526104c0516107c052610740516107e0526080610780a2610740516107805260206107806000600055f35b637d49d8758118611b8a57336101c052611ba5565b63b2fdb76f8118611f1f5760a4358060a01c614151576101c0525b600054614151576001600055600c546101e05260803661020037611bca61030061310e565b61030080516102805280602001516102a05280604001516102c05280606001516102e0525061030060006004818352015b61028061030051600481101561415157602002015160043580820282158284830414171561415157905090506101e05180801561415157820490509050610320526020610300510260240135610320511015611ced576030610340527f5769746864726177616c20726573756c74656420696e20666577657220636f69610360527f6e73207468616e206578706563746564000000000000000000000000000000006103805261034050610340518061036001818260206001820306601f82010390500336823750506308c379a0610300526020610320526103405160206001820306601f820103905060440161031cfd5b6103205161020061030051600481101561415157602002015260006004610380527fa9059cbb000000000000000000000000000000000000000000000000000000006103a0526103806004806020846103c00101826020850160045afa5050805182019150506101c0516020826103c0010152602081019050610320516020826103c0010152602081019050806103c0526103c0505060206104606103c0516103e0600060206101c0380361030051600481101561415157602002016080396080515af1611dc0573d600060003e3d6000fd5b61044060203d808211611dd35781611dd5565b805b905090508152805160200180610340828460045afa905050506000610340511115611e1557610360516103405181816020036008021c9050905015614151575b8151600101808352811415611bfb5750506101e080516004358082106141515780820390509050815250600a3360a0526080526040608020805460043580821061415157808203905090508155506101e051600c556000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610300526020610300a3337f9878ca375e106f2a43c3b599fc624568131c4c9a4ba66a14563715763be9d59d6102005161030052610220516103205261024051610340526102605161036052608036610380376101e05161040052610120610300a2610200516103005261022051610320526102405161034052610260516103605260806103006000600055f35b6318a7bd768118611f3457336104a052611f4f565b634ab3a82b81186126405760a4358060a01c614151576104a0525b600054614151576001600055611f666104e06131de565b6104e0516104c052611f7961056061310e565b61056080516104e05280602001516105005280604001516105205280606001516105405250610140380360208160803960805161056052602081602001608039608051610580526020816040016080396080516105a0526020816060016080396080516105c052506105605161028052610580516102a0526105a0516102c0526105c0516102e0526104e051610300526105005161032052610520516103405261054051610360526104c05161038052612034610600613630565b610600516105e0526104e0516106005261050051610620526105205161064052610540516106605261068060006004818352015b60206106805102600401356106a05260006106a051146121bc57610600610680516004811015614151576020020180516106a051808210614151578082039050905081525060006004610700527fa9059cbb00000000000000000000000000000000000000000000000000000000610720526107006004806020846107400101826020850160045afa5050805182019150506104a0516020826107400101526020810190506106a0516020826107400101526020810190508061074052610740505060206107e061074051610760600060206101c0380361068051600481101561415157602002016080396080515af1612167573d600060003e3d6000fd5b6107c060203d80821161217a578161217c565b805b9050905081528051602001806106c0828460045afa9050505060006106c05111156121bc576106e0516106c05181816020036008021c9050905015614151575b81516001018083528114156120685750506105605161028052610580516102a0526105a0516102c0526105c0516102e05261060051610300526106205161032052610640516103405261066051610360526104c051610380526122206106a0613630565b6106a051610680526080366106a03760055460048082028215828483041417156141515790509050600c808204905090506107205261074060006004818352015b610680516104e061074051600481101561415157602002015180820282158284830414171561415157905090506105e05180801561415157820490509050610760526000610780526106006107405160048110156141515760200201516107a0526107a05161076051116122ee576107a05161076051808210614151578082039050905061078052612309565b610760516107a0518082106141515780820390509050610780525b610720516107805180820282158284830414171561415157905090506402540be400808204905090506106a06107405160048110156141515760200201526001610740516004811015614151570260010180546106a061074051600481101561415157602002015164012a05f20080820282158284830414171561415157905090506402540be4008082049050905081818301106141515780820190509050815550610600610740516004811015614151576020020180516106a0610740516004811015614151576020020151808210614151578082039050905081525081516001018083528114156122615750506105605161028052610580516102a0526105a0516102c0526105c0516102e05261060051610300526106205161032052610640516103405261066051610360526104c0516103805261244b610760613630565b6107605161074052600c54610760526105e0516107405180821061415157808203905090506107605180820282158284830414171561415157905090506105e051808015614151578204905090506001818183011061415157808201905090506107805260016107805111156141515760843561078051111561253f5760146107a0527f536c697070616765207363726577656420796f750000000000000000000000006107c0526107a0506107a051806107c001818260206001820306601f82010390500336823750506308c379a0610760526020610780526107a05160206001820306601f820103905060440161077cfd5b610760805161078051808210614151578082039050905081525061076051600c55600a3360a052608052604060802080546107805180821061415157808203905090508155506000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610780516107a05260206107a0a3337fb964b72f73f5ef5bf0fdc559b2fab9a7b12a39e47817a547f1f0aee47febd6026004356107a0526024356107c0526044356107e052606435610800526106a051610820526106c051610840526106e051610860526107005161088052610680516108a052610760516108c0526101406107a0a2610780516107a05260206107a06000600055f35b63cc2b27d78118612688576024358060801d81607f1d1861415157610620526004356102c052610620516102e052612679610640613cca565b61064051610680526020610680f35b631a4d01d2811861269d5733610640526126b8565b63081579a581186129b2576064358060a01c61415157610640525b6024358060801d81607f1d1861415157610620526000546141515760016000556004356102c052610620516102e0526126f26106a0613cca565b6106a0805161066052806020015161068052506044356106605110156127895760186106a0527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006106c0526106a0506106a051806106c001818260206001820306601f82010390500336823750506308c379a0610660526020610680526106a05160206001820306601f820103905060440161067cfd5b6001610620516004811015614151570260010180546106805164012a05f20080820282158284830414171561415157905090506402540be4008082049050905081818301106141515780820190509050815550600c5460043580821061415157808203905090506106a0526106a051600c55600a3360a0526080526040608020805460043580821061415157808203905090508155506000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6004356106c05260206106c0a360006004610700527fa9059cbb00000000000000000000000000000000000000000000000000000000610720526107006004806020846107400101826020850160045afa50508051820191505061064051602082610740010152602081019050610660516020826107400101526020810190508061074052610740505060206107e061074051610760600060206101c0380361062051600481101561415157602002016080396080515af161290a573d600060003e3d6000fd5b6107c060203d80821161291d578161291f565b805b9050905081528051602001806106c0828460045afa9050505060006106c051111561295f576106e0516106c05181816020036008021c9050905015614151575b337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a06004356107005261066051610720526106a051610740526060610700a2610660516107005260206107006000600055f35b633c157e648118612b0557600e5433186141515760085462015180818183011061415157808201905090504210614151574262015180818183011061415157808201905090506024351061415157612a0b6101806131de565b61018051610160526004356064808202821582848304141715614151579050905061018052600060043511612a41576000612a4a565b620f4240600435105b1561415157610160516101805110612a845761016051600a8082028215828483041417156141515790509050610180511161415157612aa8565b6101605161018051600a808202821582848304141715614151579050905010614151575b6101605160065561018051600755426008556024356009557fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c254610160516101a052610180516101c052426101e0526024356102005260806101a0a1005b63551a65888118612b7857600e54331861415157612b246101806131de565b6101805161016052610160516006556101605160075542600855426009557f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386101605161018052426101a0526040610180a1005b6330c540858118612c9f57600e5433186141515760e060006004818352015b600160e05160048110156141515702600101546101005260006101005114612c8c5760206101c0380360e051600481101561415157602002016080396080516101205260006004610140527fa9059cbb00000000000000000000000000000000000000000000000000000000610160526101406004806020846101800101826020850160045afa50508051820191505033602082610180010152602081019050610100516020826101800101526020810190508061018052610180505060006000610180516101a06000610120515af1612c76573d600060003e3d6000fd5b6000600160e05160048110156141515702600101555b8151600101808352811415612b97575050005b636b441a408118612cc9576004358060a01c6141515760e052600e5433186141515760e051600f55005b63e5ea47b88118612d1457600f543318614151577f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c600e5460e0523361010052604060e0a133600e55005b6354fd4d508118612dae57610120806020808252600660e0527f76352e302e3000000000000000000000000000000000000000000000000000006101005260e0818401808280516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f82010390509050905090508101905090509050610120f35b63c66106578118612ddf5760206101c038036004356004811015614151576020020160803960805160e052602060e0f35b6306fdde038118612e505760e080602080825260c0380381840180826020816080396080516020018082843950508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090509050810190509050905060e0f35b6395d89b418118612ec15760e08060208082526060380381840180826020816080396080516020018082843950508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090509050810190509050905060e0f35b633644e5158118612ee15760206020380360803960805160e052602060e0f35b63e2e7d2648118612f08576001600435600481101561415157026001015460e052602060e0f35b63ddca3f438118612f1f5760055460e052602060e0f35b635409491a8118612f365760065460e052602060e0f35b63b4b577ad8118612f4d5760075460e052602060e0f35b632081066c8118612f645760085460e052602060e0f35b63140522888118612f7b5760095460e052602060e0f35b6370a082318118612fb0576004358060a01c6141515760e052600a60e05160a052608052604060802054610100526020610100f35b63dd62ed3e8118613003576004358060a01c6141515760e0526024358060a01c6141515761010052600b60e05160a05260805260406080206101005160a052608052604060802054610120526020610120f35b6318160ddd811861301a57600c5460e052602060e0f35b637ecebe00811861304f576004358060a01c6141515760e052600d60e05160a052608052604060802054610100526020610100f35b638da5cb5b811861306657600e5460e052602060e0f35b631ec0cdc1811861307d57600f5460e052602060e0f35b505b60006000fd5b600a60e05160a05260805260406080208054610120518082106141515780820390509050815550600a6101005160a0526080526040608020805461012051818183011061415157808201905090508155506101005160e0517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61012051610140526020610140a3565b60803660e03761016060006004818352015b6370a0823161018052306101a0526020610180602461019c60206101c0380361016051600481101561415157602002016080396080515afa613167573d600060003e3d6000fd5b601f3d111561415157610180516001610160516004811015614151570260010154808210614151578082039050905060e0610160516004811015614151576020020152815160010180835281141561312057505060e051815261010051816020015261012051816040015261014051816060015250565b60095460e0526007546101005260e0514210613204576101005181525061331756613317565b600654610120526008546101405261012051610100511161329c57610120516101205161010051808210614151578082039050905042610140518082106141515780820390509050808202821582848304141715614151579050905060e05161014051808210614151578082039050905080801561415157820490509050808210614151578082039050905081525061331756613317565b610120516101005161012051808210614151578082039050905042610140518082106141515780820390509050808202821582848304141715614151579050905060e0516101405180821061415157808203905090508080156141515782049050905081818301106141515780820190509050815250613317565b565b6080366101e03761026060006004818352015b60e06102605160048110156141515760200201516101606102605160048110156141515760200201518082028215828483041417156141515790509050670de0b6b3a7640000808204905090506101e0610260516004811015614151576020020152815160010180835281141561332c5750506101e051815261020051816020015261022051816040015261024051816060015250565b604036610180376101e060006004818352015b60206101e0510260e001516101c05261018080516101c0518181830110614151578082019050905081525081516001018083528114156133d65750506101805161342457600081525061362e565b610180516101c05261016051600480820282158284830414171561415157905090506101e052610200600060ff818352015b6101c0516102205261026060006004818352015b6020610260510260e0015161024052610220516101c051808202821582848304141715614151579050905061024051600480820282158284830414171561415157905090508080156141515782049050905061022052815160010180835281141561346a5750506101c0516101a0526101e0516101805180820282158284830414171561415157905090506064808204905090506102205160048082028215828483041417156141515790509050818183011061415157808201905090506101c05180820282158284830414171561415157905090506101e051606480821061415157808203905090506101c0518082028215828483041417156141515790509050606480820490509050600561022051808202821582848304141715614151579050905081818301106141515780820190509050808015614151578204905090506101c0526101a0516101c051116135ec5760016101a0516101c0518082106141515780820390509050116136175750506101c05181525061362e56613617565b60016101c0516101a0518082106141515780820390509050116136175750506101c05181525061362e565b815160010180835281141561345657505060006000fd5b565b6102805160e0526102a051610100526102c051610120526102e0516101405261030051610160526103205161018052610340516101a052610360516101c05261367a610420613319565b61042080516103a05280602001516103c05280604001516103e052806060015161040052506103a05160e0526103c051610100526103e05161012052610400516101405261038051610160526136d16104206133c3565b61042051815250565b6102a05161028051146141515760006102a051126141515760046102a05112156141515760006102805112614151576004610280511215614151576137206103806131de565b61038051610360526102e05160e052610300516101005261032051610120526103405161014052610360516101605261375a6103a06133c3565b6103a051610380526060366103a037610380516104005261036051600480820282158284830414171561415157905090506104205261044060006004818352015b6102805161044051186137b5576102c0516103c0526137e6565b6102a0516104405114156137cc5761384a566137e6565b6102e06104405160048110156141515760200201516103c0525b6103a080516103c05181818301106141515780820190509050815250610400516103805180820282158284830414171561415157905090506103c0516004808202821582848304141715614151579050905080801561415157820490509050610400525b815160010180835281141561379b5750506104005161038051808202821582848304141715614151579050905060648082028215828483041417156141515790509050610420516004808202821582848304141715614151579050905080801561415157820490509050610400526103a0516103805160648082028215828483041417156141515790509050610420518080156141515782049050905081818301106141515780820190509050610440526103805161046052610480600060ff818352015b610460516103e0526104605161046051808202821582848304141715614151579050905061040051818183011061415157808201905090506002610460518082028215828483041417156141515790509050610440518181830110614151578082019050905061038051808210614151578082039050905080801561415157820490509050610460526103e05161046051116139d45760016103e051610460518082106141515780820390509050116139ff57505061046051815250613a16566139ff565b6001610460516103e0518082106141515780820390509050116139ff57505061046051815250613a16565b815160010180835281141561390f57505060006000fd5b565b60006101005112614151576004610100511215614151576060366101c0376101a0516102205260e051600480820282158284830414171561415157905090506102405261026060006004818352015b61010051610260511415613a7e57613afc56613a98565b6101206102605160048110156141515760200201516101e0525b6101c080516101e05181818301106141515780820190509050815250610220516101a05180820282158284830414171561415157905090506101e0516004808202821582848304141715614151579050905080801561415157820490509050610220525b8151600101808352811415613a67575050610220516101a051808202821582848304141715614151579050905060648082028215828483041417156141515790509050610240516004808202821582848304141715614151579050905080801561415157820490509050610220526101c0516101a05160648082028215828483041417156141515790509050610240518080156141515782049050905081818301106141515780820190509050610260526101a051610280526102a0600060ff818352015b6102805161020052610280516102805180820282158284830414171561415157905090506102205181818301106141515780820190509050600261028051808202821582848304141715614151579050905061026051818183011061415157808201905090506101a05180821061415157808203905090508080156141515782049050905061028052610200516102805111613c865760016102005161028051808210614151578082039050905011613cb157505061028051815250613cc856613cb1565b60016102805161020051808210614151578082039050905011613cb157505061028051815250613cc8565b8151600101808352811415613bc157505060006000fd5b565b613cd56103206131de565b6103205161030052610140380360208160803960805161032052602081602001608039608051610340526020816040016080396080516103605260208160600160803960805161038052506103205161052052610340516105405261036051610560526103805161058052613d4b61042061310e565b61042080516105a05280602001516105c05280604001516105e052806060015161060052506105205160e0526105405161010052610560516101205261058051610140526105a051610160526105c051610180526105e0516101a052610600516101c052613dba6104a0613319565b6104a080516103a05280602001516103c05280604001516103e052806060015161040052506103a05160e0526103c051610100526103e0516101205261040051610140526103005161016052613e116104406133c3565b6104405161042052600c5461044052610420516102c05161042051808202821582848304141715614151579050905061044051808015614151578204905090508082106141515780820390509050610460526103005160e0526102e051610100526103a051610120526103c051610140526103e051610160526104005161018052610460516101a052613ea56104a0613a18565b6104a0516104805260055460048082028215828483041417156141515790509050600c808204905090506104a0526080366104c03761054060006004818352015b6000610560526103a0610540516004811015614151576020020151610580526102e0516105405118613f5a5761058051610460518082028215828483041417156141515790509050610420518080156141515782049050905061048051808210614151578082039050905061056052613f9e565b610580516105805161046051808202821582848304141715614151579050905061042051808015614151578204905090508082106141515780820390509050610560525b610580516104a0516105605180820282158284830414171561415157905090506402540be4008082049050905080821061415157808203905090506104c06105405160048110156141515760200201528151600101808352811415613ee65750506104c06102e05160048110156141515760200201516103005160e0526102e051610100526104c051610120526104e0516101405261050051610160526105205161018052610460516101a052614056610560613a18565b610560518082106141515780820390509050610540526103a06102e0516004811015614151576020020151610480518082106141515780820390509050670de0b6b3a764000080820282158284830414171561415157905090506103206102e051600481101561415157602002015180801561415157820490509050610560526105405160018082106141515780820390509050670de0b6b3a764000080820282158284830414171561415157905090506103206102e0516004811015614151576020020151808015614151578204905090506105405261054051815261056051610540518082106141515780820390509050816020015250565b600080fd5b6102596143af03610259610560396102596143af03806105600161020051815261022051816020015261024051816040015261026051816060015250806105e0016102805181526102a05181602001526102c05181604001526102e0518160600152506103208051602001808361066001828460045afa90505050610380805160200180836106c001828460045afa9050505061054051816107000152806101c001610560f35b600080fd000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a693b19d2931d498c5b318df961919bb4aee87a5000000000000000000000000853d955acef822db058eb8505911ed77f175b99e000000000000000000000000000000000000000c9f2c9cd04674edea40000000000000000000000000000000000000000000000c9f2c9cd04674edea40000000000000000000000000000000000000000000000c9f2c9cd04674edea400000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000002dc6c0000000000000000000000000000000000000000000000000000000000000002143757276652e66692034706f6f6c20555344432f555344542f5553542f465241580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043443525600000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x600436101561000d5761307f565b60046000601c37600051346141515763313ce567811861003257601260e052602060e0f35b63a9059cbb8118610074576004358060a01c61415157610160523360e052610160516101005260243561012052610067613085565b6001610180526020610180f35b6323b872dd8118610148576004358060a01c61415157610160526024358060a01c61415157610180526101605160e0526101805161010052604435610120526100bb613085565b600b6101605160a05260805260406080203360a0526080526040608020546101a0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101a0511461013b576101a0516044358082106141515780820390509050600b6101605160a05260805260406080203360a0526080526040608020555b60016101c05260206101c0f35b63095ea7b381186101c0576004358060a01c6141515760e052602435600b3360a052608052604060802060e05160a05260805260406080205560e051337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602435610100526020610100a36001610100526020610100f35b63d505accf8118610536576004358060a01c6141515760e0526024358060a01c61415157610100526084358060081c6141515761012052600060e0511461415157606435421161415157600d60e05160a0526080526040608020546101405260006002610400527f1901000000000000000000000000000000000000000000000000000000000000610420526104006002806020846106000101826020850160045afa5050805182019150506020602038036080396080516020826106000101526020810190507f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96105405260e0516105605261010051610580526044356105a052610140516105c0526064356105e05260c0610520526105208051602082012090506020826106000101526020810190508061060052610600905080516020820120905061016052600060e0513b1161034a5760e0516101605161018052610120516101a052604060a46101c03760206080608061018060015afa5060805118614151576104aa565b600060a4356102205260c435610240526040610200526102006040806020846102c00101826020850160045afa505080518201915050601f60016020820661026001602082840111614151576020806102808261012060045afa5050818152905090506001806020846102c00101826020850160045afa505080518201915050806102c0526102c09050805160200180610180828460045afa905050507f1626ba7e00000000000000000000000000000000000000000000000000000000631626ba7e610200526102208060406101605182526020820191508082528083018061018080516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810150505050602061020060c461021c60e0515afa610497573d600060003e3d6000fd5b601f3d1115614151576102005118614151575b604435600b60e05160a05260805260406080206101005160a05260805260406080205561014051600181818301106141515780820190509050600d60e05160a0526080526040608020556101005160e0517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925604435610180526020610180a36001610180526020610180f35b634903b0d1811861056b5761054c6101c061310e565b6101c06004356004811015614151576020020151610240526020610240f35b6314f0597981186105ad576105816101c061310e565b6101c080516102405280602001516102605280604001516102805280606001516102a052506080610240f35b63fee3f7f981186105c75764012a05f20060e052602060e0f35b63f446c1d081186105f5576105dd6101606131de565b61016051606480820490509050610180526020610180f35b6376a2f0f0811861061a5761060b6101606131de565b61016051610180526020610180f35b63bb7b8b808118610770576106306102a06131de565b6102a0516102805261064361032061310e565b61032080516102a05280602001516102c05280604001516102e05280606001516103005250610140380360208160803960805160e052602081602001608039608051610100526020816040016080396080516101205260208160600160803960805161014052506102a051610160526102c051610180526102e0516101a052610300516101c0526106d56103a0613319565b6103a0805161032052806020015161034052806040015161036052806060015161038052506103205160e052610340516101005261036051610120526103805161014052610280516101605261072c6103c06133c3565b6103c0516103a0526103a051670de0b6b3a76400008082028215828483041417156141515790509050600c54808015614151578204905090506103c05260206103c0f35b63cf701ff781186109da576084358060011c614151576104a0526107956104e06131de565b6104e0516104c0526107a861056061310e565b61056080516104e052806020015161050052806040015161052052806060015161054052506101403803602081608039608051610280526020816020016080396080516102a0526020816040016080396080516102c0526020816060016080396080516102e052506104e051610300526105005161032052610520516103405261054051610360526104c05161038052610843610580613630565b610580516105605261058060006004818352015b60206105805102600401356105a0526104a05161089e576104e0610580516004811015614151576020020180516105a05180821061415157808203905090508152506108cc565b6104e0610580516004811015614151576020020180516105a051818183011061415157808201905090508152505b81516001018083528114156108575750506101403803602081608039608051610280526020816020016080396080516102a0526020816040016080396080516102c0526020816060016080396080516102e052506104e051610300526105005161032052610520516103405261054051610360526104c051610380526109536105a0613630565b6105a0516105805260006105a0526104a05161098857610560516105805180821061415157808203905090506105a0526109a3565b610580516105605180821061415157808203905090506105a0525b6105a051600c54808202821582848304141715614151579050905061056051808015614151578204905090506105c05260206105c0f35b63029b2f3481186109ef57336104a052610a0a565b63cb49506481186111bc5760a4358060a01c614151576104a0525b600054614151576001600055610a216104e06131de565b6104e0516104c052610a3461056061310e565b61056080516104e05280602001516105005280604001516105205280606001516105405250610140380360208160803960805161056052602081602001608039608051610580526020816040016080396080516105a0526020816060016080396080516105c052506105605161028052610580516102a0526105a0516102c0526105c0516102e0526104e051610300526105005161032052610520516103405261054051610360526104c05161038052610aef610600613630565b610600516105e052600c54610600526104e051610620526105005161064052610520516106605261054051610680526106a060006004818352015b60206106a05102600401356106c05260006106c05111610b54576000610600511461415157610d2c565b60206101c038036106a051600481101561415157602002016080396080516106e0526370a082316107205230610740526020610720602461073c6106e0515afa610ba3573d600060003e3d6000fd5b601f3d111561415157610720516107005260006004610760527f23b872dd00000000000000000000000000000000000000000000000000000000610780526107606004806020846107a00101826020850160045afa505080518201915050336020826107a0010152602081019050306020826107a00101526020810190506106c0516020826107a0010152602081019050806107a0526107a0505060206108606107a0516107c060006106e0515af1610c61573d600060003e3d6000fd5b61084060203d808211610c745781610c76565b805b905090508152805160200180610720828460045afa905050506000610720511115610cb657610740516107205181816020036008021c9050905015614151575b6106206106a0516004811015614151576020020180516370a082316107605230610780526020610760602461077c6106e0515afa610cf9573d600060003e3d6000fd5b601f3d11156141515761076051610700518082106141515780820390509050818183011061415157808201905090508152505b8151600101808352811415610b2a5750506105605161028052610580516102a0526105a0516102c0526105c0516102e05261062051610300526106405161032052610660516103405261068051610360526104c05161038052610d906106c0613630565b6106c0516106a0526105e0516106a05111156141515760a0366106c03760006106005111610dc5576106a0516107405261102d565b60055460048082028215828483041417156141515790509050600c808204905090506107605261078060006004818352015b6106a0516104e061078051600481101561415157602002015180820282158284830414171561415157905090506105e051808015614151578204905090506107a05260006107c0526106206107805160048110156141515760200201516107e0526107e0516107a05111610e84576107e0516107a05180821061415157808203905090506107c052610e9f565b6107a0516107e05180821061415157808203905090506107c0525b610760516107c05180820282158284830414171561415157905090506402540be400808204905090506106c06107805160048110156141515760200201526001610780516004811015614151570260010180546106c061078051600481101561415157602002015164012a05f20080820282158284830414171561415157905090506402540be4008082049050905081818301106141515780820190509050815550610620610780516004811015614151576020020180516106c061078051600481101561415157602002015180821061415157808203905090508152508151600101808352811415610df75750506105605161028052610580516102a0526105a0516102c0526105c0516102e05261062051610300526106405161032052610660516103405261068051610360526104c05161038052610fe16107a0613630565b6107a0516107805261060051610780516105e051808210614151578082039050905080820282158284830414171561415157905090506105e05180801561415157820490509050610740525b6084356107405110156110b1576014610760527f536c697070616765207363726577656420796f750000000000000000000000006107805261076050610760518061078001818260206001820306601f82010390500336823750506308c379a0610720526020610740526107605160206001820306601f820103905060440161073cfd5b61060080516107405181818301106141515780820190509050815250600a6104a05160a05260805260406080208054610740518181830110614151578082019050905081555061060051600c556104a05160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61074051610760526020610760a3337f3f1915775e0c9a38a57a7bb7f1f9005f486fb904e1f84aa215364d567319a58d60043561076052602435610780526044356107a0526064356107c0526106c0516107e0526106e05161080052610700516108205261072051610840526106a051610860526106005161088052610140610760a2610740516107605260206107606000600055f35b635e0d443f8118611468576004358060801d81607f1d18614151576104a0526024358060801d81607f1d18614151576104c05261014038036020816080396080516104e052602081602001608039608051610500526020816040016080396080516105205260208160600160803960805161054052506104e0516106e05261050051610700526105205161072052610540516107405261125d6105e061310e565b6105e080516107605280602001516107805280604001516107a05280606001516107c052506106e05160e052610700516101005261072051610120526107405161014052610760516101605261078051610180526107a0516101a0526107c0516101c0526112cc610660613319565b61066080516105605280602001516105805280604001516105a05280606001516105c052506105606104a05160048110156141515760200201516044356104e06104a05160048110156141515760200201518082028215828483041417156141515790509050670de0b6b3a764000080820490509050818183011061415157808201905090506105e0526104a051610280526104c0516102a0526105e0516102c052610560516102e05261058051610300526105a051610320526105c051610340526113996106206136da565b61062051610600526105606104c051600481101561415157602002015161060051808210614151578082039050905060018082106141515780820390509050610620526005546106205180820282158284830414171561415157905090506402540be400808204905090506106405261062051610640518082106141515780820390509050670de0b6b3a764000080820282158284830414171561415157905090506104e06104c051600481101561415157602002015180801561415157820490509050610660526020610660f35b633df02124811861147d57336104e052611498565b63ddc1f59d8118611b75576084358060a01c614151576104e0525b6004358060801d81607f1d18614151576104a0526024358060801d81607f1d18614151576104c0526000546141515760016000556101403803602081608039608051610500526020816020016080396080516105205260208160400160803960805161054052602081606001608039608051610560525061151a61060061310e565b61060080516105805280602001516105a05280604001516105c05280606001516105e052506105005160e05261052051610100526105405161012052610560516101405261058051610160526105a051610180526105c0516101a0526105e0516101c052611589610680613319565b6106808051610600528060200151610620528060400151610640528060600151610660525060206101c038036104a05160048110156141515760200201608039608051610680526370a082316106c052306106e05260206106c060246106dc610680515afa6115fd573d600060003e3d6000fd5b601f3d1115614151576106c0516106a05260006004610700527f23b872dd00000000000000000000000000000000000000000000000000000000610720526107006004806020846107400101826020850160045afa5050805182019150503360208261074001015260208101905030602082610740010152602081019050604435602082610740010152602081019050806107405261074050506020610800610740516107606000610680515af16116ba573d600060003e3d6000fd5b6107e060203d8082116116cd57816116cf565b805b9050905081528051602001806106c0828460045afa9050505060006106c051111561170f576106e0516106c05181816020036008021c9050905015614151575b6370a082316107005230610720526020610700602461071c610680515afa61173c573d600060003e3d6000fd5b601f3d111561415157610700516106a05180821061415157808203905090506106a0526106006104a05160048110156141515760200201516106a0516105006104a05160048110156141515760200201518082028215828483041417156141515790509050670de0b6b3a76400008082049050905081818301106141515780820190509050610700526104a051610280526104c0516102a052610700516102c052610600516102e0526106205161030052610640516103205261066051610340526118086107406136da565b61074051610720526106006104c051600481101561415157602002015161072051808210614151578082039050905060018082106141515780820390509050610740526107405160055480820282158284830414171561415157905090506402540be400808204905090506107605261074051610760518082106141515780820390509050670de0b6b3a764000080820282158284830414171561415157905090506105006104c0516004811015614151576020020151808015614151578204905090506107405260643561074051101561197957602e610780527f45786368616e676520726573756c74656420696e20666577657220636f696e736107a0527f207468616e2065787065637465640000000000000000000000000000000000006107c0526107805061078051806107a001818260206001820306601f82010390500336823750506308c379a0610740526020610760526107805160206001820306601f820103905060440161075cfd5b60016104c0516004811015614151570260010180546107605164012a05f20080820282158284830414171561415157905090506402540be40080820490509050670de0b6b3a764000080820282158284830414171561415157905090506105006104c0516004811015614151576020020151808015614151578204905090508181830110614151578082019050905081555060006004610780527fa9059cbb000000000000000000000000000000000000000000000000000000006107a0526107806004806020846107c00101826020850160045afa5050805182019150506104e0516020826107c0010152602081019050610740516020826107c0010152602081019050806107c0526107c0505060206108606107c0516107e0600060206101c038036104c051600481101561415157602002016080396080515af1611ac5573d600060003e3d6000fd5b61084060203d808211611ad85781611ada565b805b9050905081528051602001806106c0828460045afa9050505060006106c0511115611b1a576106e0516106c05181816020036008021c9050905015614151575b337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406104a051610780526044356107a0526104c0516107c052610740516107e0526080610780a2610740516107805260206107806000600055f35b637d49d8758118611b8a57336101c052611ba5565b63b2fdb76f8118611f1f5760a4358060a01c614151576101c0525b600054614151576001600055600c546101e05260803661020037611bca61030061310e565b61030080516102805280602001516102a05280604001516102c05280606001516102e0525061030060006004818352015b61028061030051600481101561415157602002015160043580820282158284830414171561415157905090506101e05180801561415157820490509050610320526020610300510260240135610320511015611ced576030610340527f5769746864726177616c20726573756c74656420696e20666577657220636f69610360527f6e73207468616e206578706563746564000000000000000000000000000000006103805261034050610340518061036001818260206001820306601f82010390500336823750506308c379a0610300526020610320526103405160206001820306601f820103905060440161031cfd5b6103205161020061030051600481101561415157602002015260006004610380527fa9059cbb000000000000000000000000000000000000000000000000000000006103a0526103806004806020846103c00101826020850160045afa5050805182019150506101c0516020826103c0010152602081019050610320516020826103c0010152602081019050806103c0526103c0505060206104606103c0516103e0600060206101c0380361030051600481101561415157602002016080396080515af1611dc0573d600060003e3d6000fd5b61044060203d808211611dd35781611dd5565b805b905090508152805160200180610340828460045afa905050506000610340511115611e1557610360516103405181816020036008021c9050905015614151575b8151600101808352811415611bfb5750506101e080516004358082106141515780820390509050815250600a3360a0526080526040608020805460043580821061415157808203905090508155506101e051600c556000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600435610300526020610300a3337f9878ca375e106f2a43c3b599fc624568131c4c9a4ba66a14563715763be9d59d6102005161030052610220516103205261024051610340526102605161036052608036610380376101e05161040052610120610300a2610200516103005261022051610320526102405161034052610260516103605260806103006000600055f35b6318a7bd768118611f3457336104a052611f4f565b634ab3a82b81186126405760a4358060a01c614151576104a0525b600054614151576001600055611f666104e06131de565b6104e0516104c052611f7961056061310e565b61056080516104e05280602001516105005280604001516105205280606001516105405250610140380360208160803960805161056052602081602001608039608051610580526020816040016080396080516105a0526020816060016080396080516105c052506105605161028052610580516102a0526105a0516102c0526105c0516102e0526104e051610300526105005161032052610520516103405261054051610360526104c05161038052612034610600613630565b610600516105e0526104e0516106005261050051610620526105205161064052610540516106605261068060006004818352015b60206106805102600401356106a05260006106a051146121bc57610600610680516004811015614151576020020180516106a051808210614151578082039050905081525060006004610700527fa9059cbb00000000000000000000000000000000000000000000000000000000610720526107006004806020846107400101826020850160045afa5050805182019150506104a0516020826107400101526020810190506106a0516020826107400101526020810190508061074052610740505060206107e061074051610760600060206101c0380361068051600481101561415157602002016080396080515af1612167573d600060003e3d6000fd5b6107c060203d80821161217a578161217c565b805b9050905081528051602001806106c0828460045afa9050505060006106c05111156121bc576106e0516106c05181816020036008021c9050905015614151575b81516001018083528114156120685750506105605161028052610580516102a0526105a0516102c0526105c0516102e05261060051610300526106205161032052610640516103405261066051610360526104c051610380526122206106a0613630565b6106a051610680526080366106a03760055460048082028215828483041417156141515790509050600c808204905090506107205261074060006004818352015b610680516104e061074051600481101561415157602002015180820282158284830414171561415157905090506105e05180801561415157820490509050610760526000610780526106006107405160048110156141515760200201516107a0526107a05161076051116122ee576107a05161076051808210614151578082039050905061078052612309565b610760516107a0518082106141515780820390509050610780525b610720516107805180820282158284830414171561415157905090506402540be400808204905090506106a06107405160048110156141515760200201526001610740516004811015614151570260010180546106a061074051600481101561415157602002015164012a05f20080820282158284830414171561415157905090506402540be4008082049050905081818301106141515780820190509050815550610600610740516004811015614151576020020180516106a0610740516004811015614151576020020151808210614151578082039050905081525081516001018083528114156122615750506105605161028052610580516102a0526105a0516102c0526105c0516102e05261060051610300526106205161032052610640516103405261066051610360526104c0516103805261244b610760613630565b6107605161074052600c54610760526105e0516107405180821061415157808203905090506107605180820282158284830414171561415157905090506105e051808015614151578204905090506001818183011061415157808201905090506107805260016107805111156141515760843561078051111561253f5760146107a0527f536c697070616765207363726577656420796f750000000000000000000000006107c0526107a0506107a051806107c001818260206001820306601f82010390500336823750506308c379a0610760526020610780526107a05160206001820306601f820103905060440161077cfd5b610760805161078051808210614151578082039050905081525061076051600c55600a3360a052608052604060802080546107805180821061415157808203905090508155506000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610780516107a05260206107a0a3337fb964b72f73f5ef5bf0fdc559b2fab9a7b12a39e47817a547f1f0aee47febd6026004356107a0526024356107c0526044356107e052606435610800526106a051610820526106c051610840526106e051610860526107005161088052610680516108a052610760516108c0526101406107a0a2610780516107a05260206107a06000600055f35b63cc2b27d78118612688576024358060801d81607f1d1861415157610620526004356102c052610620516102e052612679610640613cca565b61064051610680526020610680f35b631a4d01d2811861269d5733610640526126b8565b63081579a581186129b2576064358060a01c61415157610640525b6024358060801d81607f1d1861415157610620526000546141515760016000556004356102c052610620516102e0526126f26106a0613cca565b6106a0805161066052806020015161068052506044356106605110156127895760186106a0527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006106c0526106a0506106a051806106c001818260206001820306601f82010390500336823750506308c379a0610660526020610680526106a05160206001820306601f820103905060440161067cfd5b6001610620516004811015614151570260010180546106805164012a05f20080820282158284830414171561415157905090506402540be4008082049050905081818301106141515780820190509050815550600c5460043580821061415157808203905090506106a0526106a051600c55600a3360a0526080526040608020805460043580821061415157808203905090508155506000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6004356106c05260206106c0a360006004610700527fa9059cbb00000000000000000000000000000000000000000000000000000000610720526107006004806020846107400101826020850160045afa50508051820191505061064051602082610740010152602081019050610660516020826107400101526020810190508061074052610740505060206107e061074051610760600060206101c0380361062051600481101561415157602002016080396080515af161290a573d600060003e3d6000fd5b6107c060203d80821161291d578161291f565b805b9050905081528051602001806106c0828460045afa9050505060006106c051111561295f576106e0516106c05181816020036008021c9050905015614151575b337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a06004356107005261066051610720526106a051610740526060610700a2610660516107005260206107006000600055f35b633c157e648118612b0557600e5433186141515760085462015180818183011061415157808201905090504210614151574262015180818183011061415157808201905090506024351061415157612a0b6101806131de565b61018051610160526004356064808202821582848304141715614151579050905061018052600060043511612a41576000612a4a565b620f4240600435105b1561415157610160516101805110612a845761016051600a8082028215828483041417156141515790509050610180511161415157612aa8565b6101605161018051600a808202821582848304141715614151579050905010614151575b6101605160065561018051600755426008556024356009557fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c254610160516101a052610180516101c052426101e0526024356102005260806101a0a1005b63551a65888118612b7857600e54331861415157612b246101806131de565b6101805161016052610160516006556101605160075542600855426009557f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386101605161018052426101a0526040610180a1005b6330c540858118612c9f57600e5433186141515760e060006004818352015b600160e05160048110156141515702600101546101005260006101005114612c8c5760206101c0380360e051600481101561415157602002016080396080516101205260006004610140527fa9059cbb00000000000000000000000000000000000000000000000000000000610160526101406004806020846101800101826020850160045afa50508051820191505033602082610180010152602081019050610100516020826101800101526020810190508061018052610180505060006000610180516101a06000610120515af1612c76573d600060003e3d6000fd5b6000600160e05160048110156141515702600101555b8151600101808352811415612b97575050005b636b441a408118612cc9576004358060a01c6141515760e052600e5433186141515760e051600f55005b63e5ea47b88118612d1457600f543318614151577f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c600e5460e0523361010052604060e0a133600e55005b6354fd4d508118612dae57610120806020808252600660e0527f76352e302e3000000000000000000000000000000000000000000000000000006101005260e0818401808280516020018083828460045afa905050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f82010390509050905090508101905090509050610120f35b63c66106578118612ddf5760206101c038036004356004811015614151576020020160803960805160e052602060e0f35b6306fdde038118612e505760e080602080825260c0380381840180826020816080396080516020018082843950508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090509050810190509050905060e0f35b6395d89b418118612ec15760e08060208082526060380381840180826020816080396080516020018082843950508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090509050810190509050905060e0f35b633644e5158118612ee15760206020380360803960805160e052602060e0f35b63e2e7d2648118612f08576001600435600481101561415157026001015460e052602060e0f35b63ddca3f438118612f1f5760055460e052602060e0f35b635409491a8118612f365760065460e052602060e0f35b63b4b577ad8118612f4d5760075460e052602060e0f35b632081066c8118612f645760085460e052602060e0f35b63140522888118612f7b5760095460e052602060e0f35b6370a082318118612fb0576004358060a01c6141515760e052600a60e05160a052608052604060802054610100526020610100f35b63dd62ed3e8118613003576004358060a01c6141515760e0526024358060a01c6141515761010052600b60e05160a05260805260406080206101005160a052608052604060802054610120526020610120f35b6318160ddd811861301a57600c5460e052602060e0f35b637ecebe00811861304f576004358060a01c6141515760e052600d60e05160a052608052604060802054610100526020610100f35b638da5cb5b811861306657600e5460e052602060e0f35b631ec0cdc1811861307d57600f5460e052602060e0f35b505b60006000fd5b600a60e05160a05260805260406080208054610120518082106141515780820390509050815550600a6101005160a0526080526040608020805461012051818183011061415157808201905090508155506101005160e0517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61012051610140526020610140a3565b60803660e03761016060006004818352015b6370a0823161018052306101a0526020610180602461019c60206101c0380361016051600481101561415157602002016080396080515afa613167573d600060003e3d6000fd5b601f3d111561415157610180516001610160516004811015614151570260010154808210614151578082039050905060e0610160516004811015614151576020020152815160010180835281141561312057505060e051815261010051816020015261012051816040015261014051816060015250565b60095460e0526007546101005260e0514210613204576101005181525061331756613317565b600654610120526008546101405261012051610100511161329c57610120516101205161010051808210614151578082039050905042610140518082106141515780820390509050808202821582848304141715614151579050905060e05161014051808210614151578082039050905080801561415157820490509050808210614151578082039050905081525061331756613317565b610120516101005161012051808210614151578082039050905042610140518082106141515780820390509050808202821582848304141715614151579050905060e0516101405180821061415157808203905090508080156141515782049050905081818301106141515780820190509050815250613317565b565b6080366101e03761026060006004818352015b60e06102605160048110156141515760200201516101606102605160048110156141515760200201518082028215828483041417156141515790509050670de0b6b3a7640000808204905090506101e0610260516004811015614151576020020152815160010180835281141561332c5750506101e051815261020051816020015261022051816040015261024051816060015250565b604036610180376101e060006004818352015b60206101e0510260e001516101c05261018080516101c0518181830110614151578082019050905081525081516001018083528114156133d65750506101805161342457600081525061362e565b610180516101c05261016051600480820282158284830414171561415157905090506101e052610200600060ff818352015b6101c0516102205261026060006004818352015b6020610260510260e0015161024052610220516101c051808202821582848304141715614151579050905061024051600480820282158284830414171561415157905090508080156141515782049050905061022052815160010180835281141561346a5750506101c0516101a0526101e0516101805180820282158284830414171561415157905090506064808204905090506102205160048082028215828483041417156141515790509050818183011061415157808201905090506101c05180820282158284830414171561415157905090506101e051606480821061415157808203905090506101c0518082028215828483041417156141515790509050606480820490509050600561022051808202821582848304141715614151579050905081818301106141515780820190509050808015614151578204905090506101c0526101a0516101c051116135ec5760016101a0516101c0518082106141515780820390509050116136175750506101c05181525061362e56613617565b60016101c0516101a0518082106141515780820390509050116136175750506101c05181525061362e565b815160010180835281141561345657505060006000fd5b565b6102805160e0526102a051610100526102c051610120526102e0516101405261030051610160526103205161018052610340516101a052610360516101c05261367a610420613319565b61042080516103a05280602001516103c05280604001516103e052806060015161040052506103a05160e0526103c051610100526103e05161012052610400516101405261038051610160526136d16104206133c3565b61042051815250565b6102a05161028051146141515760006102a051126141515760046102a05112156141515760006102805112614151576004610280511215614151576137206103806131de565b61038051610360526102e05160e052610300516101005261032051610120526103405161014052610360516101605261375a6103a06133c3565b6103a051610380526060366103a037610380516104005261036051600480820282158284830414171561415157905090506104205261044060006004818352015b6102805161044051186137b5576102c0516103c0526137e6565b6102a0516104405114156137cc5761384a566137e6565b6102e06104405160048110156141515760200201516103c0525b6103a080516103c05181818301106141515780820190509050815250610400516103805180820282158284830414171561415157905090506103c0516004808202821582848304141715614151579050905080801561415157820490509050610400525b815160010180835281141561379b5750506104005161038051808202821582848304141715614151579050905060648082028215828483041417156141515790509050610420516004808202821582848304141715614151579050905080801561415157820490509050610400526103a0516103805160648082028215828483041417156141515790509050610420518080156141515782049050905081818301106141515780820190509050610440526103805161046052610480600060ff818352015b610460516103e0526104605161046051808202821582848304141715614151579050905061040051818183011061415157808201905090506002610460518082028215828483041417156141515790509050610440518181830110614151578082019050905061038051808210614151578082039050905080801561415157820490509050610460526103e05161046051116139d45760016103e051610460518082106141515780820390509050116139ff57505061046051815250613a16566139ff565b6001610460516103e0518082106141515780820390509050116139ff57505061046051815250613a16565b815160010180835281141561390f57505060006000fd5b565b60006101005112614151576004610100511215614151576060366101c0376101a0516102205260e051600480820282158284830414171561415157905090506102405261026060006004818352015b61010051610260511415613a7e57613afc56613a98565b6101206102605160048110156141515760200201516101e0525b6101c080516101e05181818301106141515780820190509050815250610220516101a05180820282158284830414171561415157905090506101e0516004808202821582848304141715614151579050905080801561415157820490509050610220525b8151600101808352811415613a67575050610220516101a051808202821582848304141715614151579050905060648082028215828483041417156141515790509050610240516004808202821582848304141715614151579050905080801561415157820490509050610220526101c0516101a05160648082028215828483041417156141515790509050610240518080156141515782049050905081818301106141515780820190509050610260526101a051610280526102a0600060ff818352015b6102805161020052610280516102805180820282158284830414171561415157905090506102205181818301106141515780820190509050600261028051808202821582848304141715614151579050905061026051818183011061415157808201905090506101a05180821061415157808203905090508080156141515782049050905061028052610200516102805111613c865760016102005161028051808210614151578082039050905011613cb157505061028051815250613cc856613cb1565b60016102805161020051808210614151578082039050905011613cb157505061028051815250613cc8565b8151600101808352811415613bc157505060006000fd5b565b613cd56103206131de565b6103205161030052610140380360208160803960805161032052602081602001608039608051610340526020816040016080396080516103605260208160600160803960805161038052506103205161052052610340516105405261036051610560526103805161058052613d4b61042061310e565b61042080516105a05280602001516105c05280604001516105e052806060015161060052506105205160e0526105405161010052610560516101205261058051610140526105a051610160526105c051610180526105e0516101a052610600516101c052613dba6104a0613319565b6104a080516103a05280602001516103c05280604001516103e052806060015161040052506103a05160e0526103c051610100526103e0516101205261040051610140526103005161016052613e116104406133c3565b6104405161042052600c5461044052610420516102c05161042051808202821582848304141715614151579050905061044051808015614151578204905090508082106141515780820390509050610460526103005160e0526102e051610100526103a051610120526103c051610140526103e051610160526104005161018052610460516101a052613ea56104a0613a18565b6104a0516104805260055460048082028215828483041417156141515790509050600c808204905090506104a0526080366104c03761054060006004818352015b6000610560526103a0610540516004811015614151576020020151610580526102e0516105405118613f5a5761058051610460518082028215828483041417156141515790509050610420518080156141515782049050905061048051808210614151578082039050905061056052613f9e565b610580516105805161046051808202821582848304141715614151579050905061042051808015614151578204905090508082106141515780820390509050610560525b610580516104a0516105605180820282158284830414171561415157905090506402540be4008082049050905080821061415157808203905090506104c06105405160048110156141515760200201528151600101808352811415613ee65750506104c06102e05160048110156141515760200201516103005160e0526102e051610100526104c051610120526104e0516101405261050051610160526105205161018052610460516101a052614056610560613a18565b610560518082106141515780820390509050610540526103a06102e0516004811015614151576020020151610480518082106141515780820390509050670de0b6b3a764000080820282158284830414171561415157905090506103206102e051600481101561415157602002015180801561415157820490509050610560526105405160018082106141515780820390509050670de0b6b3a764000080820282158284830414171561415157905090506103206102e0516004811015614151576020020151808015614151578204905090506105405261054051815261056051610540518082106141515780820390509050816020015250565b600080fd000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a693b19d2931d498c5b318df961919bb4aee87a5000000000000000000000000853d955acef822db058eb8505911ed77f175b99e000000000000000000000000000000000000000c9f2c9cd04674edea40000000000000000000000000000000000000000000000c9f2c9cd04674edea40000000000000000000000000000000000000000000000c9f2c9cd04674edea400000000000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000002143757276652e66692034706f6f6c20555344432f555344542f5553542f465241580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043443525600000000000000000000000000000000000000000000000000000000402181fcae87a8fb8d33d6ad53a2563aa5cb9d5678d8b547f855ba90a0aa9121
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a693b19d2931d498c5b318df961919bb4aee87a5000000000000000000000000853d955acef822db058eb8505911ed77f175b99e000000000000000000000000000000000000000c9f2c9cd04674edea40000000000000000000000000000000000000000000000c9f2c9cd04674edea40000000000000000000000000000000000000000000000c9f2c9cd04674edea400000000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000002dc6c0000000000000000000000000000000000000000000000000000000000000002143757276652e66692034706f6f6c20555344432f555344542f5553542f465241580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043443525600000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Curve.fi 4pool USDC/USDT/UST/FRAX
Arg [1] : _symbol (string): 4CRV
Arg [2] : _coins (address[4]): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xdAC17F958D2ee523a2206206994597C13D831ec7,0xa693B19d2931d498c5B318dF961919BB4aee87a5,0x853d955aCEf822Db058eb8505911ED77F175b99e
Arg [3] : _rate_multipliers (uint256[4]): 1000000000000000000000000000000,1000000000000000000000000000000,1000000000000000000000000000000,1000000000000000000
Arg [4] : _A (uint256): 500
Arg [5] : _fee (uint256): 3000000
-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [1] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [2] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [3] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [4] : 000000000000000000000000a693b19d2931d498c5b318df961919bb4aee87a5
Arg [5] : 000000000000000000000000853d955acef822db058eb8505911ed77f175b99e
Arg [6] : 000000000000000000000000000000000000000c9f2c9cd04674edea40000000
Arg [7] : 000000000000000000000000000000000000000c9f2c9cd04674edea40000000
Arg [8] : 000000000000000000000000000000000000000c9f2c9cd04674edea40000000
Arg [9] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [10] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [11] : 00000000000000000000000000000000000000000000000000000000002dc6c0
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [13] : 43757276652e66692034706f6f6c20555344432f555344542f5553542f465241
Arg [14] : 5800000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [16] : 3443525600000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.