Spend less on fees, more on crypto. Buy crypto easily with MoonPay Balance. 20M+ users trust MoonPay worldwide.
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.
Ready to simplify your web3 experience? Try the all-in-one web3 app trusted by millions worldwide.
MetaMask is the most powerful and convenient way to swap tokens directly in your wallet.
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
$3,649,596.73 (@ $3,948.54/ETH)Token Holdings
Could not find any matches!
- ERC-20 Tokens (14)2,670.95623336 frxETHFrax Ether (frxETH)$10,531,506.06@3,942.97221 HQGERC-20: 环球股 (HQG)0.01 SHEESHASheesha Finance$0.05@4.53114,999.99 TokenERC-20 TOKEN*[Suspicious]2,382.23 TokenERC-20 TOKEN*[Suspicious]1.7 TokenERC-20 TOKEN*[Suspicious]4,999.99 TokenERC-20 TOKEN*[Suspicious]1.4 TokenERC-20 TOKEN*[Spam]1.4 TokenERC-20 TOKEN*[Spam]1.4 TokenERC-20 TOKEN*[Spam]3,999.99 TokenERC-20 TOKEN*[Spam]98,127 TokenERC-20 TOKEN*[Spam]1,049 TokenERC-20 TOKEN*[Spam]3,999.99 TokenERC-20 TOKEN*[Spam]NFT Tokens (11)Official Authorize credentialFRAX: Airdrop NFT VoucherERC-1155claim rewards on fraxprotocol.comfraxprotocol.comERC-1155claim rewards on pool-stake.netpool-stake.netERC-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 9,688 transactions
Transaction Hash MethodBlockFromToRemove_liquidity... 21408122 2024-12-15 13:08:59 27 hrs ago 1734268139 IN 0 ETH$0.00 0.00070189 7.06055048 Exchange 21396858 2024-12-13 23:25:23 2 days ago 1734132323 IN 0.00174 ETH$6.87 0.00115581 12.19402933 Exchange 21395736 2024-12-13 19:39:23 2 days ago 1734118763 IN 0.00182 ETH$7.19 0.0042688 45.03675325 Exchange 21388341 2024-12-12 18:52:59 3 days ago 1734029579 IN 0.00346 ETH$13.66 0.00281726 29.86795085 Exchange 21381935 2024-12-11 21:26:11 4 days ago 1733952371 IN 0.0024 ETH$9.48 0.00244025 25.74842056 Exchange 21372657 2024-12-10 14:19:59 6 days ago 1733840399 IN 0.00304 ETH$12.00 0.00952316 100.48390582 Remove_liquidity... 21369729 2024-12-10 4:30:11 6 days ago 1733805011 IN 0 ETH$0.00 0.00151862 15.27252047 Remove_liquidity... 21363242 2024-12-09 6:46:47 7 days ago 1733726807 IN 0 ETH$0.00 0.00086879 9.25872287 Remove_liquidity... 21353718 2024-12-07 22:53:47 8 days ago 1733612027 IN 0 ETH$0.00 0.0011134 11.2 Exchange 21338000 2024-12-05 18:11:35 10 days ago 1733422295 IN 0.00202 ETH$7.98 0.00312217 33.10050496 Remove_liquidity... 21329274 2024-12-04 12:56:11 12 days ago 1733316971 IN 0 ETH$0.00 0.00188353 18.94233572 Remove_liquidity 21311102 2024-12-01 23:59:23 14 days ago 1733097563 IN 0 ETH$0.00 0.00116729 12.06140318 Remove_liquidity... 21307491 2024-12-01 11:54:47 15 days ago 1733054087 IN 0 ETH$0.00 0.0008319 8.36729716 Remove_liquidity... 21304076 2024-12-01 0:28:35 15 days ago 1733012915 IN 0 ETH$0.00 0.00123696 12.43989464 Exchange 21298538 2024-11-30 5:55:11 16 days ago 1732946111 IN 0.00257 ETH$10.15 0.00068478 7.25988628 Exchange 21293649 2024-11-29 13:28:47 17 days ago 1732886927 IN 0.00312 ETH$12.32 0.00177772 18.8494304 Exchange 21288016 2024-11-28 18:34:11 17 days ago 1732818851 IN 0.00253 ETH$9.99 0.0023032 24.41799524 Exchange 21284437 2024-11-28 6:31:47 18 days ago 1732775507 IN 0 ETH$0.00 0.00096635 9.61283354 Exchange 21283765 2024-11-28 4:09:47 18 days ago 1732766987 IN 0.0026 ETH$10.27 0.00090491 8.12136251 Remove_liquidity... 21282454 2024-11-27 23:46:23 18 days ago 1732751183 IN 0 ETH$0.00 0.00138148 13.12002772 Exchange 21279385 2024-11-27 13:27:47 19 days ago 1732714067 IN 0 ETH$0.00 0.00120401 11.97686874 Exchange 21274652 2024-11-26 21:36:23 19 days ago 1732656983 IN 0.008 ETH$31.59 0.00134066 12.03207113 Remove_liquidity... 21274577 2024-11-26 21:21:23 19 days ago 1732656083 IN 0 ETH$0.00 0.00131401 10.73573605 Remove_liquidity... 21264932 2024-11-25 12:59:59 21 days ago 1732539599 IN 0 ETH$0.00 0.00144017 14.48358478 Remove_liquidity... 21256260 2024-11-24 7:57:35 22 days ago 1732435055 IN 0 ETH$0.00 0.00092504 9.30523694 Latest 25 internal transactions (View All)
Advanced mode:Parent Transaction Hash Block FromTo21416083 2024-12-16 15:49:35 1 hrs ago 1734364175 2.8 ETH$11,055.92 21415832 2024-12-16 14:59:23 1 hr ago 1734361163 0.01313425 ETH$51.86 21415555 2024-12-16 14:03:47 2 hrs ago 1734357827 0.92335071 ETH$3,645.89 21414633 2024-12-16 10:58:47 5 hrs ago 1734346727 0.53877519 ETH$2,127.38 21414348 2024-12-16 10:01:35 6 hrs ago 1734343295 3.04334869 ETH$12,016.80 21413328 2024-12-16 6:36:23 10 hrs ago 1734330983 0.57492797 ETH$2,270.13 21413245 2024-12-16 6:19:23 10 hrs ago 1734329963 0.00055364 ETH$2.19 21413033 2024-12-16 5:36:47 11 hrs ago 1734327407 1.56619391 ETH$6,184.19 21412085 2024-12-16 2:26:23 14 hrs ago 1734315983 2.5 ETH$9,871.36 21412027 2024-12-16 2:14:35 14 hrs ago 1734315275 4.32233801 ETH$17,066.94 21411952 2024-12-16 1:59:35 14 hrs ago 1734314375 1.66942003 ETH$6,591.78 21411369 2024-12-16 0:02:35 16 hrs ago 1734307355 2.55134186 ETH$10,074.09 21411218 2024-12-15 23:32:23 17 hrs ago 1734305543 11.11011791 ETH$43,868.79 21410600 2024-12-15 21:28:11 19 hrs ago 1734298091 2.14803061 ETH$8,481.59 21410480 2024-12-15 21:04:11 19 hrs ago 1734296651 7.79849999 ETH$30,792.72 21409760 2024-12-15 18:39:23 22 hrs ago 1734287963 16.05340421 ETH$63,387.57 21409569 2024-12-15 18:00:59 22 hrs ago 1734285659 0.71116261 ETH$2,808.06 21409292 2024-12-15 17:04:59 23 hrs ago 1734282299 1 ETH$3,948.54 21408655 2024-12-15 14:56:23 25 hrs ago 1734274583 0.00063293 ETH$2.50 21408420 2024-12-15 14:08:59 26 hrs ago 1734271739 9.08051473 ETH$35,854.81 21408122 2024-12-15 13:08:59 27 hrs ago 1734268139 0.02452019 ETH$96.82 21407902 2024-12-15 12:24:47 28 hrs ago 1734265487 0.06654699 ETH$262.76 21407725 2024-12-15 11:49:23 29 hrs ago 1734263363 8.5 ETH$33,562.62 21407394 2024-12-15 10:42:47 30 hrs ago 1734259367 0.14579999 ETH$575.70 21406876 2024-12-15 8:58:23 31 hrs ago 1734253103 9.07261955 ETH$35,823.64 Loading...LoadingContract Source Code Verified (Exact Match)
Contract Name:Vyper_contract
Compiler Versionvyper:0.3.7
Contract Source Code (Vyper language format)
# @version 0.3.7 """ @title FRXETH StableSwap @author Curve.Fi @license Copyright (c) Curve.Fi, 2020-2022 - all rights reserved @notice Curve ETH pool implementation """ 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(uint256) = 2 N_COINS_128: 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 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) ma_price: uint256 ma_exp_time: public(uint256) ma_last_time: public(uint256) 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] != empty(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 self.ma_exp_time = 2597 # = 1800 / ln(2) # 30 mins self.ma_price = 10**18 self.ma_last_time = block.timestamp @view @internal def _A() -> uint256: """ Handle ramping A up or down """ t1: uint256 = self.future_A_time A1: uint256 = self.future_A if block.timestamp < t1: A0: uint256 = self.initial_A t0: uint256 = self.initial_A_time # Expressions in uint256 cannot have negative numbers, thus "if" if A1 > A0: return A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0) else: return A0 - (A0 - A1) * (block.timestamp - t0) / (t1 - t0) else: # when t1 == 0 or block.timestamp >= t1 return A1 @view @external def A() -> uint256: return self._A() / A_PRECISION @view @external def A_precise() -> uint256: return self._A() @pure @internal def _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 @internal @view def _get_p(xp: uint256[N_COINS], amp: uint256, D: uint256) -> uint256: # dx_0 / dx_1 only, however can have any number of coins in pool ANN: uint256 = amp * N_COINS Dr: uint256 = D / (N_COINS**N_COINS) for i in range(N_COINS): Dr = Dr * D / xp[i] return 10**18 * (ANN * xp[0] / A_PRECISION + Dr * xp[0] / xp[1]) / (ANN * xp[0] / A_PRECISION + Dr) @external @view @nonreentrant('lock') def get_p() -> uint256: amp: uint256 = self._A() xp: uint256[N_COINS] = self.balances D: uint256 = self._get_D(xp, amp) return self._get_p(xp, amp, D) @internal @view def exp(power: int256) -> uint256: # courtesy of solmate # https://github.com/transmissions11/solmate/blob/master/src/utils/SignedWadMath.sol#L83 if power <= -42139678854452767551: return 0 if power >= 135305999368893231589: raise "exp overflow" x: int256 = unsafe_div(unsafe_mul(power, 2**96), 10**18) k: int256 = unsafe_div( unsafe_add( unsafe_div(unsafe_mul(x, 2**96), 54916777467707473351141471128), 2**95), 2**96) x = unsafe_sub(x, unsafe_mul(k, 54916777467707473351141471128)) y: int256 = unsafe_add(x, 1346386616545796478920950773328) y = unsafe_add(unsafe_div(unsafe_mul(y, x), 2**96), 57155421227552351082224309758442) p: int256 = unsafe_sub(unsafe_add(y, x), 94201549194550492254356042504812) p = unsafe_add(unsafe_div(unsafe_mul(p, y), 2**96), 28719021644029726153956944680412240) p = unsafe_add(unsafe_mul(p, x), (4385272521454847904659076985693276 * 2**96)) q: int256 = unsafe_sub(x, 2855989394907223263936484059900) q = unsafe_add(unsafe_div(unsafe_mul(q, x), 2**96), 50020603652535783019961831881945) q = unsafe_sub(unsafe_div(unsafe_mul(q, x), 2**96), 533845033583426703283633433725380) q = unsafe_add(unsafe_div(unsafe_mul(q, x), 2**96), 3604857256930695427073651918091429) q = unsafe_sub(unsafe_div(unsafe_mul(q, x), 2**96), 14423608567350463180887372962807573) q = unsafe_add(unsafe_div(unsafe_mul(q, x), 2**96), 26449188498355588339934803723976023) return unsafe_div( unsafe_mul(convert(unsafe_div(p, q), uint256), 3822833074963236453042738258902158003155416615667), pow_mod256(2, convert(unsafe_sub(195, k), uint256)) ) @internal @view def _ma_price(xp: uint256[N_COINS], amp: uint256, D: uint256) -> uint256: p: uint256 = self._get_p(xp, amp, D) ema_mul: uint256 = self.exp(-convert((block.timestamp - self.ma_last_time) * 10**18 / self.ma_exp_time, int256)) return (self.ma_price * ema_mul + p * (10**18 - ema_mul)) / 10**18 @external @view @nonreentrant('lock') def price_oracle() -> uint256: amp: uint256 = self._A() xp: uint256[N_COINS] = self.balances D: uint256 = self._get_D(xp, amp) return self._ma_price(xp, amp, D) @internal def save_p(xp: uint256[N_COINS], amp: uint256, D: uint256): """ Saves current price and its EMA """ self.ma_price = self._ma_price(xp, amp, D) self.ma_last_time = block.timestamp @view @external @nonreentrant('lock') 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 @nonreentrant('lock') 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(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(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 @payable @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 """ 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(old_balances, amp) lp_token: address = self.lp_token token_supply: uint256 = ERC20(lp_token).totalSupply() new_balances: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): if token_supply == 0: assert _amounts[i] > 0 # dev: initial deposit requires all coins new_balances[i] = old_balances[i] + _amounts[i] # Invariant after change D1: uint256 = self._get_D(new_balances, amp) assert D1 > D0 # We need to recalculate the invariant accounting for fees # to calculate fair user's share fees: uint256[N_COINS] = empty(uint256[N_COINS]) mint_amount: uint256 = 0 D2: uint256 = D1 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 if ideal_balance > new_balances[i]: difference = ideal_balance - new_balances[i] else: difference = new_balances[i] - ideal_balance fees[i] = fee * difference / FEE_DENOMINATOR self.balances[i] = new_balances[i] - (fees[i] * admin_fee / FEE_DENOMINATOR) new_balances[i] -= fees[i] D2 = self._get_D(new_balances, amp) mint_amount = token_supply * (D2 - D0) / D0 self.save_p(new_balances, amp, D2) 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): coin: address = self.coins[i] amount: uint256 = _amounts[i] if coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: assert msg.value == amount elif amount > 0: assert ERC20(coin).transferFrom(msg.sender, self, amount, default_return_value=True) # 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_128 # dev: j above N_COINS # should be unreachable, but good for safety assert i >= 0 assert i < N_COINS_128 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_128): 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 @nonreentrant('lock') 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 @payable @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 old_balances: uint256[N_COINS] = self.balances x: uint256 = old_balances[i] + _dx amp: uint256 = self._A() D: uint256 = self._get_D(old_balances, amp) y: uint256 = self._get_y(i, j, x, old_balances) dy: uint256 = old_balances[j] - y - 1 # -1 just in case there were some rounding errors dy_fee: uint256 = dy * self.fee / FEE_DENOMINATOR # Convert all to real units dy = dy - dy_fee assert dy >= _min_dy, "Exchange resulted in fewer coins than expected" xp: uint256[N_COINS] = old_balances xp[i] = x xp[j] = y self.save_p(xp, amp, D) 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 coin: address = self.coins[i] if coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: assert msg.value == _dx else: assert msg.value == 0 assert ERC20(coin).transferFrom(msg.sender, self, _dx, default_return_value=True) coin = self.coins[j] if coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: raw_call(msg.sender, b"", value=dy) else: assert ERC20(coin).transfer(msg.sender, dy, default_return_value=True) 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 """ lp_token: address = self.lp_token total_supply: uint256 = CurveToken(lp_token).totalSupply() amounts: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): old_balance: uint256 = self.balances[i] value: uint256 = old_balance * _amount / total_supply assert value >= _min_amounts[i], "Withdrawal resulted in fewer coins than expected" self.balances[i] = old_balance - value amounts[i] = value coin: address = self.coins[i] if coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: raw_call(msg.sender, b"", value=value) else: assert ERC20(coin).transfer(msg.sender, value, default_return_value=True) CurveToken(lp_token).burnFrom(msg.sender, _amount) # dev: insufficient funds log RemoveLiquidity(msg.sender, amounts, empty(uint256[N_COINS]), 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 amp: uint256 = self._A() old_balances: uint256[N_COINS] = self.balances D0: uint256 = self._get_D(old_balances, amp) new_balances: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): new_balances[i] = old_balances[i] - _amounts[i] D1: uint256 = self._get_D(new_balances, amp) fees: uint256[N_COINS] = empty(uint256[N_COINS]) fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) admin_fee: uint256 = self.admin_fee 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(new_balances, amp) self.save_p(new_balances, amp, D2) 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): amount: uint256 = _amounts[i] if amount != 0: coin: address = self.coins[i] if coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: raw_call(msg.sender, b"", value=amount) else: assert ERC20(coin).transfer(msg.sender, amount, default_return_value=True) 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_128 # 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_128): 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, 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) fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) xp_reduced: uint256[N_COINS] = xp for j in range(N_COINS_128): 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 xp[i] = new_y ma_p: uint256 = 0 if new_y > 0: ma_p = self._ma_price(xp, amp, D1) return dy, dy_0 - dy, total_supply, ma_p @view @external @nonreentrant('lock') 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 dy: uint256 = 0 dy_fee: uint256 = 0 total_supply: uint256 = 0 ma_p: uint256 = 0 dy, dy_fee, total_supply, ma_p = 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 coin: address = self.coins[i] if coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: raw_call(msg.sender, b"", value=dy) else: assert ERC20(coin).transfer(msg.sender, dy, default_return_value=True) log RemoveLiquidityOne(msg.sender, _token_amount, dy, total_supply - _token_amount) self.ma_price = ma_p self.ma_last_time = block.timestamp 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 set_ma_exp_time(_ma_exp_time: uint256): assert msg.sender == self.owner assert _ma_exp_time != 0 self.ma_exp_time = _ma_exp_time @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: coin: address = self.coins[i] if coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: return self.balance - self.balances[i] else: return ERC20(coin).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] if coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: value: uint256 = self.balance - self.balances[i] if value > 0: raw_call(msg.sender, b"", value=value) else: value: uint256 = ERC20(coin).balanceOf(self) - self.balances[i] if value > 0: assert ERC20(coin).transfer(msg.sender, value, default_return_value=True) @external def donate_admin_fees(): assert msg.sender == self.owner # dev: only owner for i in range(N_COINS): coin: address = self.coins[i] if coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: self.balances[i] = self.balance else: self.balances[i] = ERC20(coin).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":[{"name":"buyer","type":"address","indexed":true},{"name":"sold_id","type":"int128","indexed":false},{"name":"tokens_sold","type":"uint256","indexed":false},{"name":"bought_id","type":"int128","indexed":false},{"name":"tokens_bought","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[2]","indexed":false},{"name":"fees","type":"uint256[2]","indexed":false},{"name":"invariant","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[2]","indexed":false},{"name":"fees","type":"uint256[2]","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amount","type":"uint256","indexed":false},{"name":"coin_amount","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[2]","indexed":false},{"name":"fees","type":"uint256[2]","indexed":false},{"name":"invariant","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewFee","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"fee","type":"uint256","indexed":false},{"name":"admin_fee","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewFee","inputs":[{"name":"fee","type":"uint256","indexed":false},{"name":"admin_fee","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampA","inputs":[{"name":"old_A","type":"uint256","indexed":false},{"name":"new_A","type":"uint256","indexed":false},{"name":"initial_time","type":"uint256","indexed":false},{"name":"future_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"name":"A","type":"uint256","indexed":false},{"name":"t","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_owner","type":"address"},{"name":"_coins","type":"address[2]"},{"name":"_pool_token","type":"address"},{"name":"_A","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_admin_fee","type":"uint256"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"A","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"A_precise","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_p","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"price_oracle","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"_amounts","type":"uint256[2]"},{"name":"_is_deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"add_liquidity","inputs":[{"name":"_amounts","type":"uint256[2]"},{"name":"_min_mint_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"_dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"_dx","type":"uint256"},{"name":"_min_dy","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[2]"}],"outputs":[{"name":"","type":"uint256[2]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_amounts","type":"uint256[2]"},{"name":"_max_burn_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"_token_amount","type":"uint256"},{"name":"i","type":"int128"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_token_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"_min_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"ramp_A","inputs":[{"name":"_future_A","type":"uint256"},{"name":"_future_time","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"commit_new_fee","inputs":[{"name":"_new_fee","type":"uint256"},{"name":"_new_admin_fee","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"apply_new_fee","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"revert_new_parameters","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"set_ma_exp_time","inputs":[{"name":"_ma_exp_time","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_owner","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"revert_transfer_ownership","inputs":[],"outputs":[]},{"stateMutability":"view","type":"function","name":"admin_balances","inputs":[{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"withdraw_admin_fees","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"donate_admin_fees","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"kill_me","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"unkill_me","inputs":[],"outputs":[]},{"stateMutability":"view","type":"function","name":"coins","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"lp_token","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"initial_A","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_A","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"initial_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"admin_actions_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"transfer_ownership_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"ma_exp_time","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"ma_last_time","inputs":[],"outputs":[{"name":"","type":"uint256"}]}]
Contract Creation Code
602061393c6000396000518060a01c61393757604052602061395c6000396000518060a01c61393757606052602061397c6000396000518060a01c61393757608052602061399c6000396000518060a01c6139375760a052346139375760006002905b8060c05260c051600181116139375760051b60600151156139375760010181811861006257505060605160015560805160025560206139bc6000396000516064810281606482041861393757905060095560206139bc60003960005160648102816064820418613937579050600a5560206139dc60003960005160055560206139fc60003960005160065560405160075542624f1a00810181811061393757905060165560a051600855610a25601355670de0b6b3a76400006012554260145561380261013461000039613802610000f36003361161000c57612683565b60003560e01c630b4c7e4d811861064657606436106137f0576000546002146137f05760026000556015546137f0576100466102c0612689565b6102c0516102a0526003546102c0526004546102e0526102c0516040526102e0516060526102a05160805261007c6103206127ae565b610320516103005260085461032052610320516318160ddd610360526020610360600461037c845afa6100b4573d600060003e3d6000fd5b60203d106137f057610360905051610340526040366103603760006002905b806103a052610340516100f9576103a051600181116137f05760051b60040135156137f0575b6103a051600181116137f05760051b6102c001516103a051600181116137f05760051b600401358082018281106137f057905090506103a051600181116137f05760051b61036001526001018181186100d357505061036051604052610380516060526102a05160805261016e6103c06127ae565b6103c0516103a052610300516103a05111156137f0576060366103c0376103a051610420526103405115610408576005548060011b818160011c186137f05790508060021c9050610440526006546104605260006002905b80610480526103a05161048051600181116137f05760051b6102c001518082028115838383041417156137f057905090506103005180156137f057808204905090506104a05260006104c05261048051600181116137f05760051b61036001516104a0511161025e5761048051600181116137f05760051b61036001516104a0518082038281116137f057905090506104c052610289565b6104a05161048051600181116137f05760051b61036001518082038281116137f057905090506104c0525b610440516104c0518082028115838383041417156137f057905090506402540be4008104905061048051600181116137f05760051b6103c0015261048051600181116137f05760051b610360015161048051600181116137f05760051b6103c00151610460518082028115838383041417156137f057905090506402540be400810490508082038281116137f0579050905061048051600181116137f0576003015561048051600181116137f05760051b61036001805161048051600181116137f05760051b6103c001518082038281116137f057905090508152506001018181186101c657505061036051604052610380516060526102a0516080526103916104806127ae565b61048051610420526103405161042051610300518082038281116137f057905090508082028115838383041417156137f057905090506103005180156137f0578082049050905061040052610360516102005261038051610220526102a05161024052610420516102605261041f612edd5661041f565b61036051600355610380516004556103a051610400525b604435610400511015610492576014610440527f536c697070616765207363726577656420796f750000000000000000000000006104605261044050610440518061046001601f826000031636823750506308c379a061040052602061042052601f19601f61044051011660440161041cfd5b60006002905b806104405261044051600181116137f057600101546104605261044051600181116137f05760051b600401356104805273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61046051186104f5576104805134186137f057610577565b610480511561057757610460516323b872dd6104a052336104c052306104e052610480516105005260206104a060646104bc6000855af161053b573d600060003e3d6000fd5b3d61055257803b156137f05760016105205261056b565b60203d106137f0576104a0518060011c6137f057610520525b610520905051156137f0575b600101818118610498575050610320516340c10f1961044052336104605261040051610480526020610440604461045c6000855af16105bb573d600060003e3d6000fd5b60203d106137f057610440518060011c6137f0576104a0526104a05050337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860406004610440376103c051610480526103e0516104a0526103a0516104c05261034051610400518082018281106137f057905090506104e05260c0610440a260206104006003600055f35b633df021248118610b4357608436106137f05760043580600f0b81186137f0576103605260243580600f0b81186137f057610380526000546002146137f05760026000556015546137f0576003546103a0526004546103c05261036051600181116137f05760051b6103a001516044358082018281106137f057905090506103e0526106d3610420612689565b61042051610400526103a0516040526103c051606052610400516080526106fb6104406127ae565b61044051610420526103605161018052610380516101a0526103e0516101c0526103a0516101e0526103c05161020052610736610460612f15565b610460516104405261038051600181116137f05760051b6103a00151610440518082038281116137f05790509050600181038181116137f057905061046052610460516005548082028115838383041417156137f057905090506402540be400810490506104805261046051610480518082038281116137f057905090506104605260643561046051101561085057602e6104a0527f45786368616e676520726573756c74656420696e20666577657220636f696e736104c0527f207468616e2065787065637465640000000000000000000000000000000000006104e0526104a0506104a051806104c001601f826000031636823750506308c379a061046052602061048052601f19601f6104a051011660440161047cfd5b6103a0516104a0526103c0516104c0526103e05161036051600181116137f05760051b6104a001526104405161038051600181116137f05760051b6104a001526104a051610200526104c05161022052610400516102405261042051610260526108b8612edd565b610480516006548082028115838383041417156137f057905090506402540be400810490506104e05261036051600181116137f05760051b6103a001516044358082018281106137f0579050905061036051600181116137f0576003015561038051600181116137f05760051b6103a00151610460518082038281116137f057905090506104e0518082038281116137f0579050905061038051600181116137f0576003015561036051600181116137f057600101546105005273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610500511861099e5760443534186137f057610a1b565b346137f057610500516323b872dd6105205233610540523061056052604435610580526020610520606461053c6000855af16109df573d600060003e3d6000fd5b3d6109f657803b156137f05760016105a052610a0f565b60203d106137f057610520518060011c6137f0576105a0525b6105a0905051156137f0575b61038051600181116137f057600101546105005273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6105005118610a7c5760006105205261052050600060006105205161054061046051335af1610af0573d600060003e3d6000fd610af0565b6105005163a9059cbb61052052336105405261046051610560526020610520604461053c6000855af1610ab4573d600060003e3d6000fd5b3d610acb57803b156137f057600161058052610ae4565b60203d106137f057610520518060011c6137f057610580525b610580905051156137f0575b337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd97140610360516105205260443561054052610380516105605261046051610580526080610520a260206104606003600055f35b346137f05763f446c1d08118610b7757600436106137f057610b6560c0612689565b60c05160648104905060e052602060e0f35b6376a2f0f08118610b9a57600436106137f0576020610b9660c0612689565b60c0f35b63f2388acb8118610c2e57600436106137f0576000546002146137f057610bc26101a0612689565b6101a051610180526003546101a0526004546101c0526101a0516040526101c05160605261018051608052610bf86102006127ae565b610200516101e05260206101a0516040526101c051606052610180516080526101e05160a052610c296102006129b9565b610200f35b6386fc88d38118610cc657600436106137f0576000546002146137f057610c56610220612689565b61022051610200526003546102205260045461024052610220516040526102405160605261020051608052610c8c6102806127ae565b610280516102605260206102205161012052610240516101405261020051610160526102605161018052610cc1610280612db3565b610280f35b63bb7b8b808118610da457600436106137f0576000546002146137f0576003546101e05260045461020052610cfc6101a0612689565b6101a051610220526101e0516040526102005160605261022051608052610d246101c06127ae565b6101c051610180526008546318160ddd6101c05260206101c060046101dc845afa610d54573d600060003e3d6000fd5b60203d106137f0576101c09050516101a05261018051670de0b6b3a7640000810281670de0b6b3a76400008204186137f05790506101a05180156137f057808204905090506101c05260206101c0f35b63ed8e84f38118610f9257606436106137f0576044358060011c6137f057610180526000546002146137f057610ddb6101c0612689565b6101c0516101a0526003546101c0526004546101e0526101c0516040526101e0516060526101a051608052610e116102206127ae565b610220516102005260006002905b806102205261018051610e6a5761022051600181116137f05760051b6101c001805161022051600181116137f05760051b600401358082038281116137f05790509050815250610ea4565b61022051600181116137f05760051b6101c001805161022051600181116137f05760051b600401358082018281106137f057905090508152505b600101818118610e1f5750506101c0516040526101e0516060526101a051608052610ed06102406127ae565b61024051610220526008546318160ddd610260526020610260600461027c845afa610f00573d600060003e3d6000fd5b60203d106137f0576102609050516102405260006102605261018051610f3f5761020051610220518082038281116137f0579050905061026052610f5a565b61022051610200518082038281116137f05790509050610260525b61026051610240518082028115838383041417156137f057905090506102005180156137f05780820490509050610280526020610280f35b635e0d443f81186110c457606436106137f05760043580600f0b81186137f0576103605260243580600f0b81186137f057610380526000546002146137f0576003546103a0526004546103c05261036051600181116137f05760051b6103a001516044358082018281106137f057905090506103e0526103605161018052610380516101a0526103e0516101c0526103a0516101e0526103c0516102005261103b610420612f15565b610420516104005261038051600181116137f05760051b6103a00151610400518082038281116137f05790509050600181038181116137f057905061042052600554610420518082028115838383041417156137f057905090506402540be400810490506104405261042051610440518082038281116137f05790509050610460526020610460f35b635b36389c81186113db57606436106137f0576000546002146137f05760026000556008546040526040516318160ddd608052602060806004609c845afa611111573d600060003e3d6000fd5b60203d106137f057608090505160605260403660803760006002905b8060c05260c051600181116137f0576003015460e05260e0516004358082028115838383041417156137f0579050905060605180156137f057808204905090506101005260c051600181116137f05760051b60240135610100511015611216576030610120527f5769746864726177616c20726573756c74656420696e20666577657220636f69610140527f6e73207468616e206578706563746564000000000000000000000000000000006101605261012050610120518061014001601f826000031636823750506308c379a060e052602061010052601f19601f61012051011660440160fcfd5b60e051610100518082038281116137f0579050905060c051600181116137f057600301556101005160c051600181116137f05760051b6080015260c051600181116137f057600101546101205273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61012051186112b05760006101405261014050600060006101405161016061010051335af1611324573d600060003e3d6000fd611324565b6101205163a9059cbb61014052336101605261010051610180526020610140604461015c6000855af16112e8573d600060003e3d6000fd5b3d6112ff57803b156137f05760016101a052611318565b60203d106137f057610140518060011c6137f0576101a0525b6101a0905051156137f0575b60010181811861112d5750506040516379cc679060c0523360e05260043561010052602060c0604460dc6000855af1611362573d600060003e3d6000fd5b60203d106137f05760c0518060011c6137f057610120526101205050337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60805160c05260a05160e052604036610100376060516004358082038281116137f057905090506101405260a060c0a2604060806003600055f35b63e310327381186119c557606436106137f0576000546002146137f05760026000556015546137f05761140f6102c0612689565b6102c0516102a0526003546102c0526004546102e0526102c0516040526102e0516060526102a0516080526114456103206127ae565b61032051610300526040366103203760006002905b806103605261036051600181116137f05760051b6102c0015161036051600181116137f05760051b600401358082038281116137f0579050905061036051600181116137f05760051b610320015260010181811861145a57505061032051604052610340516060526102a0516080526114d46103806127ae565b6103805161036052604036610380376005548060011b818160011c186137f05790508060021c90506103c0526006546103e05260006002905b806104005261040051600181116137f05760051b6103200151610420526103605161040051600181116137f05760051b6102c001518082028115838383041417156137f057905090506103005180156137f057808204905090506104405260006104605261042051610440511161159d5761042051610440518082038281116137f05790509050610460526115b8565b61044051610420518082038281116137f05790509050610460525b6103c051610460518082028115838383041417156137f057905090506402540be4008104905061040051600181116137f05760051b61038001526104205161040051600181116137f05760051b61038001516103e0518082028115838383041417156137f057905090506402540be400810490508082038281116137f0579050905061040051600181116137f057600301556104205161040051600181116137f05760051b61038001518082038281116137f0579050905061040051600181116137f05760051b610320015260010181811861150d57505061032051604052610340516060526102a0516080526116b06104206127ae565b6104205161040052610320516102005261034051610220526102a0516102405261040051610260526116e0612edd565b60085461042052610420516318160ddd610460526020610460600461047c845afa611710573d600060003e3d6000fd5b60203d106137f0576104609050516104405261030051610400518082038281116137f05790509050610440518082028115838383041417156137f057905090506103005180156137f057808204905090506104605261046051156137f05761046051600181018181106137f0579050610460526044356104605111156117f6576014610480527f536c697070616765207363726577656420796f750000000000000000000000006104a0526104805061048051806104a001601f826000031636823750506308c379a061044052602061046052601f19601f61048051011660440161045cfd5b610420516379cc679061048052336104a052610460516104c0526020610480604461049c6000855af161182e573d600060003e3d6000fd5b60203d106137f057610480518060011c6137f0576104e0526104e0505060006002905b806104805261048051600181116137f05760051b600401356104a0526104a0511561194b5761048051600181116137f057600101546104c05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104c051186118d75760006104e0526104e050600060006104e0516105006104a051335af161194b573d600060003e3d6000fd61194b565b6104c05163a9059cbb6104e05233610500526104a0516105205260206104e060446104fc6000855af161190f573d600060003e3d6000fd5b3d61192657803b156137f05760016105405261193f565b60203d106137f0576104e0518060011c6137f057610540525b610540905051156137f0575b600101818118611851575050337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e6040600461048037610380516104c0526103a0516104e052610360516105005261044051610460518082038281116137f057905090506105205260c0610480a260206104606003600055f35b63cc2b27d78118611a1457604436106137f05760243580600f0b81186137f057610400526000546002146137f0576020600435610200526104005161022052611a0f61042061346d565b610420f35b631a4d01d28118611cef57606436106137f05760243580600f0b81186137f057610400526000546002146137f05760026000556015546137f05760803661042037600435610200526104005161022052611a6f6104a061346d565b6104a080516104205260208101516104405260408101516104605260608101516104805250604435610420511015611b075760186104a0527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006104c0526104a0506104a051806104c001601f826000031636823750506308c379a061046052602061048052601f19601f6104a051011660440161047cfd5b61040051600181116137f057600301805461042051610440516006548082028115838383041417156137f057905090506402540be400810490508082018281106137f057905090508082038281116137f057905090508155506008546379cc67906104a052336104c0526004356104e05260206104a060446104bc6000855af1611b96573d600060003e3d6000fd5b60203d106137f0576104a0518060011c6137f05761050052610500505061040051600181116137f057600101546104a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104a05118611c145760006104c0526104c050600060006104c0516104e061042051335af1611c88573d600060003e3d6000fd611c88565b6104a05163a9059cbb6104c052336104e052610420516105005260206104c060446104dc6000855af1611c4c573d600060003e3d6000fd5b3d611c6357803b156137f057600161052052611c7c565b60203d106137f0576104c0518060011c6137f057610520525b610520905051156137f0575b337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a06004356104c052610420516104e052610460516004358082038281116137f057905090506105005260606104c0a2610480516012554260145560206104206003600055f35b633c157e648118611e1f57604436106137f05760075433186137f057600b546201518081018181106137f057905042106137f057426201518081018181106137f0579050602435106137f057611d4560e0612689565b60e05160c052600435606481028160648204186137f057905060e05260043515611d7757620f423f6004351115611d7a565b60005b156137f05760c05160e05110611daa5760c051600a810281600a8204186137f057905060e051116137f057611dc6565b60c05160e051600a810281600a8204186137f0579050106137f0575b60c05160095560e051600a5542600b55602435600c557fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c25460c0516101005260e051610120524261014052602435610160526080610100a1005b63551a65888118611e9257600436106137f05760075433186137f057611e4560e0612689565b60e05160c05260c05160095560c051600a5542600b5542600c557f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc20193860c05160e0524261010052604060e0a1005b635b5a14678118611f2857604436106137f05760075433186137f057600d546137f05764012a05f200600435116137f0576402540be400602435116137f057426203f48081018181106137f0579050604052604051600d55600435600f556024356010556040517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040600460603760406060a2005b634f12fe978118611fa657600436106137f05760075433186137f057600d5442106137f057600d54156137f0576000600d55600f546040526010546060526040516005556060516006557fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d160405160805260605160a05260406080a1005b63226840fb8118611fc957600436106137f05760075433186137f0576000600d55005b637f3e17cb8118611ff557602436106137f05760075433186137f057600435156137f057600435601355005b636b441a40811861207357602436106137f0576004358060a01c6137f05760405260075433186137f057600e546137f057426203f48081018181106137f0579050606052606051600e556040516011556040516060517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006080a3005b636a1c05ae81186120dc57600436106137f05760075433186137f057600e5442106137f057600e54156137f0576000600e556011546040526040516007556040517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006060a2005b6386fbf19381186120ff57600436106137f05760075433186137f0576000600e55005b63e2e7d26481186121cc57602436106137f057600435600181116137f0576001015460405273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6040511861216f5747600435600181116137f057600301548082038281116137f05790509050606052602060606121ca566121ca565b6040516370a0823160605230608052602060606024607c845afa612198573d600060003e3d6000fd5b60203d106137f0576060905051600435600181116137f057600301548082038281116137f0579050905060a052602060a05bf35b6330c54085811861234c57600436106137f05760075433186137f05760006002905b80604052604051600181116137f0576001015460605273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee606051186122745747604051600181116137f057600301548082038281116137f057905090506080526080511561233e57600060a05260a0506000600060a05160c0608051335af161233e573d600060003e3d6000fd61233e565b6060516370a0823160a0523060c052602060a0602460bc845afa61229d573d600060003e3d6000fd5b60203d106137f05760a0905051604051600181116137f057600301548082038281116137f057905090506080526080511561233e5760605163a9059cbb60a0523360c05260805160e052602060a0604460bc6000855af1612303573d600060003e3d6000fd5b3d61231a57803b156137f057600161010052612332565b60203d106137f05760a0518060011c6137f057610100525b610100905051156137f0575b6001018181186121ee575050005b63524c3901811861240a57600436106137f05760075433186137f05760006002905b80604052604051600181116137f0576001015460605273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee606051186123b65747604051600181116137f057600301556123fc565b6060516370a082316080523060a052602060806024609c845afa6123df573d600060003e3d6000fd5b60203d106137f0576080905051604051600181116137f057600301555b60010181811861236e575050005b63e3698853811861243757600436106137f05760075433186137f0574260165411156137f0576001601555005b633046f972811861245a57600436106137f05760075433186137f0576000601555005b63c6610657811861248557602436106137f057600435600181116137f0576001015460405260206040f35b634903b0d181186124b057602436106137f057600435600181116137f0576003015460405260206040f35b63ddca3f4381186124cf57600436106137f05760055460405260206040f35b63fee3f7f981186124ee57600436106137f05760065460405260206040f35b638da5cb5b811861250d57600436106137f05760075460405260206040f35b6382c63066811861252c57600436106137f05760085460405260206040f35b635409491a811861254b57600436106137f05760095460405260206040f35b63b4b577ad811861256a57600436106137f057600a5460405260206040f35b632081066c811861258957600436106137f057600b5460405260206040f35b631405228881186125a857600436106137f057600c5460405260206040f35b63405e28f881186125c757600436106137f057600d5460405260206040f35b63e0a0b58681186125e657600436106137f057600e5460405260206040f35b6358680d0b811861260557600436106137f057600f5460405260206040f35b63e3824462811861262457600436106137f05760105460405260206040f35b631ec0cdc1811861264357600436106137f05760115460405260206040f35b631be913a5811861266257600436106137f05760135460405260206040f35b631ddc3b01811861268157600436106137f05760145460405260206040f35b505b60006000fd5b600c54604052600a5460605260405142106126ad576060518152506127ac566127ac565b600954608052600b5460a0526080516060511161273c576080516080516060518082038281116137f057905090504260a0518082038281116137f057905090508082028115838383041417156137f0579050905060405160a0518082038281116137f0579050905080156137f057808204905090508082038281116137f057905090508152506127ac566127ac565b6080516060516080518082038281116137f057905090504260a0518082038281116137f057905090508082028115838383041417156137f0579050905060405160a0518082038281116137f0579050905080156137f057808204905090508082018281106137f057905090508152505b565b60403660a03760006002905b8060051b6040015160e05260a05160e0518082018281106137f0579050905060a0526001018181186127ba57505060a0516127f95760008152506129b7565b60a05160e0526080518060011b818160011c186137f057905061010052600060ff905b806101205260e0516101405260006002905b8060051b60400151610160526101405160e0518082028115838383041417156137f05790509050610160518060011b818160011c186137f057905080156137f057808204905090506101405260010181811861282e57505060e05160c0526101005160a0518082028115838383041417156137f05790509050606481049050610140518060011b818160011c186137f05790508082018281106137f0579050905060e0518082028115838383041417156137f0579050905061010051606481038181116137f057905060e0518082028115838383041417156137f0579050905060648104905061014051600381028160038204186137f05790508082018281106137f0579050905080156137f0578082049050905060e05260c05160e0511161297d57600160c05160e0518082038281116137f05790509050116129a55760e05183525050506129b7566129a5565b600160e05160c0518082038281116137f05790509050116129a55760e05183525050506129b7565b60010181811861281c57505060006000fd5b565b6080518060011b818160011c186137f057905060c05260a0518060021c905060e05260006002905b806101005260e05160a0518082028115838383041417156137f0579050905061010051600181116137f05760051b6040015180156137f0578082049050905060e0526001018181186129e157505060c0516040518082028115838383041417156137f0579050905060648104905060e0516040518082028115838383041417156137f0579050905060605180156137f057808204905090508082018281106137f05790509050670de0b6b3a7640000810281670de0b6b3a76400008204186137f057905060c0516040518082028115838383041417156137f0579050905060648104905060e0518082018281106137f0579050905080156137f05780820490509050815250565b7ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c160405113612b1b576000815250612db1565b680755bf798b4a1bf1e560405112612b8a57600c6060527f657870206f766572666c6f77000000000000000000000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b670de0b6b3a764000060405160601b056060526c010000000000000000000000006b8000000000000000000000006bb17217f7d1cf79abc9e3b39860605160601b0501056080526bb17217f7d1cf79abc9e3b39860805102606051036060526c10fe68e7fd37d0007b713f76506060510160a0526d02d16720577bd19bf614176fe9ea6c0100000000000000000000000060605160a05102050160a0526d04a4fd9f2a8b96949216d2255a6c60605160a051010360c0526e0587f503bb6ea29d25fcb7401964506c0100000000000000000000000060a05160c05102050160c05279d835ebba824c98fb31b83b2ca45c00000000000000000000000060605160c051020160c0526c240c330e9fb2d9cbaf0fd5aafc6060510360e0526d0277594991cfc85f6e2461837cd96c0100000000000000000000000060605160e05102050160e0526d1a521255e34f6a5061b25ef1c9c46c0100000000000000000000000060605160e05102050360e0526db1bbb201f443cf962f1a1d3db4a56c0100000000000000000000000060605160e05102050160e0526e02c72388d9f74f51a9331fed693f156c0100000000000000000000000060605160e05102050360e0526e05180bb14799ab47a8a8cb2a527d576c0100000000000000000000000060605160e05102050160e05260805160c303600081126137f05760020a74029d9dc38563c32e5c2f6dc192ee70ef65f9978af360e05160c05105600081126137f05702048152505b565b6101205160405261014051606052610160516080526101805160a052612dda6101c06129b9565b6101c0516101a052426014548082038281116137f05790509050670de0b6b3a7640000810281670de0b6b3a76400008204186137f057905060135480156137f057808204905090508060ff1c6137f0577f800000000000000000000000000000000000000000000000000000000000000081146137f057600003604052612e626101e0612ae8565b6101e0516101c0526012546101c0518082028115838383041417156137f057905090506101a0516101c05180670de0b6b3a764000003670de0b6b3a764000081116137f05790508082028115838383041417156137f057905090508082018281106137f05790509050670de0b6b3a764000081049050815250565b6102005161012052610220516101405261024051610160526102605161018052612f08610280612db3565b6102805160125542601455565b6101a05161018051146137f05760006101a051126137f05760016101a051136137f057600061018051126137f057600161018051136137f057612f59610240612689565b61024051610220526101e0516040526102005160605261022051608052612f816102606127ae565b6102605161024052610220518060011b818160011c186137f05790506102605261024051610280526060366102a03760006002905b8061030052610180516103005118612fd5576101c0516102c052613003565b6101a051610300511461305f5761030051600181116137f05760051b6101e001516102c0526130035661305f565b6102a0516102c0518082018281106137f057905090506102a05261028051610240518082028115838383041417156137f057905090506102c0518060011b818160011c186137f057905080156137f05780820490509050610280525b600101818118612fb657505061028051610240518082028115838383041417156137f05790509050606481028160648204186137f0579050610260518060011b818160011c186137f057905080156137f05780820490509050610280526102a05161024051606481028160648204186137f05790506102605180156137f057808204905090508082018281106137f05790509050610300526102405161032052600060ff905b8061034052610320516102e05261032051610320518082028115838383041417156137f05790509050610280518082018281106137f05790509050610320518060011b818160011c186137f0579050610300518082018281106137f05790509050610240518082038281116137f0579050905080156137f05780820490509050610320526102e05161032051116131c55760016102e051610320518082038281116137f05790509050116131f057610320518352505050613202566131f0565b6001610320516102e0518082038281116137f05790509050116131f057610320518352505050613202565b60010181811861310557505060006000fd5b565b6000606051126137f0576001606051136137f0576040518060011b818160011c186137f057905060e05260c051610100526060366101203760006002905b806101805260605161018051146132ce5761018051600181116137f05760051b6080015161014052613273566132ce565b61012051610140518082018281106137f05790509050610120526101005160c0518082028115838383041417156137f05790509050610140518060011b818160011c186137f057905080156137f05780820490509050610100525b6001018181186132425750506101005160c0518082028115838383041417156137f05790509050606481028160648204186137f057905060e0518060011b818160011c186137f057905080156137f05780820490509050610100526101205160c051606481028160648204186137f057905060e05180156137f057808204905090508082018281106137f057905090506101805260c0516101a052600060ff905b806101c0526101a051610160526101a0516101a0518082028115838383041417156137f05790509050610100518082018281106137f057905090506101a0518060011b818160011c186137f0579050610180518082018281106137f0579050905060c0518082038281116137f0579050905080156137f057808204905090506101a052610160516101a0511161342e576001610160516101a0518082038281116137f0579050905011613459576101a051835250505061346b56613459565b60016101a051610160518082038281116137f0579050905011613459576101a051835250505061346b565b60010181811861336f57505060006000fd5b565b613478610260612689565b610260516102405260035461026052600454610280526102605160405261028051606052610240516080526134ae6102c06127ae565b6102c0516102a0526008546318160ddd6102e05260206102e060046102fc845afa6134de573d600060003e3d6000fd5b60203d106137f0576102e09050516102c0526102a051610200516102a0518082028115838383041417156137f057905090506102c05180156137f057808204905090508082038281116137f057905090506102e0526102405160405261022051606052610260516080526102805160a0526102e05160c052613561610320613204565b61032051610300526005548060011b818160011c186137f05790508060021c9050610320526102605161034052610280516103605260006002905b806103805260006103a05261022051610380511861360c5761038051600181116137f05760051b61026001516102e0518082028115838383041417156137f057905090506102a05180156137f05780820490509050610300518082038281116137f057905090506103a052613670565b61038051600181116137f05760051b610260015161038051600181116137f05760051b61026001516102e0518082028115838383041417156137f057905090506102a05180156137f057808204905090508082038281116137f057905090506103a0525b61038051600181116137f05760051b610340018051610320516103a0518082028115838383041417156137f057905090506402540be400810490508082038281116137f0579050905081525060010181811861359c57505061022051600181116137f05760051b61034001516102405160405261022051606052610340516080526103605160a0526102e05160c05261370a6103a0613204565b6103a0518082038281116137f057905090506103805261038051600181038181116137f05790506103805261022051600181116137f05760051b6102600151610300518082038281116137f057905090506103a0526103005161022051600181116137f05760051b610260015260006103c05261030051156137ba576102605161012052610280516101405261024051610160526102e051610180526137b16103e0612db3565b6103e0516103c0525b6103805181526103a051610380518082038281116137f0579050905060208201526102c05160408201526103c051606082015250565b600080fda165767970657283000307000b005b600080fd000000000000000000000000745748bcfd8f9c2de519a71d789be8a63dd7d66c000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000005e8422345238f34275888049021821e8e08caa1f000000000000000000000000f43211935c781d5ca1a41d2041f397b8a7366c7a000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f200Deployed Bytecode
0x6003361161000c57612683565b60003560e01c630b4c7e4d811861064657606436106137f0576000546002146137f05760026000556015546137f0576100466102c0612689565b6102c0516102a0526003546102c0526004546102e0526102c0516040526102e0516060526102a05160805261007c6103206127ae565b610320516103005260085461032052610320516318160ddd610360526020610360600461037c845afa6100b4573d600060003e3d6000fd5b60203d106137f057610360905051610340526040366103603760006002905b806103a052610340516100f9576103a051600181116137f05760051b60040135156137f0575b6103a051600181116137f05760051b6102c001516103a051600181116137f05760051b600401358082018281106137f057905090506103a051600181116137f05760051b61036001526001018181186100d357505061036051604052610380516060526102a05160805261016e6103c06127ae565b6103c0516103a052610300516103a05111156137f0576060366103c0376103a051610420526103405115610408576005548060011b818160011c186137f05790508060021c9050610440526006546104605260006002905b80610480526103a05161048051600181116137f05760051b6102c001518082028115838383041417156137f057905090506103005180156137f057808204905090506104a05260006104c05261048051600181116137f05760051b61036001516104a0511161025e5761048051600181116137f05760051b61036001516104a0518082038281116137f057905090506104c052610289565b6104a05161048051600181116137f05760051b61036001518082038281116137f057905090506104c0525b610440516104c0518082028115838383041417156137f057905090506402540be4008104905061048051600181116137f05760051b6103c0015261048051600181116137f05760051b610360015161048051600181116137f05760051b6103c00151610460518082028115838383041417156137f057905090506402540be400810490508082038281116137f0579050905061048051600181116137f0576003015561048051600181116137f05760051b61036001805161048051600181116137f05760051b6103c001518082038281116137f057905090508152506001018181186101c657505061036051604052610380516060526102a0516080526103916104806127ae565b61048051610420526103405161042051610300518082038281116137f057905090508082028115838383041417156137f057905090506103005180156137f0578082049050905061040052610360516102005261038051610220526102a05161024052610420516102605261041f612edd5661041f565b61036051600355610380516004556103a051610400525b604435610400511015610492576014610440527f536c697070616765207363726577656420796f750000000000000000000000006104605261044050610440518061046001601f826000031636823750506308c379a061040052602061042052601f19601f61044051011660440161041cfd5b60006002905b806104405261044051600181116137f057600101546104605261044051600181116137f05760051b600401356104805273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61046051186104f5576104805134186137f057610577565b610480511561057757610460516323b872dd6104a052336104c052306104e052610480516105005260206104a060646104bc6000855af161053b573d600060003e3d6000fd5b3d61055257803b156137f05760016105205261056b565b60203d106137f0576104a0518060011c6137f057610520525b610520905051156137f0575b600101818118610498575050610320516340c10f1961044052336104605261040051610480526020610440604461045c6000855af16105bb573d600060003e3d6000fd5b60203d106137f057610440518060011c6137f0576104a0526104a05050337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860406004610440376103c051610480526103e0516104a0526103a0516104c05261034051610400518082018281106137f057905090506104e05260c0610440a260206104006003600055f35b633df021248118610b4357608436106137f05760043580600f0b81186137f0576103605260243580600f0b81186137f057610380526000546002146137f05760026000556015546137f0576003546103a0526004546103c05261036051600181116137f05760051b6103a001516044358082018281106137f057905090506103e0526106d3610420612689565b61042051610400526103a0516040526103c051606052610400516080526106fb6104406127ae565b61044051610420526103605161018052610380516101a0526103e0516101c0526103a0516101e0526103c05161020052610736610460612f15565b610460516104405261038051600181116137f05760051b6103a00151610440518082038281116137f05790509050600181038181116137f057905061046052610460516005548082028115838383041417156137f057905090506402540be400810490506104805261046051610480518082038281116137f057905090506104605260643561046051101561085057602e6104a0527f45786368616e676520726573756c74656420696e20666577657220636f696e736104c0527f207468616e2065787065637465640000000000000000000000000000000000006104e0526104a0506104a051806104c001601f826000031636823750506308c379a061046052602061048052601f19601f6104a051011660440161047cfd5b6103a0516104a0526103c0516104c0526103e05161036051600181116137f05760051b6104a001526104405161038051600181116137f05760051b6104a001526104a051610200526104c05161022052610400516102405261042051610260526108b8612edd565b610480516006548082028115838383041417156137f057905090506402540be400810490506104e05261036051600181116137f05760051b6103a001516044358082018281106137f0579050905061036051600181116137f0576003015561038051600181116137f05760051b6103a00151610460518082038281116137f057905090506104e0518082038281116137f0579050905061038051600181116137f0576003015561036051600181116137f057600101546105005273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610500511861099e5760443534186137f057610a1b565b346137f057610500516323b872dd6105205233610540523061056052604435610580526020610520606461053c6000855af16109df573d600060003e3d6000fd5b3d6109f657803b156137f05760016105a052610a0f565b60203d106137f057610520518060011c6137f0576105a0525b6105a0905051156137f0575b61038051600181116137f057600101546105005273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6105005118610a7c5760006105205261052050600060006105205161054061046051335af1610af0573d600060003e3d6000fd610af0565b6105005163a9059cbb61052052336105405261046051610560526020610520604461053c6000855af1610ab4573d600060003e3d6000fd5b3d610acb57803b156137f057600161058052610ae4565b60203d106137f057610520518060011c6137f057610580525b610580905051156137f0575b337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd97140610360516105205260443561054052610380516105605261046051610580526080610520a260206104606003600055f35b346137f05763f446c1d08118610b7757600436106137f057610b6560c0612689565b60c05160648104905060e052602060e0f35b6376a2f0f08118610b9a57600436106137f0576020610b9660c0612689565b60c0f35b63f2388acb8118610c2e57600436106137f0576000546002146137f057610bc26101a0612689565b6101a051610180526003546101a0526004546101c0526101a0516040526101c05160605261018051608052610bf86102006127ae565b610200516101e05260206101a0516040526101c051606052610180516080526101e05160a052610c296102006129b9565b610200f35b6386fc88d38118610cc657600436106137f0576000546002146137f057610c56610220612689565b61022051610200526003546102205260045461024052610220516040526102405160605261020051608052610c8c6102806127ae565b610280516102605260206102205161012052610240516101405261020051610160526102605161018052610cc1610280612db3565b610280f35b63bb7b8b808118610da457600436106137f0576000546002146137f0576003546101e05260045461020052610cfc6101a0612689565b6101a051610220526101e0516040526102005160605261022051608052610d246101c06127ae565b6101c051610180526008546318160ddd6101c05260206101c060046101dc845afa610d54573d600060003e3d6000fd5b60203d106137f0576101c09050516101a05261018051670de0b6b3a7640000810281670de0b6b3a76400008204186137f05790506101a05180156137f057808204905090506101c05260206101c0f35b63ed8e84f38118610f9257606436106137f0576044358060011c6137f057610180526000546002146137f057610ddb6101c0612689565b6101c0516101a0526003546101c0526004546101e0526101c0516040526101e0516060526101a051608052610e116102206127ae565b610220516102005260006002905b806102205261018051610e6a5761022051600181116137f05760051b6101c001805161022051600181116137f05760051b600401358082038281116137f05790509050815250610ea4565b61022051600181116137f05760051b6101c001805161022051600181116137f05760051b600401358082018281106137f057905090508152505b600101818118610e1f5750506101c0516040526101e0516060526101a051608052610ed06102406127ae565b61024051610220526008546318160ddd610260526020610260600461027c845afa610f00573d600060003e3d6000fd5b60203d106137f0576102609050516102405260006102605261018051610f3f5761020051610220518082038281116137f0579050905061026052610f5a565b61022051610200518082038281116137f05790509050610260525b61026051610240518082028115838383041417156137f057905090506102005180156137f05780820490509050610280526020610280f35b635e0d443f81186110c457606436106137f05760043580600f0b81186137f0576103605260243580600f0b81186137f057610380526000546002146137f0576003546103a0526004546103c05261036051600181116137f05760051b6103a001516044358082018281106137f057905090506103e0526103605161018052610380516101a0526103e0516101c0526103a0516101e0526103c0516102005261103b610420612f15565b610420516104005261038051600181116137f05760051b6103a00151610400518082038281116137f05790509050600181038181116137f057905061042052600554610420518082028115838383041417156137f057905090506402540be400810490506104405261042051610440518082038281116137f05790509050610460526020610460f35b635b36389c81186113db57606436106137f0576000546002146137f05760026000556008546040526040516318160ddd608052602060806004609c845afa611111573d600060003e3d6000fd5b60203d106137f057608090505160605260403660803760006002905b8060c05260c051600181116137f0576003015460e05260e0516004358082028115838383041417156137f0579050905060605180156137f057808204905090506101005260c051600181116137f05760051b60240135610100511015611216576030610120527f5769746864726177616c20726573756c74656420696e20666577657220636f69610140527f6e73207468616e206578706563746564000000000000000000000000000000006101605261012050610120518061014001601f826000031636823750506308c379a060e052602061010052601f19601f61012051011660440160fcfd5b60e051610100518082038281116137f0579050905060c051600181116137f057600301556101005160c051600181116137f05760051b6080015260c051600181116137f057600101546101205273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61012051186112b05760006101405261014050600060006101405161016061010051335af1611324573d600060003e3d6000fd611324565b6101205163a9059cbb61014052336101605261010051610180526020610140604461015c6000855af16112e8573d600060003e3d6000fd5b3d6112ff57803b156137f05760016101a052611318565b60203d106137f057610140518060011c6137f0576101a0525b6101a0905051156137f0575b60010181811861112d5750506040516379cc679060c0523360e05260043561010052602060c0604460dc6000855af1611362573d600060003e3d6000fd5b60203d106137f05760c0518060011c6137f057610120526101205050337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60805160c05260a05160e052604036610100376060516004358082038281116137f057905090506101405260a060c0a2604060806003600055f35b63e310327381186119c557606436106137f0576000546002146137f05760026000556015546137f05761140f6102c0612689565b6102c0516102a0526003546102c0526004546102e0526102c0516040526102e0516060526102a0516080526114456103206127ae565b61032051610300526040366103203760006002905b806103605261036051600181116137f05760051b6102c0015161036051600181116137f05760051b600401358082038281116137f0579050905061036051600181116137f05760051b610320015260010181811861145a57505061032051604052610340516060526102a0516080526114d46103806127ae565b6103805161036052604036610380376005548060011b818160011c186137f05790508060021c90506103c0526006546103e05260006002905b806104005261040051600181116137f05760051b6103200151610420526103605161040051600181116137f05760051b6102c001518082028115838383041417156137f057905090506103005180156137f057808204905090506104405260006104605261042051610440511161159d5761042051610440518082038281116137f05790509050610460526115b8565b61044051610420518082038281116137f05790509050610460525b6103c051610460518082028115838383041417156137f057905090506402540be4008104905061040051600181116137f05760051b61038001526104205161040051600181116137f05760051b61038001516103e0518082028115838383041417156137f057905090506402540be400810490508082038281116137f0579050905061040051600181116137f057600301556104205161040051600181116137f05760051b61038001518082038281116137f0579050905061040051600181116137f05760051b610320015260010181811861150d57505061032051604052610340516060526102a0516080526116b06104206127ae565b6104205161040052610320516102005261034051610220526102a0516102405261040051610260526116e0612edd565b60085461042052610420516318160ddd610460526020610460600461047c845afa611710573d600060003e3d6000fd5b60203d106137f0576104609050516104405261030051610400518082038281116137f05790509050610440518082028115838383041417156137f057905090506103005180156137f057808204905090506104605261046051156137f05761046051600181018181106137f0579050610460526044356104605111156117f6576014610480527f536c697070616765207363726577656420796f750000000000000000000000006104a0526104805061048051806104a001601f826000031636823750506308c379a061044052602061046052601f19601f61048051011660440161045cfd5b610420516379cc679061048052336104a052610460516104c0526020610480604461049c6000855af161182e573d600060003e3d6000fd5b60203d106137f057610480518060011c6137f0576104e0526104e0505060006002905b806104805261048051600181116137f05760051b600401356104a0526104a0511561194b5761048051600181116137f057600101546104c05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104c051186118d75760006104e0526104e050600060006104e0516105006104a051335af161194b573d600060003e3d6000fd61194b565b6104c05163a9059cbb6104e05233610500526104a0516105205260206104e060446104fc6000855af161190f573d600060003e3d6000fd5b3d61192657803b156137f05760016105405261193f565b60203d106137f0576104e0518060011c6137f057610540525b610540905051156137f0575b600101818118611851575050337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e6040600461048037610380516104c0526103a0516104e052610360516105005261044051610460518082038281116137f057905090506105205260c0610480a260206104606003600055f35b63cc2b27d78118611a1457604436106137f05760243580600f0b81186137f057610400526000546002146137f0576020600435610200526104005161022052611a0f61042061346d565b610420f35b631a4d01d28118611cef57606436106137f05760243580600f0b81186137f057610400526000546002146137f05760026000556015546137f05760803661042037600435610200526104005161022052611a6f6104a061346d565b6104a080516104205260208101516104405260408101516104605260608101516104805250604435610420511015611b075760186104a0527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006104c0526104a0506104a051806104c001601f826000031636823750506308c379a061046052602061048052601f19601f6104a051011660440161047cfd5b61040051600181116137f057600301805461042051610440516006548082028115838383041417156137f057905090506402540be400810490508082018281106137f057905090508082038281116137f057905090508155506008546379cc67906104a052336104c0526004356104e05260206104a060446104bc6000855af1611b96573d600060003e3d6000fd5b60203d106137f0576104a0518060011c6137f05761050052610500505061040051600181116137f057600101546104a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104a05118611c145760006104c0526104c050600060006104c0516104e061042051335af1611c88573d600060003e3d6000fd611c88565b6104a05163a9059cbb6104c052336104e052610420516105005260206104c060446104dc6000855af1611c4c573d600060003e3d6000fd5b3d611c6357803b156137f057600161052052611c7c565b60203d106137f0576104c0518060011c6137f057610520525b610520905051156137f0575b337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a06004356104c052610420516104e052610460516004358082038281116137f057905090506105005260606104c0a2610480516012554260145560206104206003600055f35b633c157e648118611e1f57604436106137f05760075433186137f057600b546201518081018181106137f057905042106137f057426201518081018181106137f0579050602435106137f057611d4560e0612689565b60e05160c052600435606481028160648204186137f057905060e05260043515611d7757620f423f6004351115611d7a565b60005b156137f05760c05160e05110611daa5760c051600a810281600a8204186137f057905060e051116137f057611dc6565b60c05160e051600a810281600a8204186137f0579050106137f0575b60c05160095560e051600a5542600b55602435600c557fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c25460c0516101005260e051610120524261014052602435610160526080610100a1005b63551a65888118611e9257600436106137f05760075433186137f057611e4560e0612689565b60e05160c05260c05160095560c051600a5542600b5542600c557f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc20193860c05160e0524261010052604060e0a1005b635b5a14678118611f2857604436106137f05760075433186137f057600d546137f05764012a05f200600435116137f0576402540be400602435116137f057426203f48081018181106137f0579050604052604051600d55600435600f556024356010556040517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040600460603760406060a2005b634f12fe978118611fa657600436106137f05760075433186137f057600d5442106137f057600d54156137f0576000600d55600f546040526010546060526040516005556060516006557fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d160405160805260605160a05260406080a1005b63226840fb8118611fc957600436106137f05760075433186137f0576000600d55005b637f3e17cb8118611ff557602436106137f05760075433186137f057600435156137f057600435601355005b636b441a40811861207357602436106137f0576004358060a01c6137f05760405260075433186137f057600e546137f057426203f48081018181106137f0579050606052606051600e556040516011556040516060517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006080a3005b636a1c05ae81186120dc57600436106137f05760075433186137f057600e5442106137f057600e54156137f0576000600e556011546040526040516007556040517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006060a2005b6386fbf19381186120ff57600436106137f05760075433186137f0576000600e55005b63e2e7d26481186121cc57602436106137f057600435600181116137f0576001015460405273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6040511861216f5747600435600181116137f057600301548082038281116137f05790509050606052602060606121ca566121ca565b6040516370a0823160605230608052602060606024607c845afa612198573d600060003e3d6000fd5b60203d106137f0576060905051600435600181116137f057600301548082038281116137f0579050905060a052602060a05bf35b6330c54085811861234c57600436106137f05760075433186137f05760006002905b80604052604051600181116137f0576001015460605273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee606051186122745747604051600181116137f057600301548082038281116137f057905090506080526080511561233e57600060a05260a0506000600060a05160c0608051335af161233e573d600060003e3d6000fd61233e565b6060516370a0823160a0523060c052602060a0602460bc845afa61229d573d600060003e3d6000fd5b60203d106137f05760a0905051604051600181116137f057600301548082038281116137f057905090506080526080511561233e5760605163a9059cbb60a0523360c05260805160e052602060a0604460bc6000855af1612303573d600060003e3d6000fd5b3d61231a57803b156137f057600161010052612332565b60203d106137f05760a0518060011c6137f057610100525b610100905051156137f0575b6001018181186121ee575050005b63524c3901811861240a57600436106137f05760075433186137f05760006002905b80604052604051600181116137f0576001015460605273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee606051186123b65747604051600181116137f057600301556123fc565b6060516370a082316080523060a052602060806024609c845afa6123df573d600060003e3d6000fd5b60203d106137f0576080905051604051600181116137f057600301555b60010181811861236e575050005b63e3698853811861243757600436106137f05760075433186137f0574260165411156137f0576001601555005b633046f972811861245a57600436106137f05760075433186137f0576000601555005b63c6610657811861248557602436106137f057600435600181116137f0576001015460405260206040f35b634903b0d181186124b057602436106137f057600435600181116137f0576003015460405260206040f35b63ddca3f4381186124cf57600436106137f05760055460405260206040f35b63fee3f7f981186124ee57600436106137f05760065460405260206040f35b638da5cb5b811861250d57600436106137f05760075460405260206040f35b6382c63066811861252c57600436106137f05760085460405260206040f35b635409491a811861254b57600436106137f05760095460405260206040f35b63b4b577ad811861256a57600436106137f057600a5460405260206040f35b632081066c811861258957600436106137f057600b5460405260206040f35b631405228881186125a857600436106137f057600c5460405260206040f35b63405e28f881186125c757600436106137f057600d5460405260206040f35b63e0a0b58681186125e657600436106137f057600e5460405260206040f35b6358680d0b811861260557600436106137f057600f5460405260206040f35b63e3824462811861262457600436106137f05760105460405260206040f35b631ec0cdc1811861264357600436106137f05760115460405260206040f35b631be913a5811861266257600436106137f05760135460405260206040f35b631ddc3b01811861268157600436106137f05760145460405260206040f35b505b60006000fd5b600c54604052600a5460605260405142106126ad576060518152506127ac566127ac565b600954608052600b5460a0526080516060511161273c576080516080516060518082038281116137f057905090504260a0518082038281116137f057905090508082028115838383041417156137f0579050905060405160a0518082038281116137f0579050905080156137f057808204905090508082038281116137f057905090508152506127ac566127ac565b6080516060516080518082038281116137f057905090504260a0518082038281116137f057905090508082028115838383041417156137f0579050905060405160a0518082038281116137f0579050905080156137f057808204905090508082018281106137f057905090508152505b565b60403660a03760006002905b8060051b6040015160e05260a05160e0518082018281106137f0579050905060a0526001018181186127ba57505060a0516127f95760008152506129b7565b60a05160e0526080518060011b818160011c186137f057905061010052600060ff905b806101205260e0516101405260006002905b8060051b60400151610160526101405160e0518082028115838383041417156137f05790509050610160518060011b818160011c186137f057905080156137f057808204905090506101405260010181811861282e57505060e05160c0526101005160a0518082028115838383041417156137f05790509050606481049050610140518060011b818160011c186137f05790508082018281106137f0579050905060e0518082028115838383041417156137f0579050905061010051606481038181116137f057905060e0518082028115838383041417156137f0579050905060648104905061014051600381028160038204186137f05790508082018281106137f0579050905080156137f0578082049050905060e05260c05160e0511161297d57600160c05160e0518082038281116137f05790509050116129a55760e05183525050506129b7566129a5565b600160e05160c0518082038281116137f05790509050116129a55760e05183525050506129b7565b60010181811861281c57505060006000fd5b565b6080518060011b818160011c186137f057905060c05260a0518060021c905060e05260006002905b806101005260e05160a0518082028115838383041417156137f0579050905061010051600181116137f05760051b6040015180156137f0578082049050905060e0526001018181186129e157505060c0516040518082028115838383041417156137f0579050905060648104905060e0516040518082028115838383041417156137f0579050905060605180156137f057808204905090508082018281106137f05790509050670de0b6b3a7640000810281670de0b6b3a76400008204186137f057905060c0516040518082028115838383041417156137f0579050905060648104905060e0518082018281106137f0579050905080156137f05780820490509050815250565b7ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c160405113612b1b576000815250612db1565b680755bf798b4a1bf1e560405112612b8a57600c6060527f657870206f766572666c6f77000000000000000000000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b670de0b6b3a764000060405160601b056060526c010000000000000000000000006b8000000000000000000000006bb17217f7d1cf79abc9e3b39860605160601b0501056080526bb17217f7d1cf79abc9e3b39860805102606051036060526c10fe68e7fd37d0007b713f76506060510160a0526d02d16720577bd19bf614176fe9ea6c0100000000000000000000000060605160a05102050160a0526d04a4fd9f2a8b96949216d2255a6c60605160a051010360c0526e0587f503bb6ea29d25fcb7401964506c0100000000000000000000000060a05160c05102050160c05279d835ebba824c98fb31b83b2ca45c00000000000000000000000060605160c051020160c0526c240c330e9fb2d9cbaf0fd5aafc6060510360e0526d0277594991cfc85f6e2461837cd96c0100000000000000000000000060605160e05102050160e0526d1a521255e34f6a5061b25ef1c9c46c0100000000000000000000000060605160e05102050360e0526db1bbb201f443cf962f1a1d3db4a56c0100000000000000000000000060605160e05102050160e0526e02c72388d9f74f51a9331fed693f156c0100000000000000000000000060605160e05102050360e0526e05180bb14799ab47a8a8cb2a527d576c0100000000000000000000000060605160e05102050160e05260805160c303600081126137f05760020a74029d9dc38563c32e5c2f6dc192ee70ef65f9978af360e05160c05105600081126137f05702048152505b565b6101205160405261014051606052610160516080526101805160a052612dda6101c06129b9565b6101c0516101a052426014548082038281116137f05790509050670de0b6b3a7640000810281670de0b6b3a76400008204186137f057905060135480156137f057808204905090508060ff1c6137f0577f800000000000000000000000000000000000000000000000000000000000000081146137f057600003604052612e626101e0612ae8565b6101e0516101c0526012546101c0518082028115838383041417156137f057905090506101a0516101c05180670de0b6b3a764000003670de0b6b3a764000081116137f05790508082028115838383041417156137f057905090508082018281106137f05790509050670de0b6b3a764000081049050815250565b6102005161012052610220516101405261024051610160526102605161018052612f08610280612db3565b6102805160125542601455565b6101a05161018051146137f05760006101a051126137f05760016101a051136137f057600061018051126137f057600161018051136137f057612f59610240612689565b61024051610220526101e0516040526102005160605261022051608052612f816102606127ae565b6102605161024052610220518060011b818160011c186137f05790506102605261024051610280526060366102a03760006002905b8061030052610180516103005118612fd5576101c0516102c052613003565b6101a051610300511461305f5761030051600181116137f05760051b6101e001516102c0526130035661305f565b6102a0516102c0518082018281106137f057905090506102a05261028051610240518082028115838383041417156137f057905090506102c0518060011b818160011c186137f057905080156137f05780820490509050610280525b600101818118612fb657505061028051610240518082028115838383041417156137f05790509050606481028160648204186137f0579050610260518060011b818160011c186137f057905080156137f05780820490509050610280526102a05161024051606481028160648204186137f05790506102605180156137f057808204905090508082018281106137f05790509050610300526102405161032052600060ff905b8061034052610320516102e05261032051610320518082028115838383041417156137f05790509050610280518082018281106137f05790509050610320518060011b818160011c186137f0579050610300518082018281106137f05790509050610240518082038281116137f0579050905080156137f05780820490509050610320526102e05161032051116131c55760016102e051610320518082038281116137f05790509050116131f057610320518352505050613202566131f0565b6001610320516102e0518082038281116137f05790509050116131f057610320518352505050613202565b60010181811861310557505060006000fd5b565b6000606051126137f0576001606051136137f0576040518060011b818160011c186137f057905060e05260c051610100526060366101203760006002905b806101805260605161018051146132ce5761018051600181116137f05760051b6080015161014052613273566132ce565b61012051610140518082018281106137f05790509050610120526101005160c0518082028115838383041417156137f05790509050610140518060011b818160011c186137f057905080156137f05780820490509050610100525b6001018181186132425750506101005160c0518082028115838383041417156137f05790509050606481028160648204186137f057905060e0518060011b818160011c186137f057905080156137f05780820490509050610100526101205160c051606481028160648204186137f057905060e05180156137f057808204905090508082018281106137f057905090506101805260c0516101a052600060ff905b806101c0526101a051610160526101a0516101a0518082028115838383041417156137f05790509050610100518082018281106137f057905090506101a0518060011b818160011c186137f0579050610180518082018281106137f0579050905060c0518082038281116137f0579050905080156137f057808204905090506101a052610160516101a0511161342e576001610160516101a0518082038281116137f0579050905011613459576101a051835250505061346b56613459565b60016101a051610160518082038281116137f0579050905011613459576101a051835250505061346b565b60010181811861336f57505060006000fd5b565b613478610260612689565b610260516102405260035461026052600454610280526102605160405261028051606052610240516080526134ae6102c06127ae565b6102c0516102a0526008546318160ddd6102e05260206102e060046102fc845afa6134de573d600060003e3d6000fd5b60203d106137f0576102e09050516102c0526102a051610200516102a0518082028115838383041417156137f057905090506102c05180156137f057808204905090508082038281116137f057905090506102e0526102405160405261022051606052610260516080526102805160a0526102e05160c052613561610320613204565b61032051610300526005548060011b818160011c186137f05790508060021c9050610320526102605161034052610280516103605260006002905b806103805260006103a05261022051610380511861360c5761038051600181116137f05760051b61026001516102e0518082028115838383041417156137f057905090506102a05180156137f05780820490509050610300518082038281116137f057905090506103a052613670565b61038051600181116137f05760051b610260015161038051600181116137f05760051b61026001516102e0518082028115838383041417156137f057905090506102a05180156137f057808204905090508082038281116137f057905090506103a0525b61038051600181116137f05760051b610340018051610320516103a0518082028115838383041417156137f057905090506402540be400810490508082038281116137f0579050905081525060010181811861359c57505061022051600181116137f05760051b61034001516102405160405261022051606052610340516080526103605160a0526102e05160c05261370a6103a0613204565b6103a0518082038281116137f057905090506103805261038051600181038181116137f05790506103805261022051600181116137f05760051b6102600151610300518082038281116137f057905090506103a0526103005161022051600181116137f05760051b610260015260006103c05261030051156137ba576102605161012052610280516101405261024051610160526102e051610180526137b16103e0612db3565b6103e0516103c0525b6103805181526103a051610380518082038281116137f0579050905060208201526102c05160408201526103c051606082015250565b600080fda165767970657283000307000b
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000745748bcfd8f9c2de519a71d789be8a63dd7d66c000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000005e8422345238f34275888049021821e8e08caa1f000000000000000000000000f43211935c781d5ca1a41d2041f397b8a7366c7a000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f200
-----Decoded View---------------
Arg [0] : _owner (address): 0x745748bcFd8F9c2De519a71D789be8A63dd7d66C
Arg [1] : _coins (address[2]): 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE,0x5E8422345238F34275888049021821E8E08CAa1f
Arg [2] : _pool_token (address): 0xf43211935C781D5ca1a41d2041F397B8A7366C7A
Arg [3] : _A (uint256): 120
Arg [4] : _fee (uint256): 4000000
Arg [5] : _admin_fee (uint256): 5000000000
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000745748bcfd8f9c2de519a71d789be8a63dd7d66c
Arg [1] : 000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
Arg [2] : 0000000000000000000000005e8422345238f34275888049021821e8e08caa1f
Arg [3] : 000000000000000000000000f43211935c781d5ca1a41d2041f397b8a7366c7a
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000078
Arg [5] : 00000000000000000000000000000000000000000000000000000000003d0900
Arg [6] : 000000000000000000000000000000000000000000000000000000012a05f200Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...Loading[ Download: CSV Export ][ Download: CSV Export ]A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
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.