Ready to simplify your web3 experience? Try the all-in-one web3 app trusted by millions worldwide.
Purchase 100+ cryptocurrencies instantly, with Visa/Mastercard, Google/Apple Pay, and a variety of other funding methods.
Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
9 years old Licensed Crypto Casino, Instant Withdraw 24/7, 6000+ Slots available, Paypal Deposit, Instant Live Support 24/7, 30% Rakeback.
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Play 100s of games anonymously with all major cryptos. Join CryptoWins & start winning!
Anonymous play on awesome games - sign up now for 25 free jackpot spins - worth $100s!
Overview
ETH Balance
Eth Value
$19,966.18 (@ $2,415.26/ETH)Token Holdings
Could not find any matches!
- ERC-20 Tokens (12)27.74485834 frxETHFrax Ether (frxETH)$66,822.29@2,408.45663.72536712 rETHRocket Pool ... (rETH)$10,136.28@2,720.888.96601017 stETHstETH (stETH)$21,678.56@2,417.8612.5 Earn rewards at https://reth.farm$ reth.farm (Earn r...)5,000 $ rEthLP.com$ rEthLP.com ($ rEth...)2,382.23 TokenERC-20 TOKEN*[Suspicious]1 TokenERC-20 TOKEN*[Suspicious]3,999.99 TokenERC-20 TOKEN*[Suspicious]1.7 TokenERC-20 TOKEN*[Suspicious]5,000 TokenERC-20 TOKEN*[Suspicious]3,999.99 TokenERC-20 TOKEN*[Suspicious]1.4 TokenERC-20 TOKEN*[Spam]NFT Tokens (32)Official Authorize credential$5 stETH VoucherERC-1155EventERC-1155Official Authorize credentialFRAX: Airdrop NFT VoucherERC-1155Noox.fi Distribution ProtocolNoox.fi : Lido Airdrop RecipientERC-1155Official Authorize credentialRocket Pool: Airdrop NFT VoucherERC-1155Stake-stETH.comStake-stETH.comERC-1155nft-steth.comstETH Mysterybox NFTERC-1155ether-origin.comWithdrawal NFT ether-origin.comERC-1155Let's Go!🎁ERC-1155Let's Go!🎁ERC-1155ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]ERC-1155 TOKEN*[Spam]
More Info
Private Name Tags
ContractCreator
Multichain Info
1 address found via- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 25 from a total of 492 transactions
Transaction Hash MethodBlockFromToRemove_liquidity... 20239994 2024-07-05 11:25:47 71 days ago 1720178747 IN 0 ETH$0.00 0.00144626 7.78013184 Remove_liquidity... 20023923 2024-06-05 6:45:47 101 days ago 1717569947 IN 0 ETH$0.00 0.00154158 7.76776972 Remove_liquidity... 19752901 2024-04-28 9:24:11 139 days ago 1714296251 IN 0 ETH$0.00 0.00129253 7.13500858 Remove_liquidity... 19096104 2024-01-27 6:22:35 231 days ago 1706336555 IN 0 ETH$0.00 0.00204737 11.06737366 Remove_liquidity... 18926350 2024-01-03 10:50:23 255 days ago 1704279023 IN 0 ETH$0.00 0.00380317 20.55857204 Remove_liquidity... 18918796 2024-01-02 9:25:35 256 days ago 1704187535 IN 0 ETH$0.00 0.00371237 20.06644637 Add_liquidity 18918774 2024-01-02 9:21:11 256 days ago 1704187271 IN 0 ETH$0.00 0.00422477 17.55639786 Remove_liquidity... 18904951 2023-12-31 10:45:11 258 days ago 1704019511 IN 0 ETH$0.00 0.002359 12.47622358 Remove_liquidity... 18904951 2023-12-31 10:45:11 258 days ago 1704019511 IN 0 ETH$0.00 0.00230815 12.47622358 Remove_liquidity... 18854761 2023-12-24 9:33:35 265 days ago 1703410415 IN 0 ETH$0.00 0.00380514 20.36709521 Transfer 18827172 2023-12-20 12:38:47 269 days ago 1703075927 IN 0 ETH$0.00 0.00129097 61.35233979 Remove_liquidity... 18732660 2023-12-07 6:34:11 282 days ago 1701930851 IN 0 ETH$0.00 0.00705134 34.90711986 Remove_liquidity 18580250 2023-11-15 22:24:35 303 days ago 1700087075 IN 0 ETH$0.00 0.00877048 39.12915304 Remove_liquidity... 18508382 2023-11-05 21:09:35 314 days ago 1699218575 IN 0 ETH$0.00 0.00509471 27.25262473 Add_liquidity 18507735 2023-11-05 18:57:47 314 days ago 1699210667 IN 0.73 ETH$1,763.14 0.00476353 21.92774617 Remove_liquidity... 18502943 2023-11-05 2:50:11 314 days ago 1699152611 IN 0 ETH$0.00 0.00227729 12.46583603 Add_liquidity 18296127 2023-10-07 4:08:59 343 days ago 1696651739 IN 0.491 ETH$1,185.89 0.00134051 6.90352305 Exchange 18269342 2023-10-03 10:13:11 347 days ago 1696327991 IN 0.001 ETH$2.42 0.00228462 13.2025671 Remove_liquidity... 18246278 2023-09-30 4:56:59 350 days ago 1696049819 IN 0 ETH$0.00 0.00118914 6.39082732 Remove_liquidity... 18240849 2023-09-29 10:43:11 351 days ago 1695984191 IN 0 ETH$0.00 0.00142438 7.65511823 Remove_liquidity... 18190967 2023-09-22 11:04:35 358 days ago 1695380675 IN 0 ETH$0.00 0.00145458 7.81739896 Remove_liquidity... 18170296 2023-09-19 13:36:35 361 days ago 1695130595 IN 0 ETH$0.00 0.00219861 11.81530251 Remove_liquidity... 18168244 2023-09-19 6:42:35 361 days ago 1695105755 IN 0 ETH$0.00 0.00179069 9.6231479 Add_liquidity 18071085 2023-09-05 15:10:35 375 days ago 1693926635 IN 0.15 ETH$362.29 0.00315605 16.24470434 Remove_liquidity... 18047896 2023-09-02 9:19:47 378 days ago 1693646387 IN 0 ETH$0.00 0.00195584 10.51568131 Latest 25 internal transactions (View All)
Advanced mode:Parent Transaction Hash Block From To 20746292 2024-09-14 3:53:11 18 hrs ago 1726285991 0.00244013 ETH$5.89 20739519 2024-09-13 5:11:11 41 hrs ago 1726204271 0.00244 ETH$5.89 20739231 2024-09-13 4:13:23 42 hrs ago 1726200803 0.00244417 ETH$5.90 20726307 2024-09-11 8:54:11 3 days ago 1726044851 0.00118814 ETH$2.87 20723438 2024-09-10 23:17:35 3 days ago 1726010255 0.00202916 ETH$4.90 20718568 2024-09-10 6:56:47 4 days ago 1725951407 0.00111335 ETH$2.69 20715893 2024-09-09 21:58:59 5 days ago 1725919139 0.00186391 ETH$4.50 20711374 2024-09-09 6:49:59 5 days ago 1725864599 0.00090166 ETH$2.18 20709165 2024-09-08 23:26:59 5 days ago 1725838019 0.0006336 ETH$1.53 20707617 2024-09-08 18:15:23 6 days ago 1725819323 0.00098685 ETH$2.38 20705206 2024-09-08 10:09:59 6 days ago 1725790199 0.00076537 ETH$1.85 20703330 2024-09-08 3:53:11 6 days ago 1725767591 0.00065872 ETH$1.59 20701709 2024-09-07 22:27:11 6 days ago 1725748031 0.00106236 ETH$2.57 20699079 2024-09-07 13:39:59 7 days ago 1725716399 0.00108395 ETH$2.62 20696363 2024-09-07 4:34:47 7 days ago 1725683687 0.0008082 ETH$1.95 20694322 2024-09-06 21:45:23 8 days ago 1725659123 0.00243975 ETH$5.89 20688060 2024-09-06 0:46:11 8 days ago 1725583571 0.0010496 ETH$2.54 20685362 2024-09-05 15:44:23 9 days ago 1725551063 0.0132809 ETH$32.08 20463279 2024-08-05 15:31:47 40 days ago 1722871907 5.76033442 ETH$13,912.69 20463278 2024-08-05 15:31:35 40 days ago 1722871895 9.61332226 ETH$23,218.64 20459420 2024-08-05 2:36:59 40 days ago 1722825419 9.17406609 ETH$22,157.73 20459419 2024-08-05 2:36:47 40 days ago 1722825407 10.2187179 ETH$24,680.83 20459418 2024-08-05 2:36:35 40 days ago 1722825395 1.41319999 ETH$3,413.24 20459417 2024-08-05 2:36:23 40 days ago 1722825383 7.11268149 ETH$17,178.95 20459416 2024-08-05 2:36:11 40 days ago 1722825371 4.89219227 ETH$11,815.90 Loading...LoadingSimilar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xF646627A...180EaeFe3The constructor portion of the code might be different and could alter the actual behaviour of the contractContract Name:Vyper_contract
Compiler Versionvyper:0.2.12
Contract Source Code (Vyper language format)
# @version 0.2.12 """ @title LSDx ETH/stETH/frxETH/rETH StableSwap """ from vyper.interfaces import ERC20 interface rETH: def getExchangeRate() -> uint256: view interface CurveToken: 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 event RemoveLiquidityImbalance: provider: indexed(address) token_amounts: uint256[N_COINS] fees: uint256[N_COINS] invariant: uint256 token_supply: uint256 event CommitNewAdmin: deadline: indexed(uint256) admin: indexed(address) event NewAdmin: admin: indexed(address) event CommitNewFee: deadline: indexed(uint256) fee: uint256 admin_fee: uint256 event NewFee: fee: uint256 admin_fee: uint256 event RampA: old_A: uint256 new_A: uint256 initial_time: uint256 future_time: uint256 event StopRampA: A: uint256 t: uint256 # These constants must be set prior to compiling N_COINS: constant(int128) = 4 # 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 A_PRECISION: constant(uint256) = 100 ADMIN_ACTIONS_DELAY: constant(uint256) = 3 * 86400 MIN_RAMP_TIME: constant(uint256) = 86400 coins: public(address[N_COINS]) admin_balances: public(uint256[N_COINS]) fee: public(uint256) # fee * 1e10 admin_fee: public(uint256) # admin_fee * 1e10 owner: public(address) lp_token: public(address) initial_A: public(uint256) future_A: public(uint256) initial_A_time: public(uint256) future_A_time: public(uint256) admin_actions_deadline: public(uint256) transfer_ownership_deadline: public(uint256) future_fee: public(uint256) future_admin_fee: public(uint256) future_owner: public(address) is_killed: bool kill_deadline: uint256 KILL_DEADLINE_DT: constant(uint256) = 2 * 30 * 86400 @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 contracts of coins. Should be in exact order: ETH/stETH/frxETH/rETH @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): if i == 0: assert _coins[i] == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE else: assert _coins[i] != ZERO_ADDRESS self.coins = _coins self.initial_A = _A * A_PRECISION self.future_A = _A * A_PRECISION self.fee = _fee self.admin_fee = _admin_fee self.owner = _owner self.kill_deadline = block.timestamp + KILL_DEADLINE_DT self.lp_token = _pool_token @view @internal def _A() -> uint256: t1: uint256 = self.future_A_time A1: uint256 = self.future_A if block.timestamp < t1: # handle ramping up and down of A 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() @view @internal def _stored_rates() -> uint256[N_COINS]: return [ convert(PRECISION, uint256), convert(PRECISION, uint256), convert(PRECISION, uint256), rETH(self.coins[3]).getExchangeRate() ] @view @internal def _balances(_value: uint256 = 0) -> uint256[N_COINS]: result: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): if i == 0: result[i] = self.balance - self.admin_balances[i] - _value else: result[i] = ERC20(self.coins[i]).balanceOf(self) - self.admin_balances[i] return result @view @external def balances(i: uint256) -> uint256: """ @notice Get the current balance of a coin within the pool, less the accrued admin fees @param i Index value for the coin to query balance of @return Token balance """ return self._balances()[i] @view @internal def _xp(rates: uint256[N_COINS], _value: uint256 = 0) -> uint256[N_COINS]: result: uint256[N_COINS] = rates balances: uint256[N_COINS] = self._balances(_value) for i in range(N_COINS): result[i] = result[i] * balances[i] / PRECISION return result @pure @internal def get_D(xp: uint256[N_COINS], amp: uint256) -> uint256: """ D invariant calculation in non-overflowing integer operations iteratively A * sum(x_i) * n**n + D = A * D * n**n + D**(n+1) / (n**n * prod(x_i)) Converging solution: D[j+1] = (A * n**n * sum(x_i) - D[j]**(n+1) / (n**n prod(x_i))) / (A * n**n - 1) """ S: uint256 = 0 Dprev: uint256 = 0 for _x in xp: S += _x if S == 0: return 0 D: uint256 = S Ann: uint256 = amp * N_COINS for _i in range(255): D_P: uint256 = D for _x in xp: D_P = D_P * D / (_x * N_COINS) # If division by 0, this will be borked: only withdrawal will work. And that is good Dprev = D D = (Ann * S / A_PRECISION + D_P * N_COINS) * D / ((Ann - A_PRECISION) * D / A_PRECISION + (N_COINS + 1) * D_P) # Equality with the precision of 1 if D > Dprev: if D - Dprev <= 1: return D else: if Dprev - D <= 1: return D # convergence typically occurs in 4 rounds or less, this should be unreachable! # if it does happen the pool is borked and LPs can withdraw via `remove_liquidity` raise @view @internal def get_D_mem(rates: uint256[N_COINS], _balances: uint256[N_COINS], amp: uint256) -> uint256: result: uint256[N_COINS] = rates for i in range(N_COINS): result[i] = result[i] * _balances[i] / PRECISION return self.get_D(result, amp) @view @external def get_virtual_price() -> uint256: """ @notice The current virtual price of the pool LP token @dev Useful for calculating profits @return LP token virtual price normalized to 1e18 """ D: uint256 = self.get_D(self._xp(self._stored_rates()), self._A()) # D is in the units similar to DAI (e.g. converted to precision 1e18) # When balanced, D = n * x_u - total virtual value of the portfolio token_supply: uint256 = ERC20(self.lp_token).totalSupply() return D * PRECISION / token_supply @view @external def calc_token_amount(amounts: uint256[N_COINS], is_deposit: bool) -> uint256: """ @notice Calculate addition or reduction in token supply from a deposit or withdrawal @dev This calculation accounts for slippage, but not fees. Needed to prevent front-running, not for precise calculations! @param amounts Amount of each coin being deposited @param is_deposit set True for deposits, False for withdrawals @return Expected amount of LP tokens received """ amp: uint256 = self._A() balances: uint256[N_COINS] = self._balances() rates: uint256[N_COINS] = self._stored_rates() D0: uint256 = self.get_D_mem(rates, balances, amp) for i in range(N_COINS): if is_deposit: balances[i] += amounts[i] else: balances[i] -= amounts[i] D1: uint256 = self.get_D_mem(rates, balances, amp) token_amount: uint256 = ERC20(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 # Initial invariant amp: uint256 = self._A() rates: uint256[N_COINS] = self._stored_rates() lp_token: address = self.lp_token token_supply: uint256 = ERC20(lp_token).totalSupply() D0: uint256 = 0 old_balances: uint256[N_COINS] = self._balances(msg.value) if token_supply != 0: D0 = self.get_D_mem(rates, old_balances, amp) new_balances: uint256[N_COINS] = old_balances for i in range(N_COINS): if token_supply == 0: assert amounts[i] > 0 # dev: initial deposit requires all coins new_balances[i] += amounts[i] # Invariant after change D1: uint256 = self.get_D_mem(rates, new_balances, amp) assert D1 > D0 # We need to recalculate the invariant accounting for fees # to calculate fair user's share fees: uint256[N_COINS] = empty(uint256[N_COINS]) mint_amount: uint256 = 0 D2: uint256 = 0 if token_supply > 0: # Only account for fees if we are not the first to deposit fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) admin_fee: uint256 = self.admin_fee for i in range(N_COINS): ideal_balance: uint256 = D1 * old_balances[i] / D0 difference: uint256 = 0 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 if admin_fee != 0: self.admin_balances[i] += fees[i] * admin_fee / FEE_DENOMINATOR new_balances[i] -= fees[i] D2 = self.get_D_mem(rates, new_balances, amp) mint_amount = token_supply * (D2 - D0) / D0 else: mint_amount = D1 # Take the dust if there was any assert mint_amount >= min_mint_amount, "Slippage screwed you" # Take coins from the sender for i in range(N_COINS): if self.coins[i] == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: assert msg.value == amounts[i] elif amounts[i] > 0: assert ERC20(self.coins[i]).transferFrom(msg.sender, self, amounts[i]) # 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 + x1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n + 1) / (n ** (2 * n) * prod' * A) x_1**2 + b*x_1 = c x_1 = (x_1**2 + c) / (2*x_1 + b) """ # x in the input is converted to the same price/precision assert i != j # dev: same coin assert j >= 0 # dev: j below zero assert j < N_COINS # dev: j above N_COINS # should be unreachable, but good for safety assert i >= 0 assert i < N_COINS amp: uint256 = self._A() D: uint256 = self.get_D(xp, amp) Ann: uint256 = amp * N_COINS c: uint256 = D S_: uint256 = 0 _x: uint256 = 0 y_prev: uint256 = 0 for _i in range(N_COINS): if _i == i: _x = x elif _i != j: _x = xp[_i] else: continue S_ += _x c = c * D / (_x * N_COINS) c = c * D * A_PRECISION / (Ann * N_COINS) b: uint256 = S_ + D * A_PRECISION / Ann # - D y: uint256 = D for _i in range(255): y_prev = y y = (y*y + c) / (2 * y + b - D) # Equality with the precision of 1 if y > y_prev: if y - y_prev <= 1: return y else: if y_prev - y <= 1: return y raise @view @external def get_dy(i: int128, j: int128, dx: uint256) -> uint256: # dx and dy in c-units rates: uint256[N_COINS] = self._stored_rates() xp: uint256[N_COINS] = self._xp(rates) x: uint256 = xp[i] + dx * rates[i] / PRECISION y: uint256 = self.get_y(i, j, x, xp) dy: uint256 = xp[j] - y fee: uint256 = self.fee * dy / FEE_DENOMINATOR return (dy - fee) * PRECISION / rates[j] @view @external def get_dx(i: int128, j: int128, dy: uint256) -> uint256: # dx and dy in c-units rates: uint256[N_COINS] = self._stored_rates() xp: uint256[N_COINS] = self._xp(rates) y: uint256 = xp[j] - (dy * FEE_DENOMINATOR / (FEE_DENOMINATOR - self.fee)) * rates[j] / PRECISION x: uint256 = self.get_y(j, i, y, xp) dx: uint256 = (x - xp[i]) * PRECISION / rates[i] return dx @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 rates: uint256[N_COINS] = self._stored_rates() xp: uint256[N_COINS] = self._xp(rates, msg.value) x: uint256 = xp[i] + dx * rates[i] / PRECISION y: uint256 = self.get_y(i, j, x, xp) dy: uint256 = xp[j] - y - 1 # -1 just in case there were some rounding errors dy_fee: uint256 = dy * self.fee / FEE_DENOMINATOR dy = (dy - dy_fee) * PRECISION / rates[j] assert dy >= min_dy, "Exchange resulted in fewer coins than expected" admin_fee: uint256 = self.admin_fee if admin_fee != 0: dy_admin_fee: uint256 = dy_fee * admin_fee / FEE_DENOMINATOR if dy_admin_fee != 0: self.admin_balances[j] += dy_admin_fee in_coin: address = self.coins[i] if in_coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: assert msg.value == dx else: assert msg.value == 0 assert ERC20(in_coin).transferFrom(msg.sender, self, dx) out_coin: address = self.coins[j] if out_coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: raw_call(msg.sender, b"", value=dy) else: assert ERC20(out_coin).transfer(msg.sender, dy) 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 """ amounts: uint256[N_COINS] = self._balances() lp_token: address = self.lp_token total_supply: uint256 = ERC20(lp_token).totalSupply() CurveToken(lp_token).burnFrom(msg.sender, _amount) # dev: insufficient funds for i in range(N_COINS): value: uint256 = amounts[i] * _amount / total_supply assert value >= _min_amounts[i], "Withdrawal resulted in fewer coins than expected" amounts[i] = value if i == 0: raw_call(msg.sender, b"", value=value) else: assert ERC20(self.coins[i]).transfer(msg.sender, value) 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() rates: uint256[N_COINS] = self._stored_rates() old_balances: uint256[N_COINS] = self._balances() D0: uint256 = self.get_D_mem(rates, old_balances, amp) new_balances: uint256[N_COINS] = old_balances for i in range(N_COINS): new_balances[i] -= _amounts[i] D1: uint256 = self.get_D_mem(rates, 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): ideal_balance: uint256 = D1 * old_balances[i] / D0 new_balance: uint256 = new_balances[i] 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 if admin_fee != 0: self.admin_balances[i] += fees[i] * admin_fee / FEE_DENOMINATOR new_balances[i] -= fees[i] D2: uint256 = self.get_D_mem(rates, new_balances, amp) lp_token: address = self.lp_token token_supply: uint256 = ERC20(lp_token).totalSupply() token_amount: uint256 = (D0 - D2) * token_supply / D0 assert token_amount != 0 # dev: zero tokens burned 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(self.coins[i]).transfer(msg.sender, _amounts[i]) log RemoveLiquidityImbalance(msg.sender, _amounts, fees, D1, token_supply - token_amount) return token_amount @pure @internal def get_y_D(A_: uint256, i: int128, xp: uint256[N_COINS], D: uint256) -> uint256: """ Calculate x[i] if one reduces D from being calculated for xp to D Done by solving quadratic equation iteratively. x_1**2 + x_1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n + 1) / (n ** (2 * n) * prod' * A) x_1**2 + b*x_1 = c x_1 = (x_1**2 + c) / (2*x_1 + b) """ # x in the input is converted to the same price/precision assert i >= 0 # dev: i below zero assert i < N_COINS # dev: i above N_COINS Ann: uint256 = A_ * N_COINS c: uint256 = D S_: uint256 = 0 _x: uint256 = 0 y_prev: uint256 = 0 for _i in range(N_COINS): if _i != i: _x = xp[_i] else: continue S_ += _x c = c * D / (_x * N_COINS) c = c * D * A_PRECISION / (Ann * N_COINS) b: uint256 = S_ + D * A_PRECISION / Ann y: uint256 = D for _i in range(255): y_prev = y y = (y*y + c) / (2 * y + b - D) # Equality with the precision of 1 if y > y_prev: if y - y_prev <= 1: return y else: if y_prev - y <= 1: return y raise @view @internal def _calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> (uint256, uint256): # First, need to calculate # * Get current D # * Solve Eqn against y_i for D - _token_amount amp: uint256 = self._A() rates: uint256[N_COINS] = self._stored_rates() xp: uint256[N_COINS] = self._xp(rates) D0: uint256 = self.get_D(xp, amp) total_supply: uint256 = ERC20(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): 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) rate: uint256 = rates[i] dy = (dy - 1) * PRECISION / rate # Withdraw less to account for rounding errors dy_0: uint256 = (xp[i] - new_y) * PRECISION / rate # w/o fees return dy, dy_0 - dy @view @external def calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> uint256: """ @notice Calculate the amount received when withdrawing a single coin @dev Result is the same for underlying or wrapped asset withdrawals @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 dy, dy_fee = self._calc_withdraw_one_coin(_token_amount, i) assert dy >= _min_amount, "Not enough coins removed" self.admin_balances[i] += 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(self.coins[i]).transfer(msg.sender, dy) log RemoveLiquidityOne(msg.sender, _token_amount, dy) 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 @nonreentrant('lock') def apply_new_fee(): assert msg.sender == self.owner # dev: only owner assert block.timestamp >= self.admin_actions_deadline # dev: insufficient time assert self.admin_actions_deadline != 0 # dev: no active action self.admin_actions_deadline = 0 _fee: uint256 = self.future_fee _admin_fee: uint256 = self.future_admin_fee self.fee = _fee self.admin_fee = _admin_fee log NewFee(_fee, _admin_fee) @external def revert_new_parameters(): assert msg.sender == self.owner # dev: only owner self.admin_actions_deadline = 0 @external def commit_transfer_ownership(_owner: address): assert msg.sender == self.owner # dev: only owner assert self.transfer_ownership_deadline == 0 # dev: active transfer _deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY self.transfer_ownership_deadline = _deadline self.future_owner = _owner log CommitNewAdmin(_deadline, _owner) @external @nonreentrant('lock') 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 @external @nonreentrant('lock') def withdraw_admin_fees(): assert msg.sender == self.owner # dev: only owner for i in range(N_COINS): amount: uint256 = self.admin_balances[i] if amount != 0: if self.coins[i] == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE: raw_call(msg.sender, b"", value=amount) else: assert ERC20(self.coins[i]).transfer(msg.sender, amount) self.admin_balances = empty(uint256[N_COINS]) @external @nonreentrant('lock') def donate_admin_fees(): """ Just in case admin balances somehow become higher than total (rounding error?) this can be used to fix the state, too """ assert msg.sender == self.owner # dev: only owner self.admin_balances = empty(uint256[N_COINS]) @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[4]","indexed":false},{"name":"fees","type":"uint256[4]","indexed":false},{"name":"invariant","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[4]","indexed":false},{"name":"fees","type":"uint256[4]","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amount","type":"uint256","indexed":false},{"name":"coin_amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[4]","indexed":false},{"name":"fees","type":"uint256[4]","indexed":false},{"name":"invariant","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"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[4]"},{"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"}],"gas":10374},{"stateMutability":"view","type":"function","name":"A_precise","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":10336},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":30020},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":1437134},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"amounts","type":"uint256[4]"},{"name":"is_deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}],"gas":5469886},{"stateMutability":"payable","type":"function","name":"add_liquidity","inputs":[{"name":"amounts","type":"uint256[4]"},{"name":"min_mint_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":8458917},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3232712},{"stateMutability":"view","type":"function","name":"get_dx","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dy","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3232746},{"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"}],"gas":3401554},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[4]"}],"outputs":[{"name":"","type":"uint256[4]"}],"gas":277993},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_amounts","type":"uint256[4]"},{"name":"_max_burn_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":8593080},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"_token_amount","type":"uint256"},{"name":"i","type":"int128"}],"outputs":[{"name":"","type":"uint256"}],"gas":1222},{"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"}],"gas":4779843},{"stateMutability":"nonpayable","type":"function","name":"ramp_A","inputs":[{"name":"_future_A","type":"uint256"},{"name":"_future_time","type":"uint256"}],"outputs":[],"gas":159399},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A","inputs":[],"outputs":[],"gas":154860},{"stateMutability":"nonpayable","type":"function","name":"commit_new_fee","inputs":[{"name":"new_fee","type":"uint256"},{"name":"new_admin_fee","type":"uint256"}],"outputs":[],"gas":112818},{"stateMutability":"nonpayable","type":"function","name":"apply_new_fee","inputs":[],"outputs":[],"gas":160702},{"stateMutability":"nonpayable","type":"function","name":"revert_new_parameters","inputs":[],"outputs":[],"gas":22952},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_owner","type":"address"}],"outputs":[],"gas":76990},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":122870},{"stateMutability":"nonpayable","type":"function","name":"revert_transfer_ownership","inputs":[],"outputs":[],"gas":23042},{"stateMutability":"nonpayable","type":"function","name":"withdraw_admin_fees","inputs":[],"outputs":[],"gas":312962},{"stateMutability":"nonpayable","type":"function","name":"donate_admin_fees","inputs":[],"outputs":[],"gas":140458},{"stateMutability":"nonpayable","type":"function","name":"kill_me","inputs":[],"outputs":[],"gas":40325},{"stateMutability":"nonpayable","type":"function","name":"unkill_me","inputs":[],"outputs":[],"gas":23162},{"stateMutability":"view","type":"function","name":"coins","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":3247},{"stateMutability":"view","type":"function","name":"admin_balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3277},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3198},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3228},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3258},{"stateMutability":"view","type":"function","name":"lp_token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3288},{"stateMutability":"view","type":"function","name":"initial_A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3318},{"stateMutability":"view","type":"function","name":"future_A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3348},{"stateMutability":"view","type":"function","name":"initial_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3378},{"stateMutability":"view","type":"function","name":"future_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3408},{"stateMutability":"view","type":"function","name":"admin_actions_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3438},{"stateMutability":"view","type":"function","name":"transfer_ownership_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3468},{"stateMutability":"view","type":"function","name":"future_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3498},{"stateMutability":"view","type":"function","name":"future_admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3528},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3558}]
Deployed Bytecode
0x600436101561000d57613967565b600035601c5260005163029b2f34811415610a5b576011541561002f57600080fd5b6001601155600f541561004157600080fd5b610140516006580161396d565b610160526101405261016051610140526101405161016051610180516101a0516101c05160065801613b05565b6101e0526102005261022052610240526101c0526101a0526101805261016052610140526101e080516101605280602001516101805280604001516101a05280606001516101c052506005546101e052602061028060046318160ddd6102205261023c6101e0515afa6100ed57600080fd5b601f3d116100fa57600080fd5b60005061028051610200526000610220526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051346102c0526102c05160065801613bea565b610320526103405261036052610380526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261032080516102405280602001516102605280604001516102805280606001516102a0525060006102005118156102a0576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610160516102c052610180516102e0526101a051610300526101c051610320526102405161034052610260516103605261028051610380526102a0516103a052610140516103c0526103c0516103a05161038051610360516103405161032051610300516102e0516102c05160065801614265565b610420526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261042051610220525b610240516102c052610260516102e05261028051610300526102a0516103205261034060006004818352015b6102005115156102fa576000600461034051600481106102eb57600080fd5b6020020135116102fa57600080fd5b6102c0610340516004811061030e57600080fd5b6020020180516004610340516004811061032757600080fd5b602002013581818301101561033b57600080fd5b808201905090508152505b81516001018083528114156102cc575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516103205161034051610160516103605261018051610380526101a0516103a0526101c0516103c0526102c0516103e0526102e05161040052610300516104205261032051610440526101405161046052610460516104405161042051610400516103e0516103c0516103a051610380516103605160065801614265565b6104c0526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104c0516103405261022051610340511161047357600080fd5b60c03661036037600061020051111561080e576002546004808202821582848304141761049f57600080fd5b80905090509050600c80820490509050610420526003546104405261046060006004818352015b6103405161024061046051600481106104de57600080fd5b602002015180820282158284830414176104f757600080fd5b8090509050905061022051808061050d57600080fd5b8204905090506104805260006104a0526102c0610460516004811061053157600080fd5b602002015161048051111561057a57610480516102c0610460516004811061055857600080fd5b60200201518082101561056a57600080fd5b808203905090506104a0526105b0565b6102c0610460516004811061058e57600080fd5b602002015161048051808210156105a457600080fd5b808203905090506104a0525b610420516104a05180820282158284830414176105cc57600080fd5b809050905090506402540be4008082049050905061036061046051600481106105f457600080fd5b6020020152600061044051181561068257610460516004811061061657600080fd5b600160c052602060c020018054610360610460516004811061063757600080fd5b602002015161044051808202821582848304141761065457600080fd5b809050905090506402540be4008082049050905081818301101561067757600080fd5b808201905090508155505b6102c0610460516004811061069657600080fd5b60200201805161036061046051600481106106b057600080fd5b6020020151808210156106c257600080fd5b808203905090508152505b81516001018083528114156104c6575b5050610140610460525b61046051516020610460510161046052610460610460511015610709576106e7565b6101605161048052610180516104a0526101a0516104c0526101c0516104e0526102c051610500526102e0516105205261030051610540526103205161056052610140516105805261058051610560516105405161052051610500516104e0516104c0516104a0516104805160065801614265565b6105e052610440610460525b61046051526020610460510361046052610140610460511015156107ad5761078a565b6105e05161040052610200516104005161022051808210156107ce57600080fd5b8082039050905080820282158284830414176107e957600080fd5b809050905090506102205180806107ff57600080fd5b8204905090506103e052610817565b610340516103e0525b6084356103e0511015151561086b576308c379a0610420526020610440526014610460527f536c697070616765207363726577656420796f750000000000000000000000006104805261046050606461043cfd5b61042060006004818352015b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610420516004811061089d57600080fd5b600060c052602060c020015414156108d757600461042051600481106108c257600080fd5b602002013534146108d257600080fd5b610977565b6000600461042051600481106108ec57600080fd5b6020020135111561097757602061050060646323b872dd61044052336104605230610480526004610420516004811061092457600080fd5b60200201356104a05261045c6000610420516004811061094357600080fd5b600060c052602060c02001545af161095a57600080fd5b601f3d1161096757600080fd5b6000506105005161097757600080fd5b8151600101808352811415610877575b505060206104c060446340c10f196104205233610440526103e0516104605261043c60006101e0515af16109ba57600080fd5b601f3d116109c757600080fd5b6000506104c0506080600461042037610360516104a052610380516104c0526103a0516104e0526103c051610500526103405161052052610200516103e051818183011015610a1557600080fd5b8082019050905061054052337f3f1915775e0c9a38a57a7bb7f1f9005f486fb904e1f84aa215364d567319a58d610140610420a26103e051600052600060115560206000f35b633df021248114156110cd5760115415610a7457600080fd5b600160115560043580806000811215610a8957195b607f1c15610a9657600080fd5b90505060243580806000811215610aa957195b607f1c15610ab657600080fd5b905050600f5415610ac657600080fd5b6101405161016051610180516101a05160065801613b05565b6101c0526101e05261020052610220526101a0526101805261016052610140526101c080516101405280602001516101605280604001516101805280606001516101a052506101405161016051610180516101a0516101c0516101e05161020051610220516101405161024052610160516102605261018051610280526101a0516102a052346102c0526102c0516102a05161028051610260516102405160065801613d99565b6103205261034052610360526103805261022052610200526101e0526101c0526101a05261018052610160526101405261032080516101c05280602001516101e052806040015161020052806060015161022052506101c060043560048110610bee57600080fd5b602002015160443561014060043560048110610c0957600080fd5b60200201518082028215828483041417610c2257600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015610c4857600080fd5b80820190509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516040600461028037610240516102c0526101c0516102e0526101e05161030052610200516103205261022051610340526103405161032051610300516102e0516102c0516102a051610280516006580161440b565b6103a052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a051610260526101c060243560048110610d1757600080fd5b60200201516102605180821015610d2d57600080fd5b80820390509050600180821015610d4357600080fd5b8082039050905061028052610280516002548082028215828483041417610d6957600080fd5b809050905090506402540be400808204905090506102a052610280516102a05180821015610d9657600080fd5b80820390509050670de0b6b3a76400008082028215828483041417610dba57600080fd5b8090509050905061014060243560048110610dd457600080fd5b60200201518080610de457600080fd5b820490509050610280526064356102805110151515610e67576308c379a06102c05260206102e052602e610300527f45786368616e676520726573756c74656420696e20666577657220636f696e73610320527f207468616e206578706563746564000000000000000000000000000000000000610340526103005060846102dcfd5b6003546102c05260006102c0511815610ef5576102a0516102c0518082028215828483041417610e9657600080fd5b809050905090506402540be400808204905090506102e05260006102e0511815610ef55760243560048110610eca57600080fd5b600160c052602060c0200180546102e051818183011015610eea57600080fd5b808201905090508155505b60043560048110610f0557600080fd5b600060c052602060c02001546102e05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102e0511415610f47576044353414610f4257600080fd5b610fa4565b3415610f5257600080fd5b60206103c060646323b872dd61030052336103205230610340526044356103605261031c60006102e0515af1610f8757600080fd5b601f3d11610f9457600080fd5b6000506103c051610fa457600080fd5b60243560048110610fb457600080fd5b600060c052602060c02001546103005273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610300511415611028576000610320526103208051602001806103608284600060045af161100657600080fd5b5050600060006103605161038061028051335af161102357600080fd5b611076565b60206103c0604463a9059cbb610320523361034052610280516103605261033c6000610300515af161105957600080fd5b601f3d1161106657600080fd5b6000506103c05161107657600080fd5b6004356103205260443561034052602435610360526102805161038052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610320a261028051600052600060115560206000f35b34156110d857600080fd5b63f446c1d0811415611107576006580161396d565b610140526101405160648082049050905060005260206000f35b6376a2f0f081141561112d576006580161396d565b610140526101405160005260206000f35b634903b0d18114156111735760065801613bd3565b6101405261016052610180526101a0526101406004356004811061116557600080fd5b602002015160005260206000f35b63bb7b8b808114156114e0576101405160065801613b05565b61016052610180526101a0526101c0526101405261016080516101e052806020015161020052806040015161022052806060015161024052506101405161016051610180516101a0516101c0516101e0516102005161022051610240516101e051610260526102005161028052610220516102a052610240516102c0526102c0516102a051610280516102605160065801613d6f565b610320526103405261036052610380526102405261022052610200526101e0526101c0526101a05261018052610160526101405261032080516103a05280602001516103c05280604001516103e052806060015161040052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e051610400516006580161396d565b61042052610400526103e0526103c0526103a05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261042051610440526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e0516104005161042051610440516103a051610460526103c051610480526103e0516104a052610400516104c052610440516104e0526104e0516104c0516104a051610480516104605160065801613f63565b610540526104405261042052610400526103e0526103c0526103a05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610540516101405260206101e060046318160ddd6101805261019c6005545afa61148257600080fd5b601f3d1161148f57600080fd5b6000506101e0516101605261014051670de0b6b3a764000080820282158284830414176114bb57600080fd5b809050905090506101605180806114d157600080fd5b82049050905060005260206000f35b63cf701ff781141561193d5760843560011c156114fc57600080fd5b610140516006580161396d565b610160526101405261016051610140526101405161016051610180516101a0516101c05160065801613bd3565b6101e0526102005261022052610240526101c0526101a0526101805261016052610140526101e080516101605280602001516101805280604001516101a05280606001516101c052506101405161016051610180516101a0516101c0516101e05161020051610220516102405160065801613b05565b61026052610280526102a0526102c0526102405261022052610200526101e0526101c0526101a05261018052610160526101405261026080516101e052806020015161020052806040015161022052806060015161024052506101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101e05161028052610200516102a052610220516102c052610240516102e052610160516103005261018051610320526101a051610340526101c05161036052610140516103805261038051610360516103405161032051610300516102e0516102c0516102a0516102805160065801614265565b6103e052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e0516102605261028060006004818352015b6084351561173a5761016061028051600481106116fe57600080fd5b6020020180516004610280516004811061171757600080fd5b602002013581818301101561172b57600080fd5b80820190509050815250611784565b610160610280516004811061174e57600080fd5b6020020180516004610280516004811061176757600080fd5b60200201358082101561177957600080fd5b808203905090508152505b81516001018083528114156116e2575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516101e0516102a052610200516102c052610220516102e0526102405161030052610160516103205261018051610340526101a051610360526101c05161038052610140516103a0526103a05161038051610360516103405161032051610300516102e0516102c0516102a05160065801614265565b6104005261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104005161028052602061032060046318160ddd6102c0526102dc6005545afa61189057600080fd5b601f3d1161189d57600080fd5b600050610320516102a05260006102c052608435156118db576102805161026051808210156118cb57600080fd5b808203905090506102c0526118fc565b6102605161028051808210156118f057600080fd5b808203905090506102c0525b6102c0516102a051808202821582848304141761191857600080fd5b8090509050905061026051808061192e57600080fd5b82049050905060005260206000f35b635e0d443f811415611c97576004358080600081121561195957195b607f1c1561196657600080fd5b9050506024358080600081121561197957195b607f1c1561198657600080fd5b9050506101405161016051610180516101a05160065801613b05565b6101c0526101e05261020052610220526101a0526101805261016052610140526101c080516101405280602001516101605280604001516101805280606001516101a052506101405161016051610180516101a0516101c0516101e05161020051610220516101405161024052610160516102605261018051610280526101a0516102a0526102a05161028051610260516102405160065801613d6f565b6103005261032052610340526103605261022052610200526101e0526101c0526101a05261018052610160526101405261030080516101c05280602001516101e052806040015161020052806060015161022052506101c060043560048110611aa857600080fd5b602002015160443561014060043560048110611ac357600080fd5b60200201518082028215828483041417611adc57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611b0257600080fd5b80820190509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516040600461028037610240516102c0526101c0516102e0526101e05161030052610200516103205261022051610340526103405161032051610300516102e0516102c0516102a051610280516006580161440b565b6103a052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a051610260526101c060243560048110611bd157600080fd5b60200201516102605180821015611be757600080fd5b8082039050905061028052600254610280518082028215828483041417611c0d57600080fd5b809050905090506402540be400808204905090506102a052610280516102a05180821015611c3a57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417611c5e57600080fd5b8090509050905061014060243560048110611c7857600080fd5b60200201518080611c8857600080fd5b82049050905060005260206000f35b6367df02ca811415611ff95760043580806000811215611cb357195b607f1c15611cc057600080fd5b90505060243580806000811215611cd357195b607f1c15611ce057600080fd5b9050506101405161016051610180516101a05160065801613b05565b6101c0526101e05261020052610220526101a0526101805261016052610140526101c080516101405280602001516101605280604001516101805280606001516101a052506101405161016051610180516101a0516101c0516101e05161020051610220516101405161024052610160516102605261018051610280526101a0516102a0526102a05161028051610260516102405160065801613d6f565b6103005261032052610340526103605261022052610200526101e0526101c0526101a05261018052610160526101405261030080516101c05280602001516101e052806040015161020052806060015161022052506101c060243560048110611e0257600080fd5b60200201516044356402540be4008082028215828483041417611e2457600080fd5b809050905090506402540be40060025480821015611e4157600080fd5b808203905090508080611e5357600080fd5b82049050905061014060243560048110611e6c57600080fd5b60200201518082028215828483041417611e8557600080fd5b80905090509050670de0b6b3a76400008082049050905080821015611ea957600080fd5b80820390509050610240526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051602435610280526004356102a052610240516102c0526101c0516102e0526101e05161030052610200516103205261022051610340526103405161032051610300516102e0516102c0516102a051610280516006580161440b565b6103a052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a05161026052610260516101c060043560048110611f8257600080fd5b602002015180821015611f9457600080fd5b80820390509050670de0b6b3a76400008082028215828483041417611fb857600080fd5b8090509050905061014060043560048110611fd257600080fd5b60200201518080611fe257600080fd5b820490509050610280526102805160005260206000f35b637d49d875811415612344576011541561201257600080fd5b60016011556101405161016051610180516101a05160065801613bd3565b6101c0526101e05261020052610220526101a0526101805261016052610140526101c080516101405280602001516101605280604001516101805280606001516101a052506005546101c052602061026060046318160ddd6102005261021c6101c0515afa61209e57600080fd5b601f3d116120ab57600080fd5b600050610260516101e05260206102a060446379cc67906102005233610220526004356102405261021c60006101c0515af16120e657600080fd5b601f3d116120f357600080fd5b6000506102a05061020060006004818352015b610140610200516004811061211a57600080fd5b6020020151600435808202821582848304141761213657600080fd5b809050905090506101e051808061214c57600080fd5b820490509050610220526024610200516004811061216957600080fd5b602002013561022051101515156121e4576308c379a0610240526020610260526030610280527f5769746864726177616c20726573756c74656420696e20666577657220636f696102a0527f6e73207468616e206578706563746564000000000000000000000000000000006102c05261028050608461025cfd5b6102205161014061020051600481106121fc57600080fd5b6020020152610200511515612250576000610240526102408051602001806102808284600060045af161222e57600080fd5b505060006000610280516102a061022051335af161224b57600080fd5b6122b7565b60206102e0604463a9059cbb610240523361026052610220516102805261025c6000610200516004811061228357600080fd5b600060c052602060c02001545af161229a57600080fd5b601f3d116122a757600080fd5b6000506102e0516122b757600080fd5b8151600101808352811415612106575b50506101405161020052610160516102205261018051610240526101a05161026052608036610280376101e0516004358082101561230457600080fd5b8082039050905061030052337f9878ca375e106f2a43c3b599fc624568131c4c9a4ba66a14563715763be9d59d610120610200a260006011556080610140f35b6318a7bd76811415612d48576011541561235d57600080fd5b6001601155600f541561236f57600080fd5b610140516006580161396d565b610160526101405261016051610140526101405161016051610180516101a0516101c05160065801613b05565b6101e0526102005261022052610240526101c0526101a0526101805261016052610140526101e080516101605280602001516101805280604001516101a05280606001516101c052506101405161016051610180516101a0516101c0516101e05161020051610220516102405160065801613bd3565b61026052610280526102a0526102c0526102405261022052610200526101e0526101c0526101a05261018052610160526101405261026080516101e052806020015161020052806040015161022052806060015161024052506101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101605161028052610180516102a0526101a0516102c0526101c0516102e0526101e05161030052610200516103205261022051610340526102405161036052610140516103805261038051610360516103405161032051610300516102e0516102c0516102a0516102805160065801614265565b6103e052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610260526101e05161028052610200516102a052610220516102c052610240516102e05261030060006004818352015b610280610300516004811061258957600080fd5b602002018051600461030051600481106125a257600080fd5b6020020135808210156125b457600080fd5b808203905090508152505b8151600101808352811415612575575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610160516103205261018051610340526101a051610360526101c05161038052610280516103a0526102a0516103c0526102c0516103e0526102e05161040052610140516104205261042051610400516103e0516103c0516103a0516103805161036051610340516103205160065801614265565b61048052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610480516103005260803661032037600254600480820282158284830414176126ea57600080fd5b80905090509050600c808204905090506103a0526003546103c0526103e060006004818352015b610300516101e06103e0516004811061272957600080fd5b6020020151808202821582848304141761274257600080fd5b8090509050905061026051808061275857600080fd5b820490509050610400526102806103e0516004811061277657600080fd5b602002015161042052600061044052610420516104005111156127b8576104005161042051808210156127a857600080fd5b80820390509050610440526127d9565b6104205161040051808210156127cd57600080fd5b80820390509050610440525b6103a0516104405180820282158284830414176127f557600080fd5b809050905090506402540be400808204905090506103206103e0516004811061281d57600080fd5b602002015260006103c05118156128ab576103e0516004811061283f57600080fd5b600160c052602060c0200180546103206103e0516004811061286057600080fd5b60200201516103c051808202821582848304141761287d57600080fd5b809050905090506402540be400808204905090508181830110156128a057600080fd5b808201905090508155505b6102806103e051600481106128bf57600080fd5b6020020180516103206103e051600481106128d957600080fd5b6020020151808210156128eb57600080fd5b808203905090508152505b8151600101808352811415612711575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e051610160516104005261018051610420526101a051610440526101c0516104605261028051610480526102a0516104a0526102c0516104c0526102e0516104e0526101405161050052610500516104e0516104c0516104a051610480516104605161044051610420516104005160065801614265565b610560526103e0526103c0526103a05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610560516103e0526005546104005260206104a060046318160ddd6104405261045c610400515afa612a6257600080fd5b601f3d11612a6f57600080fd5b6000506104a05161042052610260516103e05180821015612a8f57600080fd5b80820390509050610420518082028215828483041417612aae57600080fd5b80905090509050610260518080612ac457600080fd5b8204905090506104405260006104405118612ade57600080fd5b6084356104405111151515612b32576308c379a06104605260206104805260146104a0527f536c697070616765207363726577656420796f750000000000000000000000006104c0526104a050606461047cfd5b602061050060446379cc6790610460523361048052610440516104a05261047c6000610400515af1612b6357600080fd5b601f3d11612b7057600080fd5b6000506105005061046060006004818352015b60046104605160048110612b9657600080fd5b6020020135610480526000610480511815612cab576104605160048110612bbc57600080fd5b600060c052602060c02001546104a05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6104a0511415612c305760006104c0526104c08051602001806105008284600060045af1612c0e57600080fd5b5050600060006105005161052061048051335af1612c2b57600080fd5b612cab565b6020610560604463a9059cbb6104c052336104e05260046104605160048110612c5857600080fd5b6020020135610500526104dc60006104605160048110612c7757600080fd5b600060c052602060c02001545af1612c8e57600080fd5b601f3d11612c9b57600080fd5b60005061056051612cab57600080fd5b8151600101808352811415612b83575b50506080600461046037610320516104e0526103405161050052610360516105205261038051610540526103005161056052610420516104405180821015612d0257600080fd5b8082039050905061058052337fb964b72f73f5ef5bf0fdc559b2fab9a7b12a39e47817a547f1f0aee47febd602610140610460a261044051600052600060115560206000f35b63cc2b27d7811415612dc85760243580806000811215612d6457195b607f1c15612d7157600080fd5b9050506004356101405260243561016052610160516101405160065801614c27565b6101c0526101e0526101c080808080516102005250506020810190508080805161022052505050506102005160005260206000f35b631a4d01d28114156130b35760115415612de157600080fd5b600160115560243580806000811215612df657195b607f1c15612e0357600080fd5b905050600f5415612e1357600080fd5b604036610140376101405161016051600435610180526024356101a0526101a0516101805160065801614c27565b610200526102205261016052610140526102008080808051610240525050602081019050808080516102605250505050610240805161014052806020015161016052506044356101405110151515612ed8576308c379a06101805260206101a05260186101c0527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006101e0526101c050606461019cfd5b60243560048110612ee857600080fd5b600160c052602060c020018054610160516003548082028215828483041417612f1057600080fd5b809050905090506402540be40080820490509050818183011015612f3357600080fd5b80820190509050815550602061022060446379cc679061018052336101a0526004356101c05261019c60006005545af1612f6c57600080fd5b601f3d11612f7957600080fd5b6000506102205060243560048110612f9057600080fd5b600060c052602060c02001546101805273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6101805114156130045760006101a0526101a08051602001806101e08284600060045af1612fe257600080fd5b5050600060006101e05161020061014051335af1612fff57600080fd5b61306a565b6020610240604463a9059cbb6101a052336101c052610140516101e0526101bc60006024356004811061303657600080fd5b600060c052602060c02001545af161304d57600080fd5b601f3d1161305a57600080fd5b6000506102405161306a57600080fd5b6004356101a052610140516101c052337f9e96dd3b997a2a257eec4df9bb6eaf626e206df5f543bd963682d143300be31060406101a0a261014051600052600060115560206000f35b633c157e648114156132545760045433146130cd57600080fd5b600854620151808181830110156130e357600080fd5b808201905090504210156130f657600080fd5b426201518081818301101561310a57600080fd5b80820190509050602435101561311f57600080fd5b610140516006580161396d565b610160526101405261016051610140526004356064808202821582848304141761315557600080fd5b80905090509050610160526000600435111561317857620f42406004351061317b565b60005b61318457600080fd5b610140516101605110156131c7576101405161016051600a80820282158284830414176131b057600080fd5b8090509050905010156131c257600080fd5b6131f7565b61014051600a80820282158284830414176131e157600080fd5b809050905090506101605111156131f757600080fd5b6101405160065561016051600755426008556024356009556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a65888114156132d757600454331461326e57600080fd5b610140516006580161396d565b6101605261014052610160516101405261014051600655610140516007554260085542600955610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b635b5a14678114156133935760045433146132f157600080fd5b600a54156132fe57600080fd5b64012a05f200600435111561331257600080fd5b6402540be400602435111561332657600080fd5b426203f48081818301101561333a57600080fd5b808201905090506101405261014051600a55600435600c55602435600d556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe9781141561343c57601154156133ac57600080fd5b600160115560045433146133bf57600080fd5b600a544210156133ce57600080fd5b6000600a54186133dd57600080fd5b6000600a55600c5461014052600d546101605261014051600255610160516003556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a16000601155005b63226840fb81141561345d57600454331461345657600080fd5b6000600a55005b636b441a408114156134ef5760043560a01c1561347957600080fd5b600454331461348757600080fd5b600b541561349457600080fd5b426203f4808181830110156134a857600080fd5b808201905090506101405261014051600b55600435600e55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae81141561357d576011541561350857600080fd5b6001601155600454331461351b57600080fd5b600b5442101561352a57600080fd5b6000600b541861353957600080fd5b6000600b55600e546101405261014051600455610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a26000601155005b6386fbf19381141561359e57600454331461359757600080fd5b6000600b55005b6330c5408581141561372457601154156135b757600080fd5b600160115560045433146135ca57600080fd5b61014060006004818352015b61014051600481106135e757600080fd5b600160c052602060c02001546101605260006101605118156136e75773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610140516004811061362957600080fd5b600060c052602060c02001541415613680576000610180526101808051602001806101c08284600060045af161365e57600080fd5b5050600060006101c0516101e061016051335af161367b57600080fd5b6136e7565b6020610220604463a9059cbb61018052336101a052610160516101c05261019c600061014051600481106136b357600080fd5b600060c052602060c02001545af16136ca57600080fd5b601f3d116136d757600080fd5b600050610220516136e757600080fd5b81516001018083528114156135d6575b5050600160c052602060c02060008155600060018201556000600282015560006003820155506000601155005b63524c390181141561377b576011541561373d57600080fd5b6001601155600454331461375057600080fd5b600160c052602060c02060008155600060018201556000600282015560006003820155506000601155005b63e36988538114156137aa57600454331461379557600080fd5b42601054116137a357600080fd5b6001600f55005b633046f9728114156137cb5760045433146137c457600080fd5b6000600f55005b63c66106578114156137fc57600435600481106137e757600080fd5b600060c052602060c020015460005260206000f35b63e2e7d26481141561382d576004356004811061381857600080fd5b600160c052602060c020015460005260206000f35b63ddca3f438114156138455760025460005260206000f35b63fee3f7f981141561385d5760035460005260206000f35b638da5cb5b8114156138755760045460005260206000f35b6382c6306681141561388d5760055460005260206000f35b635409491a8114156138a55760065460005260206000f35b63b4b577ad8114156138bd5760075460005260206000f35b632081066c8114156138d55760085460005260206000f35b63140522888114156138ed5760095460005260206000f35b63405e28f881141561390557600a5460005260206000f35b63e0a0b58681141561391d57600b5460005260206000f35b6358680d0b81141561393557600c5460005260206000f35b63e382446281141561394d57600d5460005260206000f35b631ec0cdc181141561396557600e5460005260206000f35b505b60006000fd5b61014052600954610160526007546101805261016051421015613af3576006546101a0526008546101c0526101a051610180511115613a4d576101a051610180516101a051808210156139bf57600080fd5b80820390509050426101c051808210156139d857600080fd5b8082039050905080820282158284830414176139f357600080fd5b80905090509050610160516101c05180821015613a0f57600080fd5b808203905090508080613a2157600080fd5b820490509050818183011015613a3657600080fd5b808201905090506000526000516101405156613aee565b6101a0516101a0516101805180821015613a6657600080fd5b80820390509050426101c05180821015613a7f57600080fd5b808203905090508082028215828483041417613a9a57600080fd5b80905090509050610160516101c05180821015613ab657600080fd5b808203905090508080613ac857600080fd5b82049050905080821015613adb57600080fd5b8082039050905060005260005161014051565b613b03565b6101805160005260005161014051565b005b61014052670de0b6b3a764000061016052670de0b6b3a764000061018052670de0b6b3a76400006101a0526020610220600463e6aa216c6101c0526101dc6003600060c052602060c02001545afa613b5c57600080fd5b601f3d11613b6957600080fd5b60005061022051610240526101605161028052610180516102a0526101a0516102c052610240516102e0526080610260525b600061026051111515613bad57613bc9565b6020610260510361028001516020610260510361026052613b9b565b6101405156613be2575b61016052600061014052613bfa565b600015613bfa575b6101605261014052600050613bfa565b6080366101803761020060006004818352015b610200511515613c7f57476102005160048110613c2957600080fd5b600160c052602060c020015480821015613c4257600080fd5b808203905090506101405180821015613c5a57600080fd5b808203905090506101806102005160048110613c7557600080fd5b6020020152613d1e565b60206102a060246370a0823161022052306102405261023c6102005160048110613ca857600080fd5b600060c052602060c02001545afa613cbf57600080fd5b601f3d11613ccc57600080fd5b6000506102a0516102005160048110613ce457600080fd5b600160c052602060c020015480821015613cfd57600080fd5b808203905090506101806102005160048110613d1857600080fd5b60200201525b8151600101808352811415613c0d575b50506080610200525b600061020051111515613d4957613d65565b6020610200510361018001516020610200510361020052613d37565b6101605156613d91575b6101e05260006101c0526101405261016052610180526101a052600050613db9565b600015613db9575b6101e0526101405261016052610180526101a0526101c052600050613db9565b6101405161020052610160516102205261018051610240526101a051610260526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516101c051610300526103005160065801613bea565b61036052610380526103a0526103c0526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080516102805280602001516102a05280604001516102c05280606001516102e0525061030060006004818352015b6102006103005160048110613eb357600080fd5b60200201516102806103005160048110613ecc57600080fd5b60200201518082028215828483041417613ee557600080fd5b80905090509050670de0b6b3a7640000808204905090506102006103005160048110613f1057600080fd5b60200201525b8151600101808352811415613e9f575b50506080610300525b600061030051111515613f4157613f5d565b6020610300510361020001516020610300510361030052613f2f565b6101e051565b6101e0526101405261016052610180526101a0526101c0526040366102003761026060006004818352015b60206102605102610140015161024052610200805161024051818183011015613fb657600080fd5b808201905090508152505b8151600101808352811415613f8e575b5050610200511515613feb5760006000526000516101e051565b61020051610240526101c0516004808202821582848304141761400d57600080fd5b8090509050905061026052610280600060ff818352015b610240516102a0526102e060006004818352015b60206102e0510261014001516102c0526102a05161024051808202821582848304141761406457600080fd5b809050905090506102c0516004808202821582848304141761408557600080fd5b80905090509050808061409757600080fd5b8204905090506102a0525b8151600101808352811415614038575b50506102405161022052610260516102005180820282158284830414176140d857600080fd5b809050905090506064808204905090506102a0516004808202821582848304141761410257600080fd5b8090509050905081818301101561411857600080fd5b8082019050905061024051808202821582848304141761413757600080fd5b809050905090506102605160648082101561415157600080fd5b8082039050905061024051808202821582848304141761417057600080fd5b8090509050905060648082049050905060056102a051808202821582848304141761419a57600080fd5b809050905090508181830110156141b057600080fd5b8082019050905080806141c257600080fd5b82049050905061024052610220516102405111156142165760016102405161022051808210156141f157600080fd5b80820390509050111515614211576102405160005250506000516101e051565b61424d565b600161022051610240518082101561422d57600080fd5b8082039050905011151561424d576102405160005250506000516101e051565b8151600101808352811415614024575b505060006000fd5b610260526101405261016052610180526101a0526101c0526101e0526102005261022052610240526101405161028052610160516102a052610180516102c0526101a0516102e05261030060006004818352015b61028061030051600481106142cd57600080fd5b60200201516101c061030051600481106142e657600080fd5b602002015180820282158284830414176142ff57600080fd5b80905090509050670de0b6b3a764000080820490509050610280610300516004811061432a57600080fd5b60200201525b81516001018083528114156142b9575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161028051610300526102a051610320526102c051610340526102e051610360526102405161038052610380516103605161034051610320516103005160065801613f63565b6103e0526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e05160005260005161026051565b610220526101405261016052610180526101a0526101c0526101e0526102005261016051610140511861443d57600080fd5b600061016051121561444e57600080fd5b6004610160511261445e57600080fd5b600061014051121561446f57600080fd5b6004610140511261447f57600080fd5b6101405161016051610180516101a0516101c0516101e0516102005161022051610240516006580161396d565b610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261026051610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101a051610280526101c0516102a0526101e0516102c052610200516102e0526102405161030052610300516102e0516102c0516102a0516102805160065801613f63565b61036052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103605161026052610240516004808202821582848304141761459757600080fd5b8090509050905061028052610260516102a0526060366102c03761032060006004818352015b610140516103205114156145d857610180516102e05261460d565b61016051610320511815614608576101a061032051600481106145fa57600080fd5b60200201516102e05261460d565b614689565b6102c080516102e05181818301101561462557600080fd5b808201905090508152506102a05161026051808202821582848304141761464b57600080fd5b809050905090506102e0516004808202821582848304141761466c57600080fd5b80905090509050808061467e57600080fd5b8204905090506102a0525b81516001018083528114156145bd575b50506102a0516102605180820282158284830414176146b757600080fd5b80905090509050606480820282158284830414176146d457600080fd5b8090509050905061028051600480820282158284830414176146f557600080fd5b80905090509050808061470757600080fd5b8204905090506102a0526102c051610260516064808202821582848304141761472f57600080fd5b8090509050905061028051808061474557600080fd5b82049050905081818301101561475a57600080fd5b80820190509050610320526102605161034052610360600060ff818352015b61034051610300526103405161034051808202821582848304141761479d57600080fd5b809050905090506102a0518181830110156147b757600080fd5b8082019050905060026103405180820282158284830414176147d857600080fd5b80905090509050610320518181830110156147f257600080fd5b80820190509050610260518082101561480a57600080fd5b80820390509050808061481c57600080fd5b820490509050610340526103005161034051111561487057600161034051610300518082101561484b57600080fd5b8082039050905011151561486b5761034051600052505060005161022051565b6148a7565b600161030051610340518082101561488757600080fd5b808203905090501115156148a75761034051600052505060005161022051565b8151600101808352811415614779575b505060006000fd5b610220526101405261016052610180526101a0526101c0526101e0526102005260006101605112156148f057600080fd5b6004610160511261490057600080fd5b610140516004808202821582848304141761491a57600080fd5b80905090509050610240526102005161026052606036610280376102e060006004818352015b610160516102e0511815614970576101806102e0516004811061496257600080fd5b60200201516102a052614975565b6149f1565b61028080516102a05181818301101561498d57600080fd5b80820190509050815250610260516102005180820282158284830414176149b357600080fd5b809050905090506102a051600480820282158284830414176149d457600080fd5b8090509050905080806149e657600080fd5b820490509050610260525b8151600101808352811415614940575b505061026051610200518082028215828483041417614a1f57600080fd5b8090509050905060648082028215828483041417614a3c57600080fd5b809050905090506102405160048082028215828483041417614a5d57600080fd5b809050905090508080614a6f57600080fd5b82049050905061026052610280516102005160648082028215828483041417614a9757600080fd5b80905090509050610240518080614aad57600080fd5b820490509050818183011015614ac257600080fd5b808201905090506102e0526102005161030052610320600060ff818352015b610300516102c05261030051610300518082028215828483041417614b0557600080fd5b8090509050905061026051818183011015614b1f57600080fd5b808201905090506002610300518082028215828483041417614b4057600080fd5b809050905090506102e051818183011015614b5a57600080fd5b808201905090506102005180821015614b7257600080fd5b808203905090508080614b8457600080fd5b820490509050610300526102c051610300511115614bd8576001610300516102c05180821015614bb357600080fd5b80820390509050111515614bd35761030051600052505060005161022051565b614c0f565b60016102c0516103005180821015614bef57600080fd5b80820390509050111515614c0f5761030051600052505060005161022051565b8151600101808352811415614ae1575b505060006000fd5b6101805261014052610160526101405161016051610180516101a0516006580161396d565b6101c0526101a0526101805261016052610140526101c0516101a0526101405161016051610180516101a0516101c0516101e051610200516102205160065801613b05565b6102405261026052610280526102a05261022052610200526101e0526101c0526101a05261018052610160526101405261024080516101c05280602001516101e052806040015161020052806060015161022052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516101c0516102c0526101e0516102e0526102005161030052610220516103205261032051610300516102e0516102c05160065801613d6f565b610380526103a0526103c0526103e0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261038080516102405280602001516102605280604001516102805280606001516102a052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c051610240516102e052610260516103005261028051610320526102a051610340526101a05161036052610360516103405161032051610300516102e05160065801613f63565b6103c0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103c0516102c052602061036060046318160ddd6103005261031c6005545afa614e8e57600080fd5b601f3d11614e9b57600080fd5b600050610360516102e0526102c051610140516102c0518082028215828483041417614ec657600080fd5b809050905090506102e0518080614edc57600080fd5b82049050905080821015614eef57600080fd5b80820390509050610300526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516101a0516103405261016051610360526102405161038052610260516103a052610280516103c0526102a0516103e0526103005161040052610400516103e0516103c0516103a051610380516103605161034051600658016148bf565b6104605261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610460516103205260025460048082028215828483041417614ffc57600080fd5b80905090509050600c808204905090506103405261024051610360526102605161038052610280516103a0526102a0516103c0526103e060006004818352015b600061040052610160516103e05114156150be576102406103e0516004811061506457600080fd5b602002015161030051808202821582848304141761508157600080fd5b809050905090506102c051808061509757600080fd5b82049050905061032051808210156150ae57600080fd5b808203905090506104005261513d565b6102406103e051600481106150d257600080fd5b60200201516102406103e051600481106150eb57600080fd5b602002015161030051808202821582848304141761510857600080fd5b809050905090506102c051808061511e57600080fd5b8204905090508082101561513157600080fd5b80820390509050610400525b6103606103e0516004811061515157600080fd5b6020020180516103405161040051808202821582848304141761517357600080fd5b809050905090506402540be400808204905090508082101561519457600080fd5b808203905090508152505b815160010180835281141561503c575b505061036061016051600481106151c557600080fd5b6020020151610140610400525b610400515160206104005101610400526104006104005110156151f4576151d2565b6101a051610420526101605161044052610360516104605261038051610480526103a0516104a0526103c0516104c052610300516104e0526104e0516104c0516104a05161048051610460516104405161042051600658016148bf565b610540526103e0610400525b61040051526020610400510361040052610140610400511015156152805761525d565b610540518082101561529157600080fd5b808203905090506103e0526101c061016051600481106152b057600080fd5b6020020151610400526103e0516001808210156152cc57600080fd5b80820390509050670de0b6b3a764000080820282158284830414176152f057600080fd5b8090509050905061040051808061530657600080fd5b8204905090506103e052610240610160516004811061532457600080fd5b6020020151610320518082101561533a57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761535e57600080fd5b8090509050905061040051808061537457600080fd5b820490509050610420526104806103e0518152610420516103e0518082101561539c57600080fd5b8082039050905081602001525060406104c0525b60006104c0511115156153c2576153de565b60206104c05103610480015160206104c051036104c0526153b0565b6101805156
Loading...LoadingLoading...Loading
Loading...Loading
Loading...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.Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.