Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Apply_admin | 15219225 | 908 days ago | IN | 0 ETH | 0.00055832 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.3.1
Contract Source Code (Vyper language format)
# @version 0.3.1 # (c) Curve.Fi, 2021 # Pool for two crypto assets # Universal implementation which can use both ETH and ERC20s from vyper.interfaces import ERC20 interface Factory: def admin() -> address: view def fee_receiver() -> address: view interface CurveToken: def totalSupply() -> uint256: view def mint(_to: address, _value: uint256) -> bool: nonpayable def mint_relative(_to: address, frac: uint256) -> uint256: nonpayable def burnFrom(_to: address, _value: uint256) -> bool: nonpayable interface WETH: def deposit(): payable def withdraw(_amount: uint256): nonpayable # Events event TokenExchange: buyer: indexed(address) sold_id: uint256 tokens_sold: uint256 bought_id: uint256 tokens_bought: uint256 event AddLiquidity: provider: indexed(address) token_amounts: uint256[N_COINS] fee: uint256 token_supply: uint256 event RemoveLiquidity: provider: indexed(address) token_amounts: uint256[N_COINS] token_supply: uint256 event RemoveLiquidityOne: provider: indexed(address) token_amount: uint256 coin_index: uint256 coin_amount: uint256 event CommitNewParameters: deadline: indexed(uint256) admin_fee: uint256 mid_fee: uint256 out_fee: uint256 fee_gamma: uint256 allowed_extra_profit: uint256 adjustment_step: uint256 ma_half_time: uint256 event NewParameters: admin_fee: uint256 mid_fee: uint256 out_fee: uint256 fee_gamma: uint256 allowed_extra_profit: uint256 adjustment_step: uint256 ma_half_time: uint256 event RampAgamma: initial_A: uint256 future_A: uint256 initial_gamma: uint256 future_gamma: uint256 initial_time: uint256 future_time: uint256 event StopRampA: current_A: uint256 current_gamma: uint256 time: uint256 event ClaimAdminFee: admin: indexed(address) tokens: uint256 ADMIN_ACTIONS_DELAY: constant(uint256) = 3 * 86400 MIN_RAMP_TIME: constant(uint256) = 86400 MAX_ADMIN_FEE: constant(uint256) = 10 * 10 ** 9 MIN_FEE: constant(uint256) = 5 * 10 ** 5 # 0.5 bps MAX_FEE: constant(uint256) = 10 * 10 ** 9 MAX_A_CHANGE: constant(uint256) = 10 NOISE_FEE: constant(uint256) = 10**5 # 0.1 bps MIN_GAMMA: constant(uint256) = 10**10 MAX_GAMMA: constant(uint256) = 2 * 10**16 MIN_A: constant(uint256) = N_COINS**N_COINS * A_MULTIPLIER / 10 MAX_A: constant(uint256) = N_COINS**N_COINS * A_MULTIPLIER * 100000 EXP_PRECISION: constant(uint256) = 10**10 N_COINS: constant(int128) = 2 PRECISION: constant(uint256) = 10 ** 18 # The precision to convert to A_MULTIPLIER: constant(uint256) = 10000 # Implementation can be changed by changing this constant WETH20: immutable(address) token: public(address) coins: public(address[N_COINS]) price_scale: public(uint256) # Internal price scale _price_oracle: uint256 # Price target given by MA last_prices: public(uint256) last_prices_timestamp: public(uint256) initial_A_gamma: public(uint256) future_A_gamma: public(uint256) initial_A_gamma_time: public(uint256) future_A_gamma_time: public(uint256) allowed_extra_profit: public(uint256) # 2 * 10**12 - recommended value future_allowed_extra_profit: public(uint256) fee_gamma: public(uint256) future_fee_gamma: public(uint256) adjustment_step: public(uint256) future_adjustment_step: public(uint256) ma_half_time: public(uint256) future_ma_half_time: public(uint256) mid_fee: public(uint256) out_fee: public(uint256) admin_fee: public(uint256) future_mid_fee: public(uint256) future_out_fee: public(uint256) future_admin_fee: public(uint256) balances: public(uint256[N_COINS]) D: public(uint256) factory: public(address) xcp_profit: public(uint256) xcp_profit_a: public(uint256) # Full profit at last claim of admin fees virtual_price: public(uint256) # Cached (fast to read) virtual price also used internally not_adjusted: bool admin_actions_deadline: public(uint256) # This must be changed for different N_COINS # For example: # N_COINS = 3 -> 1 (10**18 -> 10**18) # N_COINS = 4 -> 10**8 (10**18 -> 10**10) # PRICE_PRECISION_MUL: constant(uint256) = 1 PRECISIONS: uint256 # packed @external def __init__(_weth: address): WETH20 = _weth self.mid_fee = 22022022 @payable @external def __default__(): pass # Internal Functions @internal @view def _get_precisions() -> uint256[2]: p0: uint256 = self.PRECISIONS p1: uint256 = 10 ** shift(p0, -8) p0 = 10 ** bitwise_and(p0, 255) return [p0, p1] @internal @view def xp() -> uint256[N_COINS]: precisions: uint256[2] = self._get_precisions() return [self.balances[0] * precisions[0], self.balances[1] * precisions[1] * self.price_scale / PRECISION] @view @internal def _A_gamma() -> uint256[2]: t1: uint256 = self.future_A_gamma_time A_gamma_1: uint256 = self.future_A_gamma gamma1: uint256 = bitwise_and(A_gamma_1, 2**128-1) A1: uint256 = shift(A_gamma_1, -128) if block.timestamp < t1: # handle ramping up and down of A A_gamma_0: uint256 = self.initial_A_gamma t0: uint256 = self.initial_A_gamma_time # Less readable but more compact way of writing and converting to uint256 # gamma0: uint256 = bitwise_and(A_gamma_0, 2**128-1) # A0: uint256 = shift(A_gamma_0, -128) # A1 = A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0) # gamma1 = gamma0 + (gamma1 - gamma0) * (block.timestamp - t0) / (t1 - t0) t1 -= t0 t0 = block.timestamp - t0 t2: uint256 = t1 - t0 A1 = (shift(A_gamma_0, -128) * t2 + A1 * t0) / t1 gamma1 = (bitwise_and(A_gamma_0, 2**128-1) * t2 + gamma1 * t0) / t1 return [A1, gamma1] @internal @view def _fee(xp: uint256[N_COINS]) -> uint256: """ f = fee_gamma / (fee_gamma + (1 - K)) where K = prod(x) / (sum(x) / N)**N (all normalized to 1e18) """ fee_gamma: uint256 = self.fee_gamma f: uint256 = xp[0] + xp[1] # sum f = fee_gamma * 10**18 / ( fee_gamma + 10**18 - (10**18 * N_COINS**N_COINS) * xp[0] / f * xp[1] / f ) return (self.mid_fee * f + self.out_fee * (10**18 - f)) / 10**18 ### Math functions @internal @pure def geometric_mean(unsorted_x: uint256[N_COINS], sort: bool) -> uint256: """ (x[0] * x[1] * ...) ** (1/N) """ x: uint256[N_COINS] = unsorted_x if sort and x[0] < x[1]: x = [unsorted_x[1], unsorted_x[0]] D: uint256 = x[0] diff: uint256 = 0 for i in range(255): D_prev: uint256 = D # tmp: uint256 = 10**18 # for _x in x: # tmp = tmp * _x / D # D = D * ((N_COINS - 1) * 10**18 + tmp) / (N_COINS * 10**18) # line below makes it for 2 coins D = (D + x[0] * x[1] / D) / N_COINS if D > D_prev: diff = D - D_prev else: diff = D_prev - D if diff <= 1 or diff * 10**18 < D: return D raise "Did not converge" @internal @view def newton_D(ANN: uint256, gamma: uint256, x_unsorted: uint256[N_COINS]) -> uint256: """ Finding the invariant using Newton method. ANN is higher by the factor A_MULTIPLIER ANN is already A * N**N Currently uses 60k gas """ # Safety checks assert ANN > MIN_A - 1 and ANN < MAX_A + 1 # dev: unsafe values A assert gamma > MIN_GAMMA - 1 and gamma < MAX_GAMMA + 1 # dev: unsafe values gamma # Initial value of invariant D is that for constant-product invariant x: uint256[N_COINS] = x_unsorted if x[0] < x[1]: x = [x_unsorted[1], x_unsorted[0]] assert x[0] > 10**9 - 1 and x[0] < 10**15 * 10**18 + 1 # dev: unsafe values x[0] assert x[1] * 10**18 / x[0] > 10**14-1 # dev: unsafe values x[i] (input) D: uint256 = N_COINS * self.geometric_mean(x, False) S: uint256 = x[0] + x[1] for i in range(255): D_prev: uint256 = D # K0: uint256 = 10**18 # for _x in x: # K0 = K0 * _x * N_COINS / D # collapsed for 2 coins K0: uint256 = (10**18 * N_COINS**2) * x[0] / D * x[1] / D _g1k0: uint256 = gamma + 10**18 if _g1k0 > K0: _g1k0 = _g1k0 - K0 + 1 else: _g1k0 = K0 - _g1k0 + 1 # D / (A * N**N) * _g1k0**2 / gamma**2 mul1: uint256 = 10**18 * D / gamma * _g1k0 / gamma * _g1k0 * A_MULTIPLIER / ANN # 2*N*K0 / _g1k0 mul2: uint256 = (2 * 10**18) * N_COINS * K0 / _g1k0 neg_fprime: uint256 = (S + S * mul2 / 10**18) + mul1 * N_COINS / K0 - mul2 * D / 10**18 # D -= f / fprime D_plus: uint256 = D * (neg_fprime + S) / neg_fprime D_minus: uint256 = D*D / neg_fprime if 10**18 > K0: D_minus += D * (mul1 / neg_fprime) / 10**18 * (10**18 - K0) / K0 else: D_minus -= D * (mul1 / neg_fprime) / 10**18 * (K0 - 10**18) / K0 if D_plus > D_minus: D = D_plus - D_minus else: D = (D_minus - D_plus) / 2 diff: uint256 = 0 if D > D_prev: diff = D - D_prev else: diff = D_prev - D if diff * 10**14 < max(10**16, D): # Could reduce precision for gas efficiency here # Test that we are safe with the next newton_y for _x in x: frac: uint256 = _x * 10**18 / D assert (frac > 10**16 - 1) and (frac < 10**20 + 1) # dev: unsafe values x[i] return D raise "Did not converge" @internal @pure def newton_y(ANN: uint256, gamma: uint256, x: uint256[N_COINS], D: uint256, i: uint256) -> uint256: """ Calculating x[i] given other balances x[0..N_COINS-1] and invariant D ANN = A * N**N """ # Safety checks assert ANN > MIN_A - 1 and ANN < MAX_A + 1 # dev: unsafe values A assert gamma > MIN_GAMMA - 1 and gamma < MAX_GAMMA + 1 # dev: unsafe values gamma assert D > 10**17 - 1 and D < 10**15 * 10**18 + 1 # dev: unsafe values D x_j: uint256 = x[1 - i] y: uint256 = D**2 / (x_j * N_COINS**2) K0_i: uint256 = (10**18 * N_COINS) * x_j / D # S_i = x_j # frac = x_j * 1e18 / D => frac = K0_i / N_COINS assert (K0_i > 10**16*N_COINS - 1) and (K0_i < 10**20*N_COINS + 1) # dev: unsafe values x[i] # x_sorted: uint256[N_COINS] = x # x_sorted[i] = 0 # x_sorted = self.sort(x_sorted) # From high to low # x[not i] instead of x_sorted since x_soted has only 1 element convergence_limit: uint256 = max(max(x_j / 10**14, D / 10**14), 100) for j in range(255): y_prev: uint256 = y K0: uint256 = K0_i * y * N_COINS / D S: uint256 = x_j + y _g1k0: uint256 = gamma + 10**18 if _g1k0 > K0: _g1k0 = _g1k0 - K0 + 1 else: _g1k0 = K0 - _g1k0 + 1 # D / (A * N**N) * _g1k0**2 / gamma**2 mul1: uint256 = 10**18 * D / gamma * _g1k0 / gamma * _g1k0 * A_MULTIPLIER / ANN # 2*K0 / _g1k0 mul2: uint256 = 10**18 + (2 * 10**18) * K0 / _g1k0 yfprime: uint256 = 10**18 * y + S * mul2 + mul1 _dyfprime: uint256 = D * mul2 if yfprime < _dyfprime: y = y_prev / 2 continue else: yfprime -= _dyfprime fprime: uint256 = yfprime / y # y -= f / f_prime; y = (y * fprime - f) / fprime # y = (yfprime + 10**18 * D - 10**18 * S) // fprime + mul1 // fprime * (10**18 - K0) // K0 y_minus: uint256 = mul1 / fprime y_plus: uint256 = (yfprime + 10**18 * D) / fprime + y_minus * 10**18 / K0 y_minus += 10**18 * S / fprime if y_plus < y_minus: y = y_prev / 2 else: y = y_plus - y_minus diff: uint256 = 0 if y > y_prev: diff = y - y_prev else: diff = y_prev - y if diff < max(convergence_limit, y / 10**14): frac: uint256 = y * 10**18 / D assert (frac > 10**16 - 1) and (frac < 10**20 + 1) # dev: unsafe value for y return y raise "Did not converge" @internal @pure def halfpow(power: uint256) -> uint256: """ 1e18 * 0.5 ** (power/1e18) Inspired by: https://github.com/balancer-labs/balancer-core/blob/master/contracts/BNum.sol#L128 """ intpow: uint256 = power / 10**18 otherpow: uint256 = power - intpow * 10**18 if intpow > 59: return 0 result: uint256 = 10**18 / (2**intpow) if otherpow == 0: return result term: uint256 = 10**18 x: uint256 = 5 * 10**17 S: uint256 = 10**18 neg: bool = False for i in range(1, 256): K: uint256 = i * 10**18 c: uint256 = K - 10**18 if otherpow > c: c = otherpow - c neg = not neg else: c -= otherpow term = term * (c * x / 10**18) / K if neg: S -= term else: S += term if term < EXP_PRECISION: return result * S / 10**18 raise "Did not converge" ### end of Math functions @internal @view def get_xcp(D: uint256) -> uint256: x: uint256[N_COINS] = [D / N_COINS, D * PRECISION / (self.price_scale * N_COINS)] return self.geometric_mean(x, True) @internal def _claim_admin_fees(): A_gamma: uint256[2] = self._A_gamma() xcp_profit: uint256 = self.xcp_profit xcp_profit_a: uint256 = self.xcp_profit_a # Gulp here for i in range(N_COINS): coin: address = self.coins[i] if coin == WETH20: self.balances[i] = self.balance else: self.balances[i] = ERC20(coin).balanceOf(self) vprice: uint256 = self.virtual_price if xcp_profit > xcp_profit_a: fees: uint256 = (xcp_profit - xcp_profit_a) * self.admin_fee / (2 * 10**10) if fees > 0: receiver: address = Factory(self.factory).fee_receiver() if receiver != ZERO_ADDRESS: frac: uint256 = vprice * 10**18 / (vprice - fees) - 10**18 claimed: uint256 = CurveToken(self.token).mint_relative(receiver, frac) xcp_profit -= fees*2 self.xcp_profit = xcp_profit log ClaimAdminFee(receiver, claimed) total_supply: uint256 = CurveToken(self.token).totalSupply() # Recalculate D b/c we gulped D: uint256 = self.newton_D(A_gamma[0], A_gamma[1], self.xp()) self.D = D self.virtual_price = 10**18 * self.get_xcp(D) / total_supply if xcp_profit > xcp_profit_a: self.xcp_profit_a = xcp_profit @internal @view def internal_price_oracle() -> uint256: price_oracle: uint256 = self._price_oracle last_prices_timestamp: uint256 = self.last_prices_timestamp if last_prices_timestamp < block.timestamp: ma_half_time: uint256 = self.ma_half_time last_prices: uint256 = self.last_prices alpha: uint256 = self.halfpow((block.timestamp - last_prices_timestamp) * 10**18 / ma_half_time) return (last_prices * (10**18 - alpha) + price_oracle * alpha) / 10**18 else: return price_oracle @internal def tweak_price(A_gamma: uint256[2],_xp: uint256[N_COINS], p_i: uint256, new_D: uint256): price_oracle: uint256 = self._price_oracle last_prices: uint256 = self.last_prices price_scale: uint256 = self.price_scale last_prices_timestamp: uint256 = self.last_prices_timestamp p_new: uint256 = 0 if last_prices_timestamp < block.timestamp: # MA update required ma_half_time: uint256 = self.ma_half_time alpha: uint256 = self.halfpow((block.timestamp - last_prices_timestamp) * 10**18 / ma_half_time) price_oracle = (last_prices * (10**18 - alpha) + price_oracle * alpha) / 10**18 self._price_oracle = price_oracle self.last_prices_timestamp = block.timestamp D_unadjusted: uint256 = new_D # Withdrawal methods know new D already if new_D == 0: # We will need this a few times (35k gas) D_unadjusted = self.newton_D(A_gamma[0], A_gamma[1], _xp) if p_i > 0: last_prices = p_i else: # calculate real prices __xp: uint256[N_COINS] = _xp dx_price: uint256 = __xp[0] / 10**6 __xp[0] += dx_price last_prices = price_scale * dx_price / (_xp[1] - self.newton_y(A_gamma[0], A_gamma[1], __xp, D_unadjusted, 1)) self.last_prices = last_prices total_supply: uint256 = CurveToken(self.token).totalSupply() old_xcp_profit: uint256 = self.xcp_profit old_virtual_price: uint256 = self.virtual_price # Update profit numbers without price adjustment first xp: uint256[N_COINS] = [D_unadjusted / N_COINS, D_unadjusted * PRECISION / (N_COINS * price_scale)] xcp_profit: uint256 = 10**18 virtual_price: uint256 = 10**18 if old_virtual_price > 0: xcp: uint256 = self.geometric_mean(xp, True) virtual_price = 10**18 * xcp / total_supply xcp_profit = old_xcp_profit * virtual_price / old_virtual_price t: uint256 = self.future_A_gamma_time if virtual_price < old_virtual_price and t == 0: raise "Loss" if t == 1: self.future_A_gamma_time = 0 self.xcp_profit = xcp_profit norm: uint256 = price_oracle * 10**18 / price_scale if norm > 10**18: norm -= 10**18 else: norm = 10**18 - norm adjustment_step: uint256 = max(self.adjustment_step, norm / 5) needs_adjustment: bool = self.not_adjusted # if not needs_adjustment and (virtual_price-10**18 > (xcp_profit-10**18)/2 + self.allowed_extra_profit): # (re-arrange for gas efficiency) if not needs_adjustment and (virtual_price * 2 - 10**18 > xcp_profit + 2*self.allowed_extra_profit) and (norm > adjustment_step) and (old_virtual_price > 0): needs_adjustment = True self.not_adjusted = True if needs_adjustment: if norm > adjustment_step and old_virtual_price > 0: p_new = (price_scale * (norm - adjustment_step) + adjustment_step * price_oracle) / norm # Calculate balances*prices xp = [_xp[0], _xp[1] * p_new / price_scale] # Calculate "extended constant product" invariant xCP and virtual price D: uint256 = self.newton_D(A_gamma[0], A_gamma[1], xp) xp = [D / N_COINS, D * PRECISION / (N_COINS * p_new)] # We reuse old_virtual_price here but it's not old anymore old_virtual_price = 10**18 * self.geometric_mean(xp, True) / total_supply # Proceed if we've got enough profit # if (old_virtual_price > 10**18) and (2 * (old_virtual_price - 10**18) > xcp_profit - 10**18): if (old_virtual_price > 10**18) and (2 * old_virtual_price - 10**18 > xcp_profit): self.price_scale = p_new self.D = D self.virtual_price = old_virtual_price return else: self.not_adjusted = False # Can instead do another flag variable if we want to save bytespace self.D = D_unadjusted self.virtual_price = virtual_price self._claim_admin_fees() return # If we are here, the price_scale adjustment did not happen # Still need to update the profit counter and D self.D = D_unadjusted self.virtual_price = virtual_price # norm appeared < adjustment_step after if needs_adjustment: self.not_adjusted = False self._claim_admin_fees() @internal def _exchange(sender: address, mvalue: uint256, i: uint256, j: uint256, dx: uint256, min_dy: uint256, use_eth: bool, receiver: address, callbacker: address, callback_sig: bytes32) -> uint256: assert i != j # dev: coin index out of range assert i < N_COINS # dev: coin index out of range assert j < N_COINS # dev: coin index out of range assert dx > 0 # dev: do not exchange 0 coins A_gamma: uint256[2] = self._A_gamma() xp: uint256[N_COINS] = self.balances p: uint256 = 0 dy: uint256 = 0 in_coin: address = self.coins[i] out_coin: address = self.coins[j] y: uint256 = xp[j] x0: uint256 = xp[i] xp[i] = x0 + dx self.balances[i] = xp[i] price_scale: uint256 = self.price_scale precisions: uint256[2] = self._get_precisions() xp = [xp[0] * precisions[0], xp[1] * price_scale * precisions[1] / PRECISION] prec_i: uint256 = precisions[0] prec_j: uint256 = precisions[1] if i == 1: prec_i = precisions[1] prec_j = precisions[0] # In case ramp is happening t: uint256 = self.future_A_gamma_time if t > 0: x0 *= prec_i if i > 0: x0 = x0 * price_scale / PRECISION x1: uint256 = xp[i] # Back up old value in xp xp[i] = x0 self.D = self.newton_D(A_gamma[0], A_gamma[1], xp) xp[i] = x1 # And restore if block.timestamp >= t: self.future_A_gamma_time = 1 dy = xp[j] - self.newton_y(A_gamma[0], A_gamma[1], xp, self.D, j) # Not defining new "y" here to have less variables / make subsequent calls cheaper xp[j] -= dy dy -= 1 if j > 0: dy = dy * PRECISION / price_scale dy /= prec_j dy -= self._fee(xp) * dy / 10**10 assert dy >= min_dy, "Slippage" y -= dy self.balances[j] = y # Do transfers in and out together # XXX coin vs ETH if use_eth and in_coin == WETH20: assert mvalue == dx # dev: incorrect eth amount else: assert mvalue == 0 # dev: nonzero eth amount if callback_sig == EMPTY_BYTES32: response: Bytes[32] = raw_call( in_coin, _abi_encode( sender, self, dx, method_id=method_id("transferFrom(address,address,uint256)") ), max_outsize=32, ) if len(response) != 0: assert convert(response, bool) # dev: failed transfer else: b: uint256 = ERC20(in_coin).balanceOf(self) raw_call( callbacker, concat(slice(callback_sig, 0, 4), _abi_encode(sender, receiver, in_coin, dx, dy)) ) assert ERC20(in_coin).balanceOf(self) - b == dx # dev: callback didn't give us coins if in_coin == WETH20: WETH(WETH20).withdraw(dx) if use_eth and out_coin == WETH20: raw_call(receiver, b"", value=dy) else: if out_coin == WETH20: WETH(WETH20).deposit(value=dy) response: Bytes[32] = raw_call( out_coin, _abi_encode(receiver, dy, method_id=method_id("transfer(address,uint256)")), max_outsize=32, ) if len(response) != 0: assert convert(response, bool) y *= prec_j if j > 0: y = y * price_scale / PRECISION xp[j] = y # Calculate price if dx > 10**5 and dy > 10**5: _dx: uint256 = dx * prec_i _dy: uint256 = dy * prec_j if i == 0: p = _dx * 10**18 / _dy else: # j == 0 p = _dy * 10**18 / _dx self.tweak_price(A_gamma, xp, p, 0) log TokenExchange(sender, i, dx, j, dy) return dy @view @internal def _calc_token_fee(amounts: uint256[N_COINS], xp: uint256[N_COINS]) -> uint256: # fee = sum(amounts_i - avg(amounts)) * fee' / sum(amounts) fee: uint256 = self._fee(xp) * N_COINS / (4 * (N_COINS-1)) S: uint256 = 0 for _x in amounts: S += _x avg: uint256 = S / N_COINS Sdiff: uint256 = 0 for _x in amounts: if _x > avg: Sdiff += _x - avg else: Sdiff += avg - _x return fee * Sdiff / S + NOISE_FEE @internal @view def _calc_withdraw_one_coin(A_gamma: uint256[2], token_amount: uint256, i: uint256, update_D: bool, calc_price: bool) -> (uint256, uint256, uint256, uint256[N_COINS]): token_supply: uint256 = CurveToken(self.token).totalSupply() assert token_amount <= token_supply # dev: token amount more than supply assert i < N_COINS # dev: coin out of range xx: uint256[N_COINS] = self.balances D0: uint256 = 0 precisions: uint256[2] = self._get_precisions() price_scale_i: uint256 = self.price_scale * precisions[1] xp: uint256[N_COINS] = [xx[0] * precisions[0], xx[1] * price_scale_i / PRECISION] if i == 0: price_scale_i = PRECISION * precisions[0] if update_D: D0 = self.newton_D(A_gamma[0], A_gamma[1], xp) else: D0 = self.D D: uint256 = D0 # Charge the fee on D, not on y, e.g. reducing invariant LESS than charging the user fee: uint256 = self._fee(xp) dD: uint256 = token_amount * D / token_supply D -= (dD - (fee * dD / (2 * 10**10) + 1)) y: uint256 = self.newton_y(A_gamma[0], A_gamma[1], xp, D, i) dy: uint256 = (xp[i] - y) * PRECISION / price_scale_i xp[i] = y # Price calc p: uint256 = 0 if calc_price and dy > 10**5 and token_amount > 10**5: # p_i = dD / D0 * sum'(p_k * x_k) / (dy - dD / D0 * y0) S: uint256 = 0 precision: uint256 = precisions[0] if i == 1: S = xx[0] * precisions[0] precision = precisions[1] else: S = xx[1] * precisions[1] S = S * dD / D0 p = S * PRECISION / (dy * precision - dD * xx[i] * precision / D0) if i == 0: p = (10**18)**2 / p return dy, p, D, xp @internal @pure def sqrt_int(x: uint256) -> uint256: """ Originating from: https://github.com/vyperlang/vyper/issues/1266 """ if x == 0: return 0 z: uint256 = (x + 10**18) / 2 y: uint256 = x for i in range(256): if z == y: return y y = z z = (x * 10**18 / z + z) / 2 raise "Did not converge" # External Functions @payable @external @nonreentrant('lock') def exchange(i: uint256, j: uint256, dx: uint256, min_dy: uint256, use_eth: bool = False, receiver: address = msg.sender) -> uint256: """ Exchange using WETH by default """ return self._exchange(msg.sender, msg.value, i, j, dx, min_dy, use_eth, receiver, ZERO_ADDRESS, EMPTY_BYTES32) @payable @external @nonreentrant('lock') def exchange_underlying(i: uint256, j: uint256, dx: uint256, min_dy: uint256, receiver: address = msg.sender) -> uint256: """ Exchange using ETH """ return self._exchange(msg.sender, msg.value, i, j, dx, min_dy, True, receiver, ZERO_ADDRESS, EMPTY_BYTES32) @payable @external @nonreentrant('lock') def exchange_extended(i: uint256, j: uint256, dx: uint256, min_dy: uint256, use_eth: bool, sender: address, receiver: address, cb: bytes32) -> uint256: assert cb != EMPTY_BYTES32 # dev: No callback specified return self._exchange(sender, msg.value, i, j, dx, min_dy, use_eth, receiver, msg.sender, cb) @payable @external @nonreentrant('lock') def add_liquidity(amounts: uint256[N_COINS], min_mint_amount: uint256, use_eth: bool = False, receiver: address = msg.sender) -> uint256: assert amounts[0] > 0 or amounts[1] > 0 # dev: no coins to add A_gamma: uint256[2] = self._A_gamma() xp: uint256[N_COINS] = self.balances amountsp: uint256[N_COINS] = empty(uint256[N_COINS]) xx: uint256[N_COINS] = empty(uint256[N_COINS]) d_token: uint256 = 0 d_token_fee: uint256 = 0 old_D: uint256 = 0 xp_old: uint256[N_COINS] = xp for i in range(N_COINS): bal: uint256 = xp[i] + amounts[i] xp[i] = bal self.balances[i] = bal xx = xp precisions: uint256[2] = self._get_precisions() price_scale: uint256 = self.price_scale * precisions[1] xp = [xp[0] * precisions[0], xp[1] * price_scale / PRECISION] xp_old = [xp_old[0] * precisions[0], xp_old[1] * price_scale / PRECISION] if not use_eth: assert msg.value == 0 # dev: nonzero eth amount for i in range(N_COINS): coin: address = self.coins[i] if use_eth and coin == WETH20: assert msg.value == amounts[i] # dev: incorrect eth amount if amounts[i] > 0: if (not use_eth) or (coin != WETH20): response: Bytes[32] = raw_call( coin, _abi_encode( msg.sender, self, amounts[i], method_id=method_id("transferFrom(address,address,uint256)"), ), max_outsize=32, ) if len(response) != 0: assert convert(response, bool) # dev: failed transfer if coin == WETH20: WETH(WETH20).withdraw(amounts[i]) amountsp[i] = xp[i] - xp_old[i] t: uint256 = self.future_A_gamma_time if t > 0: old_D = self.newton_D(A_gamma[0], A_gamma[1], xp_old) if block.timestamp >= t: self.future_A_gamma_time = 1 else: old_D = self.D D: uint256 = self.newton_D(A_gamma[0], A_gamma[1], xp) lp_token: address = self.token token_supply: uint256 = CurveToken(lp_token).totalSupply() if old_D > 0: d_token = token_supply * D / old_D - token_supply else: d_token = self.get_xcp(D) # making initial virtual price equal to 1 assert d_token > 0 # dev: nothing minted if old_D > 0: d_token_fee = self._calc_token_fee(amountsp, xp) * d_token / 10**10 + 1 d_token -= d_token_fee token_supply += d_token CurveToken(lp_token).mint(receiver, d_token) # Calculate price # p_i * (dx_i - dtoken / token_supply * xx_i) = sum{k!=i}(p_k * (dtoken / token_supply * xx_k - dx_k)) # Simplified for 2 coins p: uint256 = 0 if d_token > 10**5: if amounts[0] == 0 or amounts[1] == 0: S: uint256 = 0 precision: uint256 = 0 ix: uint256 = 0 if amounts[0] == 0: S = xx[0] * precisions[0] precision = precisions[1] ix = 1 else: S = xx[1] * precisions[1] precision = precisions[0] S = S * d_token / token_supply p = S * PRECISION / (amounts[ix] * precision - d_token * xx[ix] * precision / token_supply) if ix == 0: p = (10**18)**2 / p self.tweak_price(A_gamma, xp, p, D) else: self.D = D self.virtual_price = 10**18 self.xcp_profit = 10**18 CurveToken(lp_token).mint(receiver, d_token) assert d_token >= min_mint_amount, "Slippage" log AddLiquidity(receiver, amounts, d_token_fee, token_supply) return d_token @external @nonreentrant('lock') def remove_liquidity(_amount: uint256, min_amounts: uint256[N_COINS], use_eth: bool = False, receiver: address = msg.sender): """ This withdrawal method is very safe, does no complex math """ lp_token: address = self.token total_supply: uint256 = CurveToken(lp_token).totalSupply() CurveToken(lp_token).burnFrom(msg.sender, _amount) balances: uint256[N_COINS] = self.balances amount: uint256 = _amount - 1 # Make rounding errors favoring other LPs a tiny bit for i in range(N_COINS): d_balance: uint256 = balances[i] * amount / total_supply assert d_balance >= min_amounts[i] self.balances[i] = balances[i] - d_balance balances[i] = d_balance # now it's the amounts going out coin: address = self.coins[i] if use_eth and coin == WETH20: raw_call(receiver, b"", value=d_balance) else: if coin == WETH20: WETH(WETH20).deposit(value=d_balance) response: Bytes[32] = raw_call( coin, _abi_encode(receiver, d_balance, method_id=method_id("transfer(address,uint256)")), max_outsize=32, ) if len(response) != 0: assert convert(response, bool) D: uint256 = self.D self.D = D - D * amount / total_supply log RemoveLiquidity(msg.sender, balances, total_supply - _amount) @external @nonreentrant('lock') def remove_liquidity_one_coin(token_amount: uint256, i: uint256, min_amount: uint256, use_eth: bool = False, receiver: address = msg.sender) -> uint256: A_gamma: uint256[2] = self._A_gamma() dy: uint256 = 0 D: uint256 = 0 p: uint256 = 0 xp: uint256[N_COINS] = empty(uint256[N_COINS]) future_A_gamma_time: uint256 = self.future_A_gamma_time dy, p, D, xp = self._calc_withdraw_one_coin(A_gamma, token_amount, i, (future_A_gamma_time > 0), True) assert dy >= min_amount, "Slippage" if block.timestamp >= future_A_gamma_time: self.future_A_gamma_time = 1 self.balances[i] -= dy CurveToken(self.token).burnFrom(msg.sender, token_amount) coin: address = self.coins[i] if use_eth and coin == WETH20: raw_call(receiver, b"", value=dy) else: if coin == WETH20: WETH(WETH20).deposit(value=dy) response: Bytes[32] = raw_call( coin, _abi_encode(receiver, dy, method_id=method_id("transfer(address,uint256)")), max_outsize=32, ) if len(response) != 0: assert convert(response, bool) self.tweak_price(A_gamma, xp, p, D) log RemoveLiquidityOne(msg.sender, token_amount, i, dy) return dy @external @nonreentrant('lock') def claim_admin_fees(): self._claim_admin_fees() # Admin parameters @external def ramp_A_gamma(future_A: uint256, future_gamma: uint256, future_time: uint256): assert msg.sender == Factory(self.factory).admin() # dev: only owner assert block.timestamp > self.initial_A_gamma_time + (MIN_RAMP_TIME-1) assert future_time > block.timestamp + (MIN_RAMP_TIME-1) # dev: insufficient time A_gamma: uint256[2] = self._A_gamma() initial_A_gamma: uint256 = shift(A_gamma[0], 128) initial_A_gamma = bitwise_or(initial_A_gamma, A_gamma[1]) assert future_A > MIN_A-1 assert future_A < MAX_A+1 assert future_gamma > MIN_GAMMA-1 assert future_gamma < MAX_GAMMA+1 ratio: uint256 = 10**18 * future_A / A_gamma[0] assert ratio < 10**18 * MAX_A_CHANGE + 1 assert ratio > 10**18 / MAX_A_CHANGE - 1 ratio = 10**18 * future_gamma / A_gamma[1] assert ratio < 10**18 * MAX_A_CHANGE + 1 assert ratio > 10**18 / MAX_A_CHANGE - 1 self.initial_A_gamma = initial_A_gamma self.initial_A_gamma_time = block.timestamp future_A_gamma: uint256 = shift(future_A, 128) future_A_gamma = bitwise_or(future_A_gamma, future_gamma) self.future_A_gamma_time = future_time self.future_A_gamma = future_A_gamma log RampAgamma(A_gamma[0], future_A, A_gamma[1], future_gamma, block.timestamp, future_time) @external def stop_ramp_A_gamma(): assert msg.sender == Factory(self.factory).admin() # dev: only owner A_gamma: uint256[2] = self._A_gamma() current_A_gamma: uint256 = shift(A_gamma[0], 128) current_A_gamma = bitwise_or(current_A_gamma, A_gamma[1]) self.initial_A_gamma = current_A_gamma self.future_A_gamma = current_A_gamma self.initial_A_gamma_time = block.timestamp self.future_A_gamma_time = block.timestamp # now (block.timestamp < t1) is always False, so we return saved A log StopRampA(A_gamma[0], A_gamma[1], block.timestamp) @external def commit_new_parameters( _new_mid_fee: uint256, _new_out_fee: uint256, _new_admin_fee: uint256, _new_fee_gamma: uint256, _new_allowed_extra_profit: uint256, _new_adjustment_step: uint256, _new_ma_half_time: uint256, ): assert msg.sender == Factory(self.factory).admin() # dev: only owner assert self.admin_actions_deadline == 0 # dev: active action new_mid_fee: uint256 = _new_mid_fee new_out_fee: uint256 = _new_out_fee new_admin_fee: uint256 = _new_admin_fee new_fee_gamma: uint256 = _new_fee_gamma new_allowed_extra_profit: uint256 = _new_allowed_extra_profit new_adjustment_step: uint256 = _new_adjustment_step new_ma_half_time: uint256 = _new_ma_half_time # Fees if new_out_fee < MAX_FEE+1: assert new_out_fee > MIN_FEE-1 # dev: fee is out of range else: new_out_fee = self.out_fee if new_mid_fee > MAX_FEE: new_mid_fee = self.mid_fee assert new_mid_fee <= new_out_fee # dev: mid-fee is too high if new_admin_fee > MAX_ADMIN_FEE: new_admin_fee = self.admin_fee # AMM parameters if new_fee_gamma < 10**18: assert new_fee_gamma > 0 # dev: fee_gamma out of range [1 .. 10**18] else: new_fee_gamma = self.fee_gamma if new_allowed_extra_profit > 10**18: new_allowed_extra_profit = self.allowed_extra_profit if new_adjustment_step > 10**18: new_adjustment_step = self.adjustment_step # MA if new_ma_half_time < 7*86400: assert new_ma_half_time > 0 # dev: MA time should be longer than 1 second else: new_ma_half_time = self.ma_half_time _deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY self.admin_actions_deadline = _deadline self.future_admin_fee = new_admin_fee self.future_mid_fee = new_mid_fee self.future_out_fee = new_out_fee self.future_fee_gamma = new_fee_gamma self.future_allowed_extra_profit = new_allowed_extra_profit self.future_adjustment_step = new_adjustment_step self.future_ma_half_time = new_ma_half_time log CommitNewParameters(_deadline, new_admin_fee, new_mid_fee, new_out_fee, new_fee_gamma, new_allowed_extra_profit, new_adjustment_step, new_ma_half_time) @external @nonreentrant('lock') def apply_new_parameters(): assert msg.sender == Factory(self.factory).admin() # 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 admin_fee: uint256 = self.future_admin_fee if self.admin_fee != admin_fee: self._claim_admin_fees() self.admin_fee = admin_fee mid_fee: uint256 = self.future_mid_fee self.mid_fee = mid_fee out_fee: uint256 = self.future_out_fee self.out_fee = out_fee fee_gamma: uint256 = self.future_fee_gamma self.fee_gamma = fee_gamma allowed_extra_profit: uint256 = self.future_allowed_extra_profit self.allowed_extra_profit = allowed_extra_profit adjustment_step: uint256 = self.future_adjustment_step self.adjustment_step = adjustment_step ma_half_time: uint256 = self.future_ma_half_time self.ma_half_time = ma_half_time log NewParameters(admin_fee, mid_fee, out_fee, fee_gamma, allowed_extra_profit, adjustment_step, ma_half_time) @external def revert_new_parameters(): assert msg.sender == Factory(self.factory).admin() # dev: only owner self.admin_actions_deadline = 0 # View Methods @external @view def get_dy(i: uint256, j: uint256, dx: uint256) -> uint256: assert i != j # dev: same input and output coin assert i < N_COINS # dev: coin index out of range assert j < N_COINS # dev: coin index out of range precisions: uint256[2] = self._get_precisions() price_scale: uint256 = self.price_scale * precisions[1] xp: uint256[N_COINS] = self.balances A_gamma: uint256[2] = self._A_gamma() D: uint256 = self.D if self.future_A_gamma_time > 0: D = self.newton_D(A_gamma[0], A_gamma[1], self.xp()) xp[i] += dx xp = [xp[0] * precisions[0], xp[1] * price_scale / PRECISION] y: uint256 = self.newton_y(A_gamma[0], A_gamma[1], xp, D, j) dy: uint256 = xp[j] - y - 1 xp[j] = y if j > 0: dy = dy * PRECISION / price_scale else: dy /= precisions[0] dy -= self._fee(xp) * dy / 10**10 return dy @view @external def calc_token_amount(amounts: uint256[N_COINS]) -> uint256: token_supply: uint256 = CurveToken(self.token).totalSupply() precisions: uint256[2] = self._get_precisions() price_scale: uint256 = self.price_scale * precisions[1] A_gamma: uint256[2] = self._A_gamma() xp: uint256[N_COINS] = self.xp() amountsp: uint256[N_COINS] = [ amounts[0] * precisions[0], amounts[1] * price_scale / PRECISION] D0: uint256 = self.D if self.future_A_gamma_time > 0: D0 = self.newton_D(A_gamma[0], A_gamma[1], xp) xp[0] += amountsp[0] xp[1] += amountsp[1] D: uint256 = self.newton_D(A_gamma[0], A_gamma[1], xp) d_token: uint256 = token_supply * D / D0 - token_supply d_token -= self._calc_token_fee(amountsp, xp) * d_token / 10**10 + 1 return d_token @view @external def calc_withdraw_one_coin(token_amount: uint256, i: uint256) -> uint256: return self._calc_withdraw_one_coin(self._A_gamma(), token_amount, i, True, False)[0] @external @view def lp_price() -> uint256: """ Approximate LP token price """ return 2 * self.virtual_price * self.sqrt_int(self.internal_price_oracle()) / 10**18 @view @external def A() -> uint256: return self._A_gamma()[0] @view @external def gamma() -> uint256: return self._A_gamma()[1] @external @view def fee() -> uint256: return self._fee(self.xp()) @external @view def get_virtual_price() -> uint256: return 10**18 * self.get_xcp(self.D) / CurveToken(self.token).totalSupply() @external @view def price_oracle() -> uint256: return self.internal_price_oracle() # Initializer @external def initialize( A: uint256, gamma: uint256, mid_fee: uint256, out_fee: uint256, allowed_extra_profit: uint256, fee_gamma: uint256, adjustment_step: uint256, admin_fee: uint256, ma_half_time: uint256, initial_price: uint256, _token: address, _coins: address[N_COINS], _precisions: uint256, ): assert self.mid_fee == 0 # dev: check that we call it from factory self.factory = msg.sender # Pack A and gamma: # shifted A + gamma A_gamma: uint256 = shift(A, 128) A_gamma = bitwise_or(A_gamma, gamma) self.initial_A_gamma = A_gamma self.future_A_gamma = A_gamma self.mid_fee = mid_fee self.out_fee = out_fee self.allowed_extra_profit = allowed_extra_profit self.fee_gamma = fee_gamma self.adjustment_step = adjustment_step self.admin_fee = admin_fee self.price_scale = initial_price self._price_oracle = initial_price self.last_prices = initial_price self.last_prices_timestamp = block.timestamp self.ma_half_time = ma_half_time self.xcp_profit_a = 10**18 self.token = _token self.coins = _coins self.PRECISIONS = _precisions
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"name":"TokenExchange","inputs":[{"name":"buyer","type":"address","indexed":true},{"name":"sold_id","type":"uint256","indexed":false},{"name":"tokens_sold","type":"uint256","indexed":false},{"name":"bought_id","type":"uint256","indexed":false},{"name":"tokens_bought","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[2]","indexed":false},{"name":"fee","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[2]","indexed":false},{"name":"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_index","type":"uint256","indexed":false},{"name":"coin_amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewParameters","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin_fee","type":"uint256","indexed":false},{"name":"mid_fee","type":"uint256","indexed":false},{"name":"out_fee","type":"uint256","indexed":false},{"name":"fee_gamma","type":"uint256","indexed":false},{"name":"allowed_extra_profit","type":"uint256","indexed":false},{"name":"adjustment_step","type":"uint256","indexed":false},{"name":"ma_half_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewParameters","inputs":[{"name":"admin_fee","type":"uint256","indexed":false},{"name":"mid_fee","type":"uint256","indexed":false},{"name":"out_fee","type":"uint256","indexed":false},{"name":"fee_gamma","type":"uint256","indexed":false},{"name":"allowed_extra_profit","type":"uint256","indexed":false},{"name":"adjustment_step","type":"uint256","indexed":false},{"name":"ma_half_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampAgamma","inputs":[{"name":"initial_A","type":"uint256","indexed":false},{"name":"future_A","type":"uint256","indexed":false},{"name":"initial_gamma","type":"uint256","indexed":false},{"name":"future_gamma","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":"current_A","type":"uint256","indexed":false},{"name":"current_gamma","type":"uint256","indexed":false},{"name":"time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"ClaimAdminFee","inputs":[{"name":"admin","type":"address","indexed":true},{"name":"tokens","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_weth","type":"address"}],"outputs":[]},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"},{"name":"use_eth","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"},{"name":"use_eth","type":"bool"},{"name":"receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange_underlying","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange_underlying","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"},{"name":"receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange_extended","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"},{"name":"use_eth","type":"bool"},{"name":"sender","type":"address"},{"name":"receiver","type":"address"},{"name":"cb","type":"bytes32"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"add_liquidity","inputs":[{"name":"amounts","type":"uint256[2]"},{"name":"min_mint_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"add_liquidity","inputs":[{"name":"amounts","type":"uint256[2]"},{"name":"min_mint_amount","type":"uint256"},{"name":"use_eth","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"add_liquidity","inputs":[{"name":"amounts","type":"uint256[2]"},{"name":"min_mint_amount","type":"uint256"},{"name":"use_eth","type":"bool"},{"name":"receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"min_amounts","type":"uint256[2]"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"min_amounts","type":"uint256[2]"},{"name":"use_eth","type":"bool"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"min_amounts","type":"uint256[2]"},{"name":"use_eth","type":"bool"},{"name":"receiver","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"},{"name":"min_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"},{"name":"min_amount","type":"uint256"},{"name":"use_eth","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"},{"name":"min_amount","type":"uint256"},{"name":"use_eth","type":"bool"},{"name":"receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"claim_admin_fees","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"ramp_A_gamma","inputs":[{"name":"future_A","type":"uint256"},{"name":"future_gamma","type":"uint256"},{"name":"future_time","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A_gamma","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"commit_new_parameters","inputs":[{"name":"_new_mid_fee","type":"uint256"},{"name":"_new_out_fee","type":"uint256"},{"name":"_new_admin_fee","type":"uint256"},{"name":"_new_fee_gamma","type":"uint256"},{"name":"_new_allowed_extra_profit","type":"uint256"},{"name":"_new_adjustment_step","type":"uint256"},{"name":"_new_ma_half_time","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"apply_new_parameters","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"revert_new_parameters","inputs":[],"outputs":[]},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"amounts","type":"uint256[2]"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"lp_price","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"A","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"price_oracle","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"initialize","inputs":[{"name":"A","type":"uint256"},{"name":"gamma","type":"uint256"},{"name":"mid_fee","type":"uint256"},{"name":"out_fee","type":"uint256"},{"name":"allowed_extra_profit","type":"uint256"},{"name":"fee_gamma","type":"uint256"},{"name":"adjustment_step","type":"uint256"},{"name":"admin_fee","type":"uint256"},{"name":"ma_half_time","type":"uint256"},{"name":"initial_price","type":"uint256"},{"name":"_token","type":"address"},{"name":"_coins","type":"address[2]"},{"name":"_precisions","type":"uint256"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"coins","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"price_scale","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"last_prices","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"last_prices_timestamp","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"initial_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"initial_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"allowed_extra_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_allowed_extra_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"future_admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"D","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"factory","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"xcp_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"xcp_profit_a","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"admin_actions_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}]}]
Contract Creation Code
6020615d406080396080518060a01c615d3b5760e05260e051610100526301500786601455615d1356600436101561000d57612687565b60046000601c37600051635b41b9088118610032576000610ee05233610f0052610080565b63394747c58118610056576084358060011c615ce557610ee05233610f0052610080565b63ce7d650381186100d9576084358060011c615ce557610ee05260a4358060a01c615ce557610f00525b600054615ce557600160005533610960523461098052608060046109a037610ee051610a2052610f0051610a40526000610a60526000610a80526100c5610f20614a9d565b610f2051610f40526020610f406000600055f35b6365b2489b81186100ee5733610ee052610109565b63e2ad025a8118610160576084358060a01c615ce557610ee0525b600054615ce557600160005533610960523461098052608060046109a0376001610a2052610ee051610a40526000610a60526000610a805261014c610f00614a9d565b610f0051610f20526020610f206000600055f35b63dd96994f81186101fe576084358060011c615ce557610ee05260a4358060a01c615ce557610f005260c4358060a01c615ce557610f2052600054615ce5576001600055600060e43514615ce557610f0051610960523461098052608060046109a037610ee051610a2052610f2051610a405233610a605260e435610a80526101ea610f40614a9d565b610f4051610f60526020610f606000600055f35b630b4c7e4d8118610219576000610960523361098052610267565b63ee22be23811861023d576064358060011c615ce557610960523361098052610267565b637328333b8118610bc8576064358060011c615ce557610960526084358060a01c615ce557610980525b600054615ce55760016000556000600435116102885760006024351161028b565b60015b15615ce55761029b6109e061275a565b6109e080516109a05280602001516109c05250601a546109e052601b54610a005260e036610a20376109e051610b0052610a0051610b2052610b4060006002818352015b6109e0610b40516002811015615ce55760200201516020610b405102600401358181830110615ce55780820190509050610b6052610b60516109e0610b40516002811015615ce5576020020152610b60516001610b40516002811015615ce55702601a015581516001018083528114156102df5750506109e051610a6052610a0051610a8052610370610b80612689565b610b808051610b40528060200151610b605250600454610b6051808202821582848304141715615ce55790509050610b80526109e051610b4051808202821582848304141715615ce557905090506109e052610a0051610b8051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610a0052610b0051610b4051808202821582848304141715615ce55790509050610b0052610b2051610b8051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610b2052610960516104505734615ce5575b610ba060006002818352015b6001610ba0516002811015615ce5570260020154610bc05261096051610483576000610495565b602060203803608039608051610bc051145b156104ac576020610ba05102600401353418615ce5575b60006020610ba051026004013511156106425761096051156104df57602060203803608039608051610bc05114156104e2565b60015b156105f4576323b872dd610c2452600433610c445230610c64526020610ba0510260040135610c8452606001610c2052610c20506020610ce0610c2051610c406000610bc0515af1610539573d600060003e3d6000fd5b610cc060203d80821161054c578161054e565b805b905090508152805160200180610be0828460045afa905050506000610be0511461058d57610c0051610be05181816020036008021c9050905015615ce5575b602060203803608039608051610bc051186105f457632e1a7d4d610c20526020610ba0510260040135610c40526020602038036080396080513b15615ce557600060006024610c3c60006020602038036080396080515af16105f4573d600060003e3d6000fd5b6109e0610ba0516002811015615ce5576020020151610b00610ba0516002811015615ce5576020020151808210615ce55780820390509050610a20610ba0516002811015615ce55760200201525b815160010180835281141561045c575050600b54610ba0526000610ba0511161067157601c54610ae0526106b4565b6109a051610200526109c05161022052610b005161024052610b20516102605261069c610bc0612be3565b610bc051610ae052610ba05142106106b4576001600b555b6109a051610200526109c051610220526109e05161024052610a0051610260526106df610be0612be3565b610be051610bc052600154610be0526318160ddd610c20526020610c206004610c3c610be0515afa610716573d600060003e3d6000fd5b601f3d1115615ce557610c2051610c00526000610ae0511161075257610bc05161020052610745610c20613d70565b610c2051610aa052610796565b610c0051610bc051808202821582848304141715615ce55790509050610ae051808015615ce557820490509050610c0051808210615ce55780820390509050610aa0525b6000610aa0511115615ce5576000610ae0511161081857610bc051601c55670de0b6b3a7640000602055670de0b6b3a7640000601e556340c10f19610c205261098051610c4052610aa051610c60526020610c206044610c3c6000610be0515af1610806573d600060003e3d6000fd5b601f3d1115615ce557610c2050610ae7565b610a205161016052610a4051610180526109e0516101a052610a00516101c052610843610c20615556565b610c2051610aa051808202821582848304141715615ce557905090506402540be4008082049050905060018181830110615ce55780820190509050610ac052610aa08051610ac051808210615ce55780820390509050815250610c008051610aa0518181830110615ce557808201905090508152506340c10f19610c205261098051610c4052610aa051610c60526020610c206044610c3c6000610be0515af16108f2573d600060003e3d6000fd5b601f3d1115615ce557610c20506000610c2052620186a0610aa0511115610aaf57600435156109245760243515610927565b60015b15610aaf57606036610c40376004351561096857610a8051610b6051808202821582848304141715615ce55790509050610c4052610b4051610c6052610997565b610a6051610b4051808202821582848304141715615ce55790509050610c4052610b6051610c60526001610c80525b610c4051610aa051808202821582848304141715615ce55790509050610c0051808015615ce557820490509050610c4052610c4051670de0b6b3a7640000808202821582848304141715615ce557905090506020610c80510260040135610c6051808202821582848304141715615ce55790509050610aa051610a60610c80516002811015615ce5576020020151808202821582848304141715615ce55790509050610c6051808202821582848304141715615ce55790509050610c0051808015615ce557820490509050808210615ce55780820390509050808015615ce557820490509050610c2052610c8051610aaf576ec097ce7bc90715b34b9f1000000000610c2051808015615ce557820490509050610c20525b6109a051610660526109c051610680526109e0516106a052610a00516106c052610c20516106e052610bc05161070052610ae7614298565b604435610aa0511015610b6b576008610c20527f536c697070616765000000000000000000000000000000000000000000000000610c4052610c2050610c205180610c4001818260206001820306601f82010390500336823750506308c379a0610be0526020610c0052610c205160206001820306601f8201039050604401610bfcfd5b610980517f540ab385f9b5d450a27404172caade516b3ba3f4be88239ac56a2ad1de2a1f5a600435610c2052602435610c4052610ac051610c6052610c0051610c80526080610c20a2610aa051610c20526020610c206000600055f35b635b36389c8118610be257600060e0523361010052610c2e565b63269b55818118610c05576064358060011c615ce55760e0523361010052610c2e565b631808e84a8118610fb4576064358060011c615ce55760e0526084358060a01c615ce557610100525b34615ce557600054615ce5576001600055600154610120526318160ddd610160526020610160600461017c610120515afa610c6e573d600060003e3d6000fd5b601f3d1115615ce55761016051610140526379cc67906101605233610180526004356101a0526020610160604461017c6000610120515af1610cb5573d600060003e3d6000fd5b601f3d1115615ce55761016050601a5461016052601b54610180526004356001808210615ce557808203905090506101a0526101c060006002818352015b6101606101c0516002811015615ce55760200201516101a051808202821582848304141715615ce5579050905061014051808015615ce5578204905090506101e05260206101c05102602401356101e05110615ce5576101606101c0516002811015615ce55760200201516101e051808210615ce5578082039050905060016101c0516002811015615ce55702601a01556101e0516101606101c0516002811015615ce557602002015260016101c0516002811015615ce55702600201546102005260e051610dc3576000610dd5565b60206020380360803960805161020051145b610ed4576020602038036080396080516102005118610e335763d0e30db0610220526020602038036080396080513b15615ce55760006000600461023c6101e0516020602038036080396080515af1610e33573d600060003e3d6000fd5b63a9059cbb61026452600461010051610284526101e0516102a45260400161026052610260506020610300610260516102806000610200515af1610e7c573d600060003e3d6000fd5b6102e060203d808211610e8f5781610e91565b805b905090508152805160200180610220828460045afa9050505060006102205114610f0257610240516102205181816020036008021c9050905015615ce557610f02565b6000610220526102205060006000610220516102406101e051610100515af1610f02573d600060003e3d6000fd5b8151600101808352811415610cf3575050601c546101c0526101c0516101c0516101a051808202821582848304141715615ce5579050905061014051808015615ce557820490509050808210615ce55780820390509050601c55337fdd3c0336a16f1b64f172b7bb0dad5b2b3c7c76f91e8c4aafd6aae60dce800153610160516101e052610180516102005261014051600435808210615ce557808203905090506102205260606101e0a26000600055005b63f1dc3cc98118610fcf57600061096052336109805261101d565b638f15b6b58118610ff3576064358060011c615ce55761096052336109805261101d565b6307329bcd81186113a6576064358060011c615ce557610960526084358060a01c615ce557610980525b34615ce557600054615ce55760016000556110396109e061275a565b6109e080516109a05280602001516109c0525060a0366109e037600b54610a80526109a0516104a0526109c0516104c052604060046104e0376000610a8051116105205260016105405261108e610aa06156df565b610aa080516109e0526020810151610a20526040810151610a0052606081018051610a40528060200151610a605250506044356109e0511015611142576008610aa0527f536c697070616765000000000000000000000000000000000000000000000000610ac052610aa050610aa05180610ac001818260206001820306601f82010390500336823750506308c379a0610a60526020610a8052610aa05160206001820306601f8201039050604401610a7cfd5b610a80514210611152576001600b555b60016024356002811015615ce55702601a0180546109e051808210615ce557808203905090508155506379cc6790610aa05233610ac052600435610ae0526020610aa06044610abc60006001545af16111b0573d600060003e3d6000fd5b601f3d1115615ce557610aa05060016024356002811015615ce5570260020154610aa052610960516111e35760006111f5565b602060203803608039608051610aa051145b6112f457602060203803608039608051610aa051186112535763d0e30db0610ac0526020602038036080396080513b15615ce557600060006004610adc6109e0516020602038036080396080515af1611253573d600060003e3d6000fd5b63a9059cbb610b0452600461098051610b24526109e051610b4452604001610b0052610b00506020610ba0610b0051610b206000610aa0515af161129c573d600060003e3d6000fd5b610b8060203d8082116112af57816112b1565b805b905090508152805160200180610ac0828460045afa905050506000610ac0511461132257610ae051610ac05181816020036008021c9050905015615ce557611322565b6000610ac052610ac05060006000610ac051610ae06109e051610980515af1611322573d600060003e3d6000fd5b6109a051610660526109c05161068052610a40516106a052610a60516106c052610a20516106e052610a00516107005261135a614298565b337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060406004610ac0376109e051610b00526060610ac0a26109e051610ac0526020610ac06000600055f35b63c93f49e881186113d15734615ce557600054615ce55760016000556113ca613df5565b6000600055005b635e24807281186115fe5734615ce55763f851a4406101c05260206101c060046101dc601d545afa611408573d600060003e3d6000fd5b601f3d1115615ce5576101c0513318615ce557600a546201517f8181830110615ce55780820190509050421115615ce557426201517f8181830110615ce557808201905090506044351115615ce55761146261020061275a565b61020080516101c05280602001516101e052506101c05160801b610200526101e051610200511761020052610f9f6004351115615ce55763ee6b28016004351015615ce5576402540be3ff6024351115615ce55766470de4df8200016024351015615ce557670de0b6b3a7640000600435808202821582848304141715615ce557905090506101c051808015615ce55782049050905061022052678ac7230489e80001610220511015615ce55767016345785d89ffff610220511115615ce557670de0b6b3a7640000602435808202821582848304141715615ce557905090506101e051808015615ce55782049050905061022052678ac7230489e80001610220511015615ce55767016345785d89ffff610220511115615ce5576102005160085542600a5560043560801b61024052602435610240511761024052604435600b55610240516009557fe35f0559b0642164e286b30df2077ec3a05426617a25db7578fd20ba39a6cd056101c05161026052600435610280526101e0516102a0526024356102c052426102e0526044356103005260c0610260a1005b63244c7c2e81186116d25734615ce55763f851a4406101c05260206101c060046101dc601d545afa611635573d600060003e3d6000fd5b601f3d1115615ce5576101c0513318615ce55761165361020061275a565b61020080516101c05280602001516101e052506101c05160801b610200526101e051610200511761020052610200516008556102005160095542600a5542600b557f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc2846101c051610220526101e0516102405242610260526060610220a1005b63a43c335181186118c55734615ce55763f851a44060e052602060e0600460fc601d545afa611706573d600060003e3d6000fd5b601f3d1115615ce55760e0513318615ce557602254615ce55760e0600460e0376402540be40161010051106117415760155461010052611750565b6207a11f610100511115615ce5575b6402540be40060e05111156117665760145460e0525b6101005160e05111615ce5576402540be40061012051111561178a57601654610120525b670de0b6b3a764000061014051106117a857600e54610140526117b5565b6000610140511115615ce5575b670de0b6b3a76400006101605111156117d057600c54610160525b670de0b6b3a76400006101805111156117eb57601054610180525b62093a806101a05110611804576012546101a052611811565b60006101a0511115615ce5575b426203f4808181830110615ce557808201905090506101c0526101c0516022556101205160195560e0516017556101005160185561014051600f5561016051600d55610180516011556101a0516013556101c0517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde553610120516101e05260e0516102005261010051610220526101405161024052610160516102605261018051610280526101a0516102a05260e06101e0a2005b632a7dd7cd8118611a105734615ce557600054615ce557600160005563f851a440610660526020610660600461067c601d545afa611908573d600060003e3d6000fd5b601f3d1115615ce557610660513318615ce5576022544210615ce557600060225414615ce55760006022556019546106605261066051601654146119565761194e613df5565b610660516016555b60175461068052610680516014556018546106a0526106a051601555600f546106c0526106c051600e55600d546106e0526106e051600c55601154610700526107005160105560135461072052610720516012557f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc5504087610660516107405261068051610760526106a051610780526106c0516107a0526106e0516107c052610700516107e052610720516108005260e0610740a16000600055005b63226840fb8118611a5d5734615ce55763f851a44060e052602060e0600460fc601d545afa611a44573d600060003e3d6000fd5b601f3d1115615ce55760e0513318615ce5576000602255005b63556d6e9f8118611d405734615ce55760243560043514615ce55760026004351015615ce55760026024351015615ce557611a996104e0612689565b6104e080516104a05280602001516104c052506004546104c051808202821582848304141715615ce557905090506104e052601a5461050052601b5461052052611ae461058061275a565b61058080516105405280602001516105605250601c54610580526000600b541115611b6b5761054051610600526105605161062052611b246105a06126d5565b6105a0805161064052806020015161066052506106005161020052610620516102205261064051610240526106605161026052611b626105e0612be3565b6105e051610580525b6105006004356002811015615ce5576020020180516044358181830110615ce55780820190509050815250610500516104a051808202821582848304141715615ce5579050905061050052610520516104e051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610520526105405160e052610560516101005261050051610120526105205161014052610580516101605260243561018052611c1f6105c0613372565b6105c0516105a0526105006024356002811015615ce55760200201516105a051808210615ce557808203905090506001808210615ce557808203905090506105c0526105a0516105006024356002811015615ce5576020020152600060243511611ca1576105c080516104a051808015615ce557820490509050815250611cd8565b6105c051670de0b6b3a7640000808202821582848304141715615ce557905090506104e051808015615ce5578204905090506105c0525b6105c080516105005160e0526105205161010052611cf76105e06128cd565b6105e0516105c051808202821582848304141715615ce557905090506402540be40080820490509050808210615ce557808203905090508152506105c0516105e05260206105e0f35b638d8ea7278118611fce5734615ce5576318160ddd6104c05260206104c060046104dc6001545afa611d77573d600060003e3d6000fd5b601f3d1115615ce5576104c0516104a052611d93610500612689565b61050080516104c05280602001516104e052506004546104e051808202821582848304141715615ce5579050905061050052611dd061056061275a565b61056080516105205280602001516105405250611dee6105a06126d5565b6105a0805161056052806020015161058052506004356104c051808202821582848304141715615ce557905090506105a05260243561050051808202821582848304141715615ce55790509050670de0b6b3a7640000808204905090506105c052601c546105e0526000600b541115611e95576105205161020052610540516102205261056051610240526105805161026052611e8c610600612be3565b610600516105e0525b61056080516105a0518181830110615ce5578082019050905081525061058080516105c0518181830110615ce557808201905090508152506105205161020052610540516102205261056051610240526105805161026052611ef8610620612be3565b61062051610600526104a05161060051808202821582848304141715615ce557905090506105e051808015615ce5578204905090506104a051808210615ce557808203905090506106205261062080516105a051610160526105c05161018052610560516101a052610580516101c052611f73610640615556565b6106405161062051808202821582848304141715615ce557905090506402540be4008082049050905060018181830110615ce55780820190509050808210615ce5578082039050905081525061062051610640526020610640f35b634fb08c5e811861205a5734615ce557611fe961078061275a565b61078080516108605280602001516108805250604060046108a03760016108e052600061090052610860516104a052610880516104c0526108a0516104e0526108c051610500526108e05161052052610900516105405261204b6107c06156df565b6107c051610920526020610920f35b6354f0f7d581186120db5734615ce5576002602054808202821582848304141715615ce5579050905061208e610300614192565b61030051610340526103405160e0526120a8610320615b98565b61032051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610360526020610360f35b63f446c1d081186121055734615ce5576120f66101c061275a565b6101c051610200526020610200f35b63b137392981186121325734615ce5576121206101c061275a565b6101c060200151610200526020610200f35b63ddca3f4381186121895734615ce55761214d6101a06126d5565b6101a0805161020052806020015161022052506102005160e052610220516101005261217a6101e06128cd565b6101e051610240526020610240f35b63bb7b8b8081186122185734615ce557670de0b6b3a7640000601c54610200526121b4610280613d70565b61028051808202821582848304141715615ce557905090506318160ddd6102a05260206102a060046102bc6001545afa6121f3573d600060003e3d6000fd5b601f3d1115615ce5576102a051808015615ce5578204905090506102e05260206102e0f35b6386fc88d381186122425734615ce557612233610300614192565b61030051610320526020610320f35b63a39e95c5811861231d57610144358060a01c615ce55760e052610164358060a01c615ce55761010052610184358060a01c615ce5576101205234615ce557601454615ce55733601d5560043560801b610140526024356101405117610140526101405160085561014051600955604435601455606435601555608435600c5560a435600e5560c43560105560e4356016556101243560045561012435600555610124356006554260075561010435601255670de0b6b3a7640000601f5560e05160015561010051600255610120516003556101a435602355005b63fc0c546a81186123395734615ce55760015460e052602060e0f35b63c661065781186123655734615ce55760016004356002811015615ce557026002015460e052602060e0f35b63b9e8c9fd81186123815734615ce55760045460e052602060e0f35b63c146bf94811861239d5734615ce55760065460e052602060e0f35b636112c74781186123b95734615ce55760075460e052602060e0f35b63204fe3d581186123d55734615ce55760085460e052602060e0f35b63f30cfad581186123f15734615ce55760095460e052602060e0f35b63e89876ff811861240d5734615ce557600a5460e052602060e0f35b63f9ed959781186124295734615ce557600b5460e052602060e0f35b6349fe9e7781186124455734615ce557600c5460e052602060e0f35b63727ced5781186124615734615ce557600d5460e052602060e0f35b6372d4f0e2811861247d5734615ce557600e5460e052602060e0f35b63d7c3dcbe81186124995734615ce557600f5460e052602060e0f35b63083812e581186124b55734615ce55760105460e052602060e0f35b634ea12c7d81186124d15734615ce55760115460e052602060e0f35b63662b627481186124ed5734615ce55760125460e052602060e0f35b630c5e23d481186125095734615ce55760135460e052602060e0f35b6392526c0c81186125255734615ce55760145460e052602060e0f35b63ee8de67581186125415734615ce55760155460e052602060e0f35b63fee3f7f9811861255d5734615ce55760165460e052602060e0f35b637cf9aedc81186125795734615ce55760175460e052602060e0f35b637d1b060c81186125955734615ce55760185460e052602060e0f35b63e382446281186125b15734615ce55760195460e052602060e0f35b634903b0d181186125dd5734615ce55760016004356002811015615ce55702601a015460e052602060e0f35b630f529ba281186125f95734615ce557601c5460e052602060e0f35b63c45a015581186126155734615ce557601d5460e052602060e0f35b637ba1a74d81186126315734615ce557601e5460e052602060e0f35b630b7b594b811861264d5734615ce557601f5460e052602060e0f35b630c46b72a81186126695734615ce55760205460e052602060e0f35b63405e28f881186126855734615ce55760225460e052602060e0f35b505b005b60235460e052604e60e05160081c1015615ce55760e05160081c600a0a61010052604e60ff60e051161015615ce55760ff60e05116600a0a60e05260e051815261010051816020015250565b6126e0610160612689565b61016080516101205280602001516101405250601a5461012051808202821582848304141715615ce557905090508152601b5461014051808202821582848304141715615ce55790509050600454808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050816020015250565b600b5460e052600954610100526fffffffffffffffffffffffffffffffff6101005116610120526101005160801c6101405260e0514210156128bb5760085461016052600a546101805260e0805161018051808210615ce557808203905090508152504261018051808210615ce557808203905090506101805260e05161018051808210615ce557808203905090506101a0526101605160801c6101a051808202821582848304141715615ce557905090506101405161018051808202821582848304141715615ce557905090508181830110615ce5578082019050905060e051808015615ce557820490509050610140526fffffffffffffffffffffffffffffffff61016051166101a051808202821582848304141715615ce557905090506101205161018051808202821582848304141715615ce557905090508181830110615ce5578082019050905060e051808015615ce557820490509050610120525b61014051815261012051816020015250565b600e546101205260e051610100518181830110615ce557808201905090506101405261012051670de0b6b3a7640000808202821582848304141715615ce5579050905061012051670de0b6b3a76400008181830110615ce55780820190509050673782dace9d90000060e051808202821582848304141715615ce5579050905061014051808015615ce55782049050905061010051808202821582848304141715615ce5579050905061014051808015615ce557820490509050808210615ce55780820390509050808015615ce5578204905090506101405260145461014051808202821582848304141715615ce55790509050601554670de0b6b3a764000061014051808210615ce55780820390509050808202821582848304141715615ce557905090508181830110615ce55780820190509050670de0b6b3a764000080820490509050815250565b60e05161014052610100516101605261012051612a36576000612a40565b6101605161014051105b15612a5557610100516101405260e051610160525b610140516101805260006101a0526101c0600060ff818352015b610180516101e052610180516101405161016051808202821582848304141715615ce5579050905061018051808015615ce5578204905090508181830110615ce55780820190509050600280820490509050610180526101e0516101805111612af1576101e05161018051808210615ce557808203905090506101a052612b0c565b610180516101e051808210615ce557808203905090506101a0525b60016101a0511115612b4357610180516101a051670de0b6b3a7640000808202821582848304141715615ce5579050905010612b46565b60015b15612b5957505061018051815250612be1565b8151600101808352811415612a6f57505060106101c0527f446964206e6f7420636f6e7665726765000000000000000000000000000000006101e0526101c0506101c051806101e001818260206001820306601f82010390500336823750506308c379a06101805260206101a0526101c05160206001820306601f820103905060440161019cfd5b565b610f9f6102005111612bf6576000612c01565b63ee6b280161020051105b15615ce5576402540be3ff6102205111612c1c576000612c2a565b66470de4df82000161022051105b15615ce5576102405161028052610260516102a0526102a051610280511015612c5e576102605161028052610240516102a0525b633b9ac9ff6102805111612c73576000612c88565b6d314dc6448d9338c15b0a0000000161028051105b15615ce557655af3107a3fff6102a051670de0b6b3a7640000808202821582848304141715615ce5579050905061028051808015615ce5578204905090501115615ce55760026102805160e0526102a05161010052600061012052612cee6102e0612a18565b6102e051808202821582848304141715615ce557905090506102c052610280516102a0518181830110615ce557808201905090506102e052610300600060ff818352015b6102c05161032052673782dace9d90000061028051808202821582848304141715615ce557905090506102c051808015615ce5578204905090506102a051808202821582848304141715615ce557905090506102c051808015615ce5578204905090506103405261022051670de0b6b3a76400008181830110615ce5578082019050905061036052610340516103605111612df8576103405161036051808210615ce5578082039050905060018181830110615ce5578082019050905061036052612e25565b6103605161034051808210615ce5578082039050905060018181830110615ce55780820190509050610360525b670de0b6b3a76400006102c051808202821582848304141715615ce5579050905061022051808015615ce55782049050905061036051808202821582848304141715615ce5579050905061022051808015615ce55782049050905061036051808202821582848304141715615ce55790509050612710808202821582848304141715615ce5579050905061020051808015615ce55782049050905061038052673782dace9d90000061034051808202821582848304141715615ce5579050905061036051808015615ce5578204905090506103a0526102e0516102e0516103a051808202821582848304141715615ce55790509050670de0b6b3a7640000808204905090508181830110615ce55780820190509050610380516002808202821582848304141715615ce5579050905061034051808015615ce5578204905090508181830110615ce557808201905090506103a0516102c051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050808210615ce557808203905090506103c0526102c0516103c0516102e0518181830110615ce55780820190509050808202821582848304141715615ce557905090506103c051808015615ce5578204905090506103e0526102c0516102c051808202821582848304141715615ce557905090506103c051808015615ce5578204905090506104005261034051670de0b6b3a7640000116130d35761040080516102c051610380516103c051808015615ce557820490509050808202821582848304141715615ce55790509050670de0b6b3a76400008082049050905061034051670de0b6b3a7640000808210615ce55780820390509050808202821582848304141715615ce5579050905061034051808015615ce557820490509050808210615ce55780820390509050815250613169565b61040080516102c051610380516103c051808015615ce557820490509050808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050670de0b6b3a764000061034051808210615ce55780820390509050808202821582848304141715615ce5579050905061034051808015615ce5578204905090508181830110615ce557808201905090508152505b610400516103e0511161319e57610400516103e051808210615ce557808203905090506002808204905090506102c0526131b9565b6103e05161040051808210615ce557808203905090506102c0525b600061042052610320516102c051116131eb57610320516102c051808210615ce5578082039050905061042052613206565b6102c05161032051808210615ce55780820390509050610420525b662386f26fc100006102c05180821061321f5781613221565b805b9050905061042051655af3107a4000808202821582848304141715615ce5579050905010156132e85761046060006002818352015b6020610460510261028001516104405261044051670de0b6b3a7640000808202821582848304141715615ce557905090506102c051808015615ce55782049050905061048052662386f26fc0ffff61048051116132b45760006132c4565b68056bc75e2d6310000161048051105b15615ce557815160010180835281141561325657505050506102c051815250613370565b8151600101808352811415612d325750506010610300527f446964206e6f7420636f6e7665726765000000000000000000000000000000006103205261030050610300518061032001818260206001820306601f82010390500336823750506308c379a06102c05260206102e0526103005160206001820306601f82010390506044016102dcfd5b565b610f9f60e0511161338457600061338e565b63ee6b280160e051105b15615ce5576402540be3ff61010051116133a95760006133b7565b66470de4df82000161010051105b15615ce55767016345785d89ffff61016051116133d55760006133ea565b6d314dc6448d9338c15b0a0000000161016051105b15615ce557610120600161018051808210615ce557808203905090506002811015615ce55760200201516101a052700100000000000000000000000000000000610160511015615ce5576002610160510a6101a0516004808202821582848304141715615ce55790509050808015615ce5578204905090506101c052671bc16d674ec800006101a051808202821582848304141715615ce5579050905061016051808015615ce5578204905090506101e05266470de4df81ffff6101e051116134b45760006134c4565b680ad78ebc5ac62000016101e051105b15615ce5576101a051655af3107a40008082049050905061016051655af3107a4000808204905090508082106134fa57816134fc565b805b90509050606480821061350f5781613511565b805b9050905061020052610220600060ff818352015b6101c051610240526101e0516101c051808202821582848304141715615ce557905090506002808202821582848304141715615ce5579050905061016051808015615ce557820490509050610260526101a0516101c0518181830110615ce557808201905090506102805261010051670de0b6b3a76400008181830110615ce557808201905090506102a052610260516102a051116135ef57610260516102a051808210615ce5578082039050905060018181830110615ce557808201905090506102a05261361c565b6102a05161026051808210615ce5578082039050905060018181830110615ce557808201905090506102a0525b670de0b6b3a764000061016051808202821582848304141715615ce5579050905061010051808015615ce5578204905090506102a051808202821582848304141715615ce5579050905061010051808015615ce5578204905090506102a051808202821582848304141715615ce55790509050612710808202821582848304141715615ce5579050905060e051808015615ce5578204905090506102c052670de0b6b3a7640000671bc16d674ec8000061026051808202821582848304141715615ce557905090506102a051808015615ce5578204905090508181830110615ce557808201905090506102e052670de0b6b3a76400006101c051808202821582848304141715615ce55790509050610280516102e051808202821582848304141715615ce557905090508181830110615ce557808201905090506102c0518181830110615ce5578082019050905061030052610160516102e051808202821582848304141715615ce55790509050610320526103205161030051106137ba57610300805161032051808210615ce557808203905090508152506137d0565b610240516002808204905090506101c052613a07565b610300516101c051808015615ce557820490509050610340526102c05161034051808015615ce5578204905090506103605261030051670de0b6b3a764000061016051808202821582848304141715615ce557905090508181830110615ce5578082019050905061034051808015615ce55782049050905061036051670de0b6b3a7640000808202821582848304141715615ce5579050905061026051808015615ce5578204905090508181830110615ce55780820190509050610380526103608051670de0b6b3a764000061028051808202821582848304141715615ce5579050905061034051808015615ce5578204905090508181830110615ce55780820190509050815250610360516103805110613904576103805161036051808210615ce557808203905090506101c052613916565b610240516002808204905090506101c0525b60006103a052610240516101c0511161394857610240516101c051808210615ce557808203905090506103a052613963565b6101c05161024051808210615ce557808203905090506103a0525b610200516101c051655af3107a4000808204905090508082106139865781613988565b805b905090506103a0511015613a07576101c051670de0b6b3a7640000808202821582848304141715615ce5579050905061016051808015615ce5578204905090506103c052662386f26fc0ffff6103c051116139e45760006139f4565b68056bc75e2d631000016103c051105b15615ce55750506101c051815250613a8f565b81516001018083528114156135255750506010610220527f446964206e6f7420636f6e7665726765000000000000000000000000000000006102405261022050610220518061024001818260206001820306601f82010390500336823750506308c379a06101e0526020610200526102205160206001820306601f82010390506044016101fcfd5b565b60e051670de0b6b3a7640000808204905090506101005260e05161010051670de0b6b3a7640000808202821582848304141715615ce55790509050808210615ce5578082039050905061012052603b610100511115613af4576000815250613d6e565b670de0b6b3a7640000610100610100511015615ce5576101005160020a808015615ce5578204905090506101405261012051613b365761014051815250613d6e565b670de0b6b3a7640000610160526706f05b59d3b2000061018052670de0b6b3a76400006101a05260006101c0526101e0600160ff818352015b6101e051670de0b6b3a7640000808202821582848304141715615ce557905090506102005261020051670de0b6b3a7640000808210615ce5578082039050905061022052610220516101205111613bdf57610220805161012051808210615ce55780820390509050815250613c03565b6101205161022051808210615ce55780820390509050610220526101c051156101c0525b610160516102205161018051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050808202821582848304141715615ce5579050905061020051808015615ce557820490509050610160526101c051613c85576101a08051610160518181830110615ce55780820190509050815250613ca0565b6101a0805161016051808210615ce557808203905090508152505b6402540be400610160511015613ce6575050610140516101a051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050815250613d6e565b8151600101808352811415613b6f57505060106101e0527f446964206e6f7420636f6e766572676500000000000000000000000000000000610200526101e0506101e0518061020001818260206001820306601f82010390500336823750506308c379a06101a05260206101c0526101e05160206001820306601f82010390506044016101bcfd5b565b610200516002808204905090506102205261020051670de0b6b3a7640000808202821582848304141715615ce557905090506004546002808202821582848304141715615ce55790509050808015615ce557820490509050610240526102205160e0526102405161010052600161012052613dec610260612a18565b61026051815250565b613e006104e061275a565b6104e080516104a05280602001516104c05250601e546104e052601f546105005261052060006002818352015b6001610520516002811015615ce5570260020154610540526020602038036080396080516105405118613e7457476001610520516002811015615ce55702601a0155613ec3565b6370a082316105605230610580526020610560602461057c610540515afa613ea1573d600060003e3d6000fd5b601f3d1115615ce557610560516001610520516002811015615ce55702601a01555b8151600101808352811415613e2d57505060205461052052610500516104e0511115614092576104e05161050051808210615ce55780820390509050601654808202821582848304141715615ce557905090506404a817c800808204905090506105405260006105405111156140925763cab4d3db610580526020610580600461059c601d545afa613f5a573d600060003e3d6000fd5b601f3d1115615ce557610580518060a01c615ce55761056052600061056051146140925761052051670de0b6b3a7640000808202821582848304141715615ce557905090506105205161054051808210615ce55780820390509050808015615ce557820490509050670de0b6b3a7640000808210615ce5578082039050905061058052636962f8456105c052610560516105e052610580516106005260206105c060446105dc60006001545af1614016573d600060003e3d6000fd5b601f3d1115615ce5576105c0516105a0526104e08051610540516002808202821582848304141715615ce55790509050808210615ce557808203905090508152506104e051601e55610560517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf596105a0516105c05260206105c0a25b6318160ddd610560526020610560600461057c6001545afa6140b9573d600060003e3d6000fd5b601f3d1115615ce55761056051610540526104a0516105e0526104c051610600526140e56105806126d5565b610580805161062052806020015161064052506105e051610200526106005161022052610620516102405261064051610260526141236105c0612be3565b6105c0516105605261056051601c55670de0b6b3a7640000610560516102005261414e610580613d70565b61058051808202821582848304141715615ce5579050905061054051808015615ce557820490509050602055610500516104e0511115614190576104e051601f555b565b60055461024052600754610260524261026051106141ba576102405181525061429656614296565b601254610280526006546102a0524261026051808210615ce55780820390509050670de0b6b3a7640000808202821582848304141715615ce5579050905061028051808015615ce55782049050905060e0526142176102e0613a91565b6102e0516102c0526102a051670de0b6b3a76400006102c051808210615ce55780820390509050808202821582848304141715615ce55790509050610240516102c051808202821582848304141715615ce557905090508181830110615ce55780820190509050670de0b6b3a764000080820490509050815250614296565b565b6005546107205260065461074052600454610760526007546107805260006107a052426107805110156143a2576012546107c0524261078051808210615ce55780820390509050670de0b6b3a7640000808202821582848304141715615ce557905090506107c051808015615ce55782049050905060e05261431b610800613a91565b610800516107e05261074051670de0b6b3a76400006107e051808210615ce55780820390509050808202821582848304141715615ce55790509050610720516107e051808202821582848304141715615ce557905090508181830110615ce55780820190509050670de0b6b3a7640000808204905090506107205261072051600555426007555b610700516107c052610700516143e657610660516102005261068051610220526106a051610240526106c051610260526143dd6107e0612be3565b6107e0516107c0525b60006106e051116144b0576106a0516107e0526106c051610800526107e051620f424080820490509050610820526107e08051610820518181830110615ce557808201905090508152506107605161082051808202821582848304141715615ce557905090506106c0516106605160e05261068051610100526107e0516101205261080051610140526107c05161016052600161018052614488610840613372565b61084051808210615ce55780820390509050808015615ce557820490509050610740526144b9565b6106e051610740525b610740516006556318160ddd610800526020610800600461081c6001545afa6144e7573d600060003e3d6000fd5b601f3d1115615ce557610800516107e052601e5461080052602054610820526107c051600280820490509050610840526107c051670de0b6b3a7640000808202821582848304141715615ce55790509050600261076051808202821582848304141715615ce55790509050808015615ce55782049050905061086052670de0b6b3a764000061088052670de0b6b3a76400006108a05260006108205111156146c6576108405160e05261086051610100526001610120526145a96108e0612a18565b6108e0516108c052670de0b6b3a76400006108c051808202821582848304141715615ce557905090506107e051808015615ce5578204905090506108a052610800516108a051808202821582848304141715615ce5579050905061082051808015615ce55782049050905061088052600b546108e052610820516108a05110614633576000614639565b6108e051155b156146b5576004610900527f4c6f7373000000000000000000000000000000000000000000000000000000006109205261090050610900518061092001818260206001820306601f82010390500336823750506308c379a06108c05260206108e0526109005160206001820306601f82010390506044016108dcfd5b60016108e051186146c6576000600b555b61088051601e5561072051670de0b6b3a7640000808202821582848304141715615ce5579050905061076051808015615ce5578204905090506108c052670de0b6b3a76400006108c0511161473957670de0b6b3a76400006108c051808210615ce557808203905090506108c052614759565b6108c08051670de0b6b3a7640000808210615ce557808203905090508152505b6010546108c0516005808204905090508082106147765781614778565b805b905090506108e05260215461090052610900511561479757600061481d565b610880516002600c54808202821582848304141715615ce557905090508181830110615ce557808201905090506108a0516002808202821582848304141715615ce55790509050670de0b6b3a7640000808210615ce557808203905090501161480157600061481d565b6108e0516108c0511161481557600061481d565b600061082051115b1561482e5760016109005260016021555b6109005115614a77576108e0516108c0511161484b576000614853565b600061082051115b15614a7757610760516108c0516108e051808210615ce55780820390509050808202821582848304141715615ce557905090506108e05161072051808202821582848304141715615ce557905090508181830110615ce557808201905090506108c051808015615ce5578204905090506107a0526106a051610840526106c0516107a051808202821582848304141715615ce5579050905061076051808015615ce55782049050905061086052610660516102005261068051610220526108405161024052610860516102605261492b610940612be3565b6109405161092052610920516002808204905090506108405261092051670de0b6b3a7640000808202821582848304141715615ce5579050905060026107a051808202821582848304141715615ce55790509050808015615ce55782049050905061086052670de0b6b3a76400006108405160e05261086051610100526001610120526149b9610940612a18565b61094051808202821582848304141715615ce557905090506107e051808015615ce55782049050905061082052670de0b6b3a764000061082051116149ff576000614a36565b61088051600261082051808202821582848304141715615ce55790509050670de0b6b3a7640000808210615ce55780820390509050115b614a5d5760006021556107c051601c556108a051602055614a9b613df556614a9b56614a77565b6107a05160045561092051601c5561082051602055614a9b565b6107c051601c556108a0516020556109005115614a9b576000602155614a9b613df5565b565b6109c0516109a05114615ce55760026109a0511015615ce55760026109c0511015615ce55760006109e0511115615ce557614ad9610ae061275a565b610ae08051610aa0528060200151610ac05250601a54610ae052601b54610b0052604036610b203760016109a0516002811015615ce5570260020154610b605260016109c0516002811015615ce5570260020154610b8052610ae06109c0516002811015615ce5576020020151610ba052610ae06109a0516002811015615ce5576020020151610bc052610bc0516109e0518181830110615ce55780820190509050610ae06109a0516002811015615ce5576020020152610ae06109a0516002811015615ce557602002015160016109a0516002811015615ce55702601a0155600454610be052614bcb610c40612689565b610c408051610c00528060200151610c205250610ae051610c0051808202821582848304141715615ce55790509050610ae052610b0051610be051808202821582848304141715615ce55790509050610c2051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610b0052610c0051610c4052610c2051610c605260016109a05118614c7257610c2051610c4052610c0051610c60525b600b54610c80526000610c80511115614d6f57610bc08051610c4051808202821582848304141715615ce5579050905081525060006109a0511115614ce257610bc051610be051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610bc0525b610ae06109a0516002811015615ce5576020020151610ca052610bc051610ae06109a0516002811015615ce5576020020152610aa05161020052610ac05161022052610ae05161024052610b005161026052614d3f610cc0612be3565b610cc051601c55610ca051610ae06109a0516002811015615ce5576020020152610c80514210614d6f576001600b555b610ae06109c0516002811015615ce5576020020151610aa05160e052610ac05161010052610ae05161012052610b005161014052601c54610160526109c05161018052614dbd610ca0613372565b610ca051808210615ce55780820390509050610b4052610ae06109c0516002811015615ce557602002018051610b4051808210615ce55780820390509050815250610b4080516001808210615ce5578082039050905081525060006109c0511115614e5957610b4051670de0b6b3a7640000808202821582848304141715615ce55790509050610be051808015615ce557820490509050610b40525b610b408051610c6051808015615ce557820490509050815250610b408051610ae05160e052610b005161010052614e91610ca06128cd565b610ca051610b4051808202821582848304141715615ce557905090506402540be40080820490509050808210615ce55780820390509050815250610a0051610b40511015614f50576008610ca0527f536c697070616765000000000000000000000000000000000000000000000000610cc052610ca050610ca05180610cc001818260206001820306601f82010390500336823750506308c379a0610c60526020610c8052610ca05160206001820306601f8201039050604401610c7cfd5b610ba08051610b4051808210615ce55780820390509050815250610ba05160016109c0516002811015615ce55702601a0155610a2051614f91576000614fa3565b602060203803608039608051610b6051145b61521c5761098051615ce557610a805115615116576370a08231610cc05230610ce0526020610cc06024610cdc610b60515afa614fe5573d600060003e3d6000fd5b601f3d1115615ce557610cc051610ca05260006000600460208206610cc001602082840111615ce557602080610ce082610a8060045afa505081815290509050600480602084610de00101826020850160045afa50508051820191505061096051610d4052610a4051610d6052610b6051610d80526109e051610da052610b4051610dc05260a0610d2052610d2060a080602084610de00101826020850160045afa50508051820191505080610de052610de0505060006000610de051610e006000610a60515af16150bc573d600060003e3d6000fd5b6109e0516370a08231610cc05230610ce0526020610cc06024610cdc610b60515afa6150ed573d600060003e3d6000fd5b601f3d1115615ce557610cc051610ca051808210615ce5578082039050905018615ce5576151b8565b6323b872dd610ce452600461096051610d045230610d24526109e051610d4452606001610ce052610ce0506020610da0610ce051610d006000610b60515af1615164573d600060003e3d6000fd5b610d8060203d8082116151775781615179565b805b905090508152805160200180610ca0828460045afa905050506000610ca051146151b857610cc051610ca05181816020036008021c9050905015615ce5575b602060203803608039608051610b60511861522a57632e1a7d4d610ca0526109e051610cc0526020602038036080396080513b15615ce557600060006024610cbc60006020602038036080396080515af161522a573d600060003e3d6000fd61522a565b6109e0516109805118615ce5575b610a205161523957600061524b565b602060203803608039608051610b8051145b61534a57602060203803608039608051610b8051186152a95763d0e30db0610ca0526020602038036080396080513b15615ce557600060006004610cbc610b40516020602038036080396080515af16152a9573d600060003e3d6000fd5b63a9059cbb610ce4526004610a4051610d0452610b4051610d2452604001610ce052610ce0506020610d80610ce051610d006000610b80515af16152f2573d600060003e3d6000fd5b610d6060203d8082116153055781615307565b805b905090508152805160200180610ca0828460045afa905050506000610ca0511461537857610cc051610ca05181816020036008021c9050905015615ce557615378565b6000610ca052610ca05060006000610ca051610cc0610b4051610a40515af1615378573d600060003e3d6000fd5b610ba08051610c6051808202821582848304141715615ce5579050905081525060006109c05111156153d557610ba051610be051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610ba0525b610ba051610ae06109c0516002811015615ce5576020020152620186a06109e0511161540257600061540c565b620186a0610b4051115b156154cc576109e051610c4051808202821582848304141715615ce55790509050610ca052610b4051610c6051808202821582848304141715615ce55790509050610cc0526109a0511561549557610cc051670de0b6b3a7640000808202821582848304141715615ce55790509050610ca051808015615ce557820490509050610b20526154cc565b610ca051670de0b6b3a7640000808202821582848304141715615ce55790509050610cc051808015615ce557820490509050610b20525b610aa05161066052610ac05161068052610ae0516106a052610b00516106c052610b20516106e052600061070052615502614298565b610960517fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc986109a051610ca0526109e051610cc0526109c051610ce052610b4051610d00526080610ca0a2610b4051815250565b6101a05160e0526101c051610100526155706102006128cd565b610200516002808202821582848304141715615ce557905090506004808204905090506101e05260006102005261024060006002818352015b602061024051026101600151610220526102008051610220518181830110615ce5578082019050905081525081516001018083528114156155a9575050610200516002808204905090506102205260006102405261028060006002818352015b602061028051026101600151610260526102205161026051116156595761024080516102205161026051808210615ce557808203905090508181830110615ce55780820190509050815250615688565b61024080516102605161022051808210615ce557808203905090508181830110615ce557808201905090508152505b81516001018083528114156156095750506101e05161024051808202821582848304141715615ce5579050905061020051808015615ce557820490509050620186a08181830110615ce55780820190509050815250565b6318160ddd610580526020610580600461059c6001545afa615706573d600060003e3d6000fd5b601f3d1115615ce5576105805161056052610560516104e05111615ce5576002610500511015615ce557601a5461058052601b546105a05260006105c05261574f610620612689565b61062080516105e0528060200151610600525060045461060051808202821582848304141715615ce5579050905061062052610580516105e051808202821582848304141715615ce55790509050610640526105a05161062051808202821582848304141715615ce55790509050670de0b6b3a76400008082049050905061066052610500516157ff57670de0b6b3a76400006105e051808202821582848304141715615ce55790509050610620525b6105205161581357601c546105c052615847565b6104a051610200526104c051610220526106405161024052610660516102605261583e610680612be3565b610680516105c0525b6105c051610680526106405160e05261066051610100526158696106c06128cd565b6106c0516106a0526104e05161068051808202821582848304141715615ce5579050905061056051808015615ce5578204905090506106c05261068080516106c0516106a0516106c051808202821582848304141715615ce557905090506404a817c8008082049050905060018181830110615ce55780820190509050808210615ce55780820390509050808210615ce557808203905090508152506104a05160e0526104c05161010052610640516101205261066051610140526106805161016052610500516101805261593f610700613372565b610700516106e052610640610500516002811015615ce55760200201516106e051808210615ce55780820390509050670de0b6b3a7640000808202821582848304141715615ce5579050905061062051808015615ce557820490509050610700526106e051610640610500516002811015615ce5576020020152600061072052610540516159ce5760006159ec565b620186a061070051116159e25760006159ec565b620186a06104e051115b15615b69576000610740526105e0516107605260016105005118615a3757610580516105e051808202821582848304141715615ce55790509050610740526106005161076052615a58565b6105a05161060051808202821582848304141715615ce55790509050610740525b610740516106c051808202821582848304141715615ce557905090506105c051808015615ce5578204905090506107405261074051670de0b6b3a7640000808202821582848304141715615ce557905090506107005161076051808202821582848304141715615ce557905090506106c051610580610500516002811015615ce5576020020151808202821582848304141715615ce5579050905061076051808202821582848304141715615ce557905090506105c051808015615ce557820490509050808210615ce55780820390509050808015615ce5578204905090506107205261050051615b69576ec097ce7bc90715b34b9f100000000061072051808015615ce557820490509050610720525b610700518152610720516020820152610680516040820152606081016106405181526106605181602001525050565b60e051615ba9576000815250615ce3565b60e051670de0b6b3a76400008181830110615ce557808201905090506002808204905090506101005260e051610120526101406000610100818352015b610120516101005118615c0157505061012051815250615ce3565b610100516101205260e051670de0b6b3a7640000808202821582848304141715615ce5579050905061010051808015615ce557820490509050610100518181830110615ce55780820190509050600280820490509050610100528151600101808352811415615be65750506010610140527f446964206e6f7420636f6e7665726765000000000000000000000000000000006101605261014050610140518061016001818260206001820306601f82010390500336823750506308c379a0610100526020610120526101405160206001820306601f820103905060440161011cfd5b565b600080fd5b610029615d130361002961012039610029615d13036101005181610120015280602001610120f35b600080fd000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x600436101561000d57612687565b60046000601c37600051635b41b9088118610032576000610ee05233610f0052610080565b63394747c58118610056576084358060011c615ce557610ee05233610f0052610080565b63ce7d650381186100d9576084358060011c615ce557610ee05260a4358060a01c615ce557610f00525b600054615ce557600160005533610960523461098052608060046109a037610ee051610a2052610f0051610a40526000610a60526000610a80526100c5610f20614a9d565b610f2051610f40526020610f406000600055f35b6365b2489b81186100ee5733610ee052610109565b63e2ad025a8118610160576084358060a01c615ce557610ee0525b600054615ce557600160005533610960523461098052608060046109a0376001610a2052610ee051610a40526000610a60526000610a805261014c610f00614a9d565b610f0051610f20526020610f206000600055f35b63dd96994f81186101fe576084358060011c615ce557610ee05260a4358060a01c615ce557610f005260c4358060a01c615ce557610f2052600054615ce5576001600055600060e43514615ce557610f0051610960523461098052608060046109a037610ee051610a2052610f2051610a405233610a605260e435610a80526101ea610f40614a9d565b610f4051610f60526020610f606000600055f35b630b4c7e4d8118610219576000610960523361098052610267565b63ee22be23811861023d576064358060011c615ce557610960523361098052610267565b637328333b8118610bc8576064358060011c615ce557610960526084358060a01c615ce557610980525b600054615ce55760016000556000600435116102885760006024351161028b565b60015b15615ce55761029b6109e061275a565b6109e080516109a05280602001516109c05250601a546109e052601b54610a005260e036610a20376109e051610b0052610a0051610b2052610b4060006002818352015b6109e0610b40516002811015615ce55760200201516020610b405102600401358181830110615ce55780820190509050610b6052610b60516109e0610b40516002811015615ce5576020020152610b60516001610b40516002811015615ce55702601a015581516001018083528114156102df5750506109e051610a6052610a0051610a8052610370610b80612689565b610b808051610b40528060200151610b605250600454610b6051808202821582848304141715615ce55790509050610b80526109e051610b4051808202821582848304141715615ce557905090506109e052610a0051610b8051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610a0052610b0051610b4051808202821582848304141715615ce55790509050610b0052610b2051610b8051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610b2052610960516104505734615ce5575b610ba060006002818352015b6001610ba0516002811015615ce5570260020154610bc05261096051610483576000610495565b602060203803608039608051610bc051145b156104ac576020610ba05102600401353418615ce5575b60006020610ba051026004013511156106425761096051156104df57602060203803608039608051610bc05114156104e2565b60015b156105f4576323b872dd610c2452600433610c445230610c64526020610ba0510260040135610c8452606001610c2052610c20506020610ce0610c2051610c406000610bc0515af1610539573d600060003e3d6000fd5b610cc060203d80821161054c578161054e565b805b905090508152805160200180610be0828460045afa905050506000610be0511461058d57610c0051610be05181816020036008021c9050905015615ce5575b602060203803608039608051610bc051186105f457632e1a7d4d610c20526020610ba0510260040135610c40526020602038036080396080513b15615ce557600060006024610c3c60006020602038036080396080515af16105f4573d600060003e3d6000fd5b6109e0610ba0516002811015615ce5576020020151610b00610ba0516002811015615ce5576020020151808210615ce55780820390509050610a20610ba0516002811015615ce55760200201525b815160010180835281141561045c575050600b54610ba0526000610ba0511161067157601c54610ae0526106b4565b6109a051610200526109c05161022052610b005161024052610b20516102605261069c610bc0612be3565b610bc051610ae052610ba05142106106b4576001600b555b6109a051610200526109c051610220526109e05161024052610a0051610260526106df610be0612be3565b610be051610bc052600154610be0526318160ddd610c20526020610c206004610c3c610be0515afa610716573d600060003e3d6000fd5b601f3d1115615ce557610c2051610c00526000610ae0511161075257610bc05161020052610745610c20613d70565b610c2051610aa052610796565b610c0051610bc051808202821582848304141715615ce55790509050610ae051808015615ce557820490509050610c0051808210615ce55780820390509050610aa0525b6000610aa0511115615ce5576000610ae0511161081857610bc051601c55670de0b6b3a7640000602055670de0b6b3a7640000601e556340c10f19610c205261098051610c4052610aa051610c60526020610c206044610c3c6000610be0515af1610806573d600060003e3d6000fd5b601f3d1115615ce557610c2050610ae7565b610a205161016052610a4051610180526109e0516101a052610a00516101c052610843610c20615556565b610c2051610aa051808202821582848304141715615ce557905090506402540be4008082049050905060018181830110615ce55780820190509050610ac052610aa08051610ac051808210615ce55780820390509050815250610c008051610aa0518181830110615ce557808201905090508152506340c10f19610c205261098051610c4052610aa051610c60526020610c206044610c3c6000610be0515af16108f2573d600060003e3d6000fd5b601f3d1115615ce557610c20506000610c2052620186a0610aa0511115610aaf57600435156109245760243515610927565b60015b15610aaf57606036610c40376004351561096857610a8051610b6051808202821582848304141715615ce55790509050610c4052610b4051610c6052610997565b610a6051610b4051808202821582848304141715615ce55790509050610c4052610b6051610c60526001610c80525b610c4051610aa051808202821582848304141715615ce55790509050610c0051808015615ce557820490509050610c4052610c4051670de0b6b3a7640000808202821582848304141715615ce557905090506020610c80510260040135610c6051808202821582848304141715615ce55790509050610aa051610a60610c80516002811015615ce5576020020151808202821582848304141715615ce55790509050610c6051808202821582848304141715615ce55790509050610c0051808015615ce557820490509050808210615ce55780820390509050808015615ce557820490509050610c2052610c8051610aaf576ec097ce7bc90715b34b9f1000000000610c2051808015615ce557820490509050610c20525b6109a051610660526109c051610680526109e0516106a052610a00516106c052610c20516106e052610bc05161070052610ae7614298565b604435610aa0511015610b6b576008610c20527f536c697070616765000000000000000000000000000000000000000000000000610c4052610c2050610c205180610c4001818260206001820306601f82010390500336823750506308c379a0610be0526020610c0052610c205160206001820306601f8201039050604401610bfcfd5b610980517f540ab385f9b5d450a27404172caade516b3ba3f4be88239ac56a2ad1de2a1f5a600435610c2052602435610c4052610ac051610c6052610c0051610c80526080610c20a2610aa051610c20526020610c206000600055f35b635b36389c8118610be257600060e0523361010052610c2e565b63269b55818118610c05576064358060011c615ce55760e0523361010052610c2e565b631808e84a8118610fb4576064358060011c615ce55760e0526084358060a01c615ce557610100525b34615ce557600054615ce5576001600055600154610120526318160ddd610160526020610160600461017c610120515afa610c6e573d600060003e3d6000fd5b601f3d1115615ce55761016051610140526379cc67906101605233610180526004356101a0526020610160604461017c6000610120515af1610cb5573d600060003e3d6000fd5b601f3d1115615ce55761016050601a5461016052601b54610180526004356001808210615ce557808203905090506101a0526101c060006002818352015b6101606101c0516002811015615ce55760200201516101a051808202821582848304141715615ce5579050905061014051808015615ce5578204905090506101e05260206101c05102602401356101e05110615ce5576101606101c0516002811015615ce55760200201516101e051808210615ce5578082039050905060016101c0516002811015615ce55702601a01556101e0516101606101c0516002811015615ce557602002015260016101c0516002811015615ce55702600201546102005260e051610dc3576000610dd5565b60206020380360803960805161020051145b610ed4576020602038036080396080516102005118610e335763d0e30db0610220526020602038036080396080513b15615ce55760006000600461023c6101e0516020602038036080396080515af1610e33573d600060003e3d6000fd5b63a9059cbb61026452600461010051610284526101e0516102a45260400161026052610260506020610300610260516102806000610200515af1610e7c573d600060003e3d6000fd5b6102e060203d808211610e8f5781610e91565b805b905090508152805160200180610220828460045afa9050505060006102205114610f0257610240516102205181816020036008021c9050905015615ce557610f02565b6000610220526102205060006000610220516102406101e051610100515af1610f02573d600060003e3d6000fd5b8151600101808352811415610cf3575050601c546101c0526101c0516101c0516101a051808202821582848304141715615ce5579050905061014051808015615ce557820490509050808210615ce55780820390509050601c55337fdd3c0336a16f1b64f172b7bb0dad5b2b3c7c76f91e8c4aafd6aae60dce800153610160516101e052610180516102005261014051600435808210615ce557808203905090506102205260606101e0a26000600055005b63f1dc3cc98118610fcf57600061096052336109805261101d565b638f15b6b58118610ff3576064358060011c615ce55761096052336109805261101d565b6307329bcd81186113a6576064358060011c615ce557610960526084358060a01c615ce557610980525b34615ce557600054615ce55760016000556110396109e061275a565b6109e080516109a05280602001516109c0525060a0366109e037600b54610a80526109a0516104a0526109c0516104c052604060046104e0376000610a8051116105205260016105405261108e610aa06156df565b610aa080516109e0526020810151610a20526040810151610a0052606081018051610a40528060200151610a605250506044356109e0511015611142576008610aa0527f536c697070616765000000000000000000000000000000000000000000000000610ac052610aa050610aa05180610ac001818260206001820306601f82010390500336823750506308c379a0610a60526020610a8052610aa05160206001820306601f8201039050604401610a7cfd5b610a80514210611152576001600b555b60016024356002811015615ce55702601a0180546109e051808210615ce557808203905090508155506379cc6790610aa05233610ac052600435610ae0526020610aa06044610abc60006001545af16111b0573d600060003e3d6000fd5b601f3d1115615ce557610aa05060016024356002811015615ce5570260020154610aa052610960516111e35760006111f5565b602060203803608039608051610aa051145b6112f457602060203803608039608051610aa051186112535763d0e30db0610ac0526020602038036080396080513b15615ce557600060006004610adc6109e0516020602038036080396080515af1611253573d600060003e3d6000fd5b63a9059cbb610b0452600461098051610b24526109e051610b4452604001610b0052610b00506020610ba0610b0051610b206000610aa0515af161129c573d600060003e3d6000fd5b610b8060203d8082116112af57816112b1565b805b905090508152805160200180610ac0828460045afa905050506000610ac0511461132257610ae051610ac05181816020036008021c9050905015615ce557611322565b6000610ac052610ac05060006000610ac051610ae06109e051610980515af1611322573d600060003e3d6000fd5b6109a051610660526109c05161068052610a40516106a052610a60516106c052610a20516106e052610a00516107005261135a614298565b337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060406004610ac0376109e051610b00526060610ac0a26109e051610ac0526020610ac06000600055f35b63c93f49e881186113d15734615ce557600054615ce55760016000556113ca613df5565b6000600055005b635e24807281186115fe5734615ce55763f851a4406101c05260206101c060046101dc601d545afa611408573d600060003e3d6000fd5b601f3d1115615ce5576101c0513318615ce557600a546201517f8181830110615ce55780820190509050421115615ce557426201517f8181830110615ce557808201905090506044351115615ce55761146261020061275a565b61020080516101c05280602001516101e052506101c05160801b610200526101e051610200511761020052610f9f6004351115615ce55763ee6b28016004351015615ce5576402540be3ff6024351115615ce55766470de4df8200016024351015615ce557670de0b6b3a7640000600435808202821582848304141715615ce557905090506101c051808015615ce55782049050905061022052678ac7230489e80001610220511015615ce55767016345785d89ffff610220511115615ce557670de0b6b3a7640000602435808202821582848304141715615ce557905090506101e051808015615ce55782049050905061022052678ac7230489e80001610220511015615ce55767016345785d89ffff610220511115615ce5576102005160085542600a5560043560801b61024052602435610240511761024052604435600b55610240516009557fe35f0559b0642164e286b30df2077ec3a05426617a25db7578fd20ba39a6cd056101c05161026052600435610280526101e0516102a0526024356102c052426102e0526044356103005260c0610260a1005b63244c7c2e81186116d25734615ce55763f851a4406101c05260206101c060046101dc601d545afa611635573d600060003e3d6000fd5b601f3d1115615ce5576101c0513318615ce55761165361020061275a565b61020080516101c05280602001516101e052506101c05160801b610200526101e051610200511761020052610200516008556102005160095542600a5542600b557f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc2846101c051610220526101e0516102405242610260526060610220a1005b63a43c335181186118c55734615ce55763f851a44060e052602060e0600460fc601d545afa611706573d600060003e3d6000fd5b601f3d1115615ce55760e0513318615ce557602254615ce55760e0600460e0376402540be40161010051106117415760155461010052611750565b6207a11f610100511115615ce5575b6402540be40060e05111156117665760145460e0525b6101005160e05111615ce5576402540be40061012051111561178a57601654610120525b670de0b6b3a764000061014051106117a857600e54610140526117b5565b6000610140511115615ce5575b670de0b6b3a76400006101605111156117d057600c54610160525b670de0b6b3a76400006101805111156117eb57601054610180525b62093a806101a05110611804576012546101a052611811565b60006101a0511115615ce5575b426203f4808181830110615ce557808201905090506101c0526101c0516022556101205160195560e0516017556101005160185561014051600f5561016051600d55610180516011556101a0516013556101c0517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde553610120516101e05260e0516102005261010051610220526101405161024052610160516102605261018051610280526101a0516102a05260e06101e0a2005b632a7dd7cd8118611a105734615ce557600054615ce557600160005563f851a440610660526020610660600461067c601d545afa611908573d600060003e3d6000fd5b601f3d1115615ce557610660513318615ce5576022544210615ce557600060225414615ce55760006022556019546106605261066051601654146119565761194e613df5565b610660516016555b60175461068052610680516014556018546106a0526106a051601555600f546106c0526106c051600e55600d546106e0526106e051600c55601154610700526107005160105560135461072052610720516012557f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc5504087610660516107405261068051610760526106a051610780526106c0516107a0526106e0516107c052610700516107e052610720516108005260e0610740a16000600055005b63226840fb8118611a5d5734615ce55763f851a44060e052602060e0600460fc601d545afa611a44573d600060003e3d6000fd5b601f3d1115615ce55760e0513318615ce5576000602255005b63556d6e9f8118611d405734615ce55760243560043514615ce55760026004351015615ce55760026024351015615ce557611a996104e0612689565b6104e080516104a05280602001516104c052506004546104c051808202821582848304141715615ce557905090506104e052601a5461050052601b5461052052611ae461058061275a565b61058080516105405280602001516105605250601c54610580526000600b541115611b6b5761054051610600526105605161062052611b246105a06126d5565b6105a0805161064052806020015161066052506106005161020052610620516102205261064051610240526106605161026052611b626105e0612be3565b6105e051610580525b6105006004356002811015615ce5576020020180516044358181830110615ce55780820190509050815250610500516104a051808202821582848304141715615ce5579050905061050052610520516104e051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610520526105405160e052610560516101005261050051610120526105205161014052610580516101605260243561018052611c1f6105c0613372565b6105c0516105a0526105006024356002811015615ce55760200201516105a051808210615ce557808203905090506001808210615ce557808203905090506105c0526105a0516105006024356002811015615ce5576020020152600060243511611ca1576105c080516104a051808015615ce557820490509050815250611cd8565b6105c051670de0b6b3a7640000808202821582848304141715615ce557905090506104e051808015615ce5578204905090506105c0525b6105c080516105005160e0526105205161010052611cf76105e06128cd565b6105e0516105c051808202821582848304141715615ce557905090506402540be40080820490509050808210615ce557808203905090508152506105c0516105e05260206105e0f35b638d8ea7278118611fce5734615ce5576318160ddd6104c05260206104c060046104dc6001545afa611d77573d600060003e3d6000fd5b601f3d1115615ce5576104c0516104a052611d93610500612689565b61050080516104c05280602001516104e052506004546104e051808202821582848304141715615ce5579050905061050052611dd061056061275a565b61056080516105205280602001516105405250611dee6105a06126d5565b6105a0805161056052806020015161058052506004356104c051808202821582848304141715615ce557905090506105a05260243561050051808202821582848304141715615ce55790509050670de0b6b3a7640000808204905090506105c052601c546105e0526000600b541115611e95576105205161020052610540516102205261056051610240526105805161026052611e8c610600612be3565b610600516105e0525b61056080516105a0518181830110615ce5578082019050905081525061058080516105c0518181830110615ce557808201905090508152506105205161020052610540516102205261056051610240526105805161026052611ef8610620612be3565b61062051610600526104a05161060051808202821582848304141715615ce557905090506105e051808015615ce5578204905090506104a051808210615ce557808203905090506106205261062080516105a051610160526105c05161018052610560516101a052610580516101c052611f73610640615556565b6106405161062051808202821582848304141715615ce557905090506402540be4008082049050905060018181830110615ce55780820190509050808210615ce5578082039050905081525061062051610640526020610640f35b634fb08c5e811861205a5734615ce557611fe961078061275a565b61078080516108605280602001516108805250604060046108a03760016108e052600061090052610860516104a052610880516104c0526108a0516104e0526108c051610500526108e05161052052610900516105405261204b6107c06156df565b6107c051610920526020610920f35b6354f0f7d581186120db5734615ce5576002602054808202821582848304141715615ce5579050905061208e610300614192565b61030051610340526103405160e0526120a8610320615b98565b61032051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610360526020610360f35b63f446c1d081186121055734615ce5576120f66101c061275a565b6101c051610200526020610200f35b63b137392981186121325734615ce5576121206101c061275a565b6101c060200151610200526020610200f35b63ddca3f4381186121895734615ce55761214d6101a06126d5565b6101a0805161020052806020015161022052506102005160e052610220516101005261217a6101e06128cd565b6101e051610240526020610240f35b63bb7b8b8081186122185734615ce557670de0b6b3a7640000601c54610200526121b4610280613d70565b61028051808202821582848304141715615ce557905090506318160ddd6102a05260206102a060046102bc6001545afa6121f3573d600060003e3d6000fd5b601f3d1115615ce5576102a051808015615ce5578204905090506102e05260206102e0f35b6386fc88d381186122425734615ce557612233610300614192565b61030051610320526020610320f35b63a39e95c5811861231d57610144358060a01c615ce55760e052610164358060a01c615ce55761010052610184358060a01c615ce5576101205234615ce557601454615ce55733601d5560043560801b610140526024356101405117610140526101405160085561014051600955604435601455606435601555608435600c5560a435600e5560c43560105560e4356016556101243560045561012435600555610124356006554260075561010435601255670de0b6b3a7640000601f5560e05160015561010051600255610120516003556101a435602355005b63fc0c546a81186123395734615ce55760015460e052602060e0f35b63c661065781186123655734615ce55760016004356002811015615ce557026002015460e052602060e0f35b63b9e8c9fd81186123815734615ce55760045460e052602060e0f35b63c146bf94811861239d5734615ce55760065460e052602060e0f35b636112c74781186123b95734615ce55760075460e052602060e0f35b63204fe3d581186123d55734615ce55760085460e052602060e0f35b63f30cfad581186123f15734615ce55760095460e052602060e0f35b63e89876ff811861240d5734615ce557600a5460e052602060e0f35b63f9ed959781186124295734615ce557600b5460e052602060e0f35b6349fe9e7781186124455734615ce557600c5460e052602060e0f35b63727ced5781186124615734615ce557600d5460e052602060e0f35b6372d4f0e2811861247d5734615ce557600e5460e052602060e0f35b63d7c3dcbe81186124995734615ce557600f5460e052602060e0f35b63083812e581186124b55734615ce55760105460e052602060e0f35b634ea12c7d81186124d15734615ce55760115460e052602060e0f35b63662b627481186124ed5734615ce55760125460e052602060e0f35b630c5e23d481186125095734615ce55760135460e052602060e0f35b6392526c0c81186125255734615ce55760145460e052602060e0f35b63ee8de67581186125415734615ce55760155460e052602060e0f35b63fee3f7f9811861255d5734615ce55760165460e052602060e0f35b637cf9aedc81186125795734615ce55760175460e052602060e0f35b637d1b060c81186125955734615ce55760185460e052602060e0f35b63e382446281186125b15734615ce55760195460e052602060e0f35b634903b0d181186125dd5734615ce55760016004356002811015615ce55702601a015460e052602060e0f35b630f529ba281186125f95734615ce557601c5460e052602060e0f35b63c45a015581186126155734615ce557601d5460e052602060e0f35b637ba1a74d81186126315734615ce557601e5460e052602060e0f35b630b7b594b811861264d5734615ce557601f5460e052602060e0f35b630c46b72a81186126695734615ce55760205460e052602060e0f35b63405e28f881186126855734615ce55760225460e052602060e0f35b505b005b60235460e052604e60e05160081c1015615ce55760e05160081c600a0a61010052604e60ff60e051161015615ce55760ff60e05116600a0a60e05260e051815261010051816020015250565b6126e0610160612689565b61016080516101205280602001516101405250601a5461012051808202821582848304141715615ce557905090508152601b5461014051808202821582848304141715615ce55790509050600454808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050816020015250565b600b5460e052600954610100526fffffffffffffffffffffffffffffffff6101005116610120526101005160801c6101405260e0514210156128bb5760085461016052600a546101805260e0805161018051808210615ce557808203905090508152504261018051808210615ce557808203905090506101805260e05161018051808210615ce557808203905090506101a0526101605160801c6101a051808202821582848304141715615ce557905090506101405161018051808202821582848304141715615ce557905090508181830110615ce5578082019050905060e051808015615ce557820490509050610140526fffffffffffffffffffffffffffffffff61016051166101a051808202821582848304141715615ce557905090506101205161018051808202821582848304141715615ce557905090508181830110615ce5578082019050905060e051808015615ce557820490509050610120525b61014051815261012051816020015250565b600e546101205260e051610100518181830110615ce557808201905090506101405261012051670de0b6b3a7640000808202821582848304141715615ce5579050905061012051670de0b6b3a76400008181830110615ce55780820190509050673782dace9d90000060e051808202821582848304141715615ce5579050905061014051808015615ce55782049050905061010051808202821582848304141715615ce5579050905061014051808015615ce557820490509050808210615ce55780820390509050808015615ce5578204905090506101405260145461014051808202821582848304141715615ce55790509050601554670de0b6b3a764000061014051808210615ce55780820390509050808202821582848304141715615ce557905090508181830110615ce55780820190509050670de0b6b3a764000080820490509050815250565b60e05161014052610100516101605261012051612a36576000612a40565b6101605161014051105b15612a5557610100516101405260e051610160525b610140516101805260006101a0526101c0600060ff818352015b610180516101e052610180516101405161016051808202821582848304141715615ce5579050905061018051808015615ce5578204905090508181830110615ce55780820190509050600280820490509050610180526101e0516101805111612af1576101e05161018051808210615ce557808203905090506101a052612b0c565b610180516101e051808210615ce557808203905090506101a0525b60016101a0511115612b4357610180516101a051670de0b6b3a7640000808202821582848304141715615ce5579050905010612b46565b60015b15612b5957505061018051815250612be1565b8151600101808352811415612a6f57505060106101c0527f446964206e6f7420636f6e7665726765000000000000000000000000000000006101e0526101c0506101c051806101e001818260206001820306601f82010390500336823750506308c379a06101805260206101a0526101c05160206001820306601f820103905060440161019cfd5b565b610f9f6102005111612bf6576000612c01565b63ee6b280161020051105b15615ce5576402540be3ff6102205111612c1c576000612c2a565b66470de4df82000161022051105b15615ce5576102405161028052610260516102a0526102a051610280511015612c5e576102605161028052610240516102a0525b633b9ac9ff6102805111612c73576000612c88565b6d314dc6448d9338c15b0a0000000161028051105b15615ce557655af3107a3fff6102a051670de0b6b3a7640000808202821582848304141715615ce5579050905061028051808015615ce5578204905090501115615ce55760026102805160e0526102a05161010052600061012052612cee6102e0612a18565b6102e051808202821582848304141715615ce557905090506102c052610280516102a0518181830110615ce557808201905090506102e052610300600060ff818352015b6102c05161032052673782dace9d90000061028051808202821582848304141715615ce557905090506102c051808015615ce5578204905090506102a051808202821582848304141715615ce557905090506102c051808015615ce5578204905090506103405261022051670de0b6b3a76400008181830110615ce5578082019050905061036052610340516103605111612df8576103405161036051808210615ce5578082039050905060018181830110615ce5578082019050905061036052612e25565b6103605161034051808210615ce5578082039050905060018181830110615ce55780820190509050610360525b670de0b6b3a76400006102c051808202821582848304141715615ce5579050905061022051808015615ce55782049050905061036051808202821582848304141715615ce5579050905061022051808015615ce55782049050905061036051808202821582848304141715615ce55790509050612710808202821582848304141715615ce5579050905061020051808015615ce55782049050905061038052673782dace9d90000061034051808202821582848304141715615ce5579050905061036051808015615ce5578204905090506103a0526102e0516102e0516103a051808202821582848304141715615ce55790509050670de0b6b3a7640000808204905090508181830110615ce55780820190509050610380516002808202821582848304141715615ce5579050905061034051808015615ce5578204905090508181830110615ce557808201905090506103a0516102c051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050808210615ce557808203905090506103c0526102c0516103c0516102e0518181830110615ce55780820190509050808202821582848304141715615ce557905090506103c051808015615ce5578204905090506103e0526102c0516102c051808202821582848304141715615ce557905090506103c051808015615ce5578204905090506104005261034051670de0b6b3a7640000116130d35761040080516102c051610380516103c051808015615ce557820490509050808202821582848304141715615ce55790509050670de0b6b3a76400008082049050905061034051670de0b6b3a7640000808210615ce55780820390509050808202821582848304141715615ce5579050905061034051808015615ce557820490509050808210615ce55780820390509050815250613169565b61040080516102c051610380516103c051808015615ce557820490509050808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050670de0b6b3a764000061034051808210615ce55780820390509050808202821582848304141715615ce5579050905061034051808015615ce5578204905090508181830110615ce557808201905090508152505b610400516103e0511161319e57610400516103e051808210615ce557808203905090506002808204905090506102c0526131b9565b6103e05161040051808210615ce557808203905090506102c0525b600061042052610320516102c051116131eb57610320516102c051808210615ce5578082039050905061042052613206565b6102c05161032051808210615ce55780820390509050610420525b662386f26fc100006102c05180821061321f5781613221565b805b9050905061042051655af3107a4000808202821582848304141715615ce5579050905010156132e85761046060006002818352015b6020610460510261028001516104405261044051670de0b6b3a7640000808202821582848304141715615ce557905090506102c051808015615ce55782049050905061048052662386f26fc0ffff61048051116132b45760006132c4565b68056bc75e2d6310000161048051105b15615ce557815160010180835281141561325657505050506102c051815250613370565b8151600101808352811415612d325750506010610300527f446964206e6f7420636f6e7665726765000000000000000000000000000000006103205261030050610300518061032001818260206001820306601f82010390500336823750506308c379a06102c05260206102e0526103005160206001820306601f82010390506044016102dcfd5b565b610f9f60e0511161338457600061338e565b63ee6b280160e051105b15615ce5576402540be3ff61010051116133a95760006133b7565b66470de4df82000161010051105b15615ce55767016345785d89ffff61016051116133d55760006133ea565b6d314dc6448d9338c15b0a0000000161016051105b15615ce557610120600161018051808210615ce557808203905090506002811015615ce55760200201516101a052700100000000000000000000000000000000610160511015615ce5576002610160510a6101a0516004808202821582848304141715615ce55790509050808015615ce5578204905090506101c052671bc16d674ec800006101a051808202821582848304141715615ce5579050905061016051808015615ce5578204905090506101e05266470de4df81ffff6101e051116134b45760006134c4565b680ad78ebc5ac62000016101e051105b15615ce5576101a051655af3107a40008082049050905061016051655af3107a4000808204905090508082106134fa57816134fc565b805b90509050606480821061350f5781613511565b805b9050905061020052610220600060ff818352015b6101c051610240526101e0516101c051808202821582848304141715615ce557905090506002808202821582848304141715615ce5579050905061016051808015615ce557820490509050610260526101a0516101c0518181830110615ce557808201905090506102805261010051670de0b6b3a76400008181830110615ce557808201905090506102a052610260516102a051116135ef57610260516102a051808210615ce5578082039050905060018181830110615ce557808201905090506102a05261361c565b6102a05161026051808210615ce5578082039050905060018181830110615ce557808201905090506102a0525b670de0b6b3a764000061016051808202821582848304141715615ce5579050905061010051808015615ce5578204905090506102a051808202821582848304141715615ce5579050905061010051808015615ce5578204905090506102a051808202821582848304141715615ce55790509050612710808202821582848304141715615ce5579050905060e051808015615ce5578204905090506102c052670de0b6b3a7640000671bc16d674ec8000061026051808202821582848304141715615ce557905090506102a051808015615ce5578204905090508181830110615ce557808201905090506102e052670de0b6b3a76400006101c051808202821582848304141715615ce55790509050610280516102e051808202821582848304141715615ce557905090508181830110615ce557808201905090506102c0518181830110615ce5578082019050905061030052610160516102e051808202821582848304141715615ce55790509050610320526103205161030051106137ba57610300805161032051808210615ce557808203905090508152506137d0565b610240516002808204905090506101c052613a07565b610300516101c051808015615ce557820490509050610340526102c05161034051808015615ce5578204905090506103605261030051670de0b6b3a764000061016051808202821582848304141715615ce557905090508181830110615ce5578082019050905061034051808015615ce55782049050905061036051670de0b6b3a7640000808202821582848304141715615ce5579050905061026051808015615ce5578204905090508181830110615ce55780820190509050610380526103608051670de0b6b3a764000061028051808202821582848304141715615ce5579050905061034051808015615ce5578204905090508181830110615ce55780820190509050815250610360516103805110613904576103805161036051808210615ce557808203905090506101c052613916565b610240516002808204905090506101c0525b60006103a052610240516101c0511161394857610240516101c051808210615ce557808203905090506103a052613963565b6101c05161024051808210615ce557808203905090506103a0525b610200516101c051655af3107a4000808204905090508082106139865781613988565b805b905090506103a0511015613a07576101c051670de0b6b3a7640000808202821582848304141715615ce5579050905061016051808015615ce5578204905090506103c052662386f26fc0ffff6103c051116139e45760006139f4565b68056bc75e2d631000016103c051105b15615ce55750506101c051815250613a8f565b81516001018083528114156135255750506010610220527f446964206e6f7420636f6e7665726765000000000000000000000000000000006102405261022050610220518061024001818260206001820306601f82010390500336823750506308c379a06101e0526020610200526102205160206001820306601f82010390506044016101fcfd5b565b60e051670de0b6b3a7640000808204905090506101005260e05161010051670de0b6b3a7640000808202821582848304141715615ce55790509050808210615ce5578082039050905061012052603b610100511115613af4576000815250613d6e565b670de0b6b3a7640000610100610100511015615ce5576101005160020a808015615ce5578204905090506101405261012051613b365761014051815250613d6e565b670de0b6b3a7640000610160526706f05b59d3b2000061018052670de0b6b3a76400006101a05260006101c0526101e0600160ff818352015b6101e051670de0b6b3a7640000808202821582848304141715615ce557905090506102005261020051670de0b6b3a7640000808210615ce5578082039050905061022052610220516101205111613bdf57610220805161012051808210615ce55780820390509050815250613c03565b6101205161022051808210615ce55780820390509050610220526101c051156101c0525b610160516102205161018051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050808202821582848304141715615ce5579050905061020051808015615ce557820490509050610160526101c051613c85576101a08051610160518181830110615ce55780820190509050815250613ca0565b6101a0805161016051808210615ce557808203905090508152505b6402540be400610160511015613ce6575050610140516101a051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050815250613d6e565b8151600101808352811415613b6f57505060106101e0527f446964206e6f7420636f6e766572676500000000000000000000000000000000610200526101e0506101e0518061020001818260206001820306601f82010390500336823750506308c379a06101a05260206101c0526101e05160206001820306601f82010390506044016101bcfd5b565b610200516002808204905090506102205261020051670de0b6b3a7640000808202821582848304141715615ce557905090506004546002808202821582848304141715615ce55790509050808015615ce557820490509050610240526102205160e0526102405161010052600161012052613dec610260612a18565b61026051815250565b613e006104e061275a565b6104e080516104a05280602001516104c05250601e546104e052601f546105005261052060006002818352015b6001610520516002811015615ce5570260020154610540526020602038036080396080516105405118613e7457476001610520516002811015615ce55702601a0155613ec3565b6370a082316105605230610580526020610560602461057c610540515afa613ea1573d600060003e3d6000fd5b601f3d1115615ce557610560516001610520516002811015615ce55702601a01555b8151600101808352811415613e2d57505060205461052052610500516104e0511115614092576104e05161050051808210615ce55780820390509050601654808202821582848304141715615ce557905090506404a817c800808204905090506105405260006105405111156140925763cab4d3db610580526020610580600461059c601d545afa613f5a573d600060003e3d6000fd5b601f3d1115615ce557610580518060a01c615ce55761056052600061056051146140925761052051670de0b6b3a7640000808202821582848304141715615ce557905090506105205161054051808210615ce55780820390509050808015615ce557820490509050670de0b6b3a7640000808210615ce5578082039050905061058052636962f8456105c052610560516105e052610580516106005260206105c060446105dc60006001545af1614016573d600060003e3d6000fd5b601f3d1115615ce5576105c0516105a0526104e08051610540516002808202821582848304141715615ce55790509050808210615ce557808203905090508152506104e051601e55610560517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf596105a0516105c05260206105c0a25b6318160ddd610560526020610560600461057c6001545afa6140b9573d600060003e3d6000fd5b601f3d1115615ce55761056051610540526104a0516105e0526104c051610600526140e56105806126d5565b610580805161062052806020015161064052506105e051610200526106005161022052610620516102405261064051610260526141236105c0612be3565b6105c0516105605261056051601c55670de0b6b3a7640000610560516102005261414e610580613d70565b61058051808202821582848304141715615ce5579050905061054051808015615ce557820490509050602055610500516104e0511115614190576104e051601f555b565b60055461024052600754610260524261026051106141ba576102405181525061429656614296565b601254610280526006546102a0524261026051808210615ce55780820390509050670de0b6b3a7640000808202821582848304141715615ce5579050905061028051808015615ce55782049050905060e0526142176102e0613a91565b6102e0516102c0526102a051670de0b6b3a76400006102c051808210615ce55780820390509050808202821582848304141715615ce55790509050610240516102c051808202821582848304141715615ce557905090508181830110615ce55780820190509050670de0b6b3a764000080820490509050815250614296565b565b6005546107205260065461074052600454610760526007546107805260006107a052426107805110156143a2576012546107c0524261078051808210615ce55780820390509050670de0b6b3a7640000808202821582848304141715615ce557905090506107c051808015615ce55782049050905060e05261431b610800613a91565b610800516107e05261074051670de0b6b3a76400006107e051808210615ce55780820390509050808202821582848304141715615ce55790509050610720516107e051808202821582848304141715615ce557905090508181830110615ce55780820190509050670de0b6b3a7640000808204905090506107205261072051600555426007555b610700516107c052610700516143e657610660516102005261068051610220526106a051610240526106c051610260526143dd6107e0612be3565b6107e0516107c0525b60006106e051116144b0576106a0516107e0526106c051610800526107e051620f424080820490509050610820526107e08051610820518181830110615ce557808201905090508152506107605161082051808202821582848304141715615ce557905090506106c0516106605160e05261068051610100526107e0516101205261080051610140526107c05161016052600161018052614488610840613372565b61084051808210615ce55780820390509050808015615ce557820490509050610740526144b9565b6106e051610740525b610740516006556318160ddd610800526020610800600461081c6001545afa6144e7573d600060003e3d6000fd5b601f3d1115615ce557610800516107e052601e5461080052602054610820526107c051600280820490509050610840526107c051670de0b6b3a7640000808202821582848304141715615ce55790509050600261076051808202821582848304141715615ce55790509050808015615ce55782049050905061086052670de0b6b3a764000061088052670de0b6b3a76400006108a05260006108205111156146c6576108405160e05261086051610100526001610120526145a96108e0612a18565b6108e0516108c052670de0b6b3a76400006108c051808202821582848304141715615ce557905090506107e051808015615ce5578204905090506108a052610800516108a051808202821582848304141715615ce5579050905061082051808015615ce55782049050905061088052600b546108e052610820516108a05110614633576000614639565b6108e051155b156146b5576004610900527f4c6f7373000000000000000000000000000000000000000000000000000000006109205261090050610900518061092001818260206001820306601f82010390500336823750506308c379a06108c05260206108e0526109005160206001820306601f82010390506044016108dcfd5b60016108e051186146c6576000600b555b61088051601e5561072051670de0b6b3a7640000808202821582848304141715615ce5579050905061076051808015615ce5578204905090506108c052670de0b6b3a76400006108c0511161473957670de0b6b3a76400006108c051808210615ce557808203905090506108c052614759565b6108c08051670de0b6b3a7640000808210615ce557808203905090508152505b6010546108c0516005808204905090508082106147765781614778565b805b905090506108e05260215461090052610900511561479757600061481d565b610880516002600c54808202821582848304141715615ce557905090508181830110615ce557808201905090506108a0516002808202821582848304141715615ce55790509050670de0b6b3a7640000808210615ce557808203905090501161480157600061481d565b6108e0516108c0511161481557600061481d565b600061082051115b1561482e5760016109005260016021555b6109005115614a77576108e0516108c0511161484b576000614853565b600061082051115b15614a7757610760516108c0516108e051808210615ce55780820390509050808202821582848304141715615ce557905090506108e05161072051808202821582848304141715615ce557905090508181830110615ce557808201905090506108c051808015615ce5578204905090506107a0526106a051610840526106c0516107a051808202821582848304141715615ce5579050905061076051808015615ce55782049050905061086052610660516102005261068051610220526108405161024052610860516102605261492b610940612be3565b6109405161092052610920516002808204905090506108405261092051670de0b6b3a7640000808202821582848304141715615ce5579050905060026107a051808202821582848304141715615ce55790509050808015615ce55782049050905061086052670de0b6b3a76400006108405160e05261086051610100526001610120526149b9610940612a18565b61094051808202821582848304141715615ce557905090506107e051808015615ce55782049050905061082052670de0b6b3a764000061082051116149ff576000614a36565b61088051600261082051808202821582848304141715615ce55790509050670de0b6b3a7640000808210615ce55780820390509050115b614a5d5760006021556107c051601c556108a051602055614a9b613df556614a9b56614a77565b6107a05160045561092051601c5561082051602055614a9b565b6107c051601c556108a0516020556109005115614a9b576000602155614a9b613df5565b565b6109c0516109a05114615ce55760026109a0511015615ce55760026109c0511015615ce55760006109e0511115615ce557614ad9610ae061275a565b610ae08051610aa0528060200151610ac05250601a54610ae052601b54610b0052604036610b203760016109a0516002811015615ce5570260020154610b605260016109c0516002811015615ce5570260020154610b8052610ae06109c0516002811015615ce5576020020151610ba052610ae06109a0516002811015615ce5576020020151610bc052610bc0516109e0518181830110615ce55780820190509050610ae06109a0516002811015615ce5576020020152610ae06109a0516002811015615ce557602002015160016109a0516002811015615ce55702601a0155600454610be052614bcb610c40612689565b610c408051610c00528060200151610c205250610ae051610c0051808202821582848304141715615ce55790509050610ae052610b0051610be051808202821582848304141715615ce55790509050610c2051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610b0052610c0051610c4052610c2051610c605260016109a05118614c7257610c2051610c4052610c0051610c60525b600b54610c80526000610c80511115614d6f57610bc08051610c4051808202821582848304141715615ce5579050905081525060006109a0511115614ce257610bc051610be051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610bc0525b610ae06109a0516002811015615ce5576020020151610ca052610bc051610ae06109a0516002811015615ce5576020020152610aa05161020052610ac05161022052610ae05161024052610b005161026052614d3f610cc0612be3565b610cc051601c55610ca051610ae06109a0516002811015615ce5576020020152610c80514210614d6f576001600b555b610ae06109c0516002811015615ce5576020020151610aa05160e052610ac05161010052610ae05161012052610b005161014052601c54610160526109c05161018052614dbd610ca0613372565b610ca051808210615ce55780820390509050610b4052610ae06109c0516002811015615ce557602002018051610b4051808210615ce55780820390509050815250610b4080516001808210615ce5578082039050905081525060006109c0511115614e5957610b4051670de0b6b3a7640000808202821582848304141715615ce55790509050610be051808015615ce557820490509050610b40525b610b408051610c6051808015615ce557820490509050815250610b408051610ae05160e052610b005161010052614e91610ca06128cd565b610ca051610b4051808202821582848304141715615ce557905090506402540be40080820490509050808210615ce55780820390509050815250610a0051610b40511015614f50576008610ca0527f536c697070616765000000000000000000000000000000000000000000000000610cc052610ca050610ca05180610cc001818260206001820306601f82010390500336823750506308c379a0610c60526020610c8052610ca05160206001820306601f8201039050604401610c7cfd5b610ba08051610b4051808210615ce55780820390509050815250610ba05160016109c0516002811015615ce55702601a0155610a2051614f91576000614fa3565b602060203803608039608051610b6051145b61521c5761098051615ce557610a805115615116576370a08231610cc05230610ce0526020610cc06024610cdc610b60515afa614fe5573d600060003e3d6000fd5b601f3d1115615ce557610cc051610ca05260006000600460208206610cc001602082840111615ce557602080610ce082610a8060045afa505081815290509050600480602084610de00101826020850160045afa50508051820191505061096051610d4052610a4051610d6052610b6051610d80526109e051610da052610b4051610dc05260a0610d2052610d2060a080602084610de00101826020850160045afa50508051820191505080610de052610de0505060006000610de051610e006000610a60515af16150bc573d600060003e3d6000fd5b6109e0516370a08231610cc05230610ce0526020610cc06024610cdc610b60515afa6150ed573d600060003e3d6000fd5b601f3d1115615ce557610cc051610ca051808210615ce5578082039050905018615ce5576151b8565b6323b872dd610ce452600461096051610d045230610d24526109e051610d4452606001610ce052610ce0506020610da0610ce051610d006000610b60515af1615164573d600060003e3d6000fd5b610d8060203d8082116151775781615179565b805b905090508152805160200180610ca0828460045afa905050506000610ca051146151b857610cc051610ca05181816020036008021c9050905015615ce5575b602060203803608039608051610b60511861522a57632e1a7d4d610ca0526109e051610cc0526020602038036080396080513b15615ce557600060006024610cbc60006020602038036080396080515af161522a573d600060003e3d6000fd61522a565b6109e0516109805118615ce5575b610a205161523957600061524b565b602060203803608039608051610b8051145b61534a57602060203803608039608051610b8051186152a95763d0e30db0610ca0526020602038036080396080513b15615ce557600060006004610cbc610b40516020602038036080396080515af16152a9573d600060003e3d6000fd5b63a9059cbb610ce4526004610a4051610d0452610b4051610d2452604001610ce052610ce0506020610d80610ce051610d006000610b80515af16152f2573d600060003e3d6000fd5b610d6060203d8082116153055781615307565b805b905090508152805160200180610ca0828460045afa905050506000610ca0511461537857610cc051610ca05181816020036008021c9050905015615ce557615378565b6000610ca052610ca05060006000610ca051610cc0610b4051610a40515af1615378573d600060003e3d6000fd5b610ba08051610c6051808202821582848304141715615ce5579050905081525060006109c05111156153d557610ba051610be051808202821582848304141715615ce55790509050670de0b6b3a764000080820490509050610ba0525b610ba051610ae06109c0516002811015615ce5576020020152620186a06109e0511161540257600061540c565b620186a0610b4051115b156154cc576109e051610c4051808202821582848304141715615ce55790509050610ca052610b4051610c6051808202821582848304141715615ce55790509050610cc0526109a0511561549557610cc051670de0b6b3a7640000808202821582848304141715615ce55790509050610ca051808015615ce557820490509050610b20526154cc565b610ca051670de0b6b3a7640000808202821582848304141715615ce55790509050610cc051808015615ce557820490509050610b20525b610aa05161066052610ac05161068052610ae0516106a052610b00516106c052610b20516106e052600061070052615502614298565b610960517fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc986109a051610ca0526109e051610cc0526109c051610ce052610b4051610d00526080610ca0a2610b4051815250565b6101a05160e0526101c051610100526155706102006128cd565b610200516002808202821582848304141715615ce557905090506004808204905090506101e05260006102005261024060006002818352015b602061024051026101600151610220526102008051610220518181830110615ce5578082019050905081525081516001018083528114156155a9575050610200516002808204905090506102205260006102405261028060006002818352015b602061028051026101600151610260526102205161026051116156595761024080516102205161026051808210615ce557808203905090508181830110615ce55780820190509050815250615688565b61024080516102605161022051808210615ce557808203905090508181830110615ce557808201905090508152505b81516001018083528114156156095750506101e05161024051808202821582848304141715615ce5579050905061020051808015615ce557820490509050620186a08181830110615ce55780820190509050815250565b6318160ddd610580526020610580600461059c6001545afa615706573d600060003e3d6000fd5b601f3d1115615ce5576105805161056052610560516104e05111615ce5576002610500511015615ce557601a5461058052601b546105a05260006105c05261574f610620612689565b61062080516105e0528060200151610600525060045461060051808202821582848304141715615ce5579050905061062052610580516105e051808202821582848304141715615ce55790509050610640526105a05161062051808202821582848304141715615ce55790509050670de0b6b3a76400008082049050905061066052610500516157ff57670de0b6b3a76400006105e051808202821582848304141715615ce55790509050610620525b6105205161581357601c546105c052615847565b6104a051610200526104c051610220526106405161024052610660516102605261583e610680612be3565b610680516105c0525b6105c051610680526106405160e05261066051610100526158696106c06128cd565b6106c0516106a0526104e05161068051808202821582848304141715615ce5579050905061056051808015615ce5578204905090506106c05261068080516106c0516106a0516106c051808202821582848304141715615ce557905090506404a817c8008082049050905060018181830110615ce55780820190509050808210615ce55780820390509050808210615ce557808203905090508152506104a05160e0526104c05161010052610640516101205261066051610140526106805161016052610500516101805261593f610700613372565b610700516106e052610640610500516002811015615ce55760200201516106e051808210615ce55780820390509050670de0b6b3a7640000808202821582848304141715615ce5579050905061062051808015615ce557820490509050610700526106e051610640610500516002811015615ce5576020020152600061072052610540516159ce5760006159ec565b620186a061070051116159e25760006159ec565b620186a06104e051115b15615b69576000610740526105e0516107605260016105005118615a3757610580516105e051808202821582848304141715615ce55790509050610740526106005161076052615a58565b6105a05161060051808202821582848304141715615ce55790509050610740525b610740516106c051808202821582848304141715615ce557905090506105c051808015615ce5578204905090506107405261074051670de0b6b3a7640000808202821582848304141715615ce557905090506107005161076051808202821582848304141715615ce557905090506106c051610580610500516002811015615ce5576020020151808202821582848304141715615ce5579050905061076051808202821582848304141715615ce557905090506105c051808015615ce557820490509050808210615ce55780820390509050808015615ce5578204905090506107205261050051615b69576ec097ce7bc90715b34b9f100000000061072051808015615ce557820490509050610720525b610700518152610720516020820152610680516040820152606081016106405181526106605181602001525050565b60e051615ba9576000815250615ce3565b60e051670de0b6b3a76400008181830110615ce557808201905090506002808204905090506101005260e051610120526101406000610100818352015b610120516101005118615c0157505061012051815250615ce3565b610100516101205260e051670de0b6b3a7640000808202821582848304141715615ce5579050905061010051808015615ce557820490509050610100518181830110615ce55780820190509050600280820490509050610100528151600101808352811415615be65750506010610140527f446964206e6f7420636f6e7665726765000000000000000000000000000000006101605261014050610140518061016001818260206001820306601f82010390500336823750506308c379a0610100526020610120526101405160206001820306601f820103905060440161011cfd5b565b600080fd000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.