![ads](/images/gen/moonpay_20.png)
15M+ users trust MoonPay. Checkout with your preferred payment method.
![ads](/images/gen/cons_20.png)
Ready to onboard to Ethereum? With MetaMask Portfolio, you're in control.
![ads](/images/gen/nexo.png)
Collect points for eligible actions and use multipliers to win big.
![ads](/images/gen/cons_20.png)
Ready to simplify your web3 experience? Try the all-in-one web3 app trusted by millions worldwide.
Opt-in, make your first trade on Exchange Plus & receive random crypto rewards from 10,000 SHIB, to 0.01 BTC.
![ads](/images/gen/zeedex_20.png?v2)
You will earn $Zdex as rewards by any trade or stake on ZeeDex exchange.
![ads](/images/gen/coinsgame_20a.png)
Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
![ads](/images/gen/megadice_20.png)
Play all your favorite Slots & Live Games, including Plinko, Aviator and Crash! Truly anonymous casino.
![ads](/images/gen/bcgames_20.png)
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
![ads](/images/gen/bcgames_20.png)
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
![ads](/images/gen/cw_20.png)
Play 100s of games anonymously with all major cryptos. Join CryptoWins & start winning!
![ads](/images/gen/cryptoslots.png)
Anonymous play on awesome games - sign up now for 25 free jackpot spins - worth $100s!
Overview
ETH Balance
Eth Value
$116,265,199.65 (@ $3,359.53/ETH)Token Holdings
Could not find any matches!
- ERC-20 Tokens (45)1 TSUKADejitaru Tsu... (TSUKA)$0.01@0.009310 SHIShina Inu (SHI)$0.00@0.0035,440.77954654 stETHstETH (stETH)$118,977,886.61@3,357.09690 USDTTether USD (USDT)$690.00@1.0050,000 $+ $50 000 FO... ($)0.1 ARCHAIAi Archive (ARCHAI)110,003 ANMAIANIMAZING AI... (ANMAI)10 BARBIEBarbie (BARBIE)201.984 BGBGBigMouthFrog10,000 CDLCoin Dawn La... (CDL)1,053 DNGDorkNerdGeek (DNG)0.14 OPTethopt.io$0.01@0.04381,053 SECFuckTheSEC (SEC)27,932.19513317 LOFELOFE (LOFE)10,000 MVDGMetaverse Dog10,000,000,000,000,000,0... NLINKNeuralink (NLINK)1,053 PEPEPepe (PEPE)10 PEPEPEPepepe (PEPEPE)10,000 PULAPURE LAND (PULA)102 ELITEThe Elite Ho... (ELITE)10 XELONXElon (XELON)69 ZHDZettahash (ZHD)19,999,999 ZoroZoro (Zoro)0.12 HQG环球股 (HQG)0.01 SHEESHASheesha Finance$0.05@4.77135.7 TokenERC-20 TOKEN*[Suspicious]200 TokenERC-20 TOKEN*[Suspicious]1.4 TokenERC-20 TOKEN*[Suspicious]1.7 TokenERC-20 TOKEN*[Suspicious]6,000 TokenERC-20 TOKEN*[Suspicious]12,000 TokenERC-20 TOKEN*[Suspicious]32 TokenERC-20 TOKEN*[Suspicious]329,562 TokenERC-20 TOKEN*[Suspicious]9,283 TokenERC-20 TOKEN*[Suspicious]98,127 TokenERC-20 TOKEN*[Suspicious]1 TokenERC-20 TOKEN*[Suspicious]400 TokenERC-20 TOKEN*[Unsafe]9,283 TokenERC-20 TOKEN*[Spam]1.4 TokenERC-20 TOKEN*[Spam]1.4 TokenERC-20 TOKEN*[Spam]100 TokenERC-20 TOKEN*[Spam]3,999.99 TokenERC-20 TOKEN*[Spam]7,600 TokenERC-20 TOKEN*[Spam]3,999.99 TokenERC-20 TOKEN*[Spam]100,000,000 TokenERC-20 TOKEN*[Spam]NFT Tokens (31)Official Authorize credential$5 stETH VoucherERC-1155ETH-EventAirdrop.com$5O OOO FOR FREEERC-1155ETH-BONUS.NET+ $50 000 FOR FREE (ETH-AirdropsEvent.com)ERC-1155Event+ $50 000 FOR FREE (ETH-AirdropsEvent.com)ERC-1155GC2023Greeting Cards 2023 Limited Edition GenesisERC-721AirdropLiquidETH.networkERC-1155originethers.comoriginethers.comERC-1155nft-steth.comstETH Mysterybox NFTERC-1155Let's Go!🎁ERC-1155Let's Go!🎁ERC-1155
ERC-1155 TOKEN*
[Suspicious]ERC-1155 TOKEN*
[Suspicious]ERC-1155 TOKEN*
[Suspicious]ERC-1155 TOKEN*
[Suspicious]ERC-721 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]More Info
Private Name Tags
ContractCreator
- 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 72,695 transactions
Transaction Hash MethodBlockFromToValue Remove_liquidity... 20176223 2024-06-26 13:40:23 2 hrs ago 1719409223 IN 0 ETH 0.00088624 6.96147349 Remove_liquidity... 20176151 2024-06-26 13:25:59 2 hrs ago 1719408359 IN 0 ETH 0.0008044 5.57042034 Remove_liquidity... 20175889 2024-06-26 12:33:23 3 hrs ago 1719405203 IN 0 ETH 0.00066406 5.21628612 Remove_liquidity 20175148 2024-06-26 10:04:47 5 hrs ago 1719396287 IN 0 ETH 0.00049573 4.26519435 Remove_liquidity... 20174752 2024-06-26 8:45:23 7 hrs ago 1719391523 IN 0 ETH 0.00045438 3.56920322 Remove_liquidity... 20174518 2024-06-26 7:58:11 8 hrs ago 1719388691 IN 0 ETH 0.00023425 1.84010709 Remove_liquidity... 20174190 2024-06-26 6:51:59 9 hrs ago 1719384719 IN 0 ETH 0.00041066 3.22578672 Add_liquidity 20174186 2024-06-26 6:51:11 9 hrs ago 1719384671 IN 0.103 ETH 0.00046477 3.20025869 Exchange 20173801 2024-06-26 5:33:59 10 hrs ago 1719380039 IN 100 ETH 0.00025792 2.17416279 Add_liquidity 20172737 2024-06-26 2:00:11 14 hrs ago 1719367211 IN 0.00662785 ETH 0.00040165 2.76582108 Add_liquidity 20171886 2024-06-25 23:09:23 16 hrs ago 1719356963 IN 0.00010535 ETH 0.00035699 2.4588871 Exchange 20169530 2024-06-25 15:15:47 24 hrs ago 1719328547 IN 1 ETH 0.00124354 9.16335366 Remove_liquidity... 20168164 2024-06-25 10:41:11 29 hrs ago 1719312071 IN 0 ETH 0.00041048 3.22439716 Remove_liquidity... 20167410 2024-06-25 8:09:47 31 hrs ago 1719302987 IN 0 ETH 0.00056702 4.454022 Remove_liquidity... 20167134 2024-06-25 7:14:11 32 hrs ago 1719299651 IN 0 ETH 0.00057818 4.54168754 Remove_liquidity... 20166486 2024-06-25 5:03:11 34 hrs ago 1719291791 IN 0 ETH 0.00034914 2.74307903 Remove_liquidity... 20162504 2024-06-24 15:41:47 2 days ago 1719243707 IN 0 ETH 0.00099144 7.78784596 Remove_liquidity... 20160989 2024-06-24 10:36:59 2 days ago 1719225419 IN 0 ETH 0.00053338 4.18974262 Add_liquidity 20160217 2024-06-24 8:01:23 2 days ago 1719216083 IN 0.00019305 ETH 0.00010994 5.09194564 Add_liquidity 20159973 2024-06-24 7:12:11 2 days ago 1719213131 IN 0.51532108 ETH 0.00037842 2.16848966 Add_liquidity 20159798 2024-06-24 6:37:11 2 days ago 1719211031 IN 0.51223 ETH 0.00026167 1.80175733 Remove_liquidity... 20158136 2024-06-24 1:02:23 2 days ago 1719190943 IN 0 ETH 0.00023887 1.87637419 Remove_liquidity... 20156408 2024-06-23 19:14:47 2 days ago 1719170087 IN 0 ETH 0.00033385 2.62247925 Add_liquidity 20156396 2024-06-23 19:12:23 2 days ago 1719169943 IN 0.10783109 ETH 0.00048471 2.96105167 Exchange 20156391 2024-06-23 19:11:23 2 days ago 1719169883 IN 0.11 ETH 0.00036037 3.0387039 Latest 25 internal transactions (View All)
Advanced mode:Parent Transaction Hash Block From To Value 20176827 2024-06-26 15:41:35 21 mins ago 1719416495 57.9289331 ETH 20176741 2024-06-26 15:24:23 38 mins ago 1719415463 251.99950741 ETH 20176629 2024-06-26 15:01:59 1 hr ago 1719414119 1.49958997 ETH 20176564 2024-06-26 14:48:47 1 hr ago 1719413327 0.66961768 ETH 20176540 2024-06-26 14:43:59 1 hr ago 1719413039 84.93668758 ETH 20176309 2024-06-26 13:57:35 2 hrs ago 1719410255 43.65701859 ETH 20176298 2024-06-26 13:55:23 2 hrs ago 1719410123 0.06926782 ETH 20176282 2024-06-26 13:52:11 2 hrs ago 1719409931 104.09869879 ETH 20176223 2024-06-26 13:40:23 2 hrs ago 1719409223 0.11002289 ETH 20176151 2024-06-26 13:25:59 2 hrs ago 1719408359 0.09617136 ETH 20176142 2024-06-26 13:24:11 2 hrs ago 1719408251 0.01832055 ETH 20176100 2024-06-26 13:15:47 2 hrs ago 1719407747 47.00310562 ETH 20176079 2024-06-26 13:11:35 2 hrs ago 1719407495 0.56 ETH 20176062 2024-06-26 13:08:11 2 hrs ago 1719407291 117.06328412 ETH 20176050 2024-06-26 13:05:47 2 hrs ago 1719407147 3.76767668 ETH 20176048 2024-06-26 13:05:23 2 hrs ago 1719407123 0.99582443 ETH 20176038 2024-06-26 13:03:23 2 hrs ago 1719407003 72.91429765 ETH 20176024 2024-06-26 13:00:23 3 hrs ago 1719406823 72.91429765 ETH 20176009 2024-06-26 12:57:23 3 hrs ago 1719406643 72.91429765 ETH 20175925 2024-06-26 12:40:35 3 hrs ago 1719405635 2.96711808 ETH 20175916 2024-06-26 12:38:47 3 hrs ago 1719405527 12.22870954 ETH 20175915 2024-06-26 12:38:35 3 hrs ago 1719405515 2.96421732 ETH 20175910 2024-06-26 12:37:35 3 hrs ago 1719405455 2.96402168 ETH 20175893 2024-06-26 12:34:11 3 hrs ago 1719405251 292.1022 ETH 20175889 2024-06-26 12:33:23 3 hrs ago 1719405203 2.0239388 ETH Loading...LoadingSimilar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x32fb6b59...6FF3F4906The constructor portion of the code might be different and could alter the actual behaviour of the contractContract Name:Vyper_contract
Compiler Versionvyper:0.2.8
Contract Source Code (Vyper language format)
# @version 0.2.8 """ @title Curve ETH/stETH StableSwap @author Curve.Fi @license Copyright (c) Curve.Fi, 2020 - all rights reserved """ from vyper.interfaces import ERC20 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 TokenExchangeUnderlying: 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) = 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 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 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 """ assert _coins[0] == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE assert _coins[1] != 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 _balances(_value: uint256 = 0) -> uint256[N_COINS]: return [ self.balance - self.admin_balances[0] - _value, ERC20(self.coins[1]).balanceOf(self) - self.admin_balances[1] ] @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] @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 + 1) # +1 is to prevent /0 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 @external def get_virtual_price() -> uint256: """ @notice The current virtual price of the pool LP token @dev Useful for calculating profits @return LP token virtual price normalized to 1e18 """ D: uint256 = self.get_D(self._balances(), self._A()) # D is in the units similar to DAI (e.g. converted to precision 1e18) # When balanced, D = n * x_u - total virtual value of the portfolio token_supply: uint256 = ERC20(self.lp_token).totalSupply() return D * PRECISION / token_supply @view @external def calc_token_amount(amounts: uint256[N_COINS], is_deposit: bool) -> uint256: """ @notice Calculate addition or reduction in token supply from a deposit or withdrawal @dev This calculation accounts for slippage, but not fees. Needed to prevent front-running, not for precise calculations! @param amounts Amount of each coin being deposited @param is_deposit set True for deposits, False for withdrawals @return Expected amount of LP tokens received """ amp: uint256 = self._A() balances: uint256[N_COINS] = self._balances() D0: uint256 = self.get_D(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 = 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() old_balances: uint256[N_COINS] = self._balances(msg.value) 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] = 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(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(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 assert msg.value == amounts[0] if amounts[1] > 0: assert ERC20(self.coins[1]).transferFrom(msg.sender, self, amounts[1]) # 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: 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 # dx and dy are in aTokens xp: uint256[N_COINS] = self._balances(msg.value) x: uint256 = xp[i] + dx y: uint256 = self.get_y(i, j, x, xp) dy: uint256 = xp[j] - y - 1 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" 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 coin: address = self.coins[1] if i == 0: assert msg.value == dx assert ERC20(coin).transfer(msg.sender, dy) else: assert msg.value == 0 assert ERC20(coin).transferFrom(msg.sender, self, dx) raw_call(msg.sender, b"", value=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[1]).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() old_balances: uint256[N_COINS] = self._balances() D0: uint256 = self.get_D(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(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(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 if _amounts[0] != 0: raw_call(msg.sender, b"", value=_amounts[0]) if _amounts[1] != 0: assert ERC20(self.coins[1]).transfer(msg.sender, _amounts[1]) 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 + 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 >= 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() xp: uint256[N_COINS] = self._balances() 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) dy -= 1 # Withdraw less to account for rounding errors dy_0: uint256 = xp[i] - new_y # 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 if i == 0: raw_call(msg.sender, b"", value=dy) else: assert ERC20(self.coins[1]).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 amount: uint256 = self.admin_balances[0] if amount != 0: raw_call(msg.sender, b"", value=amount) amount = self.admin_balances[1] if amount != 0: assert ERC20(self.coins[1]).transfer(msg.sender, amount) self.admin_balances = empty(uint256[N_COINS]) @external 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":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"TokenExchangeUnderlying","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256","name":"token_amount","indexed":false},{"type":"uint256","name":"coin_amount","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"type":"uint256","name":"deadline","indexed":true},{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewFee","inputs":[{"type":"uint256","name":"deadline","indexed":true},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewFee","inputs":[{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampA","inputs":[{"type":"uint256","name":"old_A","indexed":false},{"type":"uint256","name":"new_A","indexed":false},{"type":"uint256","name":"initial_time","indexed":false},{"type":"uint256","name":"future_time","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"t","indexed":false}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"address","name":"_owner"},{"type":"address[2]","name":"_coins"},{"type":"address","name":"_pool_token"},{"type":"uint256","name":"_A"},{"type":"uint256","name":"_fee"},{"type":"uint256","name":"_admin_fee"}],"stateMutability":"nonpayable","type":"constructor"},{"name":"A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":5289},{"name":"A_precise","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":5251},{"name":"balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"i"}],"stateMutability":"view","type":"function","gas":5076},{"name":"get_virtual_price","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1114301},{"name":"calc_token_amount","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"amounts"},{"type":"bool","name":"is_deposit"}],"stateMutability":"view","type":"function","gas":2218181},{"name":"add_liquidity","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"amounts"},{"type":"uint256","name":"min_mint_amount"}],"stateMutability":"payable","type":"function","gas":3484118},{"name":"get_dy","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"stateMutability":"view","type":"function","gas":2654541},{"name":"exchange","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"stateMutability":"payable","type":"function","gas":2810134},{"name":"remove_liquidity","outputs":[{"type":"uint256[2]","name":""}],"inputs":[{"type":"uint256","name":"_amount"},{"type":"uint256[2]","name":"_min_amounts"}],"stateMutability":"nonpayable","type":"function","gas":160545},{"name":"remove_liquidity_imbalance","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"_amounts"},{"type":"uint256","name":"_max_burn_amount"}],"stateMutability":"nonpayable","type":"function","gas":3519382},{"name":"calc_withdraw_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"}],"stateMutability":"view","type":"function","gas":1435},{"name":"remove_liquidity_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"},{"type":"uint256","name":"_min_amount"}],"stateMutability":"nonpayable","type":"function","gas":4113806},{"name":"ramp_A","outputs":[],"inputs":[{"type":"uint256","name":"_future_A"},{"type":"uint256","name":"_future_time"}],"stateMutability":"nonpayable","type":"function","gas":151834},{"name":"stop_ramp_A","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":148595},{"name":"commit_new_fee","outputs":[],"inputs":[{"type":"uint256","name":"new_fee"},{"type":"uint256","name":"new_admin_fee"}],"stateMutability":"nonpayable","type":"function","gas":110431},{"name":"apply_new_fee","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":153115},{"name":"revert_new_parameters","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":21865},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"_owner"}],"stateMutability":"nonpayable","type":"function","gas":74603},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":116583},{"name":"revert_transfer_ownership","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":21955},{"name":"withdraw_admin_fees","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":137597},{"name":"donate_admin_fees","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":42144},{"name":"kill_me","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":37938},{"name":"unkill_me","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":22075},{"name":"coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2160},{"name":"admin_balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2190},{"name":"fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2111},{"name":"admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2141},{"name":"owner","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2171},{"name":"lp_token","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2201},{"name":"initial_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2231},{"name":"future_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2261},{"name":"initial_A_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2291},{"name":"future_A_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2321},{"name":"admin_actions_deadline","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2351},{"name":"transfer_ownership_deadline","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2381},{"name":"future_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2411},{"name":"future_admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2441},{"name":"future_owner","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2471}]
Deployed Bytecode
0x600436101561000d57613d71565b600035601c526000156101b6575b610140526009546101605260075461018052610160514210156101a3576006546101a0526008546101c0526101a0516101805111156100fc576101a051610180516101a0518082101561006d57600080fd5b80820390509050426101c0518082101561008657600080fd5b8082039050905080820282158284830414176100a157600080fd5b80905090509050610160516101c051808210156100bd57600080fd5b8082039050905080806100cf57600080fd5b8204905090508181830110156100e457600080fd5b8082019050905060005260005161014051565061019e565b6101a0516101a051610180518082101561011557600080fd5b80820390509050426101c0518082101561012e57600080fd5b80820390509050808202821582848304141761014957600080fd5b80905090509050610160516101c0518082101561016557600080fd5b80820390509050808061017757600080fd5b8204905090508082101561018a57600080fd5b808203905090506000526000516101405156505b6101b4565b610180516000526000516101405156505b005b63f446c1d060005114156101f45734156101cf57600080fd5b6006580161001b565b610140526101405160648082049050905060005260206000f350005b6376a2f0f0600051141561022957341561020d57600080fd5b6006580161001b565b610140526101405160005260206000f350005b600015610240575b61016052600061014052610260565b600015610258575b6101605261014052600050610260565b600015610344575b47600160c052602060c020548082101561027957600080fd5b80820390509050610140518082101561029157600080fd5b8082039050905061024052602061020060246370a0823161018052306101a05261019c6001600060c052602060c02001545afa6102cd57600080fd5b601f3d116102da57600080fd5b600050610200516001600160c052602060c0200154808210156102fc57600080fd5b80820390509050610260526040610220525b6000610220511115156103205761033c565b602061022051036102400151602061022051036102205261030e565b610160515650005b634903b0d1600051141561039157341561035d57600080fd5b60065801610231565b61014052610160526101406004356002811061038157600080fd5b602002015160005260206000f350005b6000156106b1575b6101a0526101405261016052610180526040366101c03761022060006002818352015b602061022051026101400151610200526101c08051610200518181830110156103e457600080fd5b808201905090508152505b81516001018083528114156103bc575b50506101c051151561041a5760006000526000516101a05156505b6101c05161020052610180516002808202821582848304141761043c57600080fd5b8090509050905061022052610240600060ff818352015b61020051610260526102a060006002818352015b60206102a051026101400151610280526102605161020051808202821582848304141761049357600080fd5b8090509050905061028051600280820282158284830414176104b457600080fd5b8090509050905060018181830110156104cc57600080fd5b8082019050905080806104de57600080fd5b820490509050610260525b8151600101808352811415610467575b5050610200516101e052610220516101c051808202821582848304141761051f57600080fd5b80905090509050606480820490509050610260516002808202821582848304141761054957600080fd5b8090509050905081818301101561055f57600080fd5b8082019050905061020051808202821582848304141761057e57600080fd5b809050905090506102205160648082101561059857600080fd5b808203905090506102005180820282158284830414176105b757600080fd5b8090509050905060648082049050905060036102605180820282158284830414176105e157600080fd5b809050905090508181830110156105f757600080fd5b80820190509050808061060957600080fd5b820490509050610200526101e05161020051111561065e576001610200516101e0518082101561063857600080fd5b80820390509050111515610659576102005160005250506000516101a05156505b610697565b60016101e051610200518082101561067557600080fd5b80820390509050111515610696576102005160005250506000516101a05156505b5b5b8151600101808352811415610453575b505060006000fd005b63bb7b8b8060005114156108255734156106ca57600080fd5b6101405160065801610231565b61016052610180526101405261016080516101a05280602001516101c052506101405161016051610180516101a0516101c0516006580161001b565b6101e0526101c0526101a0526101805261016052610140526101e051610200526101405161016051610180516101a0516101c0516101e051610200516101a051610220526101c05161024052610200516102605261026051610240516102205160065801610399565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c0516101405260206101e060046318160ddd6101805261019c6005545afa6107c557600080fd5b601f3d116107d257600080fd5b6000506101e0516101605261014051670de0b6b3a764000080820282158284830414176107fe57600080fd5b8090509050905061016051808061081457600080fd5b82049050905060005260206000f350005b63ed8e84f36000511415610af257341561083e57600080fd5b60443560011c1561084e57600080fd5b610140516006580161001b565b6101605261014052610160516101405261014051610160516101805160065801610231565b6101a0526101c0526101805261016052610140526101a0805161016052806020015161018052506101405161016051610180516101a051610160516101c052610180516101e0526101405161020052610200516101e0516101c05160065801610399565b610260526101a052610180526101605261014052610260516101a0526101c060006002818352015b60443515610964576101606101c0516002811061092857600080fd5b60200201805160046101c0516002811061094157600080fd5b602002013581818301101561095557600080fd5b808201905090508152506109ae565b6101606101c0516002811061097857600080fd5b60200201805160046101c0516002811061099157600080fd5b6020020135808210156109a357600080fd5b808203905090508152505b5b815160010180835281141561090c575b50506101405161016051610180516101a0516101c051610160516101e0526101805161020052610140516102205261022051610200516101e05160065801610399565b610280526101c0526101a052610180526101605261014052610280516101c052602061026060046318160ddd6102005261021c6005545afa610a4357600080fd5b601f3d11610a5057600080fd5b600050610260516101e05260006102005260443515610a8e576101c0516101a05180821015610a7e57600080fd5b8082039050905061020052610aaf565b6101a0516101c05180821015610aa357600080fd5b80820390509050610200525b610200516101e0518082028215828483041417610acb57600080fd5b809050905090506101a0518080610ae157600080fd5b82049050905060005260206000f350005b630b4c7e4d60005114156112535762ffffff5415610b0f57600080fd5b600162ffffff55600f5415610b2357600080fd5b610140516006580161001b565b61016052610140526101605161014052610140516101605161018051346101a0526101a05160065801610248565b6102005261022052610180526101605261014052610200805161016052806020015161018052506101405161016051610180516101a051610160516101c052610180516101e0526101405161020052610200516101e0516101c05160065801610399565b610260526101a052610180526101605261014052610260516101a0526005546101c052602061026060046318160ddd6102005261021c6101c0515afa610c0757600080fd5b601f3d11610c1457600080fd5b600050610260516101e0526101605161020052610180516102205261024060006002818352015b6101e0511515610c6a57600060046102405160028110610c5a57600080fd5b602002013511610c6957600080fd5b5b6102006102405160028110610c7e57600080fd5b60200201805160046102405160028110610c9757600080fd5b6020020135818183011015610cab57600080fd5b808201905090508152505b8151600101808352811415610c3b575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161020051610260526102205161028052610140516102a0526102a051610280516102605160065801610399565b610300526102405261022052610200526101e0526101c0526101a05261018052610160526101405261030051610240526101a0516102405111610d5b57600080fd5b6080366102603760006101e05111156110ae5760025460028082028215828483041417610d8757600080fd5b809050905090506004808204905090506102e0526003546103005261032060006002818352015b610240516101606103205160028110610dc657600080fd5b60200201518082028215828483041417610ddf57600080fd5b809050905090506101a0518080610df557600080fd5b820490509050610340526000610360526102006103205160028110610e1957600080fd5b6020020151610340511115610e6257610340516102006103205160028110610e4057600080fd5b602002015180821015610e5257600080fd5b8082039050905061036052610e98565b6102006103205160028110610e7657600080fd5b60200201516103405180821015610e8c57600080fd5b80820390509050610360525b6102e051610360518082028215828483041417610eb457600080fd5b809050905090506402540be400808204905090506102606103205160028110610edc57600080fd5b60200201526000610300511815610f6a576103205160028110610efe57600080fd5b600160c052602060c0200180546102606103205160028110610f1f57600080fd5b6020020151610300518082028215828483041417610f3c57600080fd5b809050905090506402540be40080820490509050818183011015610f5f57600080fd5b808201905090508155505b6102006103205160028110610f7e57600080fd5b6020020180516102606103205160028110610f9857600080fd5b602002015180821015610faa57600080fd5b808203905090508152505b8151600101808352811415610dae575b5050610140610320525b61032051516020610320510161032052610320610320511015610ff157610fcf565b61020051610340526102205161036052610140516103805261038051610360516103405160065801610399565b6103e052610300610320525b610320515260206103205103610320526101406103205110151561104d5761102a565b6103e0516102c0526101e0516102c0516101a0518082101561106e57600080fd5b80820390509050808202821582848304141761108957600080fd5b809050905090506101a051808061109f57600080fd5b8204905090506102a0526110b7565b610240516102a0525b6044356102a0511015151561110b576308c379a06102e0526020610300526014610320527f536c697070616765207363726577656420796f75000000000000000000000000610340526103205060646102fcfd5b600435341461111957600080fd5b600060243511156111815760206103a060646323b872dd6102e05233610300523061032052602435610340526102fc60006001600060c052602060c02001545af161116357600080fd5b601f3d1161117057600080fd5b6000506103a05161118057600080fd5b5b602061038060446340c10f196102e05233610300526102a051610320526102fc60006101c0515af16111b257600080fd5b601f3d116111bf57600080fd5b600050610380506004356102e052602435610300526102605161032052610280516103405261024051610360526101e0516102a05181818301101561120357600080fd5b8082019050905061038052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c06102e0a26102a051600052600062ffffff5560206000f350600062ffffff55005b6000156116d5575b6101e0526101405261016052610180526101a0526101c05261016051610140511861128557600080fd5b600061016051121561129657600080fd5b600261016051126112a657600080fd5b60006101405112156112b757600080fd5b600261014051126112c757600080fd5b6101405161016051610180516101a0516101c0516101e051610200516006580161001b565b61022052610200526101e0526101c0526101a05261018052610160526101405261022051610200526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c05161026052610200516102805261028051610260516102405160065801610399565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e0516102205261020051600280820282158284830414176113a757600080fd5b80905090509050610240526102205161026052606036610280376102e060006002818352015b610140516102e05114156113e857610180516102a05261141e565b610160516102e0511815611418576101a06102e0516002811061140a57600080fd5b60200201516102a05261141d565b61149a565b5b61028080516102a05181818301101561143657600080fd5b808201905090508152506102605161022051808202821582848304141761145c57600080fd5b809050905090506102a0516002808202821582848304141761147d57600080fd5b80905090509050808061148f57600080fd5b820490509050610260525b81516001018083528114156113cd575b5050610260516102205180820282158284830414176114c857600080fd5b80905090509050606480820282158284830414176114e557600080fd5b80905090509050610240516002808202821582848304141761150657600080fd5b80905090509050808061151857600080fd5b8204905090506102605261028051610220516064808202821582848304141761154057600080fd5b8090509050905061024051808061155657600080fd5b82049050905081818301101561156b57600080fd5b808201905090506102e0526102205161030052610320600060ff818352015b610300516102c052610300516103005180820282158284830414176115ae57600080fd5b80905090509050610260518181830110156115c857600080fd5b8082019050905060026103005180820282158284830414176115e957600080fd5b809050905090506102e05181818301101561160357600080fd5b80820190509050610220518082101561161b57600080fd5b80820390509050808061162d57600080fd5b820490509050610300526102c051610300511115611682576001610300516102c0518082101561165c57600080fd5b8082039050905011151561167d576103005160005250506000516101e05156505b6116bb565b60016102c051610300518082101561169957600080fd5b808203905090501115156116ba576103005160005250506000516101e05156505b5b5b815160010180835281141561158a575b505060006000fd005b635e0d443f60005114156118aa5734156116ee57600080fd5b600435808060008112156116fe57195b607f1c1561170b57600080fd5b9050506024358080600081121561171e57195b607f1c1561172b57600080fd5b905050610140516101605160065801610231565b610180526101a0526101605261014052610180805161014052806020015161016052506101406004356002811061177557600080fd5b602002015160443581818301101561178c57600080fd5b80820190509050610180526101405161016051610180516101a0516004356101c0526024356101e0526101805161020052610140516102205261016051610240526102405161022051610200516101e0516101c0516006580161125b565b6102a0526101a0526101805261016052610140526102a0516101a0526101406024356002811061181957600080fd5b60200201516101a0518082101561182f57600080fd5b8082039050905060018082101561184557600080fd5b808203905090506101c0526002546101c051808202821582848304141761186b57600080fd5b809050905090506402540be400808204905090506101e0526101c0516101e0518082101561189857600080fd5b8082039050905060005260206000f350005b633df021246000511415611d1d5762ffffff54156118c757600080fd5b600162ffffff55600435808060008112156118de57195b607f1c156118eb57600080fd5b905050602435808060008112156118fe57195b607f1c1561190b57600080fd5b905050600f541561191b57600080fd5b610140516101605134610180526101805160065801610248565b6101e0526102005261016052610140526101e0805161014052806020015161016052506101406004356002811061196b57600080fd5b602002015160443581818301101561198257600080fd5b80820190509050610180526101405161016051610180516101a0516004356101c0526024356101e0526101805161020052610140516102205261016051610240526102405161022051610200516101e0516101c0516006580161125b565b6102a0526101a0526101805261016052610140526102a0516101a05261014060243560028110611a0f57600080fd5b60200201516101a05180821015611a2557600080fd5b80820390509050600180821015611a3b57600080fd5b808203905090506101c0526101c0516002548082028215828483041417611a6157600080fd5b809050905090506402540be400808204905090506101e0526101c0516101e05180821015611a8e57600080fd5b808203905090506101c0526064356101c05110151515611b12576308c379a061020052602061022052602e610240527f45786368616e676520726573756c74656420696e20666577657220636f696e73610260527f207468616e2065787065637465640000000000000000000000000000000000006102805261024050608461021cfd5b600354610200526000610200511815611ba1576101e051610200518082028215828483041417611b4157600080fd5b809050905090506402540be40080820490509050610220526000610220511815611ba05760243560028110611b7557600080fd5b600160c052602060c02001805461022051818183011015611b9557600080fd5b808201905090508155505b5b6001600060c052602060c0200154610220526004351515611c1d576044353414611bca57600080fd5b60206102e0604463a9059cbb6102405233610260526101c0516102805261025c6000610220515af1611bfb57600080fd5b601f3d11611c0857600080fd5b6000506102e051611c1857600080fd5b611cbb565b3415611c2857600080fd5b602061030060646323b872dd61024052336102605230610280526044356102a05261025c6000610220515af1611c5d57600080fd5b601f3d11611c6a57600080fd5b60005061030051611c7a57600080fd5b6000610240526102408051602001806102808284600060045af1611c9d57600080fd5b505060006000610280516102a06101c051335af1611cba57600080fd5b5b6004356102405260443561026052602435610280526101c0516102a052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610240a26101c051600052600062ffffff5560206000f350600062ffffff55005b635b36389c600051141561203b5762ffffff5415611d3a57600080fd5b600162ffffff553415611d4c57600080fd5b610140516101605160065801610231565b610180526101a05261016052610140526101808051610140528060200151610160525060055461018052602061022060046318160ddd6101c0526101dc610180515afa611da957600080fd5b601f3d11611db657600080fd5b600050610220516101a052602061026060446379cc67906101c052336101e052600435610200526101dc6000610180515af1611df157600080fd5b601f3d11611dfe57600080fd5b600050610260506101c060006002818352015b6101406101c05160028110611e2557600080fd5b60200201516004358082028215828483041417611e4157600080fd5b809050905090506101a0518080611e5757600080fd5b8204905090506101e05260246101c05160028110611e7457600080fd5b60200201356101e05110151515611eef576308c379a0610200526020610220526030610240527f5769746864726177616c20726573756c74656420696e20666577657220636f69610260527f6e73207468616e206578706563746564000000000000000000000000000000006102805261024050608461021cfd5b6101e0516101406101c05160028110611f0757600080fd5b60200201526101c0511515611f5b576000610200526102008051602001806102408284600060045af1611f3957600080fd5b505060006000610240516102606101e051335af1611f5657600080fd5b611fb4565b60206102a0604463a9059cbb6102005233610220526101e0516102405261021c60006001600060c052602060c02001545af1611f9657600080fd5b601f3d11611fa357600080fd5b6000506102a051611fb357600080fd5b5b5b8151600101808352811415611e11575b5050610140516101c052610160516101e052604036610200376101a05160043580821015611ff257600080fd5b8082039050905061024052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a06101c0a2600062ffffff556040610140f3600062ffffff55005b63e310327360005114156127605762ffffff541561205857600080fd5b600162ffffff55341561206a57600080fd5b600f541561207757600080fd5b610140516006580161001b565b6101605261014052610160516101405261014051610160516101805160065801610231565b6101a0526101c0526101805261016052610140526101a0805161016052806020015161018052506101405161016051610180516101a051610160516101c052610180516101e0526101405161020052610200516101e0516101c05160065801610399565b610260526101a052610180526101605261014052610260516101a052610160516101c052610180516101e05261020060006002818352015b6101c0610200516002811061215957600080fd5b6020020180516004610200516002811061217257600080fd5b60200201358082101561218457600080fd5b808203905090508152505b8151600101808352811415612145575b50506101405161016051610180516101a0516101c0516101e051610200516101c051610220526101e05161024052610140516102605261026051610240516102205160065801610399565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c05161020052604036610220376002546002808202821582848304141761223257600080fd5b8090509050905060048082049050905061026052600354610280526102a060006002818352015b610200516101606102a0516002811061227157600080fd5b6020020151808202821582848304141761228a57600080fd5b809050905090506101a05180806122a057600080fd5b8204905090506102c0526101c06102a051600281106122be57600080fd5b60200201516102e0526000610300526102e0516102c0511115612300576102c0516102e051808210156122f057600080fd5b8082039050905061030052612321565b6102e0516102c0518082101561231557600080fd5b80820390509050610300525b6102605161030051808202821582848304141761233d57600080fd5b809050905090506402540be400808204905090506102206102a0516002811061236557600080fd5b602002015260006102805118156123f3576102a0516002811061238757600080fd5b600160c052602060c0200180546102206102a051600281106123a857600080fd5b60200201516102805180820282158284830414176123c557600080fd5b809050905090506402540be400808204905090508181830110156123e857600080fd5b808201905090508155505b6101c06102a0516002811061240757600080fd5b6020020180516102206102a0516002811061242157600080fd5b60200201518082101561243357600080fd5b808203905090508152505b8151600101808352811415612259575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516101c0516102c0526101e0516102e0526101405161030052610300516102e0516102c05160065801610399565b610360526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610360516102a0526005546102c052602061036060046318160ddd6103005261031c6102c0515afa61251257600080fd5b601f3d1161251f57600080fd5b600050610360516102e0526101a0516102a0518082101561253f57600080fd5b808203905090506102e051808202821582848304141761255e57600080fd5b809050905090506101a051808061257457600080fd5b820490509050610300526000610300511861258e57600080fd5b60443561030051111515156125e2576308c379a0610320526020610340526014610360527f536c697070616765207363726577656420796f750000000000000000000000006103805261036050606461033cfd5b60206103c060446379cc6790610320523361034052610300516103605261033c60006102c0515af161261357600080fd5b601f3d1161262057600080fd5b6000506103c05060006004351815612672576000610320526103208051602001806103608284600060045af161265557600080fd5b50506000600061036051610380600435335af161267157600080fd5b5b600060243518156126d55760206103c0604463a9059cbb6103205233610340526024356103605261033c60006001600060c052602060c02001545af16126b757600080fd5b601f3d116126c457600080fd5b6000506103c0516126d457600080fd5b5b600435610320526024356103405261022051610360526102405161038052610200516103a0526102e051610300518082101561271057600080fd5b808203905090506103c052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c0610320a261030051600052600062ffffff5560206000f350600062ffffff55005b600015612acd575b6101e0526101405261016052610180526101a0526101c052600061016051121561279157600080fd5b600261016051126127a157600080fd5b61014051600280820282158284830414176127bb57600080fd5b80905090509050610200526101c05161022052606036610240376102a060006002818352015b610160516102a0511815612811576101806102a0516002811061280357600080fd5b602002015161026052612816565b612892565b61024080516102605181818301101561282e57600080fd5b80820190509050815250610220516101c051808202821582848304141761285457600080fd5b80905090509050610260516002808202821582848304141761287557600080fd5b80905090509050808061288757600080fd5b820490509050610220525b81516001018083528114156127e1575b5050610220516101c05180820282158284830414176128c057600080fd5b80905090509050606480820282158284830414176128dd57600080fd5b8090509050905061020051600280820282158284830414176128fe57600080fd5b80905090509050808061291057600080fd5b82049050905061022052610240516101c0516064808202821582848304141761293857600080fd5b8090509050905061020051808061294e57600080fd5b82049050905081818301101561296357600080fd5b808201905090506102a0526101c0516102c0526102e0600060ff818352015b6102c051610280526102c0516102c05180820282158284830414176129a657600080fd5b80905090509050610220518181830110156129c057600080fd5b8082019050905060026102c05180820282158284830414176129e157600080fd5b809050905090506102a0518181830110156129fb57600080fd5b808201905090506101c05180821015612a1357600080fd5b808203905090508080612a2557600080fd5b8204905090506102c052610280516102c0511115612a7a5760016102c0516102805180821015612a5457600080fd5b80820390509050111515612a75576102c05160005250506000516101e05156505b612ab3565b6001610280516102c05180821015612a9157600080fd5b80820390509050111515612ab2576102c05160005250506000516101e05156505b5b5b8151600101808352811415612982575b505060006000fd005b60001561306a575b6101805261014052610160526101405161016051610180516101a0516006580161001b565b6101c0526101a0526101805261016052610140526101c0516101a0526101405161016051610180516101a0516101c0516101e05160065801610231565b61020052610220526101e0526101c0526101a05261018052610160526101405261020080516101c05280602001516101e052506101405161016051610180516101a0516101c0516101e051610200516101c051610220526101e051610240526101a0516102605261026051610240516102205160065801610399565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c0516102005260206102a060046318160ddd6102405261025c6005545afa612bfc57600080fd5b601f3d11612c0957600080fd5b6000506102a051610220526102005161014051610200518082028215828483041417612c3457600080fd5b80905090509050610220518080612c4a57600080fd5b82049050905080821015612c5d57600080fd5b80820390509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101a05161028052610160516102a0526101c0516102c0526101e0516102e0526102405161030052610300516102e0516102c0516102a0516102805160065801612768565b61036052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610360516102605260025460028082028215828483041417612d2257600080fd5b80905090509050600480820490509050610280526101c0516102a0526101e0516102c0526102e060006002818352015b600061030052610160516102e0511415612dd4576101c06102e05160028110612d7a57600080fd5b6020020151610240518082028215828483041417612d9757600080fd5b80905090509050610200518080612dad57600080fd5b8204905090506102605180821015612dc457600080fd5b8082039050905061030052612e53565b6101c06102e05160028110612de857600080fd5b60200201516101c06102e05160028110612e0157600080fd5b6020020151610240518082028215828483041417612e1e57600080fd5b80905090509050610200518080612e3457600080fd5b82049050905080821015612e4757600080fd5b80820390509050610300525b6102a06102e05160028110612e6757600080fd5b60200201805161028051610300518082028215828483041417612e8957600080fd5b809050905090506402540be4008082049050905080821015612eaa57600080fd5b808203905090508152505b8151600101808352811415612d52575b50506102a06101605160028110612edb57600080fd5b6020020151610140610300525b61030051516020610300510161030052610300610300511015612f0a57612ee8565b6101a0516103205261016051610340526102a051610360526102c05161038052610240516103a0526103a0516103805161036051610340516103205160065801612768565b610400526102e0610300525b6103005152602061030051036103005261014061030051101515612f7e57612f5b565b6104005180821015612f8f57600080fd5b808203905090506102e0526102e08051600180821015612fae57600080fd5b808203905090508152506101c06101605160028110612fcc57600080fd5b60200201516102605180821015612fe257600080fd5b80820390509050610300526103208080806102e051815250506020810190508080610300516102e0518082101561301857600080fd5b808203905090508152505060409050905060c05260c051610360525b60006103605111151561304657613062565b6020610360510361032001516020610360510361036052613034565b610180515650005b63cc2b27d760005114156130f957341561308357600080fd5b6024358080600081121561309357195b607f1c156130a057600080fd5b9050506004356101405260243561016052610160516101405160065801612ad5565b6101c0526101e0526101c080808080516102005250506020810190508080805161022052505050506102005160005260206000f350005b631a4d01d260005114156133bd5762ffffff541561311657600080fd5b600162ffffff55341561312857600080fd5b6024358080600081121561313857195b607f1c1561314557600080fd5b905050600f541561315557600080fd5b604036610140376101405161016051600435610180526024356101a0526101a0516101805160065801612ad5565b61020052610220526101605261014052610200808080805161024052505060208101905080808051610260525050505061024080516101405280602001516101605250604435610140511015151561321a576308c379a06101805260206101a05260186101c0527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006101e0526101c050606461019cfd5b6024356002811061322a57600080fd5b600160c052602060c02001805461016051600354808202821582848304141761325257600080fd5b809050905090506402540be4008082049050905081818301101561327557600080fd5b80820190509050815550602061022060446379cc679061018052336101a0526004356101c05261019c60006005545af16132ae57600080fd5b601f3d116132bb57600080fd5b600050610220506024351515613310576000610180526101808051602001806101c08284600060045af16132ee57600080fd5b5050600060006101c0516101e061014051335af161330b57600080fd5b613369565b6020610220604463a9059cbb61018052336101a052610140516101c05261019c60006001600060c052602060c02001545af161334b57600080fd5b601f3d1161335857600080fd5b6000506102205161336857600080fd5b5b60043561018052610140516101a052337f9e96dd3b997a2a257eec4df9bb6eaf626e206df5f543bd963682d143300be3106040610180a261014051600052600062ffffff5560206000f350600062ffffff55005b633c157e64600051141561356c5734156133d657600080fd5b60045433146133e457600080fd5b600854620151808181830110156133fa57600080fd5b8082019050905042101561340d57600080fd5b426201518081818301101561342157600080fd5b80820190509050602435101561343657600080fd5b610140516006580161001b565b610160526101405261016051610140526004356064808202821582848304141761346c57600080fd5b80905090509050610160526000600435111561348f57620f424060043510613492565b60005b61349b57600080fd5b610140516101605110156134de576101405161016051600a80820282158284830414176134c757600080fd5b8090509050905010156134d957600080fd5b61350f565b61014051600a80820282158284830414176134f857600080fd5b8090509050905061016051111561350e57600080fd5b5b6101405160065561016051600755426008556024356009556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a658860005114156135fc57341561358557600080fd5b600454331461359357600080fd5b610140516006580161001b565b6101605261014052610160516101405261014051600655610140516007554260085542600955610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b635b5a146760005114156136c557341561361557600080fd5b600454331461362357600080fd5b600a541561363057600080fd5b64012a05f200600435111561364457600080fd5b6402540be400602435111561365857600080fd5b426203f48081818301101561366c57600080fd5b808201905090506101405261014051600a55600435600c55602435600d556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe9760005114156137815762ffffff54156136e257600080fd5b600162ffffff5534156136f457600080fd5b600454331461370257600080fd5b600a5442101561371157600080fd5b6000600a541861372057600080fd5b6000600a55600c5461014052600d546101605261014051600255610160516003556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1600062ffffff55005b63226840fb60005114156137af57341561379a57600080fd5b60045433146137a857600080fd5b6000600a55005b636b441a40600051141561384e5734156137c857600080fd5b60043560a01c156137d857600080fd5b60045433146137e657600080fd5b600b54156137f357600080fd5b426203f48081818301101561380757600080fd5b808201905090506101405261014051600b55600435600e55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae60005114156138ef5762ffffff541561386b57600080fd5b600162ffffff55341561387d57600080fd5b600454331461388b57600080fd5b600b5442101561389a57600080fd5b6000600b54186138a957600080fd5b6000600b55600e546101405261014051600455610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2600062ffffff55005b6386fbf193600051141561391d57341561390857600080fd5b600454331461391657600080fd5b6000600b55005b6330c540856000511415613a4c5762ffffff541561393a57600080fd5b600162ffffff55341561394c57600080fd5b600454331461395a57600080fd5b600160c052602060c020546101405260006101405118156139b6576000610160526101608051602001806101a08284600060045af161399857600080fd5b5050600060006101a0516101c061014051335af16139b557600080fd5b5b6001600160c052602060c0200154610140526000610140511815613a2d576020610200604463a9059cbb610160523361018052610140516101a05261017c60006001600060c052602060c02001545af1613a0f57600080fd5b601f3d11613a1c57600080fd5b60005061020051613a2c57600080fd5b5b600160c052602060c020600081556000600182015550600062ffffff55005b63524c39016000511415613a8b573415613a6557600080fd5b6004543314613a7357600080fd5b600160c052602060c020600081556000600182015550005b63e36988536000511415613ac7573415613aa457600080fd5b6004543314613ab257600080fd5b4260105411613ac057600080fd5b6001600f55005b633046f9726000511415613af5573415613ae057600080fd5b6004543314613aee57600080fd5b6000600f55005b63c66106576000511415613b35573415613b0e57600080fd5b60043560028110613b1e57600080fd5b600060c052602060c020015460005260206000f350005b63e2e7d2646000511415613b75573415613b4e57600080fd5b60043560028110613b5e57600080fd5b600160c052602060c020015460005260206000f350005b63ddca3f436000511415613b9c573415613b8e57600080fd5b60025460005260206000f350005b63fee3f7f96000511415613bc3573415613bb557600080fd5b60035460005260206000f350005b638da5cb5b6000511415613bea573415613bdc57600080fd5b60045460005260206000f350005b6382c630666000511415613c11573415613c0357600080fd5b60055460005260206000f350005b635409491a6000511415613c38573415613c2a57600080fd5b60065460005260206000f350005b63b4b577ad6000511415613c5f573415613c5157600080fd5b60075460005260206000f350005b632081066c6000511415613c86573415613c7857600080fd5b60085460005260206000f350005b63140522886000511415613cad573415613c9f57600080fd5b60095460005260206000f350005b63405e28f86000511415613cd4573415613cc657600080fd5b600a5460005260206000f350005b63e0a0b5866000511415613cfb573415613ced57600080fd5b600b5460005260206000f350005b6358680d0b6000511415613d22573415613d1457600080fd5b600c5460005260206000f350005b63e38244626000511415613d49573415613d3b57600080fd5b600d5460005260206000f350005b631ec0cdc16000511415613d70573415613d6257600080fd5b600e5460005260206000f350005b5b60006000fd
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.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.