Token Curve.fi USDC/USDT
Overview ERC20
Price
$0.00 @ 0.000000 ETH
Fully Diluted Market Cap
Total Supply:
12,657,831.793157 2CRV
Holders:
9,409 addresses
Contract:
Decimals:
18
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.2.12
Contract Source Code (Vyper language format)
# @version 0.2.12 """ @title StableSwap @author Curve.Fi @license Copyright (c) Curve.Fi, 2020-2021 - all rights reserved @notice 2 coin pool implementation with no lending """ from vyper.interfaces import ERC20 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 CommitNewAdmin: deadline: indexed(uint256) admin: indexed(address) event NewAdmin: admin: indexed(address) event CommitNewFee: deadline: indexed(uint256) fee: uint256 admin_fee: uint256 event NewFee: fee: uint256 admin_fee: uint256 event RampA: old_A: uint256 new_A: uint256 initial_time: uint256 future_time: uint256 event StopRampA: A: uint256 t: uint256 N_COINS: constant(int128) = 2 PRECISION: constant(uint256) = 10 ** 18 RATE_MULTIPLIER: constant(uint256) = 1000000000000000000000000000000 A_PRECISION: constant(uint256) = 100 FEE_DENOMINATOR: constant(uint256) = 10 ** 10 MAX_ADMIN_FEE: constant(uint256) = 10 * 10 ** 9 MAX_FEE: constant(uint256) = 5 * 10 ** 9 MAX_A: constant(uint256) = 10 ** 6 MAX_A_CHANGE: constant(uint256) = 10 ADMIN_ACTIONS_DELAY: constant(uint256) = 3 * 86400 MIN_RAMP_TIME: constant(uint256) = 86400 coins: public(address[N_COINS]) balances: public(uint256[N_COINS]) fee: public(uint256) # fee * 1e10 admin_fee: public(uint256) # admin_fee * 1e10 owner: public(address) initial_A: public(uint256) future_A: public(uint256) initial_A_time: public(uint256) future_A_time: public(uint256) admin_actions_deadline: public(uint256) transfer_ownership_deadline: public(uint256) future_fee: public(uint256) future_admin_fee: public(uint256) future_owner: public(address) is_killed: bool kill_deadline: uint256 KILL_DEADLINE_DT: constant(uint256) = 2 * 30 * 86400 name: public(String[64]) symbol: public(String[32]) balanceOf: public(HashMap[address, uint256]) allowance: public(HashMap[address, HashMap[address, uint256]]) totalSupply: public(uint256) @external def __init__( _coins: address[N_COINS], _A: uint256, _fee: uint256, _admin_fee: uint256, _name: String[64], _symbol: String[32], ): """ @notice Contract constructor @param _coins Addresses of ERC20 conracts of coins @param _A Amplification coefficient multiplied by n ** (n - 1) @param _fee Fee to charge for exchanges @param _admin_fee Admin fee @param _name Name of the new pool @param _symbol Token symbol """ self.coins = _coins self.initial_A = _A * A_PRECISION self.future_A = _A * A_PRECISION self.fee = _fee self.admin_fee = _admin_fee self.owner = msg.sender self.name = _name self.symbol = _symbol # 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 ### StableSwap Functionality ### @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 A() -> uint256: return self._A() / A_PRECISION @view @external def A_precise() -> uint256: return self._A() @pure @internal def _xp_mem(_balances: uint256[N_COINS]) -> uint256[N_COINS]: result: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): result[i] = RATE_MULTIPLIER * _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 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 * D / _xp[0] * D / _xp[1] / (N_COINS)**2 Dprev: uint256 = 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(_balances: uint256[N_COINS], _amp: uint256) -> uint256: xp: uint256[N_COINS] = self._xp_mem(_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() xp: uint256[N_COINS] = self._xp_mem(self.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(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(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 """ assert not self.is_killed # dev: is killed amp: uint256 = self._A() old_balances: uint256[N_COINS] = self.balances # Initial invariant D0: uint256 = self.get_D_mem(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: ERC20(self.coins[i]).transferFrom(msg.sender, self, amount) new_balances[i] += amount else: assert total_supply != 0 # dev: initial deposit requires all coins # Invariant after change D1: uint256 = self.get_D_mem(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)) admin_fee: uint256 = self.admin_fee 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.balances[i] = new_balance - (fees[i] * admin_fee / FEE_DENOMINATOR) new_balances[i] -= fees[i] D2: uint256 = self.get_D_mem(new_balances, amp) mint_amount = total_supply * (D2 - D0) / D0 else: self.balances = new_balances 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 """ xp: uint256[N_COINS] = self._xp_mem(self.balances) x: uint256 = xp[i] + (dx * RATE_MULTIPLIER / 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 / RATE_MULTIPLIER @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 """ assert not self.is_killed # dev: is killed old_balances: uint256[N_COINS] = self.balances xp: uint256[N_COINS] = self._xp_mem(old_balances) x: uint256 = xp[i] + _dx * RATE_MULTIPLIER / 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 / RATE_MULTIPLIER assert dy >= _min_dy, "Exchange resulted in fewer coins than expected" dy_admin_fee: uint256 = dy_fee * self.admin_fee / FEE_DENOMINATOR dy_admin_fee = dy_admin_fee * PRECISION / RATE_MULTIPLIER # Change balances exactly in same way as we change actual ERC20 coin amounts self.balances[i] = old_balances[i] + _dx # When rounding errors happen, we undercharge admin fee in favor of LP self.balances[j] = old_balances[j] - dy - dy_admin_fee ERC20(self.coins[i]).transferFrom(msg.sender, self, _dx) ERC20(self.coins[j]).transfer(_receiver, dy) 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]) for i in range(N_COINS): old_balance: uint256 = self.balances[i] value: uint256 = old_balance * _burn_amount / total_supply assert value >= _min_amounts[i], "Withdrawal resulted in fewer coins than expected" self.balances[i] = old_balance - value amounts[i] = value ERC20(self.coins[i]).transfer(_receiver, value) 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 """ assert not self.is_killed # dev: is killed amp: uint256 = self._A() old_balances: uint256[N_COINS] = self.balances D0: uint256 = self.get_D_mem(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 ERC20(self.coins[i]).transfer(_receiver, amount) D1: uint256 = self.get_D_mem(new_balances, amp) base_fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) admin_fee: uint256 = self.admin_fee fees: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): new_balance: uint256 = new_balances[i] ideal_balance: uint256 = D1 * old_balances[i] / D0 difference: uint256 = 0 if ideal_balance > new_balance: difference = ideal_balance - new_balance else: difference = new_balance - ideal_balance fees[i] = base_fee * difference / FEE_DENOMINATOR self.balances[i] = new_balance - (fees[i] * admin_fee / FEE_DENOMINATOR) new_balances[i] -= fees[i] D2: uint256 = self.get_D_mem(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() xp: uint256[N_COINS] = self._xp_mem(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 / RATE_MULTIPLIER # w/o fees dy = (dy - 1) * PRECISION / RATE_MULTIPLIER # 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 """ assert not self.is_killed # dev: is killed dy: uint256[2] = self._calc_withdraw_one_coin(_burn_amount, i) assert dy[0] >= _min_received, "Not enough coins removed" self.balances[i] -= (dy[0] + dy[1] * self.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) ERC20(self.coins[i]).transfer(_receiver, dy[0]) 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 commit_new_fee(_new_fee: uint256, _new_admin_fee: uint256): assert msg.sender == self.owner # dev: only owner assert self.admin_actions_deadline == 0 # dev: active action assert _new_fee <= MAX_FEE # dev: fee exceeds maximum assert _new_admin_fee <= MAX_ADMIN_FEE # dev: admin fee exceeds maximum deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY self.admin_actions_deadline = deadline self.future_fee = _new_fee self.future_admin_fee = _new_admin_fee log CommitNewFee(deadline, _new_fee, _new_admin_fee) @external def apply_new_fee(): assert msg.sender == self.owner # dev: only owner assert block.timestamp >= self.admin_actions_deadline # dev: insufficient time assert self.admin_actions_deadline != 0 # dev: no active action self.admin_actions_deadline = 0 fee: uint256 = self.future_fee admin_fee: uint256 = self.future_admin_fee self.fee = fee self.admin_fee = admin_fee log NewFee(fee, admin_fee) @external def revert_new_parameters(): assert msg.sender == self.owner # dev: only owner self.admin_actions_deadline = 0 @external def commit_transfer_ownership(_owner: address): assert msg.sender == self.owner # dev: only owner assert self.transfer_ownership_deadline == 0 # dev: active transfer deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY self.transfer_ownership_deadline = deadline self.future_owner = _owner log CommitNewAdmin(deadline, _owner) @external def apply_transfer_ownership(): assert msg.sender == self.owner # dev: only owner assert block.timestamp >= self.transfer_ownership_deadline # dev: insufficient time assert self.transfer_ownership_deadline != 0 # dev: no active transfer self.transfer_ownership_deadline = 0 owner: address = self.future_owner self.owner = owner log NewAdmin(owner) @external def revert_transfer_ownership(): assert msg.sender == self.owner # dev: only owner self.transfer_ownership_deadline = 0 @view @external def admin_balances(i: uint256) -> uint256: return ERC20(self.coins[i]).balanceOf(self) - self.balances[i] @external def withdraw_admin_fees(): assert msg.sender == self.owner # dev: only owner for i in range(N_COINS): coin: address = self.coins[i] fees: uint256 = ERC20(coin).balanceOf(self) - self.balances[i] ERC20(coin).transfer(msg.sender, fees) @external def donate_admin_fees(): assert msg.sender == self.owner # dev: only owner for i in range(N_COINS): self.balances[i] = ERC20(self.coins[i]).balanceOf(self) @external def kill_me(): assert msg.sender == self.owner # dev: only owner assert self.kill_deadline > block.timestamp # dev: deadline has passed self.is_killed = True @external def unkill_me(): assert msg.sender == self.owner # dev: only owner self.is_killed = False
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[2]","indexed":false},{"name":"fees","type":"uint256[2]","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[2]","indexed":false},{"name":"fees","type":"uint256[2]","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[2]","indexed":false},{"name":"fees","type":"uint256[2]","indexed":false},{"name":"invariant","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewFee","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"fee","type":"uint256","indexed":false},{"name":"admin_fee","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewFee","inputs":[{"name":"fee","type":"uint256","indexed":false},{"name":"admin_fee","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"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_coins","type":"address[2]"},{"name":"_A","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_admin_fee","type":"uint256"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":288},{"stateMutability":"nonpayable","type":"function","name":"transfer","inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}],"gas":77917},{"stateMutability":"nonpayable","type":"function","name":"transferFrom","inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}],"gas":115852},{"stateMutability":"nonpayable","type":"function","name":"approve","inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}],"gas":37821},{"stateMutability":"view","type":"function","name":"get_balances","inputs":[],"outputs":[{"name":"","type":"uint256[2]"}],"gas":4821},{"stateMutability":"view","type":"function","name":"A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":10674},{"stateMutability":"view","type":"function","name":"A_precise","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":10636},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":844192},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"_amounts","type":"uint256[2]"},{"name":"_is_deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}],"gas":3326475},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"_amounts","type":"uint256[2]"},{"name":"_min_mint_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"_amounts","type":"uint256[2]"},{"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"}],"gas":2112786},{"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[2]"}],"outputs":[{"name":"","type":"uint256[2]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_burn_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[2]"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256[2]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_amounts","type":"uint256[2]"},{"name":"_max_burn_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_amounts","type":"uint256[2]"},{"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"}],"gas":1040},{"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":[],"gas":159639},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A","inputs":[],"outputs":[],"gas":155100},{"stateMutability":"nonpayable","type":"function","name":"commit_new_fee","inputs":[{"name":"_new_fee","type":"uint256"},{"name":"_new_admin_fee","type":"uint256"}],"outputs":[],"gas":112908},{"stateMutability":"nonpayable","type":"function","name":"apply_new_fee","inputs":[],"outputs":[],"gas":103589},{"stateMutability":"nonpayable","type":"function","name":"revert_new_parameters","inputs":[],"outputs":[],"gas":23042},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_owner","type":"address"}],"outputs":[],"gas":77080},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":65757},{"stateMutability":"nonpayable","type":"function","name":"revert_transfer_ownership","inputs":[],"outputs":[],"gas":23132},{"stateMutability":"view","type":"function","name":"admin_balances","inputs":[{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":7988},{"stateMutability":"nonpayable","type":"function","name":"withdraw_admin_fees","inputs":[],"outputs":[],"gas":22115},{"stateMutability":"nonpayable","type":"function","name":"donate_admin_fees","inputs":[],"outputs":[],"gas":82832},{"stateMutability":"nonpayable","type":"function","name":"kill_me","inputs":[],"outputs":[],"gas":40445},{"stateMutability":"nonpayable","type":"function","name":"unkill_me","inputs":[],"outputs":[],"gas":23282},{"stateMutability":"view","type":"function","name":"coins","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":3367},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3397},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3318},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3348},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3378},{"stateMutability":"view","type":"function","name":"initial_A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3408},{"stateMutability":"view","type":"function","name":"future_A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3438},{"stateMutability":"view","type":"function","name":"initial_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3468},{"stateMutability":"view","type":"function","name":"future_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3498},{"stateMutability":"view","type":"function","name":"admin_actions_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3528},{"stateMutability":"view","type":"function","name":"transfer_ownership_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3558},{"stateMutability":"view","type":"function","name":"future_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3588},{"stateMutability":"view","type":"function","name":"future_admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3618},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3648},{"stateMutability":"view","type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string"}],"gas":13980},{"stateMutability":"view","type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string"}],"gas":11733},{"stateMutability":"view","type":"function","name":"balanceOf","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":3953},{"stateMutability":"view","type":"function","name":"allowance","inputs":[{"name":"arg0","type":"address"},{"name":"arg1","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":4198},{"stateMutability":"view","type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3798}]
Contract Creation Code
60e06143dd6101403960206143dd60c03960c05160a01c1561002057600080fd5b602060206143dd0160c03960c05160a01c1561003b57600080fd5b6060602060a06143dd0160c03960c0516143dd01610220396040602060a06143dd0160c03960c05160040135111561007257600080fd5b6040602060c06143dd0160c03960c0516143dd016102a0396020602060c06143dd0160c03960c0516004013511156100a957600080fd5b600060c052602060c0206101405181556101605160018201555061018051606480820282158284830414176100dd57600080fd5b80905090509050600555610180516064808202821582848304141761010157600080fd5b809050905090506006556101a0516002556101c0516003553360045561022080601060c052602060c020602082510161012060006003818352015b8261012051602002111561014f57610171565b61012051602002850151610120518501555b815160010180835281141561013c575b5050505050506102a080601160c052602060c020602082510161012060006002818352015b826101205160200211156101a9576101cb565b61012051602002850151610120518501555b8151600101808352811415610196575b5050505050506000610300523060007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610300a36143c556600436101561000d57612d41565b600035601c52600051341561002157600080fd5b63313ce56781141561003857601260005260206000f35b63a9059cbb81141561008a5760043560a01c1561005457600080fd5b3361014052600435610160526024356101805261018051610160516101405160065801612d47565b600050600160005260206000f35b6323b872dd8114156101735760043560a01c156100a657600080fd5b60243560a01c156100b657600080fd5b60043561014052602435610160526044356101805261018051610160516101405160065801612d47565b600050601360043560e05260c052604060c0203360e05260c052604060c02054610140527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61014051181561016857610140516044358082101561014357600080fd5b80820390509050601360043560e05260c052604060c0203360e05260c052604060c020555b600160005260206000f35b63095ea7b38114156101ec5760043560a01c1561018f57600080fd5b60243560133360e05260c052604060c02060043560e05260c052604060c0205560243561014052600435337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256020610140a3600160005260206000f35b6314f059798114156102215760018060c052602060c020546101605260018160c052602060c020015461018052506040610160f35b63f446c1d08114156102505760065801612df2565b610140526101405160648082049050905060005260206000f35b6376a2f0f08114156102765760065801612df2565b610140526101405160005260206000f35b63bb7b8b808114156103a3576101405160065801612df2565b6101605261014052610160516101405261014051610160516101805160018060c052602060c020546101a05260018160c052602060c02001546101c052506101c0516101a05160065801612f8a565b6102205261024052610180526101605261014052610220805161016052806020015161018052506101405161016051610180516101a051610160516101c052610180516101e0526101405161020052610200516101e0516101c05160065801613062565b610260526101a052610180526101605261014052610260516101a0526101a051670de0b6b3a7640000808202821582848304141761037f57600080fd5b80905090509050601454808061039457600080fd5b82049050905060005260206000f35b63ed8e84f38114156106005760443560011c156103bf57600080fd5b6101405160065801612df2565b6101605261014052610160516101405260018060c052602060c020546101605260018160c052602060c020015461018052506101405161016051610180516101a051610160516101c052610180516101e0526101405161020052610200516101e0516101c05160065801613344565b610260526101a052610180526101605261014052610260516101a0526101c060006002818352015b60046101c0516002811061047657600080fd5b60200201356101e052604435156104c3576101606101c0516002811061049b57600080fd5b6020020180516101e0518181830110156104b457600080fd5b808201905090508152506104f9565b6101606101c051600281106104d757600080fd5b6020020180516101e051808210156104ee57600080fd5b808203905090508152505b8151600101808352811415610463575b50506101405161016051610180516101a0516101c051610160516101e0526101805161020052610140516102205261022051610200516101e05160065801613344565b610280526101c0526101a052610180526101605261014052610280516101c05260006101e0526044351561059f576101c0516101a0518082101561058f57600080fd5b808203905090506101e0526105c0565b6101a0516101c051808210156105b457600080fd5b808203905090506101e0525b6101e05160145480820282158284830414176105db57600080fd5b809050905090506101a05180806105f157600080fd5b82049050905060005260206000f35b630b4c7e4d811415610616573361014052610647565b630c3e4b548114156106425760643560a01c1561063257600080fd5b6020606461014037600050610647565b610d36565b6015541561065457600080fd5b6001601555600e541561066657600080fd5b610140516101605160065801612df2565b610180526101605261014052610180516101605260018060c052602060c020546101805260018160c052602060c02001546101a052506101405161016051610180516101a0516101c051610180516101e0526101a05161020052610160516102205261022051610200516101e05160065801613344565b610280526101c0526101a052610180526101605261014052610280516101c0526014546101e05261018051610200526101a0516102205261024060006002818352015b6004610240516002811061074457600080fd5b60200201356102605260006102605111156107f857602061034060646323b872dd61028052336102a052306102c052610260516102e05261029c6000610240516002811061079157600080fd5b600060c052602060c02001545af16107a857600080fd5b601f3d116107b557600080fd5b6000506103405061020061024051600281106107d057600080fd5b602002018051610260518181830110156107e957600080fd5b80820190509050815250610808565b60006101e0511861080857600080fd5b8151600101808352811415610731575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161020051610260526102205161028052610160516102a0526102a051610280516102605160065801613344565b610300526102405261022052610200526101e0526101c0526101a05261018052610160526101405261030051610240526101c05161024051116108ad57600080fd5b6060366102603760006101e0511115610bcf57600254600280820282158284830414176108d957600080fd5b809050905090506004808204905090506102c0526003546102e05261030060006002818352015b61024051610180610300516002811061091857600080fd5b6020020151808202821582848304141761093157600080fd5b809050905090506101c051808061094757600080fd5b82049050905061032052600061034052610200610300516002811061096b57600080fd5b602002015161036052610360516103205111156109a75761032051610360518082101561099757600080fd5b80820390509050610340526109c8565b6103605161032051808210156109bc57600080fd5b80820390509050610340525b6102c0516103405180820282158284830414176109e457600080fd5b809050905090506402540be400808204905090506102606103005160028110610a0c57600080fd5b6020020152610360516102606103005160028110610a2957600080fd5b60200201516102e0518082028215828483041417610a4657600080fd5b809050905090506402540be4008082049050905080821015610a6757600080fd5b808203905090506103005160028110610a7f57600080fd5b600160c052602060c02001556102006103005160028110610a9f57600080fd5b6020020180516102606103005160028110610ab957600080fd5b602002015180821015610acb57600080fd5b808203905090508152505b8151600101808352811415610900575b5050610140610320525b61032051516020610320510161032052610320610320511015610b1257610af0565b61020051610340526102205161036052610160516103805261038051610360516103405160065801613344565b6103e052610300610320525b6103205152602061032051036103205261014061032051101515610b6e57610b4b565b6103e051610300526101e051610300516101c05180821015610b8f57600080fd5b808203905090508082028215828483041417610baa57600080fd5b809050905090506101c0518080610bc057600080fd5b8204905090506102a052610bf2565b600160c052602060c02061020051815561022051600182015550610240516102a0525b6044356102a05110151515610c46576308c379a06102c05260206102e0526014610300527f536c697070616765207363726577656420796f75000000000000000000000000610320526103005060646102dcfd5b6101e080516102a051818183011015610c5e57600080fd5b8082019050905081525060126101405160e05260c052604060c02080546102a051818183011015610c8e57600080fd5b808201905090508155506101e0516014556102a0516102c0526101405160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206102c0a3604060046102c0376102605161030052610280516103205261024051610340526101e05161036052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c06102c0a26102a051600052600060155560206000f35b635e0d443f811415610f925760043580806000811215610d5257195b607f1c15610d5f57600080fd5b90505060243580806000811215610d7257195b607f1c15610d7f57600080fd5b905050610140516101605160018060c052602060c020546101805260018160c052602060c02001546101a052506101a0516101805160065801612f8a565b610200526102205261016052610140526102008051610140528060200151610160525061014060043560028110610df357600080fd5b60200201516044356c0c9f2c9cd04674edea400000008082028215828483041417610e1d57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015610e4357600080fd5b80820190509050610180526101405161016051610180516101a051604060046101c0376101805161020052610140516102205261016051610240526102405161022051610200516101e0516101c05160065801613431565b6102a0526101a0526101805261016052610140526102a0516101a05261014060243560028110610eca57600080fd5b60200201516101a05180821015610ee057600080fd5b80820390509050600180821015610ef657600080fd5b808203905090506101c0526002546101c0518082028215828483041417610f1c57600080fd5b809050905090506402540be400808204905090506101e0526101c0516101e05180821015610f4957600080fd5b80820390509050670de0b6b3a76400008082028215828483041417610f6d57600080fd5b809050905090506c0c9f2c9cd04674edea400000008082049050905060005260206000f35b633df02124811415610fa8573361014052610fd9565b63ddc1f59d811415610fd45760843560a01c15610fc457600080fd5b6020608461014037600050610fd9565b611539565b60155415610fe657600080fd5b600160155560043580806000811215610ffb57195b607f1c1561100857600080fd5b9050506024358080600081121561101b57195b607f1c1561102857600080fd5b905050600e541561103857600080fd5b60018060c052602060c020546101605260018160c052602060c020015461018052506101405161016051610180516101a0516101c051610160516101e0526101805161020052610200516101e05160065801612f8a565b61026052610280526101c0526101a05261018052610160526101405261026080516101a05280602001516101c052506101a0600435600281106110d157600080fd5b60200201516044356c0c9f2c9cd04674edea4000000080820282158284830414176110fb57600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561112157600080fd5b808201905090506101e0526101405161016051610180516101a0516101c0516101e0516102005160406004610220376101e051610260526101a051610280526101c0516102a0526102a0516102805161026051610240516102205160065801613431565b61030052610200526101e0526101c0526101a05261018052610160526101405261030051610200526101a0602435600281106111c057600080fd5b602002015161020051808210156111d657600080fd5b808203905090506001808210156111ec57600080fd5b808203905090506102205261022051600254808202821582848304141761121257600080fd5b809050905090506402540be400808204905090506102405261022051610240518082101561123f57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761126357600080fd5b809050905090506c0c9f2c9cd04674edea40000000808204905090506102205260643561022051101515156112fc576308c379a061026052602061028052602e6102a0527f45786368616e676520726573756c74656420696e20666577657220636f696e736102c0527f207468616e2065787065637465640000000000000000000000000000000000006102e0526102a050608461027cfd5b61024051600354808202821582848304141761131757600080fd5b809050905090506402540be400808204905090506102605261026051670de0b6b3a7640000808202821582848304141761135057600080fd5b809050905090506c0c9f2c9cd04674edea4000000080820490509050610260526101606004356002811061138357600080fd5b602002015160443581818301101561139a57600080fd5b80820190509050600435600281106113b157600080fd5b600160c052602060c0200155610160602435600281106113d057600080fd5b602002015161022051808210156113e657600080fd5b8082039050905061026051808210156113fe57600080fd5b808203905090506024356002811061141557600080fd5b600160c052602060c0200155602061034060646323b872dd61028052336102a052306102c0526044356102e05261029c60006004356002811061145757600080fd5b600060c052602060c02001545af161146e57600080fd5b601f3d1161147b57600080fd5b600050610340506020610320604463a9059cbb61028052610140516102a052610220516102c05261029c6000602435600281106114b757600080fd5b600060c052602060c02001545af16114ce57600080fd5b601f3d116114db57600080fd5b60005061032050600435610280526044356102a0526024356102c052610220516102e052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610280a261022051600052600060155560206000f35b635b36389c81141561154f573361014052611580565b633eb1719f81141561157b5760643560a01c1561156b57600080fd5b6020606461014037600050611580565b611834565b6015541561158d57600080fd5b600160155560145461016052604036610180376101c060006002818352015b6101c051600281106115bd57600080fd5b600160c052602060c02001546101e0526101e05160043580820282158284830414176115e857600080fd5b809050905090506101605180806115fe57600080fd5b8204905090506102005260246101c0516002811061161b57600080fd5b60200201356102005110151515611696576308c379a0610220526020610240526030610260527f5769746864726177616c20726573756c74656420696e20666577657220636f69610280527f6e73207468616e206578706563746564000000000000000000000000000000006102a05261026050608461023cfd5b6101e05161020051808210156116ab57600080fd5b808203905090506101c051600281106116c357600080fd5b600160c052602060c0200155610200516101806101c051600281106116e757600080fd5b602002015260206102c0604463a9059cbb610220526101405161024052610200516102605261023c60006101c0516002811061172257600080fd5b600060c052602060c02001545af161173957600080fd5b601f3d1161174657600080fd5b6000506102c0505b81516001018083528114156115ac575b505061016080516004358082101561177557600080fd5b8082039050905081525060123360e05260c052604060c02080546004358082101561179f57600080fd5b80820390509050815550610160516014556004356101c0526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c0a3610180516101c0526101a0516101e052604036610200376101605161024052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a06101c0a260006015556040610180f35b63e310327381141561184a57336101405261187b565b6352d2cfdd8114156118765760643560a01c1561186657600080fd5b602060646101403760005061187b565b611f35565b6015541561188857600080fd5b6001601555600e541561189a57600080fd5b610140516101605160065801612df2565b610180526101605261014052610180516101605260018060c052602060c020546101805260018160c052602060c02001546101a052506101405161016051610180516101a0516101c051610180516101e0526101a05161020052610160516102205261022051610200516101e05160065801613344565b610280526101c0526101a052610180526101605261014052610280516101c052610180516101e0526101a0516102005261022060006002818352015b6004610220516002811061197157600080fd5b6020020135610240526000610240511815611a1d576101e0610220516002811061199a57600080fd5b60200201805161024051808210156119b157600080fd5b808203905090508152506020610300604463a9059cbb610260526101405161028052610240516102a05261027c600061022051600281106119f157600080fd5b600060c052602060c02001545af1611a0857600080fd5b601f3d11611a1557600080fd5b600050610300505b815160010180835281141561195e575b50506101405161016051610180516101a0516101c0516101e05161020051610220516101e051610240526102005161026052610160516102805261028051610260516102405160065801613344565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e0516102205260025460028082028215828483041417611ac157600080fd5b809050905090506004808204905090506102405260035461026052604036610280376102c060006002818352015b6101e06102c05160028110611b0357600080fd5b60200201516102e052610220516101806102c05160028110611b2457600080fd5b60200201518082028215828483041417611b3d57600080fd5b809050905090506101c0518080611b5357600080fd5b820490509050610300526000610320526102e051610300511115611b9657610300516102e05180821015611b8657600080fd5b8082039050905061032052611bb7565b6102e0516103005180821015611bab57600080fd5b80820390509050610320525b61024051610320518082028215828483041417611bd357600080fd5b809050905090506402540be400808204905090506102806102c05160028110611bfb57600080fd5b60200201526102e0516102806102c05160028110611c1857600080fd5b6020020151610260518082028215828483041417611c3557600080fd5b809050905090506402540be4008082049050905080821015611c5657600080fd5b808203905090506102c05160028110611c6e57600080fd5b600160c052602060c02001556101e06102c05160028110611c8e57600080fd5b6020020180516102806102c05160028110611ca857600080fd5b602002015180821015611cba57600080fd5b808203905090508152505b8151600101808352811415611aef575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516101e0516102e0526102005161030052610160516103205261032051610300516102e05160065801613344565b610380526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516102c0526014546102e0526101c0516102c05180821015611d9457600080fd5b808203905090506102e0518082028215828483041417611db357600080fd5b809050905090506101c0518080611dc957600080fd5b8204905090506001818183011015611de057600080fd5b808201905090506103005260016103005111611dfb57600080fd5b6044356103005111151515611e4f576308c379a0610320526020610340526014610360527f536c697070616765207363726577656420796f750000000000000000000000006103805261036050606461033cfd5b6102e080516103005180821015611e6557600080fd5b808203905090508152506102e05160145560123360e05260c052604060c02080546103005180821015611e9757600080fd5b8082039050905081555061030051610320526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610320a3604060046103203761028051610360526102a05161038052610220516103a0526102e0516103c052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c0610320a261030051600052600060155560206000f35b63cc2b27d7811415611f955760243580806000811215611f5157195b607f1c15611f5e57600080fd5b9050506004356101405260243561016052610160516101405160065801613c05565b6101c0526101e0526101c05160005260206000f35b631a4d01d2811415611fab573361014052611fdc565b63081579a5811415611fd75760643560a01c15611fc757600080fd5b6020606461014037600050611fdc565b61226f565b60155415611fe957600080fd5b600160155560243580806000811215611ffe57195b607f1c1561200b57600080fd5b905050600e541561201b57600080fd5b6101405161016051610180516004356101a0526024356101c0526101c0516101a05160065801613c05565b61022052610240526101805261016052610140526102208051610160528060200151610180525060443561016051101515156120c1576308c379a06101a05260206101c05260186101e0527f4e6f7420656e6f75676820636f696e732072656d6f7665640000000000000000610200526101e05060646101bcfd5b602435600281106120d157600080fd5b600160c052602060c020018054610160516101805160035480820282158284830414176120fd57600080fd5b809050905090506402540be4008082049050905081818301101561212057600080fd5b808201905090508082101561213457600080fd5b808203905090508155506014546004358082101561215157600080fd5b808203905090506101a0526101a05160145560123360e05260c052604060c02080546004358082101561218357600080fd5b808203905090508155506004356101c0526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c0a36020610260604463a9059cbb6101c052610140516101e05261016051610200526101dc6000602435600281106121f357600080fd5b600060c052602060c02001545af161220a57600080fd5b601f3d1161221757600080fd5b600050610260506004356101c052610160516101e0526101a05161020052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060606101c0a261016051600052600060155560206000f35b633c157e6481141561241057600454331461228957600080fd5b6007546201518081818301101561229f57600080fd5b808201905090504210156122b257600080fd5b42620151808181830110156122c657600080fd5b8082019050905060243510156122db57600080fd5b6101405160065801612df2565b610160526101405261016051610140526004356064808202821582848304141761231157600080fd5b80905090509050610160526000600435111561233457620f424060043510612337565b60005b61234057600080fd5b61014051610160511015612383576101405161016051600a808202821582848304141761236c57600080fd5b80905090509050101561237e57600080fd5b6123b3565b61014051600a808202821582848304141761239d57600080fd5b809050905090506101605111156123b357600080fd5b6101405160055561016051600655426007556024356008556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a658881141561249357600454331461242a57600080fd5b6101405160065801612df2565b6101605261014052610160516101405261014051600555610140516006554260075542600855610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b635b5a146781141561254f5760045433146124ad57600080fd5b600954156124ba57600080fd5b64012a05f20060043511156124ce57600080fd5b6402540be40060243511156124e257600080fd5b426203f4808181830110156124f657600080fd5b808201905090506101405261014051600955600435600b55602435600c556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe978114156125e157600454331461256957600080fd5b60095442101561257857600080fd5b60006009541861258757600080fd5b6000600955600b5461014052600c546101605261014051600255610160516003556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb8114156126025760045433146125fb57600080fd5b6000600955005b636b441a408114156126945760043560a01c1561261e57600080fd5b600454331461262c57600080fd5b600a541561263957600080fd5b426203f48081818301101561264d57600080fd5b808201905090506101405261014051600a55600435600d55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae81141561270b5760045433146126ae57600080fd5b600a544210156126bd57600080fd5b6000600a54186126cc57600080fd5b6000600a55600d546101405261014051600455610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19381141561272c57600454331461272557600080fd5b6000600a55005b63e2e7d2648114156127c45760206101c060246370a0823161014052306101605261015c6004356002811061276057600080fd5b600060c052602060c02001545afa61277757600080fd5b601f3d1161278457600080fd5b6000506101c0516004356002811061279b57600080fd5b600160c052602060c0200154808210156127b457600080fd5b8082039050905060005260206000f35b6330c540858114156128d55760045433146127de57600080fd5b61014060006002818352015b61014051600281106127fb57600080fd5b600060c052602060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa61283257600080fd5b601f3d1161283f57600080fd5b60005061022051610140516002811061285757600080fd5b600160c052602060c02001548082101561287057600080fd5b80820390509050610180526020610240604463a9059cbb6101a052336101c052610180516101e0526101bc6000610160515af16128ac57600080fd5b601f3d116128b957600080fd5b600050610240505b81516001018083528114156127ea575b5050005b63524c39018114156129815760045433146128ef57600080fd5b61014060006002818352015b60206101e060246370a0823161016052306101805261017c610140516002811061292457600080fd5b600060c052602060c02001545afa61293b57600080fd5b601f3d1161294857600080fd5b6000506101e051610140516002811061296057600080fd5b600160c052602060c02001555b81516001018083528114156128fb575b5050005b63e36988538114156129b057600454331461299b57600080fd5b42600f54116129a957600080fd5b6001600e55005b633046f9728114156129d15760045433146129ca57600080fd5b6000600e55005b63c6610657811415612a0257600435600281106129ed57600080fd5b600060c052602060c020015460005260206000f35b634903b0d1811415612a335760043560028110612a1e57600080fd5b600160c052602060c020015460005260206000f35b63ddca3f43811415612a4b5760025460005260206000f35b63fee3f7f9811415612a635760035460005260206000f35b638da5cb5b811415612a7b5760045460005260206000f35b635409491a811415612a935760055460005260206000f35b63b4b577ad811415612aab5760065460005260206000f35b632081066c811415612ac35760075460005260206000f35b6314052288811415612adb5760085460005260206000f35b63405e28f8811415612af35760095460005260206000f35b63e0a0b586811415612b0b57600a5460005260206000f35b6358680d0b811415612b2357600b5460005260206000f35b63e3824462811415612b3b57600c5460005260206000f35b631ec0cdc1811415612b5357600d5460005260206000f35b6306fdde03811415612bf85760108060c052602060c020610180602082540161012060006003818352015b82610120516020021115612b9157612bb3565b61012051850154610120516020028501525b8151600101808352811415612b7e575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f35b6395d89b41811415612c9d5760118060c052602060c020610180602082540161012060006002818352015b82610120516020021115612c3657612c58565b61012051850154610120516020028501525b8151600101808352811415612c23575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f35b6370a08231811415612cd35760043560a01c15612cb957600080fd5b601260043560e05260c052604060c0205460005260206000f35b63dd62ed3e811415612d275760043560a01c15612cef57600080fd5b60243560a01c15612cff57600080fd5b601360043560e05260c052604060c02060243560e05260c052604060c0205460005260206000f35b6318160ddd811415612d3f5760145460005260206000f35b505b60006000fd5b6101a05261014052610160526101805260126101405160e05260c052604060c02080546101805180821015612d7b57600080fd5b8082039050905081555060126101605160e05260c052604060c020805461018051818183011015612dab57600080fd5b80820190509050815550610180516101c05261016051610140517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c0a36101a051565b61014052600854610160526006546101805261016051421015612f78576005546101a0526007546101c0526101a051610180511115612ed2576101a051610180516101a05180821015612e4457600080fd5b80820390509050426101c05180821015612e5d57600080fd5b808203905090508082028215828483041417612e7857600080fd5b80905090509050610160516101c05180821015612e9457600080fd5b808203905090508080612ea657600080fd5b820490509050818183011015612ebb57600080fd5b808201905090506000526000516101405156612f73565b6101a0516101a0516101805180821015612eeb57600080fd5b80820390509050426101c05180821015612f0457600080fd5b808203905090508082028215828483041417612f1f57600080fd5b80905090509050610160516101c05180821015612f3b57600080fd5b808203905090508080612f4d57600080fd5b82049050905080821015612f6057600080fd5b8082039050905060005260005161014051565b612f88565b6101805160005260005161014051565b005b6101805261014052610160526040366101a0376101e060006002818352015b6c0c9f2c9cd04674edea400000006101406101e05160028110612fcb57600080fd5b60200201518082028215828483041417612fe457600080fd5b80905090509050670de0b6b3a7640000808204905090506101a06101e0516002811061300f57600080fd5b60200201525b8151600101808352811415612fa9575b505060406101e0525b60006101e0511115156130405761305c565b60206101e051036101a0015160206101e051036101e05261302e565b61018051565b6101a05261014052610160526101805260006101c05261020060006002818352015b6020610200510261014001516101e0526101c080516101e0518181830110156130ac57600080fd5b808201905090508152505b8151600101808352811415613084575b50506101c05115156130e15760006000526000516101a051565b6101c0516101e052610180516002808202821582848304141761310357600080fd5b8090509050905061020052610220600060ff818352015b6101e0516101e051808202821582848304141761313657600080fd5b8090509050905061014051808061314c57600080fd5b8204905090506101e051808202821582848304141761316a57600080fd5b8090509050905061016051808061318057600080fd5b820490509050600480820490509050610240526101e05161026052610200516101c05180820282158284830414176131b757600080fd5b8090509050905060648082049050905061024051600280820282158284830414176131e157600080fd5b809050905090508181830110156131f757600080fd5b808201905090506101e051808202821582848304141761321657600080fd5b809050905090506102005160648082101561323057600080fd5b808203905090506101e051808202821582848304141761324f57600080fd5b80905090509050606480820490509050600361024051808202821582848304141761327957600080fd5b8090509050905081818301101561328f57600080fd5b8082019050905080806132a157600080fd5b8204905090506101e052610260516101e05111156132f55760016101e05161026051808210156132d057600080fd5b808203905090501115156132f0576101e05160005250506000516101a051565b61332c565b6001610260516101e0518082101561330c57600080fd5b8082039050905011151561332c576101e05160005250506000516101a051565b815160010180835281141561311a575b505060006000fd5b6101a0526101405261016052610180526101405161016051610180516101a0516101c0516101e05161014051610200526101605161022052610220516102005160065801612f8a565b610280526102a0526101e0526101c0526101a05261018052610160526101405261028080516101c05280602001516101e052506101405161016051610180516101a0516101c0516101e0516101c051610200526101e05161022052610180516102405261024051610220516102005160065801613062565b6102a0526101e0526101c0526101a0526101805261016052610140526102a0516000526000516101a051565b6101e0526101405261016052610180526101a0526101c05261016051610140511861345b57600080fd5b600061016051121561346c57600080fd5b6002610160511261347c57600080fd5b600061014051121561348d57600080fd5b6002610140511261349d57600080fd5b6101405161016051610180516101a0516101c0516101e0516102005160065801612df2565b61022052610200526101e0526101c0526101a05261018052610160526101405261022051610200526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c05161026052610200516102805261028051610260516102405160065801613062565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e0516102205260603661024037610220516102a052610200516002808202821582848304141761358c57600080fd5b809050905090506102c0526102e060006002818352015b610140516102e05114156135be5761018051610260526135f3565b610160516102e05118156135ee576101a06102e051600281106135e057600080fd5b6020020151610260526135f3565b61366f565b61024080516102605181818301101561360b57600080fd5b808201905090508152506102a05161022051808202821582848304141761363157600080fd5b80905090509050610260516002808202821582848304141761365257600080fd5b80905090509050808061366457600080fd5b8204905090506102a0525b81516001018083528114156135a3575b50506102a05161022051808202821582848304141761369d57600080fd5b80905090509050606480820282158284830414176136ba57600080fd5b809050905090506102c051600280820282158284830414176136db57600080fd5b8090509050905080806136ed57600080fd5b8204905090506102a05261024051610220516064808202821582848304141761371557600080fd5b809050905090506102c051808061372b57600080fd5b82049050905081818301101561374057600080fd5b808201905090506102e0526102205161030052610320600060ff818352015b61030051610280526103005161030051808202821582848304141761378357600080fd5b809050905090506102a05181818301101561379d57600080fd5b8082019050905060026103005180820282158284830414176137be57600080fd5b809050905090506102e0518181830110156137d857600080fd5b8082019050905061022051808210156137f057600080fd5b80820390509050808061380257600080fd5b820490509050610300526102805161030051111561385657600161030051610280518082101561383157600080fd5b80820390509050111515613851576103005160005250506000516101e051565b61388d565b600161028051610300518082101561386d57600080fd5b8082039050905011151561388d576103005160005250506000516101e051565b815160010180835281141561375f575b505060006000fd5b6101e0526101405261016052610180526101a0526101c05260006101605112156138ce57600080fd5b600261016051126138de57600080fd5b606036610200376101c05161026052610140516002808202821582848304141761390757600080fd5b80905090509050610280526102a060006002818352015b610160516102a051181561394e576101806102a0516002811061394057600080fd5b602002015161022052613953565b6139cf565b61020080516102205181818301101561396b57600080fd5b80820190509050815250610260516101c051808202821582848304141761399157600080fd5b8090509050905061022051600280820282158284830414176139b257600080fd5b8090509050905080806139c457600080fd5b820490509050610260525b815160010180835281141561391e575b5050610260516101c05180820282158284830414176139fd57600080fd5b8090509050905060648082028215828483041417613a1a57600080fd5b809050905090506102805160028082028215828483041417613a3b57600080fd5b809050905090508080613a4d57600080fd5b82049050905061026052610200516101c05160648082028215828483041417613a7557600080fd5b80905090509050610280518080613a8b57600080fd5b820490509050818183011015613aa057600080fd5b808201905090506102a0526101c0516102c0526102e0600060ff818352015b6102c051610240526102c0516102c0518082028215828483041417613ae357600080fd5b8090509050905061026051818183011015613afd57600080fd5b8082019050905060026102c0518082028215828483041417613b1e57600080fd5b809050905090506102a051818183011015613b3857600080fd5b808201905090506101c05180821015613b5057600080fd5b808203905090508080613b6257600080fd5b8204905090506102c052610240516102c0511115613bb65760016102c0516102405180821015613b9157600080fd5b80820390509050111515613bb1576102c05160005250506000516101e051565b613bed565b6001610240516102c05180821015613bcd57600080fd5b80820390509050111515613bed576102c05160005250506000516101e051565b8151600101808352811415613abf575b505060006000fd5b6101805261014052610160526101405161016051610180516101a05160065801612df2565b6101c0526101a0526101805261016052610140526101c0516101a0526101405161016051610180516101a0516101c0516101e05160018060c052602060c020546102005260018160c052602060c02001546102205250610220516102005160065801612f8a565b610280526102a0526101e0526101c0526101a05261018052610160526101405261028080516101c05280602001516101e052506101405161016051610180516101a0516101c0516101e051610200516101c051610220526101e051610240526101a0516102605261026051610240516102205160065801613062565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c05161020052601454610220526102005161014051610200518082028215828483041417613d5c57600080fd5b80905090509050610220518080613d7257600080fd5b82049050905080821015613d8557600080fd5b80820390509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101a05161028052610160516102a0526101c0516102c0526101e0516102e0526102405161030052610300516102e0516102c0516102a05161028051600658016138a5565b61036052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610360516102605260025460028082028215828483041417613e4a57600080fd5b80905090509050600480820490509050610280526040366102a0376102e060006002818352015b6000610300526101c06102e05160028110613e8b57600080fd5b602002015161032052610160516102e0511415613efb5761032051610240518082028215828483041417613ebe57600080fd5b80905090509050610200518080613ed457600080fd5b8204905090506102605180821015613eeb57600080fd5b8082039050905061030052613f50565b6103205161032051610240518082028215828483041417613f1b57600080fd5b80905090509050610200518080613f3157600080fd5b82049050905080821015613f4457600080fd5b80820390509050610300525b6103205161028051610300518082028215828483041417613f7057600080fd5b809050905090506402540be4008082049050905080821015613f9157600080fd5b808203905090506102a06102e05160028110613fac57600080fd5b60200201525b8151600101808352811415613e71575b50506102a06101605160028110613fd857600080fd5b6020020151610140610300525b6103005151602061030051016103005261030061030051101561400757613fe5565b6101a0516103205261016051610340526102a051610360526102c05161038052610240516103a0526103a05161038051610360516103405161032051600658016138a5565b610400526102e0610300525b610300515260206103005103610300526101406103005110151561407b57614058565b610400518082101561408c57600080fd5b808203905090506102e0526101c061016051600281106140ab57600080fd5b602002015161026051808210156140c157600080fd5b80820390509050670de0b6b3a764000080820282158284830414176140e557600080fd5b809050905090506c0c9f2c9cd04674edea4000000080820490509050610300526102e05160018082101561411857600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761413c57600080fd5b809050905090506c0c9f2c9cd04674edea40000000808204905090506102e0526102e05161034052610300516102e0518082101561417957600080fd5b80820390509050610360526040610320525b60006103205111151561419d576141b9565b602061032051036103400151602061032051036103205261418b565b61018051565b6102066143c5036102066000396102066143c5036000f3000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc8000000000000000000000000fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb900000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f20000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001243757276652e666920555344432f55534454000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043243525600000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x600436101561000d57612d41565b600035601c52600051341561002157600080fd5b63313ce56781141561003857601260005260206000f35b63a9059cbb81141561008a5760043560a01c1561005457600080fd5b3361014052600435610160526024356101805261018051610160516101405160065801612d47565b600050600160005260206000f35b6323b872dd8114156101735760043560a01c156100a657600080fd5b60243560a01c156100b657600080fd5b60043561014052602435610160526044356101805261018051610160516101405160065801612d47565b600050601360043560e05260c052604060c0203360e05260c052604060c02054610140527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61014051181561016857610140516044358082101561014357600080fd5b80820390509050601360043560e05260c052604060c0203360e05260c052604060c020555b600160005260206000f35b63095ea7b38114156101ec5760043560a01c1561018f57600080fd5b60243560133360e05260c052604060c02060043560e05260c052604060c0205560243561014052600435337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256020610140a3600160005260206000f35b6314f059798114156102215760018060c052602060c020546101605260018160c052602060c020015461018052506040610160f35b63f446c1d08114156102505760065801612df2565b610140526101405160648082049050905060005260206000f35b6376a2f0f08114156102765760065801612df2565b610140526101405160005260206000f35b63bb7b8b808114156103a3576101405160065801612df2565b6101605261014052610160516101405261014051610160516101805160018060c052602060c020546101a05260018160c052602060c02001546101c052506101c0516101a05160065801612f8a565b6102205261024052610180526101605261014052610220805161016052806020015161018052506101405161016051610180516101a051610160516101c052610180516101e0526101405161020052610200516101e0516101c05160065801613062565b610260526101a052610180526101605261014052610260516101a0526101a051670de0b6b3a7640000808202821582848304141761037f57600080fd5b80905090509050601454808061039457600080fd5b82049050905060005260206000f35b63ed8e84f38114156106005760443560011c156103bf57600080fd5b6101405160065801612df2565b6101605261014052610160516101405260018060c052602060c020546101605260018160c052602060c020015461018052506101405161016051610180516101a051610160516101c052610180516101e0526101405161020052610200516101e0516101c05160065801613344565b610260526101a052610180526101605261014052610260516101a0526101c060006002818352015b60046101c0516002811061047657600080fd5b60200201356101e052604435156104c3576101606101c0516002811061049b57600080fd5b6020020180516101e0518181830110156104b457600080fd5b808201905090508152506104f9565b6101606101c051600281106104d757600080fd5b6020020180516101e051808210156104ee57600080fd5b808203905090508152505b8151600101808352811415610463575b50506101405161016051610180516101a0516101c051610160516101e0526101805161020052610140516102205261022051610200516101e05160065801613344565b610280526101c0526101a052610180526101605261014052610280516101c05260006101e0526044351561059f576101c0516101a0518082101561058f57600080fd5b808203905090506101e0526105c0565b6101a0516101c051808210156105b457600080fd5b808203905090506101e0525b6101e05160145480820282158284830414176105db57600080fd5b809050905090506101a05180806105f157600080fd5b82049050905060005260206000f35b630b4c7e4d811415610616573361014052610647565b630c3e4b548114156106425760643560a01c1561063257600080fd5b6020606461014037600050610647565b610d36565b6015541561065457600080fd5b6001601555600e541561066657600080fd5b610140516101605160065801612df2565b610180526101605261014052610180516101605260018060c052602060c020546101805260018160c052602060c02001546101a052506101405161016051610180516101a0516101c051610180516101e0526101a05161020052610160516102205261022051610200516101e05160065801613344565b610280526101c0526101a052610180526101605261014052610280516101c0526014546101e05261018051610200526101a0516102205261024060006002818352015b6004610240516002811061074457600080fd5b60200201356102605260006102605111156107f857602061034060646323b872dd61028052336102a052306102c052610260516102e05261029c6000610240516002811061079157600080fd5b600060c052602060c02001545af16107a857600080fd5b601f3d116107b557600080fd5b6000506103405061020061024051600281106107d057600080fd5b602002018051610260518181830110156107e957600080fd5b80820190509050815250610808565b60006101e0511861080857600080fd5b8151600101808352811415610731575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161020051610260526102205161028052610160516102a0526102a051610280516102605160065801613344565b610300526102405261022052610200526101e0526101c0526101a05261018052610160526101405261030051610240526101c05161024051116108ad57600080fd5b6060366102603760006101e0511115610bcf57600254600280820282158284830414176108d957600080fd5b809050905090506004808204905090506102c0526003546102e05261030060006002818352015b61024051610180610300516002811061091857600080fd5b6020020151808202821582848304141761093157600080fd5b809050905090506101c051808061094757600080fd5b82049050905061032052600061034052610200610300516002811061096b57600080fd5b602002015161036052610360516103205111156109a75761032051610360518082101561099757600080fd5b80820390509050610340526109c8565b6103605161032051808210156109bc57600080fd5b80820390509050610340525b6102c0516103405180820282158284830414176109e457600080fd5b809050905090506402540be400808204905090506102606103005160028110610a0c57600080fd5b6020020152610360516102606103005160028110610a2957600080fd5b60200201516102e0518082028215828483041417610a4657600080fd5b809050905090506402540be4008082049050905080821015610a6757600080fd5b808203905090506103005160028110610a7f57600080fd5b600160c052602060c02001556102006103005160028110610a9f57600080fd5b6020020180516102606103005160028110610ab957600080fd5b602002015180821015610acb57600080fd5b808203905090508152505b8151600101808352811415610900575b5050610140610320525b61032051516020610320510161032052610320610320511015610b1257610af0565b61020051610340526102205161036052610160516103805261038051610360516103405160065801613344565b6103e052610300610320525b6103205152602061032051036103205261014061032051101515610b6e57610b4b565b6103e051610300526101e051610300516101c05180821015610b8f57600080fd5b808203905090508082028215828483041417610baa57600080fd5b809050905090506101c0518080610bc057600080fd5b8204905090506102a052610bf2565b600160c052602060c02061020051815561022051600182015550610240516102a0525b6044356102a05110151515610c46576308c379a06102c05260206102e0526014610300527f536c697070616765207363726577656420796f75000000000000000000000000610320526103005060646102dcfd5b6101e080516102a051818183011015610c5e57600080fd5b8082019050905081525060126101405160e05260c052604060c02080546102a051818183011015610c8e57600080fd5b808201905090508155506101e0516014556102a0516102c0526101405160007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206102c0a3604060046102c0376102605161030052610280516103205261024051610340526101e05161036052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c06102c0a26102a051600052600060155560206000f35b635e0d443f811415610f925760043580806000811215610d5257195b607f1c15610d5f57600080fd5b90505060243580806000811215610d7257195b607f1c15610d7f57600080fd5b905050610140516101605160018060c052602060c020546101805260018160c052602060c02001546101a052506101a0516101805160065801612f8a565b610200526102205261016052610140526102008051610140528060200151610160525061014060043560028110610df357600080fd5b60200201516044356c0c9f2c9cd04674edea400000008082028215828483041417610e1d57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015610e4357600080fd5b80820190509050610180526101405161016051610180516101a051604060046101c0376101805161020052610140516102205261016051610240526102405161022051610200516101e0516101c05160065801613431565b6102a0526101a0526101805261016052610140526102a0516101a05261014060243560028110610eca57600080fd5b60200201516101a05180821015610ee057600080fd5b80820390509050600180821015610ef657600080fd5b808203905090506101c0526002546101c0518082028215828483041417610f1c57600080fd5b809050905090506402540be400808204905090506101e0526101c0516101e05180821015610f4957600080fd5b80820390509050670de0b6b3a76400008082028215828483041417610f6d57600080fd5b809050905090506c0c9f2c9cd04674edea400000008082049050905060005260206000f35b633df02124811415610fa8573361014052610fd9565b63ddc1f59d811415610fd45760843560a01c15610fc457600080fd5b6020608461014037600050610fd9565b611539565b60155415610fe657600080fd5b600160155560043580806000811215610ffb57195b607f1c1561100857600080fd5b9050506024358080600081121561101b57195b607f1c1561102857600080fd5b905050600e541561103857600080fd5b60018060c052602060c020546101605260018160c052602060c020015461018052506101405161016051610180516101a0516101c051610160516101e0526101805161020052610200516101e05160065801612f8a565b61026052610280526101c0526101a05261018052610160526101405261026080516101a05280602001516101c052506101a0600435600281106110d157600080fd5b60200201516044356c0c9f2c9cd04674edea4000000080820282158284830414176110fb57600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561112157600080fd5b808201905090506101e0526101405161016051610180516101a0516101c0516101e0516102005160406004610220376101e051610260526101a051610280526101c0516102a0526102a0516102805161026051610240516102205160065801613431565b61030052610200526101e0526101c0526101a05261018052610160526101405261030051610200526101a0602435600281106111c057600080fd5b602002015161020051808210156111d657600080fd5b808203905090506001808210156111ec57600080fd5b808203905090506102205261022051600254808202821582848304141761121257600080fd5b809050905090506402540be400808204905090506102405261022051610240518082101561123f57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761126357600080fd5b809050905090506c0c9f2c9cd04674edea40000000808204905090506102205260643561022051101515156112fc576308c379a061026052602061028052602e6102a0527f45786368616e676520726573756c74656420696e20666577657220636f696e736102c0527f207468616e2065787065637465640000000000000000000000000000000000006102e0526102a050608461027cfd5b61024051600354808202821582848304141761131757600080fd5b809050905090506402540be400808204905090506102605261026051670de0b6b3a7640000808202821582848304141761135057600080fd5b809050905090506c0c9f2c9cd04674edea4000000080820490509050610260526101606004356002811061138357600080fd5b602002015160443581818301101561139a57600080fd5b80820190509050600435600281106113b157600080fd5b600160c052602060c0200155610160602435600281106113d057600080fd5b602002015161022051808210156113e657600080fd5b8082039050905061026051808210156113fe57600080fd5b808203905090506024356002811061141557600080fd5b600160c052602060c0200155602061034060646323b872dd61028052336102a052306102c0526044356102e05261029c60006004356002811061145757600080fd5b600060c052602060c02001545af161146e57600080fd5b601f3d1161147b57600080fd5b600050610340506020610320604463a9059cbb61028052610140516102a052610220516102c05261029c6000602435600281106114b757600080fd5b600060c052602060c02001545af16114ce57600080fd5b601f3d116114db57600080fd5b60005061032050600435610280526044356102a0526024356102c052610220516102e052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610280a261022051600052600060155560206000f35b635b36389c81141561154f573361014052611580565b633eb1719f81141561157b5760643560a01c1561156b57600080fd5b6020606461014037600050611580565b611834565b6015541561158d57600080fd5b600160155560145461016052604036610180376101c060006002818352015b6101c051600281106115bd57600080fd5b600160c052602060c02001546101e0526101e05160043580820282158284830414176115e857600080fd5b809050905090506101605180806115fe57600080fd5b8204905090506102005260246101c0516002811061161b57600080fd5b60200201356102005110151515611696576308c379a0610220526020610240526030610260527f5769746864726177616c20726573756c74656420696e20666577657220636f69610280527f6e73207468616e206578706563746564000000000000000000000000000000006102a05261026050608461023cfd5b6101e05161020051808210156116ab57600080fd5b808203905090506101c051600281106116c357600080fd5b600160c052602060c0200155610200516101806101c051600281106116e757600080fd5b602002015260206102c0604463a9059cbb610220526101405161024052610200516102605261023c60006101c0516002811061172257600080fd5b600060c052602060c02001545af161173957600080fd5b601f3d1161174657600080fd5b6000506102c0505b81516001018083528114156115ac575b505061016080516004358082101561177557600080fd5b8082039050905081525060123360e05260c052604060c02080546004358082101561179f57600080fd5b80820390509050815550610160516014556004356101c0526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c0a3610180516101c0526101a0516101e052604036610200376101605161024052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a06101c0a260006015556040610180f35b63e310327381141561184a57336101405261187b565b6352d2cfdd8114156118765760643560a01c1561186657600080fd5b602060646101403760005061187b565b611f35565b6015541561188857600080fd5b6001601555600e541561189a57600080fd5b610140516101605160065801612df2565b610180526101605261014052610180516101605260018060c052602060c020546101805260018160c052602060c02001546101a052506101405161016051610180516101a0516101c051610180516101e0526101a05161020052610160516102205261022051610200516101e05160065801613344565b610280526101c0526101a052610180526101605261014052610280516101c052610180516101e0526101a0516102005261022060006002818352015b6004610220516002811061197157600080fd5b6020020135610240526000610240511815611a1d576101e0610220516002811061199a57600080fd5b60200201805161024051808210156119b157600080fd5b808203905090508152506020610300604463a9059cbb610260526101405161028052610240516102a05261027c600061022051600281106119f157600080fd5b600060c052602060c02001545af1611a0857600080fd5b601f3d11611a1557600080fd5b600050610300505b815160010180835281141561195e575b50506101405161016051610180516101a0516101c0516101e05161020051610220516101e051610240526102005161026052610160516102805261028051610260516102405160065801613344565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e0516102205260025460028082028215828483041417611ac157600080fd5b809050905090506004808204905090506102405260035461026052604036610280376102c060006002818352015b6101e06102c05160028110611b0357600080fd5b60200201516102e052610220516101806102c05160028110611b2457600080fd5b60200201518082028215828483041417611b3d57600080fd5b809050905090506101c0518080611b5357600080fd5b820490509050610300526000610320526102e051610300511115611b9657610300516102e05180821015611b8657600080fd5b8082039050905061032052611bb7565b6102e0516103005180821015611bab57600080fd5b80820390509050610320525b61024051610320518082028215828483041417611bd357600080fd5b809050905090506402540be400808204905090506102806102c05160028110611bfb57600080fd5b60200201526102e0516102806102c05160028110611c1857600080fd5b6020020151610260518082028215828483041417611c3557600080fd5b809050905090506402540be4008082049050905080821015611c5657600080fd5b808203905090506102c05160028110611c6e57600080fd5b600160c052602060c02001556101e06102c05160028110611c8e57600080fd5b6020020180516102806102c05160028110611ca857600080fd5b602002015180821015611cba57600080fd5b808203905090508152505b8151600101808352811415611aef575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516101e0516102e0526102005161030052610160516103205261032051610300516102e05160065801613344565b610380526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516102c0526014546102e0526101c0516102c05180821015611d9457600080fd5b808203905090506102e0518082028215828483041417611db357600080fd5b809050905090506101c0518080611dc957600080fd5b8204905090506001818183011015611de057600080fd5b808201905090506103005260016103005111611dfb57600080fd5b6044356103005111151515611e4f576308c379a0610320526020610340526014610360527f536c697070616765207363726577656420796f750000000000000000000000006103805261036050606461033cfd5b6102e080516103005180821015611e6557600080fd5b808203905090508152506102e05160145560123360e05260c052604060c02080546103005180821015611e9757600080fd5b8082039050905081555061030051610320526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610320a3604060046103203761028051610360526102a05161038052610220516103a0526102e0516103c052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c0610320a261030051600052600060155560206000f35b63cc2b27d7811415611f955760243580806000811215611f5157195b607f1c15611f5e57600080fd5b9050506004356101405260243561016052610160516101405160065801613c05565b6101c0526101e0526101c05160005260206000f35b631a4d01d2811415611fab573361014052611fdc565b63081579a5811415611fd75760643560a01c15611fc757600080fd5b6020606461014037600050611fdc565b61226f565b60155415611fe957600080fd5b600160155560243580806000811215611ffe57195b607f1c1561200b57600080fd5b905050600e541561201b57600080fd5b6101405161016051610180516004356101a0526024356101c0526101c0516101a05160065801613c05565b61022052610240526101805261016052610140526102208051610160528060200151610180525060443561016051101515156120c1576308c379a06101a05260206101c05260186101e0527f4e6f7420656e6f75676820636f696e732072656d6f7665640000000000000000610200526101e05060646101bcfd5b602435600281106120d157600080fd5b600160c052602060c020018054610160516101805160035480820282158284830414176120fd57600080fd5b809050905090506402540be4008082049050905081818301101561212057600080fd5b808201905090508082101561213457600080fd5b808203905090508155506014546004358082101561215157600080fd5b808203905090506101a0526101a05160145560123360e05260c052604060c02080546004358082101561218357600080fd5b808203905090508155506004356101c0526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c0a36020610260604463a9059cbb6101c052610140516101e05261016051610200526101dc6000602435600281106121f357600080fd5b600060c052602060c02001545af161220a57600080fd5b601f3d1161221757600080fd5b600050610260506004356101c052610160516101e0526101a05161020052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060606101c0a261016051600052600060155560206000f35b633c157e6481141561241057600454331461228957600080fd5b6007546201518081818301101561229f57600080fd5b808201905090504210156122b257600080fd5b42620151808181830110156122c657600080fd5b8082019050905060243510156122db57600080fd5b6101405160065801612df2565b610160526101405261016051610140526004356064808202821582848304141761231157600080fd5b80905090509050610160526000600435111561233457620f424060043510612337565b60005b61234057600080fd5b61014051610160511015612383576101405161016051600a808202821582848304141761236c57600080fd5b80905090509050101561237e57600080fd5b6123b3565b61014051600a808202821582848304141761239d57600080fd5b809050905090506101605111156123b357600080fd5b6101405160055561016051600655426007556024356008556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a658881141561249357600454331461242a57600080fd5b6101405160065801612df2565b6101605261014052610160516101405261014051600555610140516006554260075542600855610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b635b5a146781141561254f5760045433146124ad57600080fd5b600954156124ba57600080fd5b64012a05f20060043511156124ce57600080fd5b6402540be40060243511156124e257600080fd5b426203f4808181830110156124f657600080fd5b808201905090506101405261014051600955600435600b55602435600c556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe978114156125e157600454331461256957600080fd5b60095442101561257857600080fd5b60006009541861258757600080fd5b6000600955600b5461014052600c546101605261014051600255610160516003556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb8114156126025760045433146125fb57600080fd5b6000600955005b636b441a408114156126945760043560a01c1561261e57600080fd5b600454331461262c57600080fd5b600a541561263957600080fd5b426203f48081818301101561264d57600080fd5b808201905090506101405261014051600a55600435600d55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae81141561270b5760045433146126ae57600080fd5b600a544210156126bd57600080fd5b6000600a54186126cc57600080fd5b6000600a55600d546101405261014051600455610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19381141561272c57600454331461272557600080fd5b6000600a55005b63e2e7d2648114156127c45760206101c060246370a0823161014052306101605261015c6004356002811061276057600080fd5b600060c052602060c02001545afa61277757600080fd5b601f3d1161278457600080fd5b6000506101c0516004356002811061279b57600080fd5b600160c052602060c0200154808210156127b457600080fd5b8082039050905060005260206000f35b6330c540858114156128d55760045433146127de57600080fd5b61014060006002818352015b61014051600281106127fb57600080fd5b600060c052602060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa61283257600080fd5b601f3d1161283f57600080fd5b60005061022051610140516002811061285757600080fd5b600160c052602060c02001548082101561287057600080fd5b80820390509050610180526020610240604463a9059cbb6101a052336101c052610180516101e0526101bc6000610160515af16128ac57600080fd5b601f3d116128b957600080fd5b600050610240505b81516001018083528114156127ea575b5050005b63524c39018114156129815760045433146128ef57600080fd5b61014060006002818352015b60206101e060246370a0823161016052306101805261017c610140516002811061292457600080fd5b600060c052602060c02001545afa61293b57600080fd5b601f3d1161294857600080fd5b6000506101e051610140516002811061296057600080fd5b600160c052602060c02001555b81516001018083528114156128fb575b5050005b63e36988538114156129b057600454331461299b57600080fd5b42600f54116129a957600080fd5b6001600e55005b633046f9728114156129d15760045433146129ca57600080fd5b6000600e55005b63c6610657811415612a0257600435600281106129ed57600080fd5b600060c052602060c020015460005260206000f35b634903b0d1811415612a335760043560028110612a1e57600080fd5b600160c052602060c020015460005260206000f35b63ddca3f43811415612a4b5760025460005260206000f35b63fee3f7f9811415612a635760035460005260206000f35b638da5cb5b811415612a7b5760045460005260206000f35b635409491a811415612a935760055460005260206000f35b63b4b577ad811415612aab5760065460005260206000f35b632081066c811415612ac35760075460005260206000f35b6314052288811415612adb5760085460005260206000f35b63405e28f8811415612af35760095460005260206000f35b63e0a0b586811415612b0b57600a5460005260206000f35b6358680d0b811415612b2357600b5460005260206000f35b63e3824462811415612b3b57600c5460005260206000f35b631ec0cdc1811415612b5357600d5460005260206000f35b6306fdde03811415612bf85760108060c052602060c020610180602082540161012060006003818352015b82610120516020021115612b9157612bb3565b61012051850154610120516020028501525b8151600101808352811415612b7e575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f35b6395d89b41811415612c9d5760118060c052602060c020610180602082540161012060006002818352015b82610120516020021115612c3657612c58565b61012051850154610120516020028501525b8151600101808352811415612c23575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f35b6370a08231811415612cd35760043560a01c15612cb957600080fd5b601260043560e05260c052604060c0205460005260206000f35b63dd62ed3e811415612d275760043560a01c15612cef57600080fd5b60243560a01c15612cff57600080fd5b601360043560e05260c052604060c02060243560e05260c052604060c0205460005260206000f35b6318160ddd811415612d3f5760145460005260206000f35b505b60006000fd5b6101a05261014052610160526101805260126101405160e05260c052604060c02080546101805180821015612d7b57600080fd5b8082039050905081555060126101605160e05260c052604060c020805461018051818183011015612dab57600080fd5b80820190509050815550610180516101c05261016051610140517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101c0a36101a051565b61014052600854610160526006546101805261016051421015612f78576005546101a0526007546101c0526101a051610180511115612ed2576101a051610180516101a05180821015612e4457600080fd5b80820390509050426101c05180821015612e5d57600080fd5b808203905090508082028215828483041417612e7857600080fd5b80905090509050610160516101c05180821015612e9457600080fd5b808203905090508080612ea657600080fd5b820490509050818183011015612ebb57600080fd5b808201905090506000526000516101405156612f73565b6101a0516101a0516101805180821015612eeb57600080fd5b80820390509050426101c05180821015612f0457600080fd5b808203905090508082028215828483041417612f1f57600080fd5b80905090509050610160516101c05180821015612f3b57600080fd5b808203905090508080612f4d57600080fd5b82049050905080821015612f6057600080fd5b8082039050905060005260005161014051565b612f88565b6101805160005260005161014051565b005b6101805261014052610160526040366101a0376101e060006002818352015b6c0c9f2c9cd04674edea400000006101406101e05160028110612fcb57600080fd5b60200201518082028215828483041417612fe457600080fd5b80905090509050670de0b6b3a7640000808204905090506101a06101e0516002811061300f57600080fd5b60200201525b8151600101808352811415612fa9575b505060406101e0525b60006101e0511115156130405761305c565b60206101e051036101a0015160206101e051036101e05261302e565b61018051565b6101a05261014052610160526101805260006101c05261020060006002818352015b6020610200510261014001516101e0526101c080516101e0518181830110156130ac57600080fd5b808201905090508152505b8151600101808352811415613084575b50506101c05115156130e15760006000526000516101a051565b6101c0516101e052610180516002808202821582848304141761310357600080fd5b8090509050905061020052610220600060ff818352015b6101e0516101e051808202821582848304141761313657600080fd5b8090509050905061014051808061314c57600080fd5b8204905090506101e051808202821582848304141761316a57600080fd5b8090509050905061016051808061318057600080fd5b820490509050600480820490509050610240526101e05161026052610200516101c05180820282158284830414176131b757600080fd5b8090509050905060648082049050905061024051600280820282158284830414176131e157600080fd5b809050905090508181830110156131f757600080fd5b808201905090506101e051808202821582848304141761321657600080fd5b809050905090506102005160648082101561323057600080fd5b808203905090506101e051808202821582848304141761324f57600080fd5b80905090509050606480820490509050600361024051808202821582848304141761327957600080fd5b8090509050905081818301101561328f57600080fd5b8082019050905080806132a157600080fd5b8204905090506101e052610260516101e05111156132f55760016101e05161026051808210156132d057600080fd5b808203905090501115156132f0576101e05160005250506000516101a051565b61332c565b6001610260516101e0518082101561330c57600080fd5b8082039050905011151561332c576101e05160005250506000516101a051565b815160010180835281141561311a575b505060006000fd5b6101a0526101405261016052610180526101405161016051610180516101a0516101c0516101e05161014051610200526101605161022052610220516102005160065801612f8a565b610280526102a0526101e0526101c0526101a05261018052610160526101405261028080516101c05280602001516101e052506101405161016051610180516101a0516101c0516101e0516101c051610200526101e05161022052610180516102405261024051610220516102005160065801613062565b6102a0526101e0526101c0526101a0526101805261016052610140526102a0516000526000516101a051565b6101e0526101405261016052610180526101a0526101c05261016051610140511861345b57600080fd5b600061016051121561346c57600080fd5b6002610160511261347c57600080fd5b600061014051121561348d57600080fd5b6002610140511261349d57600080fd5b6101405161016051610180516101a0516101c0516101e0516102005160065801612df2565b61022052610200526101e0526101c0526101a05261018052610160526101405261022051610200526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c05161026052610200516102805261028051610260516102405160065801613062565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e0516102205260603661024037610220516102a052610200516002808202821582848304141761358c57600080fd5b809050905090506102c0526102e060006002818352015b610140516102e05114156135be5761018051610260526135f3565b610160516102e05118156135ee576101a06102e051600281106135e057600080fd5b6020020151610260526135f3565b61366f565b61024080516102605181818301101561360b57600080fd5b808201905090508152506102a05161022051808202821582848304141761363157600080fd5b80905090509050610260516002808202821582848304141761365257600080fd5b80905090509050808061366457600080fd5b8204905090506102a0525b81516001018083528114156135a3575b50506102a05161022051808202821582848304141761369d57600080fd5b80905090509050606480820282158284830414176136ba57600080fd5b809050905090506102c051600280820282158284830414176136db57600080fd5b8090509050905080806136ed57600080fd5b8204905090506102a05261024051610220516064808202821582848304141761371557600080fd5b809050905090506102c051808061372b57600080fd5b82049050905081818301101561374057600080fd5b808201905090506102e0526102205161030052610320600060ff818352015b61030051610280526103005161030051808202821582848304141761378357600080fd5b809050905090506102a05181818301101561379d57600080fd5b8082019050905060026103005180820282158284830414176137be57600080fd5b809050905090506102e0518181830110156137d857600080fd5b8082019050905061022051808210156137f057600080fd5b80820390509050808061380257600080fd5b820490509050610300526102805161030051111561385657600161030051610280518082101561383157600080fd5b80820390509050111515613851576103005160005250506000516101e051565b61388d565b600161028051610300518082101561386d57600080fd5b8082039050905011151561388d576103005160005250506000516101e051565b815160010180835281141561375f575b505060006000fd5b6101e0526101405261016052610180526101a0526101c05260006101605112156138ce57600080fd5b600261016051126138de57600080fd5b606036610200376101c05161026052610140516002808202821582848304141761390757600080fd5b80905090509050610280526102a060006002818352015b610160516102a051181561394e576101806102a0516002811061394057600080fd5b602002015161022052613953565b6139cf565b61020080516102205181818301101561396b57600080fd5b80820190509050815250610260516101c051808202821582848304141761399157600080fd5b8090509050905061022051600280820282158284830414176139b257600080fd5b8090509050905080806139c457600080fd5b820490509050610260525b815160010180835281141561391e575b5050610260516101c05180820282158284830414176139fd57600080fd5b8090509050905060648082028215828483041417613a1a57600080fd5b809050905090506102805160028082028215828483041417613a3b57600080fd5b809050905090508080613a4d57600080fd5b82049050905061026052610200516101c05160648082028215828483041417613a7557600080fd5b80905090509050610280518080613a8b57600080fd5b820490509050818183011015613aa057600080fd5b808201905090506102a0526101c0516102c0526102e0600060ff818352015b6102c051610240526102c0516102c0518082028215828483041417613ae357600080fd5b8090509050905061026051818183011015613afd57600080fd5b8082019050905060026102c0518082028215828483041417613b1e57600080fd5b809050905090506102a051818183011015613b3857600080fd5b808201905090506101c05180821015613b5057600080fd5b808203905090508080613b6257600080fd5b8204905090506102c052610240516102c0511115613bb65760016102c0516102405180821015613b9157600080fd5b80820390509050111515613bb1576102c05160005250506000516101e051565b613bed565b6001610240516102c05180821015613bcd57600080fd5b80820390509050111515613bed576102c05160005250506000516101e051565b8151600101808352811415613abf575b505060006000fd5b6101805261014052610160526101405161016051610180516101a05160065801612df2565b6101c0526101a0526101805261016052610140526101c0516101a0526101405161016051610180516101a0516101c0516101e05160018060c052602060c020546102005260018160c052602060c02001546102205250610220516102005160065801612f8a565b610280526102a0526101e0526101c0526101a05261018052610160526101405261028080516101c05280602001516101e052506101405161016051610180516101a0516101c0516101e051610200516101c051610220526101e051610240526101a0516102605261026051610240516102205160065801613062565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c05161020052601454610220526102005161014051610200518082028215828483041417613d5c57600080fd5b80905090509050610220518080613d7257600080fd5b82049050905080821015613d8557600080fd5b80820390509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101a05161028052610160516102a0526101c0516102c0526101e0516102e0526102405161030052610300516102e0516102c0516102a05161028051600658016138a5565b61036052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610360516102605260025460028082028215828483041417613e4a57600080fd5b80905090509050600480820490509050610280526040366102a0376102e060006002818352015b6000610300526101c06102e05160028110613e8b57600080fd5b602002015161032052610160516102e0511415613efb5761032051610240518082028215828483041417613ebe57600080fd5b80905090509050610200518080613ed457600080fd5b8204905090506102605180821015613eeb57600080fd5b8082039050905061030052613f50565b6103205161032051610240518082028215828483041417613f1b57600080fd5b80905090509050610200518080613f3157600080fd5b82049050905080821015613f4457600080fd5b80820390509050610300525b6103205161028051610300518082028215828483041417613f7057600080fd5b809050905090506402540be4008082049050905080821015613f9157600080fd5b808203905090506102a06102e05160028110613fac57600080fd5b60200201525b8151600101808352811415613e71575b50506102a06101605160028110613fd857600080fd5b6020020151610140610300525b6103005151602061030051016103005261030061030051101561400757613fe5565b6101a0516103205261016051610340526102a051610360526102c05161038052610240516103a0526103a05161038051610360516103405161032051600658016138a5565b610400526102e0610300525b610300515260206103005103610300526101406103005110151561407b57614058565b610400518082101561408c57600080fd5b808203905090506102e0526101c061016051600281106140ab57600080fd5b602002015161026051808210156140c157600080fd5b80820390509050670de0b6b3a764000080820282158284830414176140e557600080fd5b809050905090506c0c9f2c9cd04674edea4000000080820490509050610300526102e05160018082101561411857600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761413c57600080fd5b809050905090506c0c9f2c9cd04674edea40000000808204905090506102e0526102e05161034052610300516102e0518082101561417957600080fd5b80820390509050610360526040610320525b60006103205111151561419d576141b9565b602061032051036103400151602061032051036103205261418b565b6101805156
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc8000000000000000000000000fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb900000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f20000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001243757276652e666920555344432f55534454000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043243525600000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _coins (address[2]): 0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8,0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9
Arg [1] : _A (uint256): 1000
Arg [2] : _fee (uint256): 4000000
Arg [3] : _admin_fee (uint256): 5000000000
Arg [4] : _name (string): Curve.fi USDC/USDT
Arg [5] : _symbol (string): 2CRV
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc8
Arg [1] : 000000000000000000000000fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [3] : 00000000000000000000000000000000000000000000000000000000003d0900
Arg [4] : 000000000000000000000000000000000000000000000000000000012a05f200
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [8] : 43757276652e666920555344432f555344540000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 3243525600000000000000000000000000000000000000000000000000000000