20M+ users trust MoonPay worldwide. Checkout with your preferred payment method.
Ready to onboard to Ethereum? With MetaMask Portfolio, you're in control.
Don’t invest unless you’re prepared to lose all the money you invest.
Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Slots, Roulette, Poker & more - Proud sponsors of UFC, Everton & StakeF1 team!
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Anonymous play on awesome games - sign up now for 25 free jackpot spins - worth $100s!
100s of games, generous bonuses, 20+ years of trusted gaming. Join CryptoWins & start winning today!
Overview
ETH Balance
Eth Value
$0.00Token Holdings
Could not find any matches!
- ERC-20 Tokens (10)27,176.11725627 LINKChainLink To... (LINK)$469,603.31@17.281 TSUKADejitaru Tsu... (TSUKA)$0.01@0.01171,000 MTVMultiVAC (MTV)$1.04@0.001750 $stLink rewards on stlink.fi! stlink.fi ($stLin...)14,780,000 LINKv2ChainLink DA... (LINKv2)30,182.69754191 sLINKSynth sLINK1.4 TokenERC-20 TOKEN*[Suspicious]245.44 TokenERC-20 TOKEN*[Suspicious]132.84 TokenERC-20 TOKEN*[Spam]5,555 TokenERC-20 TOKEN*[Spam]NFT Tokens (10)claim rewards on apylink.comapylink.comERC-1155Reward Club [ovBxWTMf]Reward Club [ni5STHWG]ERC-1155
More Info
Private Name Tags
ContractCreator
- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
- Cards New
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 25 from a total of 5,408 transactions
Transaction Hash MethodBlockFromToRemove_liquidity... 21275318 2024-11-26 23:49:47 2 mins ago 1732664987 IN 0 ETH$0.00 0.00093521 7.198854 Remove_liquidity... 21256149 2024-11-24 7:35:23 2 days ago 1732433723 IN 0 ETH$0.00 0.0010458 8.05016707 Remove_liquidity... 21225355 2024-11-20 0:25:59 6 days ago 1732062359 IN 0 ETH$0.00 0.00121854 10.80169269 Remove_liquidity... 21208872 2024-11-17 17:18:35 9 days ago 1731863915 IN 0 ETH$0.00 0.00179528 15.91412416 Remove_liquidity... 21180675 2024-11-13 18:51:11 13 days ago 1731523871 IN 0 ETH$0.00 0.01119527 99.23919016 Remove_liquidity... 21158665 2024-11-10 17:07:59 16 days ago 1731258479 IN 0 ETH$0.00 0.00265141 23.50316314 Remove_liquidity... 20748095 2024-09-14 9:56:59 73 days ago 1726307819 IN 0 ETH$0.00 0.0001653 1.27244852 Remove_liquidity... 20662977 2024-09-02 12:47:11 85 days ago 1725281231 IN 0 ETH$0.00 0.00042467 3.2 Remove_liquidity... 20546795 2024-08-17 7:16:47 101 days ago 1723879007 IN 0 ETH$0.00 0.00009815 0.84923036 Remove_liquidity... 20363111 2024-07-22 15:57:35 127 days ago 1721663855 IN 0 ETH$0.00 0.00132759 10.21926148 Remove_liquidity... 20320828 2024-07-16 18:20:47 133 days ago 1721154047 IN 0 ETH$0.00 0.00217 16.10860356 Remove_liquidity... 20254404 2024-07-07 11:42:11 142 days ago 1720352531 IN 0 ETH$0.00 0.00019707 1.48498304 Remove_liquidity... 20186081 2024-06-27 22:42:59 152 days ago 1719528179 IN 0 ETH$0.00 0.0005104 3.92958265 Remove_liquidity... 20161632 2024-06-24 12:46:59 155 days ago 1719233219 IN 0 ETH$0.00 0.00066924 5.93241738 Remove_liquidity... 20111682 2024-06-17 13:03:47 162 days ago 1718629427 IN 0 ETH$0.00 0.00072408 5.5742038 Remove_liquidity... 20096306 2024-06-15 9:30:11 164 days ago 1718443811 IN 0 ETH$0.00 0.00051377 4.3899068 Exchange 20023381 2024-06-05 4:57:11 174 days ago 1717563431 IN 0 ETH$0.00 0.00096449 4.64557356 Exchange 20017602 2024-06-04 9:36:35 175 days ago 1717493795 IN 0 ETH$0.00 0.00217419 9.5062976 Remove_liquidity... 19989594 2024-05-31 11:43:47 179 days ago 1717155827 IN 0 ETH$0.00 0.00118472 9.09722659 Remove_liquidity... 19665164 2024-04-16 2:47:11 224 days ago 1713235631 IN 0 ETH$0.00 0.00096081 7.37790932 Remove_liquidity... 19663922 2024-04-15 22:36:11 225 days ago 1713220571 IN 0 ETH$0.00 0.00124947 9.59442504 Remove_liquidity... 19602026 2024-04-07 6:27:35 233 days ago 1712471255 IN 0 ETH$0.00 0.00120184 9.22866975 Remove_liquidity... 19544085 2024-03-30 3:24:47 241 days ago 1711769087 IN 0 ETH$0.00 0.00201871 17.84434312 Remove_liquidity... 19515823 2024-03-26 3:04:23 245 days ago 1711422263 IN 0 ETH$0.00 0.00249364 19.14818185 Remove_liquidity... 19464666 2024-03-18 22:33:23 253 days ago 1710801203 IN 0 ETH$0.00 0.00373048 28.64556618 View more zero value Internal Transactions in Advanced View mode
Advanced mode:Loading...LoadingContract Source Code Verified (Exact Match)
Contract Name:Vyper_contract
Compiler Versionvyper:0.2.8
Contract Source Code (Vyper language format)
# @version 0.2.8 """ @title StableSwap @author Curve.Fi @license Copyright (c) Curve.Fi, 2020 - all rights reserved @notice Minimal pool implementation with no lending @dev Swaps between LINK and sLINK """ from vyper.interfaces import ERC20 interface CurveToken: def totalSupply() -> uint256: view def mint(_to: address, _value: uint256) -> bool: nonpayable def burnFrom(_to: address, _value: uint256) -> bool: nonpayable # Events 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 # These constants must be set prior to compiling N_COINS: constant(int128) = 2 # fixed constants FEE_DENOMINATOR: constant(uint256) = 10 ** 10 PRECISION: constant(uint256) = 10 ** 18 # The precision to convert to 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 previous_balances: public(uint256[N_COINS]) block_timestamp_last: public(uint256) owner: public(address) lp_token: public(address) A_PRECISION: constant(uint256) = 100 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 @external def __init__( _owner: address, _coins: address[N_COINS], _pool_token: address, _A: uint256, _fee: uint256, _admin_fee: uint256 ): """ @notice Contract constructor @param _owner Contract owner address @param _coins Addresses of ERC20 conracts of coins @param _pool_token Address of the token representing LP share @param _A Amplification coefficient multiplied by n * (n - 1) @param _fee Fee to charge for exchanges @param _admin_fee Admin fee """ for i in range(N_COINS): assert _coins[i] != ZERO_ADDRESS 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 = _owner self.kill_deadline = block.timestamp + KILL_DEADLINE_DT self.lp_token = _pool_token @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() @internal def _update(): """ Commits pre-change balances for the previous block Can be used to compare against current values for flash loan checks """ if block.timestamp > self.block_timestamp_last: self.previous_balances = self.balances self.block_timestamp_last = block.timestamp @pure @internal def _get_D(_xp: uint256[N_COINS], _amp: uint256) -> uint256: """ D invariant calculation in non-overflowing integer operations iteratively A * sum(x_i) * n**n + D = A * D * n**n + D**(n+1) / (n**n * prod(x_i)) Converging solution: D[j+1] = (A * n**n * sum(x_i) - D[j]**(n+1) / (n**n prod(x_i))) / (A * n**n - 1) """ S: uint256 = 0 Dprev: uint256 = 0 for _x in _xp: S += _x if S == 0: return 0 D: uint256 = S Ann: uint256 = _amp * N_COINS for _i in range(255): D_P: uint256 = D for _x in _xp: D_P = D_P * D / (_x * N_COINS) # If division by 0, this will be borked: only withdrawal will work. And that is good Dprev = D D = (Ann * S / A_PRECISION + D_P * N_COINS) * D / ((Ann - A_PRECISION) * D / A_PRECISION + (N_COINS + 1) * D_P) # Equality with the precision of 1 if D > Dprev: if D - Dprev <= 1: return D else: if Dprev - D <= 1: return D # convergence typically occurs in 4 rounds or less, this should be unreachable! # if it does happen the pool is borked and LPs can withdraw via `remove_liquidity` raise @view @internal def _get_D_mem(_balances: uint256[N_COINS], _amp: uint256) -> uint256: return self._get_D(_balances, _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 """ D: uint256 = self._get_D(self.balances, self._A()) # 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 token_supply: uint256 = ERC20(self.lp_token).totalSupply() return D * PRECISION / token_supply @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): if _is_deposit: balances[i] += _amounts[i] else: balances[i] -= _amounts[i] D1: uint256 = self._get_D_mem(balances, amp) token_amount: uint256 = CurveToken(self.lp_token).totalSupply() diff: uint256 = 0 if _is_deposit: diff = D1 - D0 else: diff = D0 - D1 return diff * token_amount / D0 @external @nonreentrant('lock') def add_liquidity(_amounts: uint256[N_COINS], _min_mint_amount: uint256) -> 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 @return Amount of LP tokens received by depositing """ self._update() 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) lp_token: address = self.lp_token token_supply: uint256 = CurveToken(lp_token).totalSupply() new_balances: uint256[N_COINS] = old_balances for i in range(N_COINS): if token_supply == 0: assert _amounts[i] > 0 # dev: initial deposit requires all coins # balances store amounts of c-tokens new_balances[i] += _amounts[i] # 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 D2: uint256 = D1 fees: uint256[N_COINS] = empty(uint256[N_COINS]) mint_amount: uint256 = 0 if token_supply > 0: # Only account for fees if we are not the first to deposit 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] = fee * difference / FEE_DENOMINATOR self.balances[i] = new_balance - (fees[i] * admin_fee / FEE_DENOMINATOR) new_balances[i] -= fees[i] D2 = self._get_D_mem(new_balances, amp) mint_amount = token_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" # Take coins from the sender for i in range(N_COINS): if _amounts[i] > 0: # "safeTransferFrom" which works for ERC20s which return bool or not _response: Bytes[32] = raw_call( self.coins[i], concat( method_id("transferFrom(address,address,uint256)"), convert(msg.sender, bytes32), convert(self, bytes32), convert(_amounts[i], bytes32), ), max_outsize=32, ) if len(_response) > 0: assert convert(_response, bool) # dev: failed transfer # end "safeTransferFrom" # Mint pool tokens CurveToken(lp_token).mint(msg.sender, mint_amount) log AddLiquidity(msg.sender, _amounts, fees, D1, token_supply + mint_amount) 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 A: uint256 = self._A() D: uint256 = self._get_D(_xp, A) Ann: uint256 = A * N_COINS c: uint256 = D S: uint256 = 0 _x: uint256 = 0 y_prev: uint256 = 0 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: xp: uint256[N_COINS] = self.balances x: uint256 = xp[i] + _dx 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 @external @nonreentrant('lock') def exchange(i: int128, j: int128, _dx: uint256, _min_dy: uint256) -> 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 self._update() old_balances: uint256[N_COINS] = self.balances xp: uint256[N_COINS] = old_balances x: uint256 = xp[i] + _dx 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_fee assert dy >= _min_dy, "Exchange resulted in fewer coins than expected" dy_admin_fee: uint256 = dy_fee * self.admin_fee / FEE_DENOMINATOR # 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 _response: Bytes[32] = raw_call( self.coins[i], concat( method_id("transferFrom(address,address,uint256)"), convert(msg.sender, bytes32), convert(self, bytes32), convert(_dx, bytes32), ), max_outsize=32, ) if len(_response) > 0: assert convert(_response, bool) _response = raw_call( self.coins[j], concat( method_id("transfer(address,uint256)"), convert(msg.sender, bytes32), convert(dy, bytes32), ), max_outsize=32, ) if len(_response) > 0: assert convert(_response, bool) log TokenExchange(msg.sender, i, _dx, j, dy) return dy @external @nonreentrant('lock') def remove_liquidity(_amount: uint256, _min_amounts: uint256[N_COINS]) -> uint256[N_COINS]: """ @notice Withdraw coins from the pool @dev Withdrawal amounts are based on current deposit ratios @param _amount Quantity of LP tokens to burn in the withdrawal @param _min_amounts Minimum amounts of underlying coins to receive @return List of amounts of coins that were withdrawn """ self._update() lp_token: address = self.lp_token total_supply: uint256 = CurveToken(lp_token).totalSupply() amounts: uint256[N_COINS] = empty(uint256[N_COINS]) fees: uint256[N_COINS] = empty(uint256[N_COINS]) # Fees are unused but we've got them historically in event for i in range(N_COINS): old_balance: uint256 = self.balances[i] value: uint256 = old_balance * _amount / total_supply assert value >= _min_amounts[i], "Withdrawal resulted in fewer coins than expected" self.balances[i] = old_balance - value amounts[i] = value _response: Bytes[32] = raw_call( self.coins[i], concat( method_id("transfer(address,uint256)"), convert(msg.sender, bytes32), convert(value, bytes32), ), max_outsize=32, ) if len(_response) > 0: assert convert(_response, bool) CurveToken(lp_token).burnFrom(msg.sender, _amount) # dev: insufficient funds log RemoveLiquidity(msg.sender, amounts, fees, total_supply - _amount) return amounts @external @nonreentrant('lock') def remove_liquidity_imbalance(_amounts: uint256[N_COINS], _max_burn_amount: uint256) -> 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 @return Actual amount of the LP token burned in the withdrawal """ assert not self.is_killed # dev: is killed self._update() 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): new_balances[i] -= _amounts[i] D1: uint256 = self._get_D_mem(new_balances, amp) 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] = fee * difference / FEE_DENOMINATOR self.balances[i] = new_balance - (fees[i] * admin_fee / FEE_DENOMINATOR) new_balances[i] = new_balance - fees[i] D2: uint256 = self._get_D_mem(new_balances, amp) lp_token: address = self.lp_token token_supply: uint256 = CurveToken(lp_token).totalSupply() token_amount: uint256 = (D0 - D2) * token_supply / D0 assert token_amount != 0 # dev: zero tokens burned token_amount += 1 # In case of rounding errors - make it unfavorable for the "attacker" assert token_amount <= _max_burn_amount, "Slippage screwed you" CurveToken(lp_token).burnFrom(msg.sender, token_amount) # dev: insufficient funds for i in range(N_COINS): if _amounts[i] != 0: _response: Bytes[32] = raw_call( self.coins[i], concat( method_id("transfer(address,uint256)"), convert(msg.sender, bytes32), convert(_amounts[i], bytes32), ), max_outsize=32, ) if len(_response) > 0: assert convert(_response, bool) log RemoveLiquidityImbalance(msg.sender, _amounts, fees, D1, token_supply - token_amount) return token_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 Ann: uint256 = A * N_COINS c: uint256 = D S: uint256 = 0 _x: uint256 = 0 y_prev: uint256 = 0 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(_token_amount: uint256, i: int128) -> (uint256, uint256, uint256): # 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.balances D0: uint256 = self._get_D(xp, amp) total_supply: uint256 = CurveToken(self.lp_token).totalSupply() D1: uint256 = D0 - _token_amount * D0 / total_supply new_y: uint256 = self._get_y_D(amp, i, xp, D1) xp_reduced: uint256[N_COINS] = xp fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) for j in range(N_COINS): dx_expected: uint256 = 0 if j == i: dx_expected = xp[j] * D1 / D0 - new_y else: dx_expected = xp[j] - xp[j] * D1 / D0 xp_reduced[j] -= fee * dx_expected / FEE_DENOMINATOR dy: uint256 = xp_reduced[i] - self._get_y_D(amp, i, xp_reduced, D1) dy -= 1 # Withdraw less to account for rounding errors dy_0: uint256 = xp[i] - new_y # w/o fees return dy, dy_0 - dy, total_supply @view @external def calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> uint256: """ @notice Calculate the amount received when withdrawing a single coin @param _token_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(_token_amount, i)[0] @external @nonreentrant('lock') def remove_liquidity_one_coin(_token_amount: uint256, i: int128, _min_amount: uint256) -> uint256: """ @notice Withdraw a single coin from the pool @param _token_amount Amount of LP tokens to burn in the withdrawal @param i Index value of the coin to withdraw @param _min_amount Minimum amount of coin to receive @return Amount of coin received """ assert not self.is_killed # dev: is killed self._update() dy: uint256 = 0 dy_fee: uint256 = 0 total_supply: uint256 = 0 dy, dy_fee, total_supply = self._calc_withdraw_one_coin(_token_amount, i) assert dy >= _min_amount, "Not enough coins removed" self.balances[i] -= (dy + dy_fee * self.admin_fee / FEE_DENOMINATOR) CurveToken(self.lp_token).burnFrom(msg.sender, _token_amount) # dev: insufficient funds _response: Bytes[32] = raw_call( self.coins[i], concat( method_id("transfer(address,uint256)"), convert(msg.sender, bytes32), convert(dy, bytes32), ), max_outsize=32, ) if len(_response) > 0: assert convert(_response, bool) log RemoveLiquidityOne(msg.sender, _token_amount, dy, total_supply - _token_amount) return dy ### Admin functions ### @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] value: uint256 = ERC20(coin).balanceOf(self) - self.balances[i] if value > 0: _response: Bytes[32] = raw_call( coin, concat( method_id("transfer(address,uint256)"), convert(msg.sender, bytes32), convert(value, bytes32), ), max_outsize=32, ) # dev: failed transfer if len(_response) > 0: assert convert(_response, bool) @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
Contract ABI
[{"name":"TokenExchange","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256","name":"token_amount","indexed":false},{"type":"uint256","name":"coin_amount","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"type":"uint256","name":"deadline","indexed":true},{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewFee","inputs":[{"type":"uint256","name":"deadline","indexed":true},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewFee","inputs":[{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampA","inputs":[{"type":"uint256","name":"old_A","indexed":false},{"type":"uint256","name":"new_A","indexed":false},{"type":"uint256","name":"initial_time","indexed":false},{"type":"uint256","name":"future_time","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"t","indexed":false}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"address","name":"_owner"},{"type":"address[2]","name":"_coins"},{"type":"address","name":"_pool_token"},{"type":"uint256","name":"_A"},{"type":"uint256","name":"_fee"},{"type":"uint256","name":"_admin_fee"}],"stateMutability":"nonpayable","type":"constructor"},{"name":"A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":5199},{"name":"A_precise","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":5161},{"name":"get_virtual_price","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1007693},{"name":"calc_token_amount","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"_amounts"},{"type":"bool","name":"_is_deposit"}],"stateMutability":"view","type":"function","gas":4007542},{"name":"add_liquidity","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"_amounts"},{"type":"uint256","name":"_min_mint_amount"}],"stateMutability":"nonpayable","type":"function","gas":6284305},{"name":"get_dy","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"_dx"}],"stateMutability":"view","type":"function","gas":2444494},{"name":"exchange","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"_dx"},{"type":"uint256","name":"_min_dy"}],"stateMutability":"nonpayable","type":"function","gas":2715006},{"name":"remove_liquidity","outputs":[{"type":"uint256[2]","name":""}],"inputs":[{"type":"uint256","name":"_amount"},{"type":"uint256[2]","name":"_min_amounts"}],"stateMutability":"nonpayable","type":"function","gas":274634},{"name":"remove_liquidity_imbalance","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"_amounts"},{"type":"uint256","name":"_max_burn_amount"}],"stateMutability":"nonpayable","type":"function","gas":6283981},{"name":"calc_withdraw_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"}],"stateMutability":"view","type":"function","gas":1459},{"name":"remove_liquidity_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"},{"type":"uint256","name":"_min_amount"}],"stateMutability":"nonpayable","type":"function","gas":3977693},{"name":"ramp_A","outputs":[],"inputs":[{"type":"uint256","name":"_future_A"},{"type":"uint256","name":"_future_time"}],"stateMutability":"nonpayable","type":"function","gas":151744},{"name":"stop_ramp_A","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":148505},{"name":"commit_new_fee","outputs":[],"inputs":[{"type":"uint256","name":"_new_fee"},{"type":"uint256","name":"_new_admin_fee"}],"stateMutability":"nonpayable","type":"function","gas":110341},{"name":"apply_new_fee","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":97122},{"name":"revert_new_parameters","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":21775},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"_owner"}],"stateMutability":"nonpayable","type":"function","gas":74513},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":60590},{"name":"revert_transfer_ownership","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":21865},{"name":"admin_balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"i"}],"stateMutability":"view","type":"function","gas":3361},{"name":"withdraw_admin_fees","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":14917},{"name":"donate_admin_fees","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":74845},{"name":"kill_me","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":37878},{"name":"unkill_me","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":22015},{"name":"coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2100},{"name":"balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2130},{"name":"fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2051},{"name":"admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2081},{"name":"previous_balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2220},{"name":"block_timestamp_last","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2141},{"name":"owner","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2171},{"name":"lp_token","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2201},{"name":"initial_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2231},{"name":"future_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2261},{"name":"initial_A_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2291},{"name":"future_A_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2321},{"name":"admin_actions_deadline","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2351},{"name":"transfer_ownership_deadline","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2381},{"name":"future_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2411},{"name":"future_admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2441},{"name":"future_owner","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2471}]
Contract Creation Code
60e061446161014039602061446160c03960c05160a01c1561002057600080fd5b602060206144610160c03960c05160a01c1561003b57600080fd5b602060406144610160c03960c05160a01c1561005657600080fd5b602060606144610160c03960c05160a01c1561007157600080fd5b61022060006002818352015b6000610160610220516002811061009357600080fd5b6020020151186100a257600080fd5b5b815160010180835281141561007d575b5050600060c052602060c020610160518155610180516001820155506101c051606480820282158284830414176100e957600080fd5b809050905090506008556101c0516064808202821582848304141761010d57600080fd5b809050905090506009556101e051600255610200516003556101405160065542624f1a0081818301101561014057600080fd5b808201905090506012556101a05160075561444956341561000a57600080fd5b6004361015610018576142ed565b600035601c526000156101c1575b61014052600b546101605260095461018052610160514210156101ae576008546101a052600a546101c0526101a051610180511115610107576101a051610180516101a0518082101561007857600080fd5b80820390509050426101c0518082101561009157600080fd5b8082039050905080820282158284830414176100ac57600080fd5b80905090509050610160516101c051808210156100c857600080fd5b8082039050905080806100da57600080fd5b8204905090508181830110156100ef57600080fd5b808201905090506000526000516101405156506101a9565b6101a0516101a051610180518082101561012057600080fd5b80820390509050426101c0518082101561013957600080fd5b80820390509050808202821582848304141761015457600080fd5b80905090509050610160516101c0518082101561017057600080fd5b80820390509050808061018257600080fd5b8204905090508082101561019557600080fd5b808203905090506000526000516101405156505b6101bf565b610180516000526000516101405156505b005b63f446c1d060005114156101f45760065801610026565b610140526101405160648082049050905060005260206000f350005b6376a2f0f0600051141561021e5760065801610026565b610140526101405160005260206000f350005b60001561026b575b6101405260055442111561026557600460c052602060c02060018060c052602060c02054825560018160c052602060c020015460018301555050426005555b61014051565b600015610573575b6101a0526101405261016052610180526040366101c03761022060006002818352015b602061022051026101400151610200526101c08051610200518181830110156102be57600080fd5b808201905090508152505b8151600101808352811415610296575b50506101c05115156102f45760006000526000516101a05156505b6101c05161020052610180516002808202821582848304141761031657600080fd5b8090509050905061022052610240600060ff818352015b61020051610260526102a060006002818352015b60206102a051026101400151610280526102605161020051808202821582848304141761036d57600080fd5b80905090509050610280516002808202821582848304141761038e57600080fd5b8090509050905080806103a057600080fd5b820490509050610260525b8151600101808352811415610341575b5050610200516101e052610220516101c05180820282158284830414176103e157600080fd5b80905090509050606480820490509050610260516002808202821582848304141761040b57600080fd5b8090509050905081818301101561042157600080fd5b8082019050905061020051808202821582848304141761044057600080fd5b809050905090506102205160648082101561045a57600080fd5b8082039050905061020051808202821582848304141761047957600080fd5b8090509050905060648082049050905060036102605180820282158284830414176104a357600080fd5b809050905090508181830110156104b957600080fd5b8082019050905080806104cb57600080fd5b820490509050610200526101e051610200511115610520576001610200516101e051808210156104fa57600080fd5b8082039050905011151561051b576102005160005250506000516101a05156505b610559565b60016101e051610200518082101561053757600080fd5b80820390509050111515610558576102005160005250506000516101a05156505b5b5b815160010180835281141561032d575b505060006000fd005b6000156105ee575b6101a0526101405261016052610180526101405161016051610180516101a051610140516101c052610160516101e0526101805161020052610200516101e0516101c05160065801610273565b610260526101a052610180526101605261014052610260516000526000516101a0515650005b63bb7b8b8060005114156106fd576101405160065801610026565b6101605261014052610160516101805261014051610160516101805160018060c052602060c020546101a05260018160c052602060c02001546101c05250610180516101e0526101e0516101c0516101a05160065801610273565b61024052610180526101605261014052610240516101405260206101e060046318160ddd6101805261019c6007545afa61069d57600080fd5b601f3d116106aa57600080fd5b6000506101e0516101605261014051670de0b6b3a764000080820282158284830414176106d657600080fd5b809050905090506101605180806106ec57600080fd5b82049050905060005260206000f350005b63ed8e84f360005114156109a55760443560011c1561071b57600080fd5b6101405160065801610026565b6101605261014052610160516101405260018060c052602060c020546101605260018160c052602060c020015461018052506101405161016051610180516101a051610160516101c052610180516101e0526101405161020052610200516101e0516101c0516006580161057b565b610260526101a052610180526101605261014052610260516101a0526101c060006002818352015b60443515610817576101606101c051600281106107db57600080fd5b60200201805160046101c051600281106107f457600080fd5b602002013581818301101561080857600080fd5b80820190509050815250610861565b6101606101c0516002811061082b57600080fd5b60200201805160046101c0516002811061084457600080fd5b60200201358082101561085657600080fd5b808203905090508152505b5b81516001018083528114156107bf575b50506101405161016051610180516101a0516101c051610160516101e0526101805161020052610140516102205261022051610200516101e0516006580161057b565b610280526101c0526101a052610180526101605261014052610280516101c052602061026060046318160ddd6102005261021c6007545afa6108f657600080fd5b601f3d1161090357600080fd5b600050610260516101e05260006102005260443515610941576101c0516101a0518082101561093157600080fd5b8082039050905061020052610962565b6101a0516101c0518082101561095657600080fd5b80820390509050610200525b610200516101e051808202821582848304141761097e57600080fd5b809050905090506101a051808061099457600080fd5b82049050905060005260206000f350005b630b4c7e4d60005114156112275762ffffff54156109c257600080fd5b600162ffffff5560065801610226565b600050601154156109e257600080fd5b6101405160065801610026565b6101605261014052610160516101405260018060c052602060c020546101605260018160c052602060c020015461018052506101405161016051610180516101a051610160516101c052610180516101e0526101405161020052610200516101e0516101c0516006580161057b565b610260526101a052610180526101605261014052610260516101a0526007546101c052602061026060046318160ddd6102005261021c6101c0515afa610aa357600080fd5b601f3d11610ab057600080fd5b600050610260516101e0526101605161020052610180516102205261024060006002818352015b6101e0511515610b0657600060046102405160028110610af657600080fd5b602002013511610b0557600080fd5b5b6102006102405160028110610b1a57600080fd5b60200201805160046102405160028110610b3357600080fd5b6020020135818183011015610b4757600080fd5b808201905090508152505b8151600101808352811415610ad7575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161020051610260526102205161028052610140516102a0526102a05161028051610260516006580161057b565b610300526102405261022052610200526101e0526101c0526101a05261018052610160526101405261030051610240526101a0516102405111610bf757600080fd5b61024051610260526060366102803760006101e0511115610f215760025460028082028215828483041417610c2b57600080fd5b809050905090506004808204905090506102e0526003546103005261032060006002818352015b610240516101606103205160028110610c6a57600080fd5b60200201518082028215828483041417610c8357600080fd5b809050905090506101a0518080610c9957600080fd5b820490509050610340526000610360526102006103205160028110610cbd57600080fd5b60200201516103805261038051610340511115610cf957610340516103805180821015610ce957600080fd5b8082039050905061036052610d1a565b610380516103405180821015610d0e57600080fd5b80820390509050610360525b6102e051610360518082028215828483041417610d3657600080fd5b809050905090506402540be400808204905090506102806103205160028110610d5e57600080fd5b6020020152610380516102806103205160028110610d7b57600080fd5b6020020151610300518082028215828483041417610d9857600080fd5b809050905090506402540be4008082049050905080821015610db957600080fd5b808203905090506103205160028110610dd157600080fd5b600160c052602060c02001556102006103205160028110610df157600080fd5b6020020180516102806103205160028110610e0b57600080fd5b602002015180821015610e1d57600080fd5b808203905090508152505b8151600101808352811415610c52575b5050610140610320525b61032051516020610320510161032052610320610320511015610e6457610e42565b6102005161034052610220516103605261014051610380526103805161036051610340516006580161057b565b6103e052610300610320525b6103205152602061032051036103205261014061032051101515610ec057610e9d565b6103e051610260526101e051610260516101a05180821015610ee157600080fd5b808203905090508082028215828483041417610efc57600080fd5b809050905090506101a0518080610f1257600080fd5b8204905090506102c052610f44565b600160c052602060c02061020051815561022051600182015550610240516102c0525b6044356102c05110151515610f98576308c379a06102e0526020610300526014610320527f536c697070616765207363726577656420796f75000000000000000000000000610340526103205060646102fcfd5b6102e060006002818352015b600060046102e05160028110610fb957600080fd5b602002013511156111425760006004610360527f23b872dd00000000000000000000000000000000000000000000000000000000610380526103606004806020846103c001018260208501600060045af1505080518201915050336020826103c0010152602081019050306020826103c001015260208101905060046102e0516002811061104657600080fd5b60200201356020826103c0010152602081019050806103c0526103c090508051602001806104808284600060045af161107e57600080fd5b50506020610560610480516104a060006102e0516002811061109f57600080fd5b600060c052602060c02001545af16110b657600080fd5b60203d808211156110c757806110c9565b815b90509050610540526105408051602001806103008284600060045af16110ee57600080fd5b505060006103005111156111415761030080602001516000825180602090131561111757600080fd5b809190121561112557600080fd5b806020036101000a8204905090509050151561114057600080fd5b5b5b5b8151600101808352811415610fa4575b5050602061038060446340c10f196102e05233610300526102c051610320526102fc60006101c0515af161118657600080fd5b601f3d1161119357600080fd5b600050610380506004356102e0526024356103005261028051610320526102a0516103405261024051610360526101e0516102c0518181830110156111d757600080fd5b8082019050905061038052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c06102e0a26102c051600052600062ffffff5560206000f350600062ffffff55005b6000156116a9575b6101e0526101405261016052610180526101a0526101c05261016051610140511861125957600080fd5b600061016051121561126a57600080fd5b6002610160511261127a57600080fd5b600061014051121561128b57600080fd5b6002610140511261129b57600080fd5b6101405161016051610180516101a0516101c0516101e0516102005160065801610026565b61022052610200526101e0526101c0526101a05261018052610160526101405261022051610200526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c05161026052610200516102805261028051610260516102405160065801610273565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e05161022052610200516002808202821582848304141761137b57600080fd5b80905090509050610240526102205161026052606036610280376102e060006002818352015b610140516102e05114156113bc57610180516102a0526113f2565b610160516102e05118156113ec576101a06102e051600281106113de57600080fd5b60200201516102a0526113f1565b61146e565b5b61028080516102a05181818301101561140a57600080fd5b808201905090508152506102605161022051808202821582848304141761143057600080fd5b809050905090506102a0516002808202821582848304141761145157600080fd5b80905090509050808061146357600080fd5b820490509050610260525b81516001018083528114156113a1575b50506102605161022051808202821582848304141761149c57600080fd5b80905090509050606480820282158284830414176114b957600080fd5b8090509050905061024051600280820282158284830414176114da57600080fd5b8090509050905080806114ec57600080fd5b8204905090506102605261028051610220516064808202821582848304141761151457600080fd5b8090509050905061024051808061152a57600080fd5b82049050905081818301101561153f57600080fd5b808201905090506102e0526102205161030052610320600060ff818352015b610300516102c0526103005161030051808202821582848304141761158257600080fd5b809050905090506102605181818301101561159c57600080fd5b8082019050905060026103005180820282158284830414176115bd57600080fd5b809050905090506102e0518181830110156115d757600080fd5b8082019050905061022051808210156115ef57600080fd5b80820390509050808061160157600080fd5b820490509050610300526102c051610300511115611656576001610300516102c0518082101561163057600080fd5b80820390509050111515611651576103005160005250506000516101e05156505b61168f565b60016102c051610300518082101561166d57600080fd5b8082039050905011151561168e576103005160005250506000516101e05156505b5b5b815160010180835281141561155e575b505060006000fd005b635e0d443f600051141561186157600435808060008112156116c757195b607f1c156116d457600080fd5b905050602435808060008112156116e757195b607f1c156116f457600080fd5b90505060018060c052602060c020546101405260018160c052602060c020015461016052506101406004356002811061172c57600080fd5b602002015160443581818301101561174357600080fd5b80820190509050610180526101405161016051610180516101a0516004356101c0526024356101e0526101805161020052610140516102205261016051610240526102405161022051610200516101e0516101c0516006580161122f565b6102a0526101a0526101805261016052610140526102a0516101a052610140602435600281106117d057600080fd5b60200201516101a051808210156117e657600080fd5b808203905090506001808210156117fc57600080fd5b808203905090506101c0526002546101c051808202821582848304141761182257600080fd5b809050905090506402540be400808204905090506101e0526101c0516101e0518082101561184f57600080fd5b8082039050905060005260206000f350005b633df021246000511415611edf5762ffffff541561187e57600080fd5b600162ffffff556004358080600081121561189557195b607f1c156118a257600080fd5b905050602435808060008112156118b557195b607f1c156118c257600080fd5b905050601154156118d257600080fd5b60065801610226565b60005060018060c052602060c020546101405260018160c052602060c020015461016052506101405161018052610160516101a0526101806004356002811061192357600080fd5b602002015160443581818301101561193a57600080fd5b808201905090506101c0526101405161016051610180516101a0516101c0516101e05160043561020052602435610220526101c0516102405261018051610260526101a0516102805261028051610260516102405161022051610200516006580161122f565b6102e0526101e0526101c0526101a0526101805261016052610140526102e0516101e052610180602435600281106119d757600080fd5b60200201516101e051808210156119ed57600080fd5b80820390509050600180821015611a0357600080fd5b8082039050905061020052610200516002548082028215828483041417611a2957600080fd5b809050905090506402540be400808204905090506102205261020080516102205180821015611a5757600080fd5b808203905090508152506064356102005110151515611ada576308c379a061024052602061026052602e610280527f45786368616e676520726573756c74656420696e20666577657220636f696e736102a0527f207468616e2065787065637465640000000000000000000000000000000000006102c05261028050608461025cfd5b610220516003548082028215828483041417611af557600080fd5b809050905090506402540be400808204905090506102405261014060043560028110611b2057600080fd5b6020020151604435818183011015611b3757600080fd5b8082019050905060043560028110611b4e57600080fd5b600160c052602060c020015561014060243560028110611b6d57600080fd5b60200201516102005180821015611b8357600080fd5b808203905090506102405180821015611b9b57600080fd5b8082039050905060243560028110611bb257600080fd5b600160c052602060c0200155600060046102c0527f23b872dd000000000000000000000000000000000000000000000000000000006102e0526102c060048060208461032001018260208501600060045af15050805182019150503360208261032001015260208101905030602082610320010152602081019050604435602082610320010152602081019050806103205261032090508051602001806103e08284600060045af1611c6357600080fd5b505060206104c06103e051610400600060043560028110611c8357600080fd5b600060c052602060c02001545af1611c9a57600080fd5b60203d80821115611cab5780611cad565b815b905090506104a0526104a08051602001806102608284600060045af1611cd257600080fd5b50506000610260511115611d2557610260806020015160008251806020901315611cfb57600080fd5b8091901215611d0957600080fd5b806020036101000a82049050905090501515611d2457600080fd5b5b600060046102c0527fa9059cbb000000000000000000000000000000000000000000000000000000006102e0526102c060048060208461032001018260208501600060045af15050805182019150503360208261032001015260208101905061020051602082610320010152602081019050806103205261032090508051602001806103c08284600060045af1611dbb57600080fd5b505060206104806103c0516103e0600060243560028110611ddb57600080fd5b600060c052602060c02001545af1611df257600080fd5b60203d80821115611e035780611e05565b815b90509050610460526104608051602001806102608284600060045af1611e2a57600080fd5b50506000610260511115611e7d57610260806020015160008251806020901315611e5357600080fd5b8091901215611e6157600080fd5b806020036101000a82049050905090501515611e7c57600080fd5b5b6004356102c0526044356102e052602435610300526102005161032052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd9714060806102c0a261020051600052600062ffffff5560206000f350600062ffffff55005b635b36389c60005114156122d05762ffffff5415611efc57600080fd5b600162ffffff5560065801610226565b6000506007546101405260206101e060046318160ddd6101805261019c610140515afa611f3857600080fd5b601f3d11611f4557600080fd5b6000506101e051610160526080366101803761020060006002818352015b6102005160028110611f7457600080fd5b600160c052602060c020015461022052610220516004358082028215828483041417611f9f57600080fd5b80905090509050610160518080611fb557600080fd5b8204905090506102405260246102005160028110611fd257600080fd5b6020020135610240511015151561204d576308c379a06102605260206102805260306102a0527f5769746864726177616c20726573756c74656420696e20666577657220636f696102c0527f6e73207468616e206578706563746564000000000000000000000000000000006102e0526102a050608461027cfd5b61022051610240518082101561206257600080fd5b80820390509050610200516002811061207a57600080fd5b600160c052602060c020015561024051610180610200516002811061209e57600080fd5b6020020152600060046102c0527fa9059cbb000000000000000000000000000000000000000000000000000000006102e0526102c060048060208461032001018260208501600060045af15050805182019150503360208261032001015260208101905061024051602082610320010152602081019050806103205261032090508051602001806103c08284600060045af161213957600080fd5b505060206104806103c0516103e06000610200516002811061215a57600080fd5b600060c052602060c02001545af161217157600080fd5b60203d808211156121825780612184565b815b90509050610460526104608051602001806102608284600060045af16121a957600080fd5b505060006102605111156121fc576102608060200151600082518060209013156121d257600080fd5b80919012156121e057600080fd5b806020036101000a820490509050905015156121fb57600080fd5b5b5b8151600101808352811415611f63575b505060206102a060446379cc67906102005233610220526004356102405261021c6000610140515af161223f57600080fd5b601f3d1161224c57600080fd5b6000506102a05061018051610200526101a051610220526101c051610240526101e05161026052610160516004358082101561228757600080fd5b8082039050905061028052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a0610200a2600062ffffff556040610180f3600062ffffff55005b63e31032736000511415612aec5762ffffff54156122ed57600080fd5b600162ffffff556011541561230157600080fd5b60065801610226565b6000506101405160065801610026565b6101605261014052610160516101405260018060c052602060c020546101605260018160c052602060c020015461018052506101405161016051610180516101a051610160516101c052610180516101e0526101405161020052610200516101e0516101c0516006580161057b565b610260526101a052610180526101605261014052610260516101a052610160516101c052610180516101e05261020060006002818352015b6101c061020051600281106123d557600080fd5b602002018051600461020051600281106123ee57600080fd5b60200201358082101561240057600080fd5b808203905090508152505b81516001018083528114156123c1575b50506101405161016051610180516101a0516101c0516101e051610200516101c051610220526101e0516102405261014051610260526102605161024051610220516006580161057b565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c05161020052600254600280820282158284830414176124a757600080fd5b809050905090506004808204905090506102205260035461024052604036610260376102a060006002818352015b6101c06102a051600281106124e957600080fd5b60200201516102c052610200516101606102a0516002811061250a57600080fd5b6020020151808202821582848304141761252357600080fd5b809050905090506101a051808061253957600080fd5b8204905090506102e0526000610300526102c0516102e051111561257c576102e0516102c0518082101561256c57600080fd5b808203905090506103005261259d565b6102c0516102e0518082101561259157600080fd5b80820390509050610300525b610220516103005180820282158284830414176125b957600080fd5b809050905090506402540be400808204905090506102606102a051600281106125e157600080fd5b60200201526102c0516102606102a051600281106125fe57600080fd5b602002015161024051808202821582848304141761261b57600080fd5b809050905090506402540be400808204905090508082101561263c57600080fd5b808203905090506102a0516002811061265457600080fd5b600160c052602060c02001556102c0516102606102a0516002811061267857600080fd5b60200201518082101561268a57600080fd5b808203905090506101c06102a051600281106126a557600080fd5b60200201525b81516001018083528114156124d5575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516101c0516102c0526101e0516102e0526101405161030052610300516102e0516102c0516006580161057b565b610360526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610360516102a0526007546102c052602061036060046318160ddd6103005261031c6102c0515afa61277f57600080fd5b601f3d1161278c57600080fd5b600050610360516102e0526101a0516102a051808210156127ac57600080fd5b808203905090506102e05180820282158284830414176127cb57600080fd5b809050905090506101a05180806127e157600080fd5b82049050905061030052600061030051186127fb57600080fd5b6103008051600181818301101561281157600080fd5b80820190509050815250604435610300511115151561286f576308c379a0610320526020610340526014610360527f536c697070616765207363726577656420796f750000000000000000000000006103805261036050606461033cfd5b60206103c060446379cc6790610320523361034052610300516103605261033c60006102c0515af16128a057600080fd5b601f3d116128ad57600080fd5b6000506103c05061032060006002818352015b6000600461032051600281106128d557600080fd5b60200201351815612a4e57600060046103a0527fa9059cbb000000000000000000000000000000000000000000000000000000006103c0526103a060048060208461040001018260208501600060045af1505080518201915050336020826104000101526020810190506004610320516002811061295257600080fd5b6020020135602082610400010152602081019050806104005261040090508051602001806104a08284600060045af161298a57600080fd5b505060206105606104a0516104c0600061032051600281106129ab57600080fd5b600060c052602060c02001545af16129c257600080fd5b60203d808211156129d357806129d5565b815b90509050610540526105408051602001806103408284600060045af16129fa57600080fd5b50506000610340511115612a4d57610340806020015160008251806020901315612a2357600080fd5b8091901215612a3157600080fd5b806020036101000a82049050905090501515612a4c57600080fd5b5b5b5b81516001018083528114156128c0575b5050600435610320526024356103405261026051610360526102805161038052610200516103a0526102e0516103005180821015612a9c57600080fd5b808203905090506103c052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c0610320a261030051600052600062ffffff5560206000f350600062ffffff55005b600015612e59575b6101e0526101405261016052610180526101a0526101c0526000610160511215612b1d57600080fd5b60026101605112612b2d57600080fd5b6101405160028082028215828483041417612b4757600080fd5b80905090509050610200526101c05161022052606036610240376102a060006002818352015b610160516102a0511815612b9d576101806102a05160028110612b8f57600080fd5b602002015161026052612ba2565b612c1e565b610240805161026051818183011015612bba57600080fd5b80820190509050815250610220516101c0518082028215828483041417612be057600080fd5b809050905090506102605160028082028215828483041417612c0157600080fd5b809050905090508080612c1357600080fd5b820490509050610220525b8151600101808352811415612b6d575b5050610220516101c0518082028215828483041417612c4c57600080fd5b8090509050905060648082028215828483041417612c6957600080fd5b809050905090506102005160028082028215828483041417612c8a57600080fd5b809050905090508080612c9c57600080fd5b82049050905061022052610240516101c05160648082028215828483041417612cc457600080fd5b80905090509050610200518080612cda57600080fd5b820490509050818183011015612cef57600080fd5b808201905090506102a0526101c0516102c0526102e0600060ff818352015b6102c051610280526102c0516102c0518082028215828483041417612d3257600080fd5b8090509050905061022051818183011015612d4c57600080fd5b8082019050905060026102c0518082028215828483041417612d6d57600080fd5b809050905090506102a051818183011015612d8757600080fd5b808201905090506101c05180821015612d9f57600080fd5b808203905090508080612db157600080fd5b8204905090506102c052610280516102c0511115612e065760016102c0516102805180821015612de057600080fd5b80820390509050111515612e01576102c05160005250506000516101e05156505b612e3f565b6001610280516102c05180821015612e1d57600080fd5b80820390509050111515612e3e576102c05160005250506000516101e05156505b5b5b8151600101808352811415612d0e575b505060006000fd005b6000156133d4575b6101805261014052610160526101405161016051610180516101a05160065801610026565b6101c0526101a0526101805261016052610140526101c0516101a05260018060c052602060c020546101c05260018160c052602060c02001546101e052506101405161016051610180516101a0516101c0516101e051610200516101c051610220526101e051610240526101a0516102605261026051610240516102205160065801610273565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c0516102005260206102a060046318160ddd6102405261025c6007545afa612f5657600080fd5b601f3d11612f6357600080fd5b6000506102a051610220526102005161014051610200518082028215828483041417612f8e57600080fd5b80905090509050610220518080612fa457600080fd5b82049050905080821015612fb757600080fd5b80820390509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101a05161028052610160516102a0526101c0516102c0526101e0516102e0526102405161030052610300516102e0516102c0516102a0516102805160065801612af4565b61036052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036051610260526101c051610280526101e0516102a0526002546002808202821582848304141761308c57600080fd5b809050905090506004808204905090506102c0526102e060006002818352015b600061030052610160516102e051141561312e576101c06102e051600281106130d457600080fd5b60200201516102405180820282158284830414176130f157600080fd5b8090509050905061020051808061310757600080fd5b820490509050610260518082101561311e57600080fd5b80820390509050610300526131ad565b6101c06102e0516002811061314257600080fd5b60200201516101c06102e0516002811061315b57600080fd5b602002015161024051808202821582848304141761317857600080fd5b8090509050905061020051808061318e57600080fd5b820490509050808210156131a157600080fd5b80820390509050610300525b6102806102e051600281106131c157600080fd5b6020020180516102c0516103005180820282158284830414176131e357600080fd5b809050905090506402540be400808204905090508082101561320457600080fd5b808203905090508152505b81516001018083528114156130ac575b5050610280610160516002811061323557600080fd5b6020020151610140610300525b6103005151602061030051016103005261030061030051101561326457613242565b6101a05161032052610160516103405261028051610360526102a05161038052610240516103a0526103a0516103805161036051610340516103205160065801612af4565b610400526102e0610300525b61030051526020610300510361030052610140610300511015156132d8576132b5565b61040051808210156132e957600080fd5b808203905090506102e0526102e0805160018082101561330857600080fd5b808203905090508152506101c0610160516002811061332657600080fd5b6020020151610260518082101561333c57600080fd5b80820390509050610300526103208080806102e051815250506020810190508080610300516102e0518082101561337257600080fd5b80820390509050815250506020810190508080610220518152505060609050905060c05260c051610380525b6000610380511115156133b0576133cc565b602061038051036103200151602061038051036103805261339e565b610180515650005b63cc2b27d7600051141561346c57602435808060008112156133f257195b607f1c156133ff57600080fd5b9050506004356101405260243561016052610160516101405160065801612e61565b6101c0526101e052610200526101c08080808051610220525050602081019050808080516102405250506020810190508080805161026052505050506102205160005260206000f350005b631a4d01d2600051141561383e5762ffffff541561348957600080fd5b600162ffffff55602435808060008112156134a057195b607f1c156134ad57600080fd5b905050601154156134bd57600080fd5b60065801610226565b600050606036610140376101405161016051610180516004356101a0526024356101c0526101c0516101a05160065801612e61565b6102205261024052610260526101805261016052610140526102208080808051610280525050602081019050808080516102a0525050602081019050808080516102c052505050506102808051610140528060200151610160528060400151610180525060443561014051101515156135b3576308c379a06101a05260206101c05260186101e0527f4e6f7420656e6f75676820636f696e732072656d6f7665640000000000000000610200526101e05060646101bcfd5b602435600281106135c357600080fd5b600160c052602060c020018054610140516101605160035480820282158284830414176135ef57600080fd5b809050905090506402540be4008082049050905081818301101561361257600080fd5b808201905090508082101561362657600080fd5b80820390509050815550602061024060446379cc67906101a052336101c0526004356101e0526101bc60006007545af161365f57600080fd5b601f3d1161366c57600080fd5b6000506102405060006004610200527fa9059cbb000000000000000000000000000000000000000000000000000000006102205261020060048060208461026001018260208501600060045af15050805182019150503360208261026001015260208101905061014051602082610260010152602081019050806102605261026090508051602001806103008284600060045af161370957600080fd5b505060206103c06103005161032060006024356002811061372957600080fd5b600060c052602060c02001545af161374057600080fd5b60203d808211156137515780613753565b815b905090506103a0526103a08051602001806101a08284600060045af161377857600080fd5b505060006101a05111156137cb576101a08060200151600082518060209013156137a157600080fd5b80919012156137af57600080fd5b806020036101000a820490509050905015156137ca57600080fd5b5b60043561020052610140516102205261018051600435808210156137ee57600080fd5b8082039050905061024052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a06060610200a261014051600052600062ffffff5560206000f350600062ffffff55005b633c157e6460005114156139e257600654331461385a57600080fd5b600a546201518081818301101561387057600080fd5b8082019050905042101561388357600080fd5b426201518081818301101561389757600080fd5b8082019050905060243510156138ac57600080fd5b6101405160065801610026565b61016052610140526101605161014052600435606480820282158284830414176138e257600080fd5b80905090509050610160526000600435111561390557620f424060043510613908565b60005b61391157600080fd5b61014051610160511015613954576101405161016051600a808202821582848304141761393d57600080fd5b80905090509050101561394f57600080fd5b613985565b61014051600a808202821582848304141761396e57600080fd5b8090509050905061016051111561398457600080fd5b5b610140516008556101605160095542600a55602435600b556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a65886000511415613a675760065433146139fe57600080fd5b6101405160065801610026565b61016052610140526101605161014052610140516008556101405160095542600a5542600b55610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b635b5a14676000511415613b25576006543314613a8357600080fd5b600c5415613a9057600080fd5b64012a05f2006004351115613aa457600080fd5b6402540be4006024351115613ab857600080fd5b426203f480818183011015613acc57600080fd5b808201905090506101405261014051600c55600435600e55602435600f556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe976000511415613bb9576006543314613b4157600080fd5b600c54421015613b5057600080fd5b6000600c5418613b5f57600080fd5b6000600c55600e5461014052600f546101605261014051600255610160516003556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb6000511415613bdc576006543314613bd557600080fd5b6000600c55005b636b441a406000511415613c705760043560a01c15613bfa57600080fd5b6006543314613c0857600080fd5b600d5415613c1557600080fd5b426203f480818183011015613c2957600080fd5b808201905090506101405261014051600d55600435601055600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae6000511415613ce9576006543314613c8c57600080fd5b600d54421015613c9b57600080fd5b6000600d5418613caa57600080fd5b6000600d556010546101405261014051600655610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf1936000511415613d0c576006543314613d0557600080fd5b6000600d55005b63e2e7d2646000511415613da85760206101c060246370a0823161014052306101605261015c60043560028110613d4257600080fd5b600060c052602060c02001545afa613d5957600080fd5b601f3d11613d6657600080fd5b6000506101c05160043560028110613d7d57600080fd5b600160c052602060c020015480821015613d9657600080fd5b8082039050905060005260206000f350005b6330c540856000511415613fc3576006543314613dc457600080fd5b61014060006002818352015b6101405160028110613de157600080fd5b600060c052602060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa613e1857600080fd5b601f3d11613e2557600080fd5b600050610220516101405160028110613e3d57600080fd5b600160c052602060c020015480821015613e5657600080fd5b80820390509050610180526000610180511115613fae5760006004610200527fa9059cbb000000000000000000000000000000000000000000000000000000006102205261020060048060208461026001018260208501600060045af15050805182019150503360208261026001015260208101905061018051602082610260010152602081019050806102605261026090508051602001806103008284600060045af1613f0357600080fd5b505060206103c0610300516103206000610160515af1613f2257600080fd5b60203d80821115613f335780613f35565b815b905090506103a0526103a08051602001806101a08284600060045af1613f5a57600080fd5b505060006101a0511115613fad576101a0806020015160008251806020901315613f8357600080fd5b8091901215613f9157600080fd5b806020036101000a82049050905090501515613fac57600080fd5b5b5b5b8151600101808352811415613dd0575b5050005b63524c39016000511415614071576006543314613fdf57600080fd5b61014060006002818352015b60206101e060246370a0823161016052306101805261017c610140516002811061401457600080fd5b600060c052602060c02001545afa61402b57600080fd5b601f3d1161403857600080fd5b6000506101e051610140516002811061405057600080fd5b600160c052602060c02001555b8151600101808352811415613feb575b5050005b63e369885360005114156140a257600654331461408d57600080fd5b426012541161409b57600080fd5b6001601155005b633046f97260005114156140c55760065433146140be57600080fd5b6000601155005b63c661065760005114156140fa57600435600281106140e357600080fd5b600060c052602060c020015460005260206000f350005b634903b0d1600051141561412f576004356002811061411857600080fd5b600160c052602060c020015460005260206000f350005b63ddca3f43600051141561414b5760025460005260206000f350005b63fee3f7f960005114156141675760035460005260206000f350005b639e266d4f600051141561419c576004356002811061418557600080fd5b600460c052602060c020015460005260206000f350005b6363543f0660005114156141b85760055460005260206000f350005b638da5cb5b60005114156141d45760065460005260206000f350005b6382c6306660005114156141f05760075460005260206000f350005b635409491a600051141561420c5760085460005260206000f350005b63b4b577ad60005114156142285760095460005260206000f350005b632081066c600051141561424457600a5460005260206000f350005b6314052288600051141561426057600b5460005260206000f350005b63405e28f8600051141561427c57600c5460005260206000f350005b63e0a0b586600051141561429857600d5460005260206000f350005b6358680d0b60005114156142b457600e5460005260206000f350005b63e382446260005114156142d057600f5460005260206000f350005b631ec0cdc160005114156142ec5760105460005260206000f350005b5b60006000fd5b61015661444903610156600039610156614449036000f3000000000000000000000000ecb456ea5365865ebab8a2661b0c503410e9b347000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000bbc455cb4f1b9e4bfc4b73970d360c8f032efee6000000000000000000000000cee60cfa923170e4f8204ae08b4fa6a3f5656f3a000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f200Deployed Bytecode
0x341561000a57600080fd5b6004361015610018576142ed565b600035601c526000156101c1575b61014052600b546101605260095461018052610160514210156101ae576008546101a052600a546101c0526101a051610180511115610107576101a051610180516101a0518082101561007857600080fd5b80820390509050426101c0518082101561009157600080fd5b8082039050905080820282158284830414176100ac57600080fd5b80905090509050610160516101c051808210156100c857600080fd5b8082039050905080806100da57600080fd5b8204905090508181830110156100ef57600080fd5b808201905090506000526000516101405156506101a9565b6101a0516101a051610180518082101561012057600080fd5b80820390509050426101c0518082101561013957600080fd5b80820390509050808202821582848304141761015457600080fd5b80905090509050610160516101c0518082101561017057600080fd5b80820390509050808061018257600080fd5b8204905090508082101561019557600080fd5b808203905090506000526000516101405156505b6101bf565b610180516000526000516101405156505b005b63f446c1d060005114156101f45760065801610026565b610140526101405160648082049050905060005260206000f350005b6376a2f0f0600051141561021e5760065801610026565b610140526101405160005260206000f350005b60001561026b575b6101405260055442111561026557600460c052602060c02060018060c052602060c02054825560018160c052602060c020015460018301555050426005555b61014051565b600015610573575b6101a0526101405261016052610180526040366101c03761022060006002818352015b602061022051026101400151610200526101c08051610200518181830110156102be57600080fd5b808201905090508152505b8151600101808352811415610296575b50506101c05115156102f45760006000526000516101a05156505b6101c05161020052610180516002808202821582848304141761031657600080fd5b8090509050905061022052610240600060ff818352015b61020051610260526102a060006002818352015b60206102a051026101400151610280526102605161020051808202821582848304141761036d57600080fd5b80905090509050610280516002808202821582848304141761038e57600080fd5b8090509050905080806103a057600080fd5b820490509050610260525b8151600101808352811415610341575b5050610200516101e052610220516101c05180820282158284830414176103e157600080fd5b80905090509050606480820490509050610260516002808202821582848304141761040b57600080fd5b8090509050905081818301101561042157600080fd5b8082019050905061020051808202821582848304141761044057600080fd5b809050905090506102205160648082101561045a57600080fd5b8082039050905061020051808202821582848304141761047957600080fd5b8090509050905060648082049050905060036102605180820282158284830414176104a357600080fd5b809050905090508181830110156104b957600080fd5b8082019050905080806104cb57600080fd5b820490509050610200526101e051610200511115610520576001610200516101e051808210156104fa57600080fd5b8082039050905011151561051b576102005160005250506000516101a05156505b610559565b60016101e051610200518082101561053757600080fd5b80820390509050111515610558576102005160005250506000516101a05156505b5b5b815160010180835281141561032d575b505060006000fd005b6000156105ee575b6101a0526101405261016052610180526101405161016051610180516101a051610140516101c052610160516101e0526101805161020052610200516101e0516101c05160065801610273565b610260526101a052610180526101605261014052610260516000526000516101a0515650005b63bb7b8b8060005114156106fd576101405160065801610026565b6101605261014052610160516101805261014051610160516101805160018060c052602060c020546101a05260018160c052602060c02001546101c05250610180516101e0526101e0516101c0516101a05160065801610273565b61024052610180526101605261014052610240516101405260206101e060046318160ddd6101805261019c6007545afa61069d57600080fd5b601f3d116106aa57600080fd5b6000506101e0516101605261014051670de0b6b3a764000080820282158284830414176106d657600080fd5b809050905090506101605180806106ec57600080fd5b82049050905060005260206000f350005b63ed8e84f360005114156109a55760443560011c1561071b57600080fd5b6101405160065801610026565b6101605261014052610160516101405260018060c052602060c020546101605260018160c052602060c020015461018052506101405161016051610180516101a051610160516101c052610180516101e0526101405161020052610200516101e0516101c0516006580161057b565b610260526101a052610180526101605261014052610260516101a0526101c060006002818352015b60443515610817576101606101c051600281106107db57600080fd5b60200201805160046101c051600281106107f457600080fd5b602002013581818301101561080857600080fd5b80820190509050815250610861565b6101606101c0516002811061082b57600080fd5b60200201805160046101c0516002811061084457600080fd5b60200201358082101561085657600080fd5b808203905090508152505b5b81516001018083528114156107bf575b50506101405161016051610180516101a0516101c051610160516101e0526101805161020052610140516102205261022051610200516101e0516006580161057b565b610280526101c0526101a052610180526101605261014052610280516101c052602061026060046318160ddd6102005261021c6007545afa6108f657600080fd5b601f3d1161090357600080fd5b600050610260516101e05260006102005260443515610941576101c0516101a0518082101561093157600080fd5b8082039050905061020052610962565b6101a0516101c0518082101561095657600080fd5b80820390509050610200525b610200516101e051808202821582848304141761097e57600080fd5b809050905090506101a051808061099457600080fd5b82049050905060005260206000f350005b630b4c7e4d60005114156112275762ffffff54156109c257600080fd5b600162ffffff5560065801610226565b600050601154156109e257600080fd5b6101405160065801610026565b6101605261014052610160516101405260018060c052602060c020546101605260018160c052602060c020015461018052506101405161016051610180516101a051610160516101c052610180516101e0526101405161020052610200516101e0516101c0516006580161057b565b610260526101a052610180526101605261014052610260516101a0526007546101c052602061026060046318160ddd6102005261021c6101c0515afa610aa357600080fd5b601f3d11610ab057600080fd5b600050610260516101e0526101605161020052610180516102205261024060006002818352015b6101e0511515610b0657600060046102405160028110610af657600080fd5b602002013511610b0557600080fd5b5b6102006102405160028110610b1a57600080fd5b60200201805160046102405160028110610b3357600080fd5b6020020135818183011015610b4757600080fd5b808201905090508152505b8151600101808352811415610ad7575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161020051610260526102205161028052610140516102a0526102a05161028051610260516006580161057b565b610300526102405261022052610200526101e0526101c0526101a05261018052610160526101405261030051610240526101a0516102405111610bf757600080fd5b61024051610260526060366102803760006101e0511115610f215760025460028082028215828483041417610c2b57600080fd5b809050905090506004808204905090506102e0526003546103005261032060006002818352015b610240516101606103205160028110610c6a57600080fd5b60200201518082028215828483041417610c8357600080fd5b809050905090506101a0518080610c9957600080fd5b820490509050610340526000610360526102006103205160028110610cbd57600080fd5b60200201516103805261038051610340511115610cf957610340516103805180821015610ce957600080fd5b8082039050905061036052610d1a565b610380516103405180821015610d0e57600080fd5b80820390509050610360525b6102e051610360518082028215828483041417610d3657600080fd5b809050905090506402540be400808204905090506102806103205160028110610d5e57600080fd5b6020020152610380516102806103205160028110610d7b57600080fd5b6020020151610300518082028215828483041417610d9857600080fd5b809050905090506402540be4008082049050905080821015610db957600080fd5b808203905090506103205160028110610dd157600080fd5b600160c052602060c02001556102006103205160028110610df157600080fd5b6020020180516102806103205160028110610e0b57600080fd5b602002015180821015610e1d57600080fd5b808203905090508152505b8151600101808352811415610c52575b5050610140610320525b61032051516020610320510161032052610320610320511015610e6457610e42565b6102005161034052610220516103605261014051610380526103805161036051610340516006580161057b565b6103e052610300610320525b6103205152602061032051036103205261014061032051101515610ec057610e9d565b6103e051610260526101e051610260516101a05180821015610ee157600080fd5b808203905090508082028215828483041417610efc57600080fd5b809050905090506101a0518080610f1257600080fd5b8204905090506102c052610f44565b600160c052602060c02061020051815561022051600182015550610240516102c0525b6044356102c05110151515610f98576308c379a06102e0526020610300526014610320527f536c697070616765207363726577656420796f75000000000000000000000000610340526103205060646102fcfd5b6102e060006002818352015b600060046102e05160028110610fb957600080fd5b602002013511156111425760006004610360527f23b872dd00000000000000000000000000000000000000000000000000000000610380526103606004806020846103c001018260208501600060045af1505080518201915050336020826103c0010152602081019050306020826103c001015260208101905060046102e0516002811061104657600080fd5b60200201356020826103c0010152602081019050806103c0526103c090508051602001806104808284600060045af161107e57600080fd5b50506020610560610480516104a060006102e0516002811061109f57600080fd5b600060c052602060c02001545af16110b657600080fd5b60203d808211156110c757806110c9565b815b90509050610540526105408051602001806103008284600060045af16110ee57600080fd5b505060006103005111156111415761030080602001516000825180602090131561111757600080fd5b809190121561112557600080fd5b806020036101000a8204905090509050151561114057600080fd5b5b5b5b8151600101808352811415610fa4575b5050602061038060446340c10f196102e05233610300526102c051610320526102fc60006101c0515af161118657600080fd5b601f3d1161119357600080fd5b600050610380506004356102e0526024356103005261028051610320526102a0516103405261024051610360526101e0516102c0518181830110156111d757600080fd5b8082019050905061038052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c06102e0a26102c051600052600062ffffff5560206000f350600062ffffff55005b6000156116a9575b6101e0526101405261016052610180526101a0526101c05261016051610140511861125957600080fd5b600061016051121561126a57600080fd5b6002610160511261127a57600080fd5b600061014051121561128b57600080fd5b6002610140511261129b57600080fd5b6101405161016051610180516101a0516101c0516101e0516102005160065801610026565b61022052610200526101e0526101c0526101a05261018052610160526101405261022051610200526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c05161026052610200516102805261028051610260516102405160065801610273565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e05161022052610200516002808202821582848304141761137b57600080fd5b80905090509050610240526102205161026052606036610280376102e060006002818352015b610140516102e05114156113bc57610180516102a0526113f2565b610160516102e05118156113ec576101a06102e051600281106113de57600080fd5b60200201516102a0526113f1565b61146e565b5b61028080516102a05181818301101561140a57600080fd5b808201905090508152506102605161022051808202821582848304141761143057600080fd5b809050905090506102a0516002808202821582848304141761145157600080fd5b80905090509050808061146357600080fd5b820490509050610260525b81516001018083528114156113a1575b50506102605161022051808202821582848304141761149c57600080fd5b80905090509050606480820282158284830414176114b957600080fd5b8090509050905061024051600280820282158284830414176114da57600080fd5b8090509050905080806114ec57600080fd5b8204905090506102605261028051610220516064808202821582848304141761151457600080fd5b8090509050905061024051808061152a57600080fd5b82049050905081818301101561153f57600080fd5b808201905090506102e0526102205161030052610320600060ff818352015b610300516102c0526103005161030051808202821582848304141761158257600080fd5b809050905090506102605181818301101561159c57600080fd5b8082019050905060026103005180820282158284830414176115bd57600080fd5b809050905090506102e0518181830110156115d757600080fd5b8082019050905061022051808210156115ef57600080fd5b80820390509050808061160157600080fd5b820490509050610300526102c051610300511115611656576001610300516102c0518082101561163057600080fd5b80820390509050111515611651576103005160005250506000516101e05156505b61168f565b60016102c051610300518082101561166d57600080fd5b8082039050905011151561168e576103005160005250506000516101e05156505b5b5b815160010180835281141561155e575b505060006000fd005b635e0d443f600051141561186157600435808060008112156116c757195b607f1c156116d457600080fd5b905050602435808060008112156116e757195b607f1c156116f457600080fd5b90505060018060c052602060c020546101405260018160c052602060c020015461016052506101406004356002811061172c57600080fd5b602002015160443581818301101561174357600080fd5b80820190509050610180526101405161016051610180516101a0516004356101c0526024356101e0526101805161020052610140516102205261016051610240526102405161022051610200516101e0516101c0516006580161122f565b6102a0526101a0526101805261016052610140526102a0516101a052610140602435600281106117d057600080fd5b60200201516101a051808210156117e657600080fd5b808203905090506001808210156117fc57600080fd5b808203905090506101c0526002546101c051808202821582848304141761182257600080fd5b809050905090506402540be400808204905090506101e0526101c0516101e0518082101561184f57600080fd5b8082039050905060005260206000f350005b633df021246000511415611edf5762ffffff541561187e57600080fd5b600162ffffff556004358080600081121561189557195b607f1c156118a257600080fd5b905050602435808060008112156118b557195b607f1c156118c257600080fd5b905050601154156118d257600080fd5b60065801610226565b60005060018060c052602060c020546101405260018160c052602060c020015461016052506101405161018052610160516101a0526101806004356002811061192357600080fd5b602002015160443581818301101561193a57600080fd5b808201905090506101c0526101405161016051610180516101a0516101c0516101e05160043561020052602435610220526101c0516102405261018051610260526101a0516102805261028051610260516102405161022051610200516006580161122f565b6102e0526101e0526101c0526101a0526101805261016052610140526102e0516101e052610180602435600281106119d757600080fd5b60200201516101e051808210156119ed57600080fd5b80820390509050600180821015611a0357600080fd5b8082039050905061020052610200516002548082028215828483041417611a2957600080fd5b809050905090506402540be400808204905090506102205261020080516102205180821015611a5757600080fd5b808203905090508152506064356102005110151515611ada576308c379a061024052602061026052602e610280527f45786368616e676520726573756c74656420696e20666577657220636f696e736102a0527f207468616e2065787065637465640000000000000000000000000000000000006102c05261028050608461025cfd5b610220516003548082028215828483041417611af557600080fd5b809050905090506402540be400808204905090506102405261014060043560028110611b2057600080fd5b6020020151604435818183011015611b3757600080fd5b8082019050905060043560028110611b4e57600080fd5b600160c052602060c020015561014060243560028110611b6d57600080fd5b60200201516102005180821015611b8357600080fd5b808203905090506102405180821015611b9b57600080fd5b8082039050905060243560028110611bb257600080fd5b600160c052602060c0200155600060046102c0527f23b872dd000000000000000000000000000000000000000000000000000000006102e0526102c060048060208461032001018260208501600060045af15050805182019150503360208261032001015260208101905030602082610320010152602081019050604435602082610320010152602081019050806103205261032090508051602001806103e08284600060045af1611c6357600080fd5b505060206104c06103e051610400600060043560028110611c8357600080fd5b600060c052602060c02001545af1611c9a57600080fd5b60203d80821115611cab5780611cad565b815b905090506104a0526104a08051602001806102608284600060045af1611cd257600080fd5b50506000610260511115611d2557610260806020015160008251806020901315611cfb57600080fd5b8091901215611d0957600080fd5b806020036101000a82049050905090501515611d2457600080fd5b5b600060046102c0527fa9059cbb000000000000000000000000000000000000000000000000000000006102e0526102c060048060208461032001018260208501600060045af15050805182019150503360208261032001015260208101905061020051602082610320010152602081019050806103205261032090508051602001806103c08284600060045af1611dbb57600080fd5b505060206104806103c0516103e0600060243560028110611ddb57600080fd5b600060c052602060c02001545af1611df257600080fd5b60203d80821115611e035780611e05565b815b90509050610460526104608051602001806102608284600060045af1611e2a57600080fd5b50506000610260511115611e7d57610260806020015160008251806020901315611e5357600080fd5b8091901215611e6157600080fd5b806020036101000a82049050905090501515611e7c57600080fd5b5b6004356102c0526044356102e052602435610300526102005161032052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd9714060806102c0a261020051600052600062ffffff5560206000f350600062ffffff55005b635b36389c60005114156122d05762ffffff5415611efc57600080fd5b600162ffffff5560065801610226565b6000506007546101405260206101e060046318160ddd6101805261019c610140515afa611f3857600080fd5b601f3d11611f4557600080fd5b6000506101e051610160526080366101803761020060006002818352015b6102005160028110611f7457600080fd5b600160c052602060c020015461022052610220516004358082028215828483041417611f9f57600080fd5b80905090509050610160518080611fb557600080fd5b8204905090506102405260246102005160028110611fd257600080fd5b6020020135610240511015151561204d576308c379a06102605260206102805260306102a0527f5769746864726177616c20726573756c74656420696e20666577657220636f696102c0527f6e73207468616e206578706563746564000000000000000000000000000000006102e0526102a050608461027cfd5b61022051610240518082101561206257600080fd5b80820390509050610200516002811061207a57600080fd5b600160c052602060c020015561024051610180610200516002811061209e57600080fd5b6020020152600060046102c0527fa9059cbb000000000000000000000000000000000000000000000000000000006102e0526102c060048060208461032001018260208501600060045af15050805182019150503360208261032001015260208101905061024051602082610320010152602081019050806103205261032090508051602001806103c08284600060045af161213957600080fd5b505060206104806103c0516103e06000610200516002811061215a57600080fd5b600060c052602060c02001545af161217157600080fd5b60203d808211156121825780612184565b815b90509050610460526104608051602001806102608284600060045af16121a957600080fd5b505060006102605111156121fc576102608060200151600082518060209013156121d257600080fd5b80919012156121e057600080fd5b806020036101000a820490509050905015156121fb57600080fd5b5b5b8151600101808352811415611f63575b505060206102a060446379cc67906102005233610220526004356102405261021c6000610140515af161223f57600080fd5b601f3d1161224c57600080fd5b6000506102a05061018051610200526101a051610220526101c051610240526101e05161026052610160516004358082101561228757600080fd5b8082039050905061028052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a0610200a2600062ffffff556040610180f3600062ffffff55005b63e31032736000511415612aec5762ffffff54156122ed57600080fd5b600162ffffff556011541561230157600080fd5b60065801610226565b6000506101405160065801610026565b6101605261014052610160516101405260018060c052602060c020546101605260018160c052602060c020015461018052506101405161016051610180516101a051610160516101c052610180516101e0526101405161020052610200516101e0516101c0516006580161057b565b610260526101a052610180526101605261014052610260516101a052610160516101c052610180516101e05261020060006002818352015b6101c061020051600281106123d557600080fd5b602002018051600461020051600281106123ee57600080fd5b60200201358082101561240057600080fd5b808203905090508152505b81516001018083528114156123c1575b50506101405161016051610180516101a0516101c0516101e051610200516101c051610220526101e0516102405261014051610260526102605161024051610220516006580161057b565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c05161020052600254600280820282158284830414176124a757600080fd5b809050905090506004808204905090506102205260035461024052604036610260376102a060006002818352015b6101c06102a051600281106124e957600080fd5b60200201516102c052610200516101606102a0516002811061250a57600080fd5b6020020151808202821582848304141761252357600080fd5b809050905090506101a051808061253957600080fd5b8204905090506102e0526000610300526102c0516102e051111561257c576102e0516102c0518082101561256c57600080fd5b808203905090506103005261259d565b6102c0516102e0518082101561259157600080fd5b80820390509050610300525b610220516103005180820282158284830414176125b957600080fd5b809050905090506402540be400808204905090506102606102a051600281106125e157600080fd5b60200201526102c0516102606102a051600281106125fe57600080fd5b602002015161024051808202821582848304141761261b57600080fd5b809050905090506402540be400808204905090508082101561263c57600080fd5b808203905090506102a0516002811061265457600080fd5b600160c052602060c02001556102c0516102606102a0516002811061267857600080fd5b60200201518082101561268a57600080fd5b808203905090506101c06102a051600281106126a557600080fd5b60200201525b81516001018083528114156124d5575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516101c0516102c0526101e0516102e0526101405161030052610300516102e0516102c0516006580161057b565b610360526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610360516102a0526007546102c052602061036060046318160ddd6103005261031c6102c0515afa61277f57600080fd5b601f3d1161278c57600080fd5b600050610360516102e0526101a0516102a051808210156127ac57600080fd5b808203905090506102e05180820282158284830414176127cb57600080fd5b809050905090506101a05180806127e157600080fd5b82049050905061030052600061030051186127fb57600080fd5b6103008051600181818301101561281157600080fd5b80820190509050815250604435610300511115151561286f576308c379a0610320526020610340526014610360527f536c697070616765207363726577656420796f750000000000000000000000006103805261036050606461033cfd5b60206103c060446379cc6790610320523361034052610300516103605261033c60006102c0515af16128a057600080fd5b601f3d116128ad57600080fd5b6000506103c05061032060006002818352015b6000600461032051600281106128d557600080fd5b60200201351815612a4e57600060046103a0527fa9059cbb000000000000000000000000000000000000000000000000000000006103c0526103a060048060208461040001018260208501600060045af1505080518201915050336020826104000101526020810190506004610320516002811061295257600080fd5b6020020135602082610400010152602081019050806104005261040090508051602001806104a08284600060045af161298a57600080fd5b505060206105606104a0516104c0600061032051600281106129ab57600080fd5b600060c052602060c02001545af16129c257600080fd5b60203d808211156129d357806129d5565b815b90509050610540526105408051602001806103408284600060045af16129fa57600080fd5b50506000610340511115612a4d57610340806020015160008251806020901315612a2357600080fd5b8091901215612a3157600080fd5b806020036101000a82049050905090501515612a4c57600080fd5b5b5b5b81516001018083528114156128c0575b5050600435610320526024356103405261026051610360526102805161038052610200516103a0526102e0516103005180821015612a9c57600080fd5b808203905090506103c052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c0610320a261030051600052600062ffffff5560206000f350600062ffffff55005b600015612e59575b6101e0526101405261016052610180526101a0526101c0526000610160511215612b1d57600080fd5b60026101605112612b2d57600080fd5b6101405160028082028215828483041417612b4757600080fd5b80905090509050610200526101c05161022052606036610240376102a060006002818352015b610160516102a0511815612b9d576101806102a05160028110612b8f57600080fd5b602002015161026052612ba2565b612c1e565b610240805161026051818183011015612bba57600080fd5b80820190509050815250610220516101c0518082028215828483041417612be057600080fd5b809050905090506102605160028082028215828483041417612c0157600080fd5b809050905090508080612c1357600080fd5b820490509050610220525b8151600101808352811415612b6d575b5050610220516101c0518082028215828483041417612c4c57600080fd5b8090509050905060648082028215828483041417612c6957600080fd5b809050905090506102005160028082028215828483041417612c8a57600080fd5b809050905090508080612c9c57600080fd5b82049050905061022052610240516101c05160648082028215828483041417612cc457600080fd5b80905090509050610200518080612cda57600080fd5b820490509050818183011015612cef57600080fd5b808201905090506102a0526101c0516102c0526102e0600060ff818352015b6102c051610280526102c0516102c0518082028215828483041417612d3257600080fd5b8090509050905061022051818183011015612d4c57600080fd5b8082019050905060026102c0518082028215828483041417612d6d57600080fd5b809050905090506102a051818183011015612d8757600080fd5b808201905090506101c05180821015612d9f57600080fd5b808203905090508080612db157600080fd5b8204905090506102c052610280516102c0511115612e065760016102c0516102805180821015612de057600080fd5b80820390509050111515612e01576102c05160005250506000516101e05156505b612e3f565b6001610280516102c05180821015612e1d57600080fd5b80820390509050111515612e3e576102c05160005250506000516101e05156505b5b5b8151600101808352811415612d0e575b505060006000fd005b6000156133d4575b6101805261014052610160526101405161016051610180516101a05160065801610026565b6101c0526101a0526101805261016052610140526101c0516101a05260018060c052602060c020546101c05260018160c052602060c02001546101e052506101405161016051610180516101a0516101c0516101e051610200516101c051610220526101e051610240526101a0516102605261026051610240516102205160065801610273565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c0516102005260206102a060046318160ddd6102405261025c6007545afa612f5657600080fd5b601f3d11612f6357600080fd5b6000506102a051610220526102005161014051610200518082028215828483041417612f8e57600080fd5b80905090509050610220518080612fa457600080fd5b82049050905080821015612fb757600080fd5b80820390509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101a05161028052610160516102a0526101c0516102c0526101e0516102e0526102405161030052610300516102e0516102c0516102a0516102805160065801612af4565b61036052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036051610260526101c051610280526101e0516102a0526002546002808202821582848304141761308c57600080fd5b809050905090506004808204905090506102c0526102e060006002818352015b600061030052610160516102e051141561312e576101c06102e051600281106130d457600080fd5b60200201516102405180820282158284830414176130f157600080fd5b8090509050905061020051808061310757600080fd5b820490509050610260518082101561311e57600080fd5b80820390509050610300526131ad565b6101c06102e0516002811061314257600080fd5b60200201516101c06102e0516002811061315b57600080fd5b602002015161024051808202821582848304141761317857600080fd5b8090509050905061020051808061318e57600080fd5b820490509050808210156131a157600080fd5b80820390509050610300525b6102806102e051600281106131c157600080fd5b6020020180516102c0516103005180820282158284830414176131e357600080fd5b809050905090506402540be400808204905090508082101561320457600080fd5b808203905090508152505b81516001018083528114156130ac575b5050610280610160516002811061323557600080fd5b6020020151610140610300525b6103005151602061030051016103005261030061030051101561326457613242565b6101a05161032052610160516103405261028051610360526102a05161038052610240516103a0526103a0516103805161036051610340516103205160065801612af4565b610400526102e0610300525b61030051526020610300510361030052610140610300511015156132d8576132b5565b61040051808210156132e957600080fd5b808203905090506102e0526102e0805160018082101561330857600080fd5b808203905090508152506101c0610160516002811061332657600080fd5b6020020151610260518082101561333c57600080fd5b80820390509050610300526103208080806102e051815250506020810190508080610300516102e0518082101561337257600080fd5b80820390509050815250506020810190508080610220518152505060609050905060c05260c051610380525b6000610380511115156133b0576133cc565b602061038051036103200151602061038051036103805261339e565b610180515650005b63cc2b27d7600051141561346c57602435808060008112156133f257195b607f1c156133ff57600080fd5b9050506004356101405260243561016052610160516101405160065801612e61565b6101c0526101e052610200526101c08080808051610220525050602081019050808080516102405250506020810190508080805161026052505050506102205160005260206000f350005b631a4d01d2600051141561383e5762ffffff541561348957600080fd5b600162ffffff55602435808060008112156134a057195b607f1c156134ad57600080fd5b905050601154156134bd57600080fd5b60065801610226565b600050606036610140376101405161016051610180516004356101a0526024356101c0526101c0516101a05160065801612e61565b6102205261024052610260526101805261016052610140526102208080808051610280525050602081019050808080516102a0525050602081019050808080516102c052505050506102808051610140528060200151610160528060400151610180525060443561014051101515156135b3576308c379a06101a05260206101c05260186101e0527f4e6f7420656e6f75676820636f696e732072656d6f7665640000000000000000610200526101e05060646101bcfd5b602435600281106135c357600080fd5b600160c052602060c020018054610140516101605160035480820282158284830414176135ef57600080fd5b809050905090506402540be4008082049050905081818301101561361257600080fd5b808201905090508082101561362657600080fd5b80820390509050815550602061024060446379cc67906101a052336101c0526004356101e0526101bc60006007545af161365f57600080fd5b601f3d1161366c57600080fd5b6000506102405060006004610200527fa9059cbb000000000000000000000000000000000000000000000000000000006102205261020060048060208461026001018260208501600060045af15050805182019150503360208261026001015260208101905061014051602082610260010152602081019050806102605261026090508051602001806103008284600060045af161370957600080fd5b505060206103c06103005161032060006024356002811061372957600080fd5b600060c052602060c02001545af161374057600080fd5b60203d808211156137515780613753565b815b905090506103a0526103a08051602001806101a08284600060045af161377857600080fd5b505060006101a05111156137cb576101a08060200151600082518060209013156137a157600080fd5b80919012156137af57600080fd5b806020036101000a820490509050905015156137ca57600080fd5b5b60043561020052610140516102205261018051600435808210156137ee57600080fd5b8082039050905061024052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a06060610200a261014051600052600062ffffff5560206000f350600062ffffff55005b633c157e6460005114156139e257600654331461385a57600080fd5b600a546201518081818301101561387057600080fd5b8082019050905042101561388357600080fd5b426201518081818301101561389757600080fd5b8082019050905060243510156138ac57600080fd5b6101405160065801610026565b61016052610140526101605161014052600435606480820282158284830414176138e257600080fd5b80905090509050610160526000600435111561390557620f424060043510613908565b60005b61391157600080fd5b61014051610160511015613954576101405161016051600a808202821582848304141761393d57600080fd5b80905090509050101561394f57600080fd5b613985565b61014051600a808202821582848304141761396e57600080fd5b8090509050905061016051111561398457600080fd5b5b610140516008556101605160095542600a55602435600b556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a65886000511415613a675760065433146139fe57600080fd5b6101405160065801610026565b61016052610140526101605161014052610140516008556101405160095542600a5542600b55610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b635b5a14676000511415613b25576006543314613a8357600080fd5b600c5415613a9057600080fd5b64012a05f2006004351115613aa457600080fd5b6402540be4006024351115613ab857600080fd5b426203f480818183011015613acc57600080fd5b808201905090506101405261014051600c55600435600e55602435600f556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe976000511415613bb9576006543314613b4157600080fd5b600c54421015613b5057600080fd5b6000600c5418613b5f57600080fd5b6000600c55600e5461014052600f546101605261014051600255610160516003556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb6000511415613bdc576006543314613bd557600080fd5b6000600c55005b636b441a406000511415613c705760043560a01c15613bfa57600080fd5b6006543314613c0857600080fd5b600d5415613c1557600080fd5b426203f480818183011015613c2957600080fd5b808201905090506101405261014051600d55600435601055600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae6000511415613ce9576006543314613c8c57600080fd5b600d54421015613c9b57600080fd5b6000600d5418613caa57600080fd5b6000600d556010546101405261014051600655610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf1936000511415613d0c576006543314613d0557600080fd5b6000600d55005b63e2e7d2646000511415613da85760206101c060246370a0823161014052306101605261015c60043560028110613d4257600080fd5b600060c052602060c02001545afa613d5957600080fd5b601f3d11613d6657600080fd5b6000506101c05160043560028110613d7d57600080fd5b600160c052602060c020015480821015613d9657600080fd5b8082039050905060005260206000f350005b6330c540856000511415613fc3576006543314613dc457600080fd5b61014060006002818352015b6101405160028110613de157600080fd5b600060c052602060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa613e1857600080fd5b601f3d11613e2557600080fd5b600050610220516101405160028110613e3d57600080fd5b600160c052602060c020015480821015613e5657600080fd5b80820390509050610180526000610180511115613fae5760006004610200527fa9059cbb000000000000000000000000000000000000000000000000000000006102205261020060048060208461026001018260208501600060045af15050805182019150503360208261026001015260208101905061018051602082610260010152602081019050806102605261026090508051602001806103008284600060045af1613f0357600080fd5b505060206103c0610300516103206000610160515af1613f2257600080fd5b60203d80821115613f335780613f35565b815b905090506103a0526103a08051602001806101a08284600060045af1613f5a57600080fd5b505060006101a0511115613fad576101a0806020015160008251806020901315613f8357600080fd5b8091901215613f9157600080fd5b806020036101000a82049050905090501515613fac57600080fd5b5b5b5b8151600101808352811415613dd0575b5050005b63524c39016000511415614071576006543314613fdf57600080fd5b61014060006002818352015b60206101e060246370a0823161016052306101805261017c610140516002811061401457600080fd5b600060c052602060c02001545afa61402b57600080fd5b601f3d1161403857600080fd5b6000506101e051610140516002811061405057600080fd5b600160c052602060c02001555b8151600101808352811415613feb575b5050005b63e369885360005114156140a257600654331461408d57600080fd5b426012541161409b57600080fd5b6001601155005b633046f97260005114156140c55760065433146140be57600080fd5b6000601155005b63c661065760005114156140fa57600435600281106140e357600080fd5b600060c052602060c020015460005260206000f350005b634903b0d1600051141561412f576004356002811061411857600080fd5b600160c052602060c020015460005260206000f350005b63ddca3f43600051141561414b5760025460005260206000f350005b63fee3f7f960005114156141675760035460005260206000f350005b639e266d4f600051141561419c576004356002811061418557600080fd5b600460c052602060c020015460005260206000f350005b6363543f0660005114156141b85760055460005260206000f350005b638da5cb5b60005114156141d45760065460005260206000f350005b6382c6306660005114156141f05760075460005260206000f350005b635409491a600051141561420c5760085460005260206000f350005b63b4b577ad60005114156142285760095460005260206000f350005b632081066c600051141561424457600a5460005260206000f350005b6314052288600051141561426057600b5460005260206000f350005b63405e28f8600051141561427c57600c5460005260206000f350005b63e0a0b586600051141561429857600d5460005260206000f350005b6358680d0b60005114156142b457600e5460005260206000f350005b63e382446260005114156142d057600f5460005260206000f350005b631ec0cdc160005114156142ec5760105460005260206000f350005b5b60006000fd
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ecb456ea5365865ebab8a2661b0c503410e9b347000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000bbc455cb4f1b9e4bfc4b73970d360c8f032efee6000000000000000000000000cee60cfa923170e4f8204ae08b4fa6a3f5656f3a000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f200
-----Decoded View---------------
Arg [0] : _owner (address): 0xeCb456EA5365865EbAb8a2661B0c503410e9B347
Arg [1] : _coins (address[2]): 0x514910771AF9Ca656af840dff83E8264EcF986CA,0xbBC455cb4F1B9e4bFC4B73970d360c8f032EfEE6
Arg [2] : _pool_token (address): 0xcee60cFa923170e4f8204AE08B4fA6A3F5656F3a
Arg [3] : _A (uint256): 100
Arg [4] : _fee (uint256): 4000000
Arg [5] : _admin_fee (uint256): 5000000000
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000ecb456ea5365865ebab8a2661b0c503410e9b347
Arg [1] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [2] : 000000000000000000000000bbc455cb4f1b9e4bfc4b73970d360c8f032efee6
Arg [3] : 000000000000000000000000cee60cfa923170e4f8204ae08b4fa6a3f5656f3a
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [5] : 00000000000000000000000000000000000000000000000000000000003d0900
Arg [6] : 000000000000000000000000000000000000000000000000000000012a05f200Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...Loading[ Download: CSV Export ]A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.SignIn
Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
Transaction Private Note
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.