More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x98293b4048e27f232db952d3d4bb6c7ce095fac5469adadc232d9e1c97c16b3f | Exchange | (pending) | 11 days ago | IN | 0.0005 ETH | (Pending) | |||
Remove_liquidity... | 21741939 | 48 days ago | IN | 0 ETH | 0.00016898 | ||||
Add_liquidity | 21733521 | 50 days ago | IN | 0 ETH | 0.00075342 | ||||
Exchange | 21605319 | 67 days ago | IN | 0 ETH | 0.00049372 | ||||
Remove_liquidity... | 21485781 | 84 days ago | IN | 0 ETH | 0.00130211 | ||||
Remove_liquidity... | 21485779 | 84 days ago | IN | 0 ETH | 0.00130639 | ||||
Remove_liquidity | 21485776 | 84 days ago | IN | 0 ETH | 0.00051141 | ||||
Remove_liquidity | 21485763 | 84 days ago | IN | 0 ETH | 0.00096359 | ||||
Remove_liquidity... | 21362625 | 101 days ago | IN | 0 ETH | 0.00141158 | ||||
Remove_liquidity... | 21234259 | 119 days ago | IN | 0 ETH | 0.00150139 | ||||
Exchange | 21097531 | 138 days ago | IN | 0.0001 ETH | 0.00038354 | ||||
Remove_liquidity... | 20983111 | 154 days ago | IN | 0 ETH | 0.00129608 | ||||
Remove_liquidity... | 20983079 | 154 days ago | IN | 0 ETH | 0.00095816 | ||||
Remove_liquidity... | 20983071 | 154 days ago | IN | 0 ETH | 0.0009944 | ||||
Remove_liquidity... | 20983063 | 154 days ago | IN | 0 ETH | 0.0012543 | ||||
Remove_liquidity... | 20983026 | 154 days ago | IN | 0 ETH | 0.00093995 | ||||
Remove_liquidity... | 20760446 | 185 days ago | IN | 0 ETH | 0.00028096 | ||||
Remove_liquidity... | 20760434 | 185 days ago | IN | 0 ETH | 0.00059739 | ||||
Remove_liquidity | 20760425 | 185 days ago | IN | 0 ETH | 0.00012677 | ||||
Remove_liquidity... | 20615256 | 206 days ago | IN | 0 ETH | 0.00038899 | ||||
Remove_liquidity... | 20576822 | 211 days ago | IN | 0 ETH | 0.00013646 | ||||
Exchange_underly... | 20422941 | 232 days ago | IN | 0 ETH | 0.00064902 | ||||
Exchange_underly... | 20422883 | 233 days ago | IN | 0.00000011 ETH | 0.00066635 | ||||
Remove_liquidity... | 20298823 | 250 days ago | IN | 0 ETH | 0.00043604 | ||||
Remove_liquidity... | 20248854 | 257 days ago | IN | 0 ETH | 0.00059202 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Transfer | 22011822 | 11 days ago | 0 ETH | ||||
Deposit | 22009618 | 11 days ago | 0 ETH | ||||
Transfer | 21951594 | 19 days ago | 0.00000001 ETH | ||||
Deposit | 21939734 | 21 days ago | 0.00000001 ETH | ||||
Transfer | 21881554 | 29 days ago | 0.00000001 ETH | ||||
Deposit | 21853696 | 33 days ago | 0.00000001 ETH | ||||
Transfer | 21829693 | 36 days ago | 0.00000007 ETH | ||||
Deposit | 21761171 | 46 days ago | 0.00000001 ETH | ||||
Deposit | 21649072 | 61 days ago | 0.00000001 ETH | ||||
Exchange | 21627130 | 64 days ago | 0.00000284 ETH | ||||
Transfer | 21627130 | 64 days ago | 0.00000284 ETH | ||||
Transfer | 21605319 | 67 days ago | 0.00000001 ETH | ||||
Deposit | 21600318 | 68 days ago | 0 ETH | ||||
Transfer | 21598339 | 68 days ago | 0.00000019 ETH | ||||
Deposit | 21537922 | 77 days ago | 0.00000002 ETH | ||||
Transfer | 21485776 | 84 days ago | 0.00080093 ETH | ||||
Deposit | 21485763 | 84 days ago | 0.00000785 ETH | ||||
Deposit | 21463139 | 87 days ago | 0 ETH | ||||
Deposit | 21439609 | 91 days ago | 0.00000001 ETH | ||||
Transfer | 21362625 | 101 days ago | 0.01324298 ETH | ||||
Deposit | 21349689 | 103 days ago | 0.00000001 ETH | ||||
Deposit | 21254022 | 116 days ago | 0.00000003 ETH | ||||
Deposit | 21114668 | 136 days ago | 0.00000001 ETH | ||||
Deposit | 21045049 | 146 days ago | 0.00000001 ETH | ||||
Deposit | 20994863 | 153 days ago | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.3.0
Contract Source Code (Vyper language format)
# @version 0.3.0 # (c) Curve.Fi, 2021 # Pool for two crypto assets from vyper.interfaces import ERC20 # Expected coins: # eth/whatever 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 CommitNewAdmin: deadline: indexed(uint256) admin: indexed(address) event NewAdmin: admin: indexed(address) 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 N_COINS: constant(int128) = 2 PRECISION: constant(uint256) = 10 ** 18 # The precision to convert to A_MULTIPLIER: constant(uint256) = 10000 # These addresses are replaced by the deployer token: constant(address) = 0xEd4064f376cB8d68F770FB1Ff088a3d0F3FF5c4d coins: constant(address[N_COINS]) = [ 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 0xD533a949740bb3306d119CC777fa900bA034cd52] price_scale: public(uint256) # Internal price scale price_oracle: public(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) owner: public(address) future_owner: 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 is_killed: public(bool) kill_deadline: public(uint256) transfer_ownership_deadline: public(uint256) admin_actions_deadline: public(uint256) admin_fee_receiver: public(address) KILL_DEADLINE_DT: constant(uint256) = 2 * 30 * 86400 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 # 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: constant(uint256[N_COINS]) = [ 1, 1, ] EXP_PRECISION: constant(uint256) = 10**10 ETH_INDEX: constant(uint256) = 0 # Can put it to something big to turn the logic off @external def __init__( owner: address, admin_fee_receiver: address, 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 ): self.owner = owner # 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.kill_deadline = block.timestamp + KILL_DEADLINE_DT self.admin_fee_receiver = admin_fee_receiver @payable @external def __default__(): pass ### 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 @external @view def token() -> address: return token @external @view def coins(i: uint256) -> address: _coins: address[N_COINS] = coins return _coins[i] @internal @view def xp() -> uint256[N_COINS]: 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] @view @external def A() -> uint256: return self._A_gamma()[0] @view @external def gamma() -> uint256: return self._A_gamma()[1] @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 @external @view def fee() -> uint256: return self._fee(self.xp()) @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) @external @view def get_virtual_price() -> uint256: return 10**18 * self.get_xcp(self.D) / CurveToken(token).totalSupply() @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 _coins: address[N_COINS] = coins for i in range(N_COINS): if i == ETH_INDEX: self.balances[i] = self.balance else: self.balances[i] = ERC20(_coins[i]).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 = self.admin_fee_receiver if receiver != ZERO_ADDRESS: frac: uint256 = vprice * 10**18 / (vprice - fees) - 10**18 claimed: uint256 = CurveToken(token).mint_relative(receiver, frac) xcp_profit -= fees*2 self.xcp_profit = xcp_profit log ClaimAdminFee(receiver, claimed) total_supply: uint256 = CurveToken(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 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(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 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): needs_adjustment = True self.not_adjusted = True if needs_adjustment: 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 / 10) 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 @internal def _exchange(sender: address, mvalue: uint256, i: uint256, j: uint256, dx: uint256, min_dy: uint256, use_eth: bool) -> uint256: assert not self.is_killed # dev: the pool is killed 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 _coins: address[N_COINS] = coins if use_eth and i == ETH_INDEX: assert mvalue == dx # dev: incorrect eth amount else: assert mvalue == 0 # dev: nonzero eth amount assert ERC20(_coins[i]).transferFrom(sender, self, dx) if i == ETH_INDEX: WETH(_coins[i]).withdraw(dx) y: uint256 = xp[j] x0: uint256 = xp[i] xp[i] = x0 + dx self.balances[i] = xp[i] price_scale: uint256 = self.price_scale 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 if use_eth and j == ETH_INDEX: raw_call(sender, b"", value=dy) else: if j == ETH_INDEX: WETH(_coins[j]).deposit(value=dy) assert ERC20(_coins[j]).transfer(sender, dy) 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 @payable @external @nonreentrant('lock') def exchange(i: uint256, j: uint256, dx: uint256, min_dy: uint256, use_eth: bool = False) -> uint256: """ Exchange using WETH by default """ return self._exchange(msg.sender, msg.value, i, j, dx, min_dy, use_eth) @payable @external @nonreentrant('lock') def exchange_underlying(i: uint256, j: uint256, dx: uint256, min_dy: uint256) -> uint256: """ Exchange using ETH """ return self._exchange(msg.sender, msg.value, i, j, dx, min_dy, True) @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 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 @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 @payable @external @nonreentrant('lock') def add_liquidity(amounts: uint256[N_COINS], min_mint_amount: uint256, use_eth: bool = False) -> uint256: assert not self.is_killed # dev: the pool is killed assert amounts[0] > 0 or amounts[1] > 0 # dev: no coins to add A_gamma: uint256[2] = self._A_gamma() _coins: address[N_COINS] = coins 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 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): if use_eth and i == ETH_INDEX: assert msg.value == amounts[i] # dev: incorrect eth amount if amounts[i] > 0: if (not use_eth) or (i != ETH_INDEX): assert ERC20(_coins[i]).transferFrom(msg.sender, self, amounts[i]) if i == ETH_INDEX: WETH(_coins[i]).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) token_supply: uint256 = CurveToken(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(token).mint(msg.sender, 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(token).mint(msg.sender, d_token) assert d_token >= min_mint_amount, "Slippage" log AddLiquidity(msg.sender, 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): """ This withdrawal method is very safe, does no complex math """ _coins: address[N_COINS] = coins total_supply: uint256 = CurveToken(token).totalSupply() CurveToken(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 if use_eth and i == ETH_INDEX: raw_call(msg.sender, b"", value=d_balance) else: if i == ETH_INDEX: WETH(_coins[i]).deposit(value=d_balance) assert ERC20(_coins[i]).transfer(msg.sender, d_balance) D: uint256 = self.D self.D = D - D * amount / total_supply log RemoveLiquidity(msg.sender, balances, total_supply - _amount) @view @external def calc_token_amount(amounts: uint256[N_COINS]) -> uint256: token_supply: uint256 = CurveToken(token).totalSupply() 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 @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(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 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 @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 @nonreentrant('lock') def remove_liquidity_one_coin(token_amount: uint256, i: uint256, min_amount: uint256, use_eth: bool = False) -> uint256: assert not self.is_killed # dev: the pool is killed 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(token).burnFrom(msg.sender, token_amount) _coins: address[N_COINS] = coins if use_eth and i == ETH_INDEX: raw_call(msg.sender, b"", value=dy) else: if i == ETH_INDEX: WETH(_coins[i]).deposit(value=dy) assert ERC20(_coins[i]).transfer(msg.sender, dy) 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 == self.owner # 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 == self.owner # 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 == self.owner # 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 == self.owner # dev: only owner assert block.timestamp >= self.admin_actions_deadline # dev: insufficient time assert self.admin_actions_deadline != 0 # dev: no active action self.admin_actions_deadline = 0 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 == self.owner # dev: only owner self.admin_actions_deadline = 0 @external def commit_transfer_ownership(_owner: address): assert msg.sender == self.owner # dev: only owner assert self.transfer_ownership_deadline == 0 # dev: active transfer _deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY self.transfer_ownership_deadline = _deadline self.future_owner = _owner log CommitNewAdmin(_deadline, _owner) @external def apply_transfer_ownership(): assert msg.sender == self.owner # dev: only owner assert block.timestamp >= self.transfer_ownership_deadline # dev: insufficient time assert self.transfer_ownership_deadline != 0 # dev: no active transfer self.transfer_ownership_deadline = 0 _owner: address = self.future_owner self.owner = _owner log NewAdmin(_owner) @external def revert_transfer_ownership(): assert msg.sender == self.owner # dev: only owner self.transfer_ownership_deadline = 0 @external def kill_me(): assert msg.sender == self.owner # dev: only owner assert self.kill_deadline > block.timestamp # dev: deadline has passed self.is_killed = True @external def unkill_me(): assert msg.sender == self.owner # dev: only owner self.is_killed = False @external def set_admin_fee_receiver(_admin_fee_receiver: address): assert msg.sender == self.owner # dev: only owner self.admin_fee_receiver = _admin_fee_receiver @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 @view def lp_price() -> uint256: """ Approximate LP token price """ max_price: uint256 = 2 * self.virtual_price * self.sqrt_int(self.price_oracle) / 10**18 return max_price
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"CommitNewAdmin","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"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":"owner","type":"address"},{"name":"admin_fee_receiver","type":"address"},{"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"}],"outputs":[]},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":516},{"stateMutability":"view","type":"function","name":"coins","inputs":[{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":648},{"stateMutability":"view","type":"function","name":"A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":685},{"stateMutability":"view","type":"function","name":"gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":11789},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":17633},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":364797},{"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"}],"gas":16775598},{"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"}],"gas":16775598},{"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"}],"gas":16775396},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":4577515},{"stateMutability":"payable","type":"function","name":"add_liquidity","inputs":[{"name":"amounts","type":"uint256[2]"},{"name":"min_mint_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":17694821},{"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"}],"gas":17694821},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"min_amounts","type":"uint256[2]"}],"outputs":[],"gas":263729},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"min_amounts","type":"uint256[2]"},{"name":"use_eth","type":"bool"}],"outputs":[],"gas":263729},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"amounts","type":"uint256[2]"}],"outputs":[{"name":"","type":"uint256"}],"gas":5200947},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":12584},{"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"}],"gas":16702178},{"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"}],"gas":16702178},{"stateMutability":"nonpayable","type":"function","name":"claim_admin_fees","inputs":[],"outputs":[],"gas":3250985},{"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":[],"gas":161698},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A_gamma","inputs":[],"outputs":[],"gas":156743},{"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":[],"gas":305084},{"stateMutability":"nonpayable","type":"function","name":"apply_new_parameters","inputs":[],"outputs":[],"gas":3543175},{"stateMutability":"nonpayable","type":"function","name":"revert_new_parameters","inputs":[],"outputs":[],"gas":23142},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_owner","type":"address"}],"outputs":[],"gas":78827},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":67042},{"stateMutability":"nonpayable","type":"function","name":"revert_transfer_ownership","inputs":[],"outputs":[],"gas":23232},{"stateMutability":"nonpayable","type":"function","name":"kill_me","inputs":[],"outputs":[],"gas":40455},{"stateMutability":"nonpayable","type":"function","name":"unkill_me","inputs":[],"outputs":[],"gas":23292},{"stateMutability":"nonpayable","type":"function","name":"set_admin_fee_receiver","inputs":[{"name":"_admin_fee_receiver","type":"address"}],"outputs":[],"gas":38482},{"stateMutability":"view","type":"function","name":"lp_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":217046},{"stateMutability":"view","type":"function","name":"price_scale","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3426},{"stateMutability":"view","type":"function","name":"price_oracle","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3456},{"stateMutability":"view","type":"function","name":"last_prices","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3486},{"stateMutability":"view","type":"function","name":"last_prices_timestamp","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3516},{"stateMutability":"view","type":"function","name":"initial_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3546},{"stateMutability":"view","type":"function","name":"future_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3576},{"stateMutability":"view","type":"function","name":"initial_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3606},{"stateMutability":"view","type":"function","name":"future_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3636},{"stateMutability":"view","type":"function","name":"allowed_extra_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3666},{"stateMutability":"view","type":"function","name":"future_allowed_extra_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3696},{"stateMutability":"view","type":"function","name":"fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3726},{"stateMutability":"view","type":"function","name":"future_fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3756},{"stateMutability":"view","type":"function","name":"adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3786},{"stateMutability":"view","type":"function","name":"future_adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3816},{"stateMutability":"view","type":"function","name":"ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3846},{"stateMutability":"view","type":"function","name":"future_ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3876},{"stateMutability":"view","type":"function","name":"mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3906},{"stateMutability":"view","type":"function","name":"out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3936},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3966},{"stateMutability":"view","type":"function","name":"future_mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3996},{"stateMutability":"view","type":"function","name":"future_out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4026},{"stateMutability":"view","type":"function","name":"future_admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4056},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":4131},{"stateMutability":"view","type":"function","name":"D","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4116},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4146},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4176},{"stateMutability":"view","type":"function","name":"xcp_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4206},{"stateMutability":"view","type":"function","name":"xcp_profit_a","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4236},{"stateMutability":"view","type":"function","name":"virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4266},{"stateMutability":"view","type":"function","name":"is_killed","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":4296},{"stateMutability":"view","type":"function","name":"kill_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4326},{"stateMutability":"view","type":"function","name":"transfer_ownership_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4356},{"stateMutability":"view","type":"function","name":"admin_actions_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4386},{"stateMutability":"view","type":"function","name":"admin_fee_receiver","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4416}]
Contract Creation Code
60206158ed60c03960c0518060a01c6158e85780905061014052602060206158ed0160c03960c0518060a01c6158e8578090506101605261014051602055602060406158ed0160c03960c05160801b61018052602060606158ed0160c03960c05161018051176101805261018051600b5561018051600c55602060806158ed0160c03960c051601755602060a06158ed0160c03960c051601855602060c06158ed0160c03960c051600f55602060e06158ed0160c03960c05160115560206101006158ed0160c03960c05160135560206101206158ed0160c03960c05160195560206101606158ed0160c03960c05160075560206101606158ed0160c03960c05160085560206101606158ed0160c03960c05160095542600a5560206101406158ed0160c03960c051601555670de0b6b3a764000060235542624f1a0081818301106158e8578082019050905060275561016051602a556158d056600436101561000d576124f8565b60046000601c37600051635b41b90881141561002e576000610d805261004d565b63394747c5811415610092576084358060011c61577057809050610d80525b60005461577057600160005533610a605234610a805260806004610aa037610d8051610b205261007e610da0614781565b610da051610dc0526020610dc06000600055f35b6365b2489b8114156100e15760015461577057600160015533610a605234610a805260806004610aa0376001610b20526100cd610d80614781565b610d8051610da0526020610da06000600155f35b630b4c7e4d8114156100f8576000610a6052610117565b63ee22be23811415610a0e576064358060011c61577057809050610a60525b600254615770576001600255602654615770576000600435111561013c576001610143565b6000602435115b1561577057610153610ac0613898565b610ac08051610a80528060200151610aa0525073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610ac05273d533a949740bb3306d119cc777fa900ba034cd52610ae052601d54610b0052601e54610b205260e036610b4037610b0051610c2052610b2051610c4052610c6060006002818352015b610b00610c605160028110156157705760200201516020610c6051026004013581818301106157705780820190509050610c8052610c8051610b00610c60516002811015615770576020020152610c80516001610c605160028110156157705702601d015581516001018083528114156101c9575050610b0051610b8052610b2051610ba05260075460018082028215828483041417156157705780905090509050610c6052610b005160018082028215828483041417156157705780905090509050610b0052610b2051610c60518082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050610b2052610c205160018082028215828483041417156157705780905090509050610c2052610c4051610c60518082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050610c4052610a60516103255734615770575b610c8060006002818352015b610a60511561034457610c805115610347565b60005b1561035f576020610c80510260040135341415615770575b60006020610c80510260040135111561049d57610a605161038157600161038a565b6000610c805114155b1561044f576323b872dd610ca05233610cc05230610ce0526020610c80510260040135610d00526020610ca06064610cbc6000610ac0610c805160028110156157705760200201515af11561577057601f3d111561577057610ca0511561577057610c805161044e57632e1a7d4d610ca0526020610c80510260040135610cc052610ac0610c805160028110156157705760200201513b1561577057600060006024610cbc6000610ac0610c805160028110156157705760200201515af115615770575b5b610b00610c80516002811015615770576020020151610c20610c805160028110156157705760200201518082106157705780820390509050610b40610c805160028110156157705760200201525b8151600101808352811415610331575050600e54610c80526000610c8051111561050957610a80516102a052610aa0516102c052610c20516102e052610c4051610300526104ec610ca061269c565b610ca051610c0052610c80514210610504576001600e555b610511565b601f54610c00525b610a80516102a052610aa0516102c052610b00516102e052610b20516103005261053c610cc061269c565b610cc051610ca0526318160ddd610ce0526020610ce06004610cfc73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d111561577057610ce051610cc0526000610c005111156105db57610cc051610ca0518082028215828483041417156157705780905090509050610c005180801561577057820490509050610cc0518082106157705780820390509050610bc0526105f7565b610ca0516102a0526105ee610ce0613b79565b610ce051610bc0525b6000610bc0511115615770576000610c005111156108f757610b40516101c052610b60516101e052610b005161020052610b20516102205261063a610ce061500e565b610ce051610bc05180820282158284830414171561577057809050905090506402540be40080820490509050600181818301106157705780820190509050610be052610bc08051610be0518082106157705780820390509050815250610cc08051610bc051818183011061577057808201905090508152506340c10f19610ce05233610d0052610bc051610d20526020610ce06044610cfc600073ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5af11561577057601f3d111561577057610ce0506000610ce052620186a0610bc05111156108ba5760043561071f576001610724565b602435155b156108b957606036610d003760043561076957610b805160018082028215828483041417156157705780905090509050610d00526001610d20526001610d4052610791565b610ba05160018082028215828483041417156157705780905090509050610d00526001610d20525b610d0051610bc0518082028215828483041417156157705780905090509050610cc05180801561577057820490509050610d0052610d0051670de0b6b3a764000080820282158284830414171561577057809050905090506020610d40510260040135610d20518082028215828483041417156157705780905090509050610bc051610b80610d405160028110156157705760200201518082028215828483041417156157705780905090509050610d20518082028215828483041417156157705780905090509050610cc05180801561577057820490509050808210615770578082039050905080801561577057820490509050610ce052610d40516108b8576ec097ce7bc90715b34b9f1000000000610ce05180801561577057820490509050610ce0525b5b5b610a805161074052610aa05161076052610b005161078052610b20516107a052610ce0516107c052610ca0516107e0526108f2613f9c565b610962565b610ca051601f55670de0b6b3a7640000602455670de0b6b3a76400006022556340c10f19610ce05233610d0052610bc051610d20526020610ce06044610cfc600073ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5af11561577057601f3d111561577057610ce0505b604435610bc05110156109b4576308c379a0610ce0526020610d00526008610d20527f536c697070616765000000000000000000000000000000000000000000000000610d4052610d20506064610cfcfd5b337f540ab385f9b5d450a27404172caade516b3ba3f4be88239ac56a2ad1de2a1f5a600435610ce052602435610d0052610be051610d2052610cc051610d40526080610ce0a2610bc051610ce0526020610ce06000600255f35b63fc0c546a811415610a3f57346157705773ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d610140526020610140f35b63c6610657811415610aa157346157705773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101405273d533a949740bb3306d119cc777fa900ba034cd52610160526101406004356002811015615770576020020151610180526020610180f35b63f446c1d0811415610acc573461577057610abd610220613898565b61022051610260526020610260f35b63b1373929811415610afa573461577057610ae8610220613898565b61022060200151610260526020610260f35b63ddca3f43811415610b53573461577057610b166101c061382c565b6101c08051610220528060200151610240525061022051610140526102405161016052610b44610200613a1d565b61020051610260526020610260f35b63bb7b8b80811415610bee573461577057670de0b6b3a7640000601f546102a052610b7f610320613b79565b6103205180820282158284830414171561577057809050905090506318160ddd610340526020610340600461035c73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d1115615770576103405180801561577057820490509050610380526020610380f35b63556d6e9f811415610ebb573461577057602435600435181561577057600260043510156157705760026024351015615770576007546001808202821582848304141715615770578090509050905061054052601d5461056052601e5461058052610c5a6105e0613898565b6105e080516105a05280602001516105c05250601f546105e0526000600e541115610ce1576105a051610660526105c05161068052610c9a61060061382c565b61060080516106a05280602001516106c05250610660516102a052610680516102c0526106a0516102e0526106c05161030052610cd861064061269c565b610640516105e0525b6105606004356002811015615770576020020180516044358181830110615770578082019050905081525061056051600180820282158284830414171561577057809050905090506105605261058051610540518082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050610580526105a051610140526105c051610160526105605161018052610580516101a0526105e0516101c0526024356101e052610d9a610620612e3f565b61062051610600526105606024356002811015615770576020020151610600518082106157705780820390509050600180821061577057808203905090506106205261060051610560602435600281101561577057602002015260006024351115610e3d5761062051670de0b6b3a76400008082028215828483041417156157705780905090509050610540518080156157705782049050905061062052610e4f565b61062080516001808204905090508152505b610620805161056051610140526105805161016052610e6f610640613a1d565b610640516106205180820282158284830414171561577057809050905090506402540be40080820490509050808210615770578082039050905081525061062051610640526020610640f35b635b36389c811415610ed257600061014052610ef1565b63269b5581811415611250576064358060011c61577057809050610140525b346157705760035461577057600160035573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101605273d533a949740bb3306d119cc777fa900ba034cd52610180526318160ddd6101c05260206101c060046101dc73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d1115615770576101c0516101a0526379cc67906101c052336101e0526004356102005260206101c060446101dc600073ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5af11561577057601f3d1115615770576101c050601d546101c052601e546101e052600435600180821061577057808203905090506102005261022060006002818352015b6101c06102205160028110156157705760200201516102005180820282158284830414171561577057809050905090506101a051808015615770578204905090506102405260206102205102602401356102405110615770576101c061022051600281101561577057602002015161024051808210615770578082039050905060016102205160028110156157705702601d0155610240516101c061022051600281101561577057602002015261014051156110af5761022051156110b2565b60005b156110f4576000610260526102608051602001806102808284600060045af11561577057505060006000610280516102a061024051335af1156157705761119b565b6102205161114a5763d0e30db0610260526101606102205160028110156157705760200201513b156157705760006000600461027c610240516101606102205160028110156157705760200201515af115615770575b63a9059cbb610260523361028052610240516102a0526020610260604461027c60006101606102205160028110156157705760200201515af11561577057601f3d1115615770576102605115615770575b8151600101808352811415610fef575050601f546102205261022051610220516102005180820282158284830414171561577057809050905090506101a051808015615770578204905090508082106157705780820390509050601f55337fdd3c0336a16f1b64f172b7bb0dad5b2b3c7c76f91e8c4aafd6aae60dce8001536101c051610240526101e051610260526101a0516004358082106157705780820390509050610280526060610240a26000600355005b638d8ea7278114156114d45734615770576318160ddd610560526020610560600461057c73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d111561577057610560516105405260075460018082028215828483041417156157705780905090509050610560526112cc6105c0613898565b6105c080516105805280602001516105a052506112ea61060061382c565b61060080516105c05280602001516105e052506004356001808202821582848304141715615770578090509050905061060052602435610560518082028215828483041417156157705780905090509050670de0b6b3a76400008082049050905061062052601f54610640526000600e54111561139557610580516102a0526105a0516102c0526105c0516102e0526105e0516103005261138c61066061269c565b61066051610640525b6105c0805161060051818183011061577057808201905090508152506105e080516106205181818301106157705780820190509050815250610580516102a0526105a0516102c0526105c0516102e0526105e051610300526113f861068061269c565b6106805161066052610540516106605180820282158284830414171561577057809050905090506106405180801561577057820490509050610540518082106157705780820390509050610680526106808051610600516101c052610620516101e0526105c051610200526105e051610220526114766106a061500e565b6106a0516106805180820282158284830414171561577057809050905090506402540be400808204905090506001818183011061577057808201905090508082106157705780820390509050815250610680516106a05260206106a0f35b634fb08c5e8114156115615734615770576114f06107e0613898565b6107e080516108c05280602001516108e0525060406004610900376001610940526000610960526108c051610540526108e051610560526109005161058052610920516105a052610940516105c052610960516105e05261155261082061519f565b61082051610980526020610980f35b63f1dc3cc9811415611578576000610a6052611597565b638f15b6b58114156118c4576064358060011c61577057809050610a60525b3461577057600454615770576001600455602654615770576115ba610ac0613898565b610ac08051610a80528060200151610aa0525060a036610ac037600e54610b6052610a805161054052610aa0516105605260406004610580376000610b6051116105c05260016105e05261160f610b8061519f565b610b808051610ac0526020810151610b00526040810151610ae052606081018051610b20528060200151610b40525050604435610ac0511015611691576308c379a0610b80526020610ba0526008610bc0527f536c697070616765000000000000000000000000000000000000000000000000610be052610bc0506064610b9cfd5b610b605142106116a1576001600e555b600160243560028110156157705702601d018054610ac05180821061577057808203905090508155506379cc6790610b805233610ba052600435610bc0526020610b806044610b9c600073ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5af11561577057601f3d111561577057610b805073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610b805273d533a949740bb3306d119cc777fa900ba034cd52610ba052610a605115611758576024351561175b565b60005b1561179d576000610bc052610bc0805160200180610be08284600060045af11561577057505060006000610be051610c00610ac051335af11561577057611840565b6024356117f05763d0e30db0610bc052610b8060243560028110156157705760200201513b1561577057600060006004610bdc610ac051610b8060243560028110156157705760200201515af115615770575b63a9059cbb610bc05233610be052610ac051610c00526020610bc06044610bdc6000610b8060243560028110156157705760200201515af11561577057601f3d111561577057610bc05115615770575b610a805161074052610aa05161076052610b205161078052610b40516107a052610b00516107c052610ae0516107e052611878613f9c565b337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060406004610bc037610ac051610c00526060610bc0a2610ac051610bc0526020610bc06000600455f35b63c93f49e88114156118f05734615770576005546157705760016005556118e9613c05565b6000600555005b635e248072811415611af457346157705760205433141561577057600d546201517f8181830110615770578082019050905042111561577057426201517f81818301106157705780820190509050604435111561577057611952610260613898565b610260805161022052806020015161024052506102205160801b6102605261024051610260511761026052610f9f60043511156157705763ee6b28016004351015615770576402540be3ff60243511156157705766470de4df820001602435101561577057670de0b6b3a76400006004358082028215828483041417156157705780905090509050610220518080156157705782049050905061028052678ac7230489e800016102805110156157705767016345785d89ffff61028051111561577057670de0b6b3a76400006024358082028215828483041417156157705780905090509050610240518080156157705782049050905061028052678ac7230489e800016102805110156157705767016345785d89ffff6102805111156157705761026051600b5542600d5560043560801b6102a0526024356102a051176102a052604435600e556102a051600c557fe35f0559b0642164e286b30df2077ec3a05426617a25db7578fd20ba39a6cd05610220516102c0526004356102e05261024051610300526024356103205242610340526044356103605260c06102c0a1005b63244c7c2e811415611b9957346157705760205433141561577057611b1a610260613898565b610260805161022052806020015161024052506102205160801b610260526102405161026051176102605261026051600b5561026051600c5542600d5542600e557f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc2846102205161028052610240516102a052426102c0526060610280a1005b63a43c3351811415611d6a573461577057602054331415615770576029546157705760e06004610140376402540be401610160511015611be6576207a11f61016051111561577057611bee565b601854610160525b6402540be400610140511115611c0657601754610140525b610160516101405111615770576402540be400610180511115611c2b57601954610180525b670de0b6b3a76400006101a0511015611c4f5760006101a051111561577057611c57565b6011546101a0525b670de0b6b3a76400006101c0511115611c7257600f546101c0525b670de0b6b3a76400006101e0511115611c8d576013546101e0525b62093a80610200511015611cac57600061020051111561577057611cb4565b601554610200525b426203f48081818301106157705780820190509050610220526102205160295561018051601c5561014051601a5561016051601b556101a0516012556101c0516010556101e05160145561020051601655610220517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde5536101805161024052610140516102605261016051610280526101a0516102a0526101c0516102c0526101e0516102e052610200516103005260e0610240a2005b632a7dd7cd811415611e885734615770576006546157705760016006556020543314156157705760295442106157705760006029541815615770576000602955601c5461074052610740516019541815611dce57611dc6613c05565b610740516019555b601a546107605261076051601755601b5461078052610780516018556012546107a0526107a0516011556010546107c0526107c051600f556014546107e0526107e05160135560165461080052610800516015557f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc55040876107405161082052610760516108405261078051610860526107a051610880526107c0516108a0526107e0516108c052610800516108e05260e0610820a16000600655005b63226840fb811415611eaa573461577057602054331415615770576000602955005b636b441a40811415611f36576004358060a01c615770578090506101405234615770576020543314156157705760285461577057426203f4808181830110615770578082019050905061016052610160516028556101405160215561014051610160517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb9356000610180a3005b636a1c05ae811415611fa557346157705760205433141561577057602854421061577057600060285418156157705760006028556021546101405261014051602055610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c6000610160a2005b6386fbf193811415611fc7573461577057602054331415615770576000602855005b63e3698853811415611ff357346157705760205433141561577057426027541115615770576001602655005b633046f972811415612015573461577057602054331415615770576000602655005b637242e52481141561204b576004358060a01c615770578090506101405234615770576020543314156157705761014051602a55005b6354f0f7d58114156120c8573461577057600260245480820282158284830414171561577057809050905090506008546101405261208a61024061564d565b610240518082028215828483041417156157705780905090509050670de0b6b3a7640000808204905090506102205261022051610240526020610240f35b63b9e8c9fd8114156120e7573461577057600754610140526020610140f35b6386fc88d3811415612106573461577057600854610140526020610140f35b63c146bf94811415612125573461577057600954610140526020610140f35b636112c747811415612144573461577057600a54610140526020610140f35b63204fe3d5811415612163573461577057600b54610140526020610140f35b63f30cfad5811415612182573461577057600c54610140526020610140f35b63e89876ff8114156121a1573461577057600d54610140526020610140f35b63f9ed95978114156121c0573461577057600e54610140526020610140f35b6349fe9e778114156121df573461577057600f54610140526020610140f35b63727ced578114156121fe573461577057601054610140526020610140f35b6372d4f0e281141561221d573461577057601154610140526020610140f35b63d7c3dcbe81141561223c573461577057601254610140526020610140f35b63083812e581141561225b573461577057601354610140526020610140f35b634ea12c7d81141561227a573461577057601454610140526020610140f35b63662b6274811415612299573461577057601554610140526020610140f35b630c5e23d48114156122b8573461577057601654610140526020610140f35b6392526c0c8114156122d7573461577057601754610140526020610140f35b63ee8de6758114156122f6573461577057601854610140526020610140f35b63fee3f7f9811415612315573461577057601954610140526020610140f35b637cf9aedc811415612334573461577057601a54610140526020610140f35b637d1b060c811415612353573461577057601b54610140526020610140f35b63e3824462811415612372573461577057601c54610140526020610140f35b634903b0d18114156123a1573461577057600160043560028110156157705702601d0154610140526020610140f35b630f529ba28114156123c0573461577057601f54610140526020610140f35b638da5cb5b8114156123df573461577057602054610140526020610140f35b631ec0cdc18114156123fe573461577057602154610140526020610140f35b637ba1a74d81141561241d573461577057602254610140526020610140f35b630b7b594b81141561243c573461577057602354610140526020610140f35b630c46b72a81141561245b573461577057602454610140526020610140f35b639c868ac081141561247a573461577057602654610140526020610140f35b632a426896811415612499573461577057602754610140526020610140f35b63e0a0b5868114156124b8573461577057602854610140526020610140f35b63405e28f88114156124d7573461577057602954610140526020610140f35b636e42e4d28114156124f6573461577057602a54610140526020610140f35b505b005b610140516101a052610160516101c0526101805115612521576101c0516101a05110612524565b60005b1561253a57610160516101a052610140516101c0525b6101a0516101e052600061020052610220600060ff818352015b6101e051610240526101e0516101a0516101c05180820282158284830414171561577057809050905090506101e05180801561577057820490509050818183011061577057808201905090506002808204905090506101e052610240516101e05111156125da576101e051610240518082106157705780820390509050610200526125f5565b610240516101e0518082106157705780820390509050610200525b60016102005111612607576001612631565b6101e05161020051670de0b6b3a76400008082028215828483041417156157705780905090509050105b156126445750506101e05181525061269a565b81516001018083528114156125545750506308c379a0610220526020610240526010610260527f446964206e6f7420636f6e7665726765000000000000000000000000000000006102805261026050606461023cfd5b565b610f9f6102a05111156126b85763ee6b28016102a051106126bb565b60005b15615770576402540be3ff6102c05111156126e25766470de4df8200016102c051106126e5565b60005b15615770576102e051610320526103005161034052610340516103205110156127195761030051610320526102e051610340525b633b9ac9ff610320511115612741576d314dc6448d9338c15b0a000000016103205110612744565b60005b1561577057655af3107a3fff61034051670de0b6b3a7640000808202821582848304141715615770578090509050905061032051808015615770578204905090501115615770576002610320516101405261034051610160526000610180526127ae6103806124fa565b61038051808202821582848304141715615770578090509050905061036052610320516103405181818301106157705780820190509050610380526103a0600060ff818352015b610360516103c052673782dace9d900000610320518082028215828483041417156157705780905090509050610360518080156157705782049050905061034051808202821582848304141715615770578090509050905061036051808015615770578204905090506103e0526102c051670de0b6b3a764000081818301106157705780820190509050610400526103e0516104005111156128c257610400516103e0518082106157705780820390509050600181818301106157705780820190509050610400526128ef565b6103e051610400518082106157705780820390509050600181818301106157705780820190509050610400525b670de0b6b3a76400006103605180820282158284830414171561577057809050905090506102c051808015615770578204905090506104005180820282158284830414171561577057809050905090506102c0518080156157705782049050905061040051808202821582848304141715615770578090509050905061271080820282158284830414171561577057809050905090506102a0518080156157705782049050905061042052673782dace9d9000006103e05180820282158284830414171561577057809050905090506104005180801561577057820490509050610440526103805161038051610440518082028215828483041417156157705780905090509050670de0b6b3a7640000808204905090508181830110615770578082019050905061042051600280820282158284830414171561577057809050905090506103e051808015615770578204905090508181830110615770578082019050905061044051610360518082028215828483041417156157705780905090509050670de0b6b3a7640000808204905090508082106157705780820390509050610460526103605161046051610380518181830110615770578082019050905080820282158284830414171561577057809050905090506104605180801561577057820490509050610480526103605161036051808202821582848304141715615770578090509050905061046051808015615770578204905090506104a0526103e051670de0b6b3a76400001115612bc4576104a08051610360516104205161046051808015615770578204905090508082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050670de0b6b3a76400006103e051808210615770578082039050905080820282158284830414171561577057809050905090506103e0518080156157705782049050905081818301106157705780820190509050815250612c5e565b6104a08051610360516104205161046051808015615770578204905090508082028215828483041417156157705780905090509050670de0b6b3a7640000808204905090506103e051670de0b6b3a7640000808210615770578082039050905080820282158284830414171561577057809050905090506103e0518080156157705782049050905080821061577057808203905090508152505b6104a051610480511115612c8b57610480516104a051808210615770578082039050905061036052612caf565b6104a051610480518082106157705780820390509050600280820490509050610360525b60006104c0526103c051610360511115612ce257610360516103c05180821061577057808203905090506104c052612cfd565b6103c0516103605180821061577057808203905090506104c0525b662386f26fc100006103605180821015612d175780612d19565b815b905090506104c051655af3107a400080820282158284830414171561577057809050905090501015612de75761050060006002818352015b6020610500510261032001516104e0526104e051670de0b6b3a76400008082028215828483041417156157705780905090509050610360518080156157705782049050905061052052662386f26fc0ffff610520511115612dc05768056bc75e2d631000016105205110612dc3565b60005b15615770578151600101808352811415612d51575050505061036051815250612e3d565b81516001018083528114156127f55750506308c379a06103a05260206103c05260106103e0527f446964206e6f7420636f6e766572676500000000000000000000000000000000610400526103e05060646103bcfd5b565b610f9f610140511115612e5b5763ee6b28016101405110612e5e565b60005b15615770576402540be3ff610160511115612e855766470de4df8200016101605110612e88565b60005b156157705767016345785d89ffff6101c0511115612eb9576d314dc6448d9338c15b0a000000016101c05110612ebc565b60005b156157705761018060016101e05180821061577057808203905090506002811015615770576020020151610200527001000000000000000000000000000000006101c05110156157705760026101c0510a61020051600480820282158284830414171561577057809050905090508080156157705782049050905061022052671bc16d674ec800006102005180820282158284830414171561577057809050905090506101c051808015615770578204905090506102405266470de4df81ffff610240511115612f9a57680ad78ebc5ac62000016102405110612f9d565b60005b156157705761020051655af3107a4000808204905090506101c051655af3107a40008082049050905080821015612fd45780612fd6565b815b90509050606480821015612fea5780612fec565b815b9050905061026052610280600060ff818352015b610220516102a05261024051610220518082028215828483041417156157705780905090509050600280820282158284830414171561577057809050905090506101c051808015615770578204905090506102c0526102005161022051818183011061577057808201905090506102e05261016051670de0b6b3a764000081818301106157705780820190509050610300526102c0516103005111156130d157610300516102c0518082106157705780820390509050600181818301106157705780820190509050610300526130fe565b6102c051610300518082106157705780820390509050600181818301106157705780820190509050610300525b670de0b6b3a76400006101c0518082028215828483041417156157705780905090509050610160518080156157705782049050905061030051808202821582848304141715615770578090509050905061016051808015615770578204905090506103005180820282158284830414171561577057809050905090506127108082028215828483041417156157705780905090509050610140518080156157705782049050905061032052670de0b6b3a7640000671bc16d674ec800006102c051808202821582848304141715615770578090509050905061030051808015615770578204905090508181830110615770578082019050905061034052670de0b6b3a76400006102205180820282158284830414171561577057809050905090506102e051610340518082028215828483041417156157705780905090509050818183011061577057808201905090506103205181818301106157705780820190509050610360526101c05161034051808202821582848304141715615770578090509050905061038052610380516103605110156132b1576102a05160028082049050905061022052613514566132cc565b61036080516103805180821061577057808203905090508152505b6103605161022051808015615770578204905090506103a052610320516103a051808015615770578204905090506103c05261036051670de0b6b3a76400006101c0518082028215828483041417156157705780905090509050818183011061577057808201905090506103a051808015615770578204905090506103c051670de0b6b3a764000080820282158284830414171561577057809050905090506102c05180801561577057820490509050818183011061577057808201905090506103e0526103c08051670de0b6b3a76400006102e05180820282158284830414171561577057809050905090506103a05180801561577057820490509050818183011061577057808201905090508152506103c0516103e0511015613401576102a0516002808204905090506102205261341c565b6103e0516103c0518082106157705780820390509050610220525b6000610400526102a05161022051111561344f57610220516102a05180821061577057808203905090506104005261346a565b6102a051610220518082106157705780820390509050610400525b6102605161022051655af3107a4000808204905090508082101561348e5780613490565b815b905090506104005110156135135761022051670de0b6b3a764000080820282158284830414171561577057809050905090506101c0518080156157705782049050905061042052662386f26fc0ffff6104205111156134fd5768056bc75e2d631000016104205110613500565b60005b156157705750506102205181525061356a565b5b81516001018083528114156130005750506308c379a06102805260206102a05260106102c0527f446964206e6f7420636f6e7665726765000000000000000000000000000000006102e0526102c050606461029cfd5b565b61014051670de0b6b3a764000080820490509050610160526101405161016051670de0b6b3a76400008082028215828483041417156157705780905090509050808210615770578082039050905061018052603b6101605111156135d457600081525061382a565b670de0b6b3a7640000610100610160511015615770576101605160020a808015615770578204905090506101a05261018051613616576101a05181525061382a565b670de0b6b3a76400006101c0526706f05b59d3b200006101e052670de0b6b3a764000061020052600061022052610240600160ff818352015b61024051670de0b6b3a764000080820282158284830414171561577057809050905090506102605261026051670de0b6b3a7640000808210615770578082039050905061028052610280516101805111156136cc5761018051610280518082106157705780820390509050610280526102205115610220526136e7565b61028080516101805180821061577057808203905090508152505b6101c051610280516101e0518082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050808202821582848304141715615770578090509050905061026051808015615770578204905090506101c052610220511561376e5761020080516101c051808210615770578082039050905081525061378b565b61020080516101c051818183011061577057808201905090508152505b6402540be4006101c05110156137d45750506101a051610200518082028215828483041417156157705780905090509050670de0b6b3a76400008082049050905081525061382a565b815160010180835281141561364f5750506308c379a0610240526020610260526010610280527f446964206e6f7420636f6e7665726765000000000000000000000000000000006102a05261028050606461025cfd5b565b601d54600180820282158284830414171561577057809050905090508152601e54600180820282158284830414171561577057809050905090506007548082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050816020015250565b600e5461014052600c54610160526fffffffffffffffffffffffffffffffff6101605116610180526101605160801c6101a05261014051421015613a0b57600b546101c052600d546101e05261014080516101e0518082106157705780820390509050815250426101e05180821061577057808203905090506101e052610140516101e0518082106157705780820390509050610200526101c05160801c6102005180820282158284830414171561577057809050905090506101a0516101e05180820282158284830414171561577057809050905090508181830110615770578082019050905061014051808015615770578204905090506101a0526fffffffffffffffffffffffffffffffff6101c05116610200518082028215828483041417156157705780905090509050610180516101e0518082028215828483041417156157705780905090509050818183011061577057808201905090506101405180801561577057820490509050610180525b6101a051815261018051816020015250565b601154610180526101405161016051818183011061577057808201905090506101a05261018051670de0b6b3a7640000808202821582848304141715615770578090509050905061018051670de0b6b3a764000081818301106157705780820190509050673782dace9d9000006101405180820282158284830414171561577057809050905090506101a051808015615770578204905090506101605180820282158284830414171561577057809050905090506101a051808015615770578204905090508082106157705780820390509050808015615770578204905090506101a0526017546101a0518082028215828483041417156157705780905090509050601854670de0b6b3a76400006101a0518082106157705780820390509050808202821582848304141715615770578090509050905081818301106157705780820190509050670de0b6b3a764000080820490509050815250565b6102a0516002808204905090506102c0526102a051670de0b6b3a7640000808202821582848304141715615770578090509050905060075460028082028215828483041417156157705780905090509050808015615770578204905090506102e0526102c051610140526102e05161016052600161018052613bfc6103006124fa565b61030051815250565b613c10610580613898565b61058080516105405280602001516105605250602254610580526023546105a05273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26105c05273d533a949740bb3306d119cc777fa900ba034cd526105e05261060060006002818352015b61060051613c91574760016106005160028110156157705702601d0155613ce7565b6370a082316106205230610640526020610620602461063c6105c06106005160028110156157705760200201515afa1561577057601f3d1115615770576106205160016106005160028110156157705702601d01555b8151600101808352811415613c6f575050602454610600526105a051610580511115613e9157610580516105a051808210615770578082039050905060195480820282158284830414171561577057809050905090506404a817c80080820490509050610620526000610620511115613e9057602a54610640526000610640511815613e8f5761060051670de0b6b3a764000080820282158284830414171561577057809050905090506106005161062051808210615770578082039050905080801561577057820490509050670de0b6b3a7640000808210615770578082039050905061066052636962f8456106a052610640516106c052610660516106e05260206106a060446106bc600073ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5af11561577057601f3d1115615770576106a0516106805261058080516106205160028082028215828483041417156157705780905090509050808210615770578082039050905081525061058051602255610640517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf59610680516106a05260206106a0a25b5b5b6318160ddd610640526020610640600461065c73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d1115615770576106405161062052610540516106c052610560516106e052613eec61066061382c565b610660805161070052806020015161072052506106c0516102a0526106e0516102c052610700516102e0526107205161030052613f2a6106a061269c565b6106a0516106405261064051601f55670de0b6b3a7640000610640516102a052613f55610660613b79565b61066051808202821582848304141715615770578090509050905061062051808015615770578204905090506024556105a051610580511115613f9a57610580516023555b565b600854610800526009546108205260075461084052600a5461086052600061088052426108605110156140b0576015546108a05242610860518082106157705780820390509050670de0b6b3a764000080820282158284830414171561577057809050905090506108a05180801561577057820490509050610140526140236108e061356c565b6108e0516108c05261082051670de0b6b3a76400006108c05180821061577057808203905090508082028215828483041417156157705780905090509050610800516108c051808202821582848304141715615770578090509050905081818301106157705780820190509050670de0b6b3a764000080820490509050610800526108005160085542600a555b6107e0516108a0526107e0516140f457610740516102a052610760516102c052610780516102e0526107a051610300526140eb6108c061269c565b6108c0516108a0525b60006107c051111561410d576107c051610820526141cc565b610780516108c0526107a0516108e0526108c051620f424080820490509050610900526108c080516109005181818301106157705780820190509050815250610840516109005180820282158284830414171561577057809050905090506107a051610740516101405261076051610160526108c051610180526108e0516101a0526108a0516101c05260016101e0526141a8610920612e3f565b61092051808210615770578082039050905080801561577057820490509050610820525b610820516009556318160ddd6108e05260206108e060046108fc73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d1115615770576108e0516108c0526022546108e052602454610900526108a051600280820490509050610920526108a051670de0b6b3a7640000808202821582848304141715615770578090509050905060026108405180820282158284830414171561577057809050905090508080156157705782049050905061094052670de0b6b3a764000061096052670de0b6b3a76400006109805260006109005111156143bf57610920516101405261094051610160526001610180526142cb6109c06124fa565b6109c0516109a052670de0b6b3a76400006109a05180820282158284830414171561577057809050905090506108c05180801561577057820490509050610980526108e051610980518082028215828483041417156157705780905090509050610900518080156157705782049050905061096052600e546109c0526109005161098051101561435f576109c05115614362565b60005b156143ac576308c379a06109e0526020610a00526004610a20527f4c6f737300000000000000000000000000000000000000000000000000000000610a4052610a205060646109fcfd5b60016109c05114156143be576000600e555b5b610960516022556025546109a0526109a05161443f57610960516002600f548082028215828483041417156157705780905090509050818183011061577057808201905090506109805160028082028215828483041417156157705780905090509050670de0b6b3a7640000808210615770578082039050905011614442565b60005b156144535760016109a05260016025555b6109a051156147705761080051670de0b6b3a7640000808202821582848304141715615770578090509050905061084051808015615770578204905090506109c052670de0b6b3a76400006109c05111156144cc576109c08051670de0b6b3a764000080821061577057808203905090508152506144ec565b670de0b6b3a76400006109c05180821061577057808203905090506109c0525b6013546109c051600a808204905090508082101561450a578061450c565b815b905090506109e0526109e0516109c051111561452e5760006109005111614531565b60005b1561476f57610840516109c0516109e051808210615770578082039050905080820282158284830414171561577057809050905090506109e051610800518082028215828483041417156157705780905090509050818183011061577057808201905090506109c051808015615770578204905090506108805261078051610920526107a051610880518082028215828483041417156157705780905090509050610840518080156157705782049050905061094052610740516102a052610760516102c052610920516102e0526109405161030052614612610a2061269c565b610a2051610a0052610a005160028082049050905061092052610a0051670de0b6b3a7640000808202821582848304141715615770578090509050905060026108805180820282158284830414171561577057809050905090508080156157705782049050905061094052670de0b6b3a7640000610920516101405261094051610160526001610180526146a7610a206124fa565b610a205180820282158284830414171561577057809050905090506108c0518080156157705782049050905061090052670de0b6b3a764000061090051111561472857610960516002610900518082028215828483041417156157705780905090509050670de0b6b3a764000080821061577057808203905090501161472b565b60005b1561474e5761088051600755610a0051601f556109005160245561477f5661476e565b60006025556108a051601f5561098051602455614769613c05565b61477f565b5b5b6108a051601f55610980516024555b565b60265461577057610ac051610aa0511815615770576002610aa0511015615770576002610ac0511015615770576000610ae0511115615770576147c5610b80613898565b610b808051610b40528060200151610b605250601d54610b8052601e54610ba052604036610bc03773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610c005273d533a949740bb3306d119cc777fa900ba034cd52610c2052610b20511561483257610aa05115614835565b60005b1561484d57610ae051610a805114156157705761490a565b610a8051615770576323b872dd610c4052610a6051610c605230610c8052610ae051610ca0526020610c406064610c5c6000610c00610aa05160028110156157705760200201515af11561577057601f3d111561577057610c40511561577057610aa05161490957632e1a7d4d610c4052610ae051610c6052610c00610aa05160028110156157705760200201513b1561577057600060006024610c5c6000610c00610aa05160028110156157705760200201515af115615770575b5b610b80610ac0516002811015615770576020020151610c4052610b80610aa0516002811015615770576020020151610c6052610c6051610ae05181818301106157705780820190509050610b80610aa0516002811015615770576020020152610b80610aa05160028110156157705760200201516001610aa05160028110156157705702601d0155600754610c8052610b805160018082028215828483041417156157705780905090509050610b8052610ba051610c8051808202821582848304141715615770578090509050905060018082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050610ba0526001610ca0526001610cc0526001610aa0511415614a2b576001610ca0526001610cc0525b600e54610ce0526000610ce0511115614b2f57610c608051610ca05180820282158284830414171561577057809050905090508152506000610aa0511115614aa157610c6051610c80518082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050610c60525b610b80610aa0516002811015615770576020020151610d0052610c6051610b80610aa0516002811015615770576020020152610b40516102a052610b60516102c052610b80516102e052610ba05161030052614afe610d2061269c565b610d2051601f55610d0051610b80610aa0516002811015615770576020020152610ce0514210614b2e576001600e555b5b610b80610ac0516002811015615770576020020151610b405161014052610b605161016052610b805161018052610ba0516101a052601f546101c052610ac0516101e052614b7e610d00612e3f565b610d00518082106157705780820390509050610be052610b80610ac051600281101561577057602002018051610be0518082106157705780820390509050815250610be08051600180821061577057808203905090508152506000610ac0511115614c1d57610be051670de0b6b3a76400008082028215828483041417156157705780905090509050610c805180801561577057820490509050610be0525b610be08051610cc05180801561577057820490509050815250610be08051610b805161014052610ba05161016052614c56610d00613a1d565b610d0051610be05180820282158284830414171561577057809050905090506402540be400808204905090508082106157705780820390509050815250610b0051610be0511015614ce6576308c379a0610d00526020610d20526008610d40527f536c697070616765000000000000000000000000000000000000000000000000610d6052610d40506064610d1cfd5b610c408051610be0518082106157705780820390509050815250610c40516001610ac05160028110156157705702601d0155610b205115614d2b57610ac05115614d2e565b60005b15614d73576000610d0052610d00805160200180610d208284600060045af11561577057505060006000610d2051610d40610be051610a60515af11561577057614e1d565b610ac051614dc95763d0e30db0610d0052610c00610ac05160028110156157705760200201513b1561577057600060006004610d1c610be051610c00610ac05160028110156157705760200201515af115615770575b63a9059cbb610d0052610a6051610d2052610be051610d40526020610d006044610d1c6000610c00610ac05160028110156157705760200201515af11561577057601f3d111561577057610d005115615770575b610c408051610cc05180820282158284830414171561577057809050905090508152506000610ac0511115614e8057610c4051610c80518082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050610c40525b610c4051610b80610ac0516002811015615770576020020152620186a0610ae0511115614eb557620186a0610be05111614eb8565b60005b15614f8457610ae051610ca0518082028215828483041417156157705780905090509050610d0052610be051610cc0518082028215828483041417156157705780905090509050610d2052610aa051614f4957610d0051670de0b6b3a76400008082028215828483041417156157705780905090509050610d205180801561577057820490509050610bc052614f83565b610d2051670de0b6b3a76400008082028215828483041417156157705780905090509050610d005180801561577057820490509050610bc0525b5b610b405161074052610b605161076052610b805161078052610ba0516107a052610bc0516107c05260006107e052614fba613f9c565b610a60517fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc98610aa051610d0052610ae051610d2052610ac051610d4052610be051610d60526080610d00a2610be051815250565b61020051610140526102205161016052615029610260613a1d565b6102605160028082028215828483041417156157705780905090509050600480820490509050610240526000610260526102a060006002818352015b60206102a051026101c0015161028052610260805161028051818183011061577057808201905090508152508151600101808352811415615065575050610260516002808204905090506102805260006102a0526102e060006002818352015b60206102e051026101c001516102c052610280516102c0511115615116576102a080516102c05161028051808210615770578082039050905081818301106157705780820190509050815250615145565b6102a08051610280516102c0518082106157705780820390509050818183011061577057808201905090508152505b81516001018083528114156150c5575050610240516102a05180820282158284830414171561577057809050905090506102605180801561577057820490509050620186a081818301106157705780820190509050815250565b6318160ddd610620526020610620600461063c73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d11156157705761062051610600526106005161058051116157705760026105a051101561577057601d5461062052601e5461064052600061066052600754600180820282158284830414171561577057809050905090506106805261062051600180820282158284830414171561577057809050905090506106a05261064051610680518082028215828483041417156157705780905090509050670de0b6b3a7640000808204905090506106c0526105a05161529657670de0b6b3a7640000610680525b6105c051156152d757610540516102a052610560516102c0526106a0516102e0526106c051610300526152ca6106e061269c565b6106e051610660526152df565b601f54610660525b610660516106e0526106a051610140526106c05161016052615302610720613a1d565b6107205161070052610580516106e05180820282158284830414171561577057809050905090506106005180801561577057820490509050610720526106e0805161072051610700516107205180820282158284830414171561577057809050905090506404a817c8008082049050905060018181830110615770578082019050905080821061577057808203905090508082106157705780820390509050815250610540516101405261056051610160526106a051610180526106c0516101a0526106e0516101c0526105a0516101e0526153df610760612e3f565b61076051610740526106a06105a0516002811015615770576020020151610740518082106157705780820390509050670de0b6b3a76400008082028215828483041417156157705780905090509050610680518080156157705782049050905061076052610740516106a06105a05160028110156157705760200201526000610780526105e0511561548f57620186a061076051111561548757620186a0610580511161548a565b60005b615492565b60005b1561561e5760006107a05260016107c05260016105a05114156154db5761062051600180820282158284830414171561577057809050905090506107a05260016107c0526154fd565b61064051600180820282158284830414171561577057809050905090506107a0525b6107a05161072051808202821582848304141715615770578090509050905061066051808015615770578204905090506107a0526107a051670de0b6b3a76400008082028215828483041417156157705780905090509050610760516107c0518082028215828483041417156157705780905090509050610720516106206105a051600281101561577057602002015180820282158284830414171561577057809050905090506107c05180820282158284830414171561577057809050905090506106605180801561577057820490509050808210615770578082039050905080801561577057820490509050610780526105a05161561d576ec097ce7bc90715b34b9f10000000006107805180801561577057820490509050610780525b5b6107605181526107805160208201526106e0516040820152606081016106a05181526106c05181602001525050565b6101405161565f57600081525061576e565b61014051670de0b6b3a7640000818183011061577057808201905090506002808204905090506101605261014051610180526101a06000610100818352015b610180516101605114156156ba5750506101805181525061576e565b610160516101805261014051670de0b6b3a764000080820282158284830414171561577057809050905090506101605180801561577057820490509050610160518181830110615770578082019050905060028082049050905061016052815160010180835281141561569e5750506308c379a06101a05260206101c05260106101e0527f446964206e6f7420636f6e766572676500000000000000000000000000000000610200526101e05060646101bcfd5b565b600080fd5b61015b6158d00361015b60003961015b6158d0036000f35b600080fd000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67000000000000000000000000ecb456ea5365865ebab8a2661b0c503410e9b3470000000000000000000000000000000000000000000000000000000000061a80000000000000000000000000000000000000000000000000000083e0717e100000000000000000000000000000000000000000000000000000000000018cba800000000000000000000000000000000000000000000000000000000002aea540000000000000000000000000000000000000000000000000000001d1a94a20000000000000000000000000000000000000000000000000000000d12f0c4c6000000000000000000000000000000000000000000000000000000084c946232000000000000000000000000000000000000000000000000000000000012a05f20000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000003f6fa5779f7ff
Deployed Bytecode
0x600436101561000d576124f8565b60046000601c37600051635b41b90881141561002e576000610d805261004d565b63394747c5811415610092576084358060011c61577057809050610d80525b60005461577057600160005533610a605234610a805260806004610aa037610d8051610b205261007e610da0614781565b610da051610dc0526020610dc06000600055f35b6365b2489b8114156100e15760015461577057600160015533610a605234610a805260806004610aa0376001610b20526100cd610d80614781565b610d8051610da0526020610da06000600155f35b630b4c7e4d8114156100f8576000610a6052610117565b63ee22be23811415610a0e576064358060011c61577057809050610a60525b600254615770576001600255602654615770576000600435111561013c576001610143565b6000602435115b1561577057610153610ac0613898565b610ac08051610a80528060200151610aa0525073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610ac05273d533a949740bb3306d119cc777fa900ba034cd52610ae052601d54610b0052601e54610b205260e036610b4037610b0051610c2052610b2051610c4052610c6060006002818352015b610b00610c605160028110156157705760200201516020610c6051026004013581818301106157705780820190509050610c8052610c8051610b00610c60516002811015615770576020020152610c80516001610c605160028110156157705702601d015581516001018083528114156101c9575050610b0051610b8052610b2051610ba05260075460018082028215828483041417156157705780905090509050610c6052610b005160018082028215828483041417156157705780905090509050610b0052610b2051610c60518082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050610b2052610c205160018082028215828483041417156157705780905090509050610c2052610c4051610c60518082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050610c4052610a60516103255734615770575b610c8060006002818352015b610a60511561034457610c805115610347565b60005b1561035f576020610c80510260040135341415615770575b60006020610c80510260040135111561049d57610a605161038157600161038a565b6000610c805114155b1561044f576323b872dd610ca05233610cc05230610ce0526020610c80510260040135610d00526020610ca06064610cbc6000610ac0610c805160028110156157705760200201515af11561577057601f3d111561577057610ca0511561577057610c805161044e57632e1a7d4d610ca0526020610c80510260040135610cc052610ac0610c805160028110156157705760200201513b1561577057600060006024610cbc6000610ac0610c805160028110156157705760200201515af115615770575b5b610b00610c80516002811015615770576020020151610c20610c805160028110156157705760200201518082106157705780820390509050610b40610c805160028110156157705760200201525b8151600101808352811415610331575050600e54610c80526000610c8051111561050957610a80516102a052610aa0516102c052610c20516102e052610c4051610300526104ec610ca061269c565b610ca051610c0052610c80514210610504576001600e555b610511565b601f54610c00525b610a80516102a052610aa0516102c052610b00516102e052610b20516103005261053c610cc061269c565b610cc051610ca0526318160ddd610ce0526020610ce06004610cfc73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d111561577057610ce051610cc0526000610c005111156105db57610cc051610ca0518082028215828483041417156157705780905090509050610c005180801561577057820490509050610cc0518082106157705780820390509050610bc0526105f7565b610ca0516102a0526105ee610ce0613b79565b610ce051610bc0525b6000610bc0511115615770576000610c005111156108f757610b40516101c052610b60516101e052610b005161020052610b20516102205261063a610ce061500e565b610ce051610bc05180820282158284830414171561577057809050905090506402540be40080820490509050600181818301106157705780820190509050610be052610bc08051610be0518082106157705780820390509050815250610cc08051610bc051818183011061577057808201905090508152506340c10f19610ce05233610d0052610bc051610d20526020610ce06044610cfc600073ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5af11561577057601f3d111561577057610ce0506000610ce052620186a0610bc05111156108ba5760043561071f576001610724565b602435155b156108b957606036610d003760043561076957610b805160018082028215828483041417156157705780905090509050610d00526001610d20526001610d4052610791565b610ba05160018082028215828483041417156157705780905090509050610d00526001610d20525b610d0051610bc0518082028215828483041417156157705780905090509050610cc05180801561577057820490509050610d0052610d0051670de0b6b3a764000080820282158284830414171561577057809050905090506020610d40510260040135610d20518082028215828483041417156157705780905090509050610bc051610b80610d405160028110156157705760200201518082028215828483041417156157705780905090509050610d20518082028215828483041417156157705780905090509050610cc05180801561577057820490509050808210615770578082039050905080801561577057820490509050610ce052610d40516108b8576ec097ce7bc90715b34b9f1000000000610ce05180801561577057820490509050610ce0525b5b5b610a805161074052610aa05161076052610b005161078052610b20516107a052610ce0516107c052610ca0516107e0526108f2613f9c565b610962565b610ca051601f55670de0b6b3a7640000602455670de0b6b3a76400006022556340c10f19610ce05233610d0052610bc051610d20526020610ce06044610cfc600073ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5af11561577057601f3d111561577057610ce0505b604435610bc05110156109b4576308c379a0610ce0526020610d00526008610d20527f536c697070616765000000000000000000000000000000000000000000000000610d4052610d20506064610cfcfd5b337f540ab385f9b5d450a27404172caade516b3ba3f4be88239ac56a2ad1de2a1f5a600435610ce052602435610d0052610be051610d2052610cc051610d40526080610ce0a2610bc051610ce0526020610ce06000600255f35b63fc0c546a811415610a3f57346157705773ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d610140526020610140f35b63c6610657811415610aa157346157705773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101405273d533a949740bb3306d119cc777fa900ba034cd52610160526101406004356002811015615770576020020151610180526020610180f35b63f446c1d0811415610acc573461577057610abd610220613898565b61022051610260526020610260f35b63b1373929811415610afa573461577057610ae8610220613898565b61022060200151610260526020610260f35b63ddca3f43811415610b53573461577057610b166101c061382c565b6101c08051610220528060200151610240525061022051610140526102405161016052610b44610200613a1d565b61020051610260526020610260f35b63bb7b8b80811415610bee573461577057670de0b6b3a7640000601f546102a052610b7f610320613b79565b6103205180820282158284830414171561577057809050905090506318160ddd610340526020610340600461035c73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d1115615770576103405180801561577057820490509050610380526020610380f35b63556d6e9f811415610ebb573461577057602435600435181561577057600260043510156157705760026024351015615770576007546001808202821582848304141715615770578090509050905061054052601d5461056052601e5461058052610c5a6105e0613898565b6105e080516105a05280602001516105c05250601f546105e0526000600e541115610ce1576105a051610660526105c05161068052610c9a61060061382c565b61060080516106a05280602001516106c05250610660516102a052610680516102c0526106a0516102e0526106c05161030052610cd861064061269c565b610640516105e0525b6105606004356002811015615770576020020180516044358181830110615770578082019050905081525061056051600180820282158284830414171561577057809050905090506105605261058051610540518082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050610580526105a051610140526105c051610160526105605161018052610580516101a0526105e0516101c0526024356101e052610d9a610620612e3f565b61062051610600526105606024356002811015615770576020020151610600518082106157705780820390509050600180821061577057808203905090506106205261060051610560602435600281101561577057602002015260006024351115610e3d5761062051670de0b6b3a76400008082028215828483041417156157705780905090509050610540518080156157705782049050905061062052610e4f565b61062080516001808204905090508152505b610620805161056051610140526105805161016052610e6f610640613a1d565b610640516106205180820282158284830414171561577057809050905090506402540be40080820490509050808210615770578082039050905081525061062051610640526020610640f35b635b36389c811415610ed257600061014052610ef1565b63269b5581811415611250576064358060011c61577057809050610140525b346157705760035461577057600160035573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101605273d533a949740bb3306d119cc777fa900ba034cd52610180526318160ddd6101c05260206101c060046101dc73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d1115615770576101c0516101a0526379cc67906101c052336101e0526004356102005260206101c060446101dc600073ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5af11561577057601f3d1115615770576101c050601d546101c052601e546101e052600435600180821061577057808203905090506102005261022060006002818352015b6101c06102205160028110156157705760200201516102005180820282158284830414171561577057809050905090506101a051808015615770578204905090506102405260206102205102602401356102405110615770576101c061022051600281101561577057602002015161024051808210615770578082039050905060016102205160028110156157705702601d0155610240516101c061022051600281101561577057602002015261014051156110af5761022051156110b2565b60005b156110f4576000610260526102608051602001806102808284600060045af11561577057505060006000610280516102a061024051335af1156157705761119b565b6102205161114a5763d0e30db0610260526101606102205160028110156157705760200201513b156157705760006000600461027c610240516101606102205160028110156157705760200201515af115615770575b63a9059cbb610260523361028052610240516102a0526020610260604461027c60006101606102205160028110156157705760200201515af11561577057601f3d1115615770576102605115615770575b8151600101808352811415610fef575050601f546102205261022051610220516102005180820282158284830414171561577057809050905090506101a051808015615770578204905090508082106157705780820390509050601f55337fdd3c0336a16f1b64f172b7bb0dad5b2b3c7c76f91e8c4aafd6aae60dce8001536101c051610240526101e051610260526101a0516004358082106157705780820390509050610280526060610240a26000600355005b638d8ea7278114156114d45734615770576318160ddd610560526020610560600461057c73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d111561577057610560516105405260075460018082028215828483041417156157705780905090509050610560526112cc6105c0613898565b6105c080516105805280602001516105a052506112ea61060061382c565b61060080516105c05280602001516105e052506004356001808202821582848304141715615770578090509050905061060052602435610560518082028215828483041417156157705780905090509050670de0b6b3a76400008082049050905061062052601f54610640526000600e54111561139557610580516102a0526105a0516102c0526105c0516102e0526105e0516103005261138c61066061269c565b61066051610640525b6105c0805161060051818183011061577057808201905090508152506105e080516106205181818301106157705780820190509050815250610580516102a0526105a0516102c0526105c0516102e0526105e051610300526113f861068061269c565b6106805161066052610540516106605180820282158284830414171561577057809050905090506106405180801561577057820490509050610540518082106157705780820390509050610680526106808051610600516101c052610620516101e0526105c051610200526105e051610220526114766106a061500e565b6106a0516106805180820282158284830414171561577057809050905090506402540be400808204905090506001818183011061577057808201905090508082106157705780820390509050815250610680516106a05260206106a0f35b634fb08c5e8114156115615734615770576114f06107e0613898565b6107e080516108c05280602001516108e0525060406004610900376001610940526000610960526108c051610540526108e051610560526109005161058052610920516105a052610940516105c052610960516105e05261155261082061519f565b61082051610980526020610980f35b63f1dc3cc9811415611578576000610a6052611597565b638f15b6b58114156118c4576064358060011c61577057809050610a60525b3461577057600454615770576001600455602654615770576115ba610ac0613898565b610ac08051610a80528060200151610aa0525060a036610ac037600e54610b6052610a805161054052610aa0516105605260406004610580376000610b6051116105c05260016105e05261160f610b8061519f565b610b808051610ac0526020810151610b00526040810151610ae052606081018051610b20528060200151610b40525050604435610ac0511015611691576308c379a0610b80526020610ba0526008610bc0527f536c697070616765000000000000000000000000000000000000000000000000610be052610bc0506064610b9cfd5b610b605142106116a1576001600e555b600160243560028110156157705702601d018054610ac05180821061577057808203905090508155506379cc6790610b805233610ba052600435610bc0526020610b806044610b9c600073ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5af11561577057601f3d111561577057610b805073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610b805273d533a949740bb3306d119cc777fa900ba034cd52610ba052610a605115611758576024351561175b565b60005b1561179d576000610bc052610bc0805160200180610be08284600060045af11561577057505060006000610be051610c00610ac051335af11561577057611840565b6024356117f05763d0e30db0610bc052610b8060243560028110156157705760200201513b1561577057600060006004610bdc610ac051610b8060243560028110156157705760200201515af115615770575b63a9059cbb610bc05233610be052610ac051610c00526020610bc06044610bdc6000610b8060243560028110156157705760200201515af11561577057601f3d111561577057610bc05115615770575b610a805161074052610aa05161076052610b205161078052610b40516107a052610b00516107c052610ae0516107e052611878613f9c565b337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060406004610bc037610ac051610c00526060610bc0a2610ac051610bc0526020610bc06000600455f35b63c93f49e88114156118f05734615770576005546157705760016005556118e9613c05565b6000600555005b635e248072811415611af457346157705760205433141561577057600d546201517f8181830110615770578082019050905042111561577057426201517f81818301106157705780820190509050604435111561577057611952610260613898565b610260805161022052806020015161024052506102205160801b6102605261024051610260511761026052610f9f60043511156157705763ee6b28016004351015615770576402540be3ff60243511156157705766470de4df820001602435101561577057670de0b6b3a76400006004358082028215828483041417156157705780905090509050610220518080156157705782049050905061028052678ac7230489e800016102805110156157705767016345785d89ffff61028051111561577057670de0b6b3a76400006024358082028215828483041417156157705780905090509050610240518080156157705782049050905061028052678ac7230489e800016102805110156157705767016345785d89ffff6102805111156157705761026051600b5542600d5560043560801b6102a0526024356102a051176102a052604435600e556102a051600c557fe35f0559b0642164e286b30df2077ec3a05426617a25db7578fd20ba39a6cd05610220516102c0526004356102e05261024051610300526024356103205242610340526044356103605260c06102c0a1005b63244c7c2e811415611b9957346157705760205433141561577057611b1a610260613898565b610260805161022052806020015161024052506102205160801b610260526102405161026051176102605261026051600b5561026051600c5542600d5542600e557f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc2846102205161028052610240516102a052426102c0526060610280a1005b63a43c3351811415611d6a573461577057602054331415615770576029546157705760e06004610140376402540be401610160511015611be6576207a11f61016051111561577057611bee565b601854610160525b6402540be400610140511115611c0657601754610140525b610160516101405111615770576402540be400610180511115611c2b57601954610180525b670de0b6b3a76400006101a0511015611c4f5760006101a051111561577057611c57565b6011546101a0525b670de0b6b3a76400006101c0511115611c7257600f546101c0525b670de0b6b3a76400006101e0511115611c8d576013546101e0525b62093a80610200511015611cac57600061020051111561577057611cb4565b601554610200525b426203f48081818301106157705780820190509050610220526102205160295561018051601c5561014051601a5561016051601b556101a0516012556101c0516010556101e05160145561020051601655610220517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde5536101805161024052610140516102605261016051610280526101a0516102a0526101c0516102c0526101e0516102e052610200516103005260e0610240a2005b632a7dd7cd811415611e885734615770576006546157705760016006556020543314156157705760295442106157705760006029541815615770576000602955601c5461074052610740516019541815611dce57611dc6613c05565b610740516019555b601a546107605261076051601755601b5461078052610780516018556012546107a0526107a0516011556010546107c0526107c051600f556014546107e0526107e05160135560165461080052610800516015557f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc55040876107405161082052610760516108405261078051610860526107a051610880526107c0516108a0526107e0516108c052610800516108e05260e0610820a16000600655005b63226840fb811415611eaa573461577057602054331415615770576000602955005b636b441a40811415611f36576004358060a01c615770578090506101405234615770576020543314156157705760285461577057426203f4808181830110615770578082019050905061016052610160516028556101405160215561014051610160517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb9356000610180a3005b636a1c05ae811415611fa557346157705760205433141561577057602854421061577057600060285418156157705760006028556021546101405261014051602055610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c6000610160a2005b6386fbf193811415611fc7573461577057602054331415615770576000602855005b63e3698853811415611ff357346157705760205433141561577057426027541115615770576001602655005b633046f972811415612015573461577057602054331415615770576000602655005b637242e52481141561204b576004358060a01c615770578090506101405234615770576020543314156157705761014051602a55005b6354f0f7d58114156120c8573461577057600260245480820282158284830414171561577057809050905090506008546101405261208a61024061564d565b610240518082028215828483041417156157705780905090509050670de0b6b3a7640000808204905090506102205261022051610240526020610240f35b63b9e8c9fd8114156120e7573461577057600754610140526020610140f35b6386fc88d3811415612106573461577057600854610140526020610140f35b63c146bf94811415612125573461577057600954610140526020610140f35b636112c747811415612144573461577057600a54610140526020610140f35b63204fe3d5811415612163573461577057600b54610140526020610140f35b63f30cfad5811415612182573461577057600c54610140526020610140f35b63e89876ff8114156121a1573461577057600d54610140526020610140f35b63f9ed95978114156121c0573461577057600e54610140526020610140f35b6349fe9e778114156121df573461577057600f54610140526020610140f35b63727ced578114156121fe573461577057601054610140526020610140f35b6372d4f0e281141561221d573461577057601154610140526020610140f35b63d7c3dcbe81141561223c573461577057601254610140526020610140f35b63083812e581141561225b573461577057601354610140526020610140f35b634ea12c7d81141561227a573461577057601454610140526020610140f35b63662b6274811415612299573461577057601554610140526020610140f35b630c5e23d48114156122b8573461577057601654610140526020610140f35b6392526c0c8114156122d7573461577057601754610140526020610140f35b63ee8de6758114156122f6573461577057601854610140526020610140f35b63fee3f7f9811415612315573461577057601954610140526020610140f35b637cf9aedc811415612334573461577057601a54610140526020610140f35b637d1b060c811415612353573461577057601b54610140526020610140f35b63e3824462811415612372573461577057601c54610140526020610140f35b634903b0d18114156123a1573461577057600160043560028110156157705702601d0154610140526020610140f35b630f529ba28114156123c0573461577057601f54610140526020610140f35b638da5cb5b8114156123df573461577057602054610140526020610140f35b631ec0cdc18114156123fe573461577057602154610140526020610140f35b637ba1a74d81141561241d573461577057602254610140526020610140f35b630b7b594b81141561243c573461577057602354610140526020610140f35b630c46b72a81141561245b573461577057602454610140526020610140f35b639c868ac081141561247a573461577057602654610140526020610140f35b632a426896811415612499573461577057602754610140526020610140f35b63e0a0b5868114156124b8573461577057602854610140526020610140f35b63405e28f88114156124d7573461577057602954610140526020610140f35b636e42e4d28114156124f6573461577057602a54610140526020610140f35b505b005b610140516101a052610160516101c0526101805115612521576101c0516101a05110612524565b60005b1561253a57610160516101a052610140516101c0525b6101a0516101e052600061020052610220600060ff818352015b6101e051610240526101e0516101a0516101c05180820282158284830414171561577057809050905090506101e05180801561577057820490509050818183011061577057808201905090506002808204905090506101e052610240516101e05111156125da576101e051610240518082106157705780820390509050610200526125f5565b610240516101e0518082106157705780820390509050610200525b60016102005111612607576001612631565b6101e05161020051670de0b6b3a76400008082028215828483041417156157705780905090509050105b156126445750506101e05181525061269a565b81516001018083528114156125545750506308c379a0610220526020610240526010610260527f446964206e6f7420636f6e7665726765000000000000000000000000000000006102805261026050606461023cfd5b565b610f9f6102a05111156126b85763ee6b28016102a051106126bb565b60005b15615770576402540be3ff6102c05111156126e25766470de4df8200016102c051106126e5565b60005b15615770576102e051610320526103005161034052610340516103205110156127195761030051610320526102e051610340525b633b9ac9ff610320511115612741576d314dc6448d9338c15b0a000000016103205110612744565b60005b1561577057655af3107a3fff61034051670de0b6b3a7640000808202821582848304141715615770578090509050905061032051808015615770578204905090501115615770576002610320516101405261034051610160526000610180526127ae6103806124fa565b61038051808202821582848304141715615770578090509050905061036052610320516103405181818301106157705780820190509050610380526103a0600060ff818352015b610360516103c052673782dace9d900000610320518082028215828483041417156157705780905090509050610360518080156157705782049050905061034051808202821582848304141715615770578090509050905061036051808015615770578204905090506103e0526102c051670de0b6b3a764000081818301106157705780820190509050610400526103e0516104005111156128c257610400516103e0518082106157705780820390509050600181818301106157705780820190509050610400526128ef565b6103e051610400518082106157705780820390509050600181818301106157705780820190509050610400525b670de0b6b3a76400006103605180820282158284830414171561577057809050905090506102c051808015615770578204905090506104005180820282158284830414171561577057809050905090506102c0518080156157705782049050905061040051808202821582848304141715615770578090509050905061271080820282158284830414171561577057809050905090506102a0518080156157705782049050905061042052673782dace9d9000006103e05180820282158284830414171561577057809050905090506104005180801561577057820490509050610440526103805161038051610440518082028215828483041417156157705780905090509050670de0b6b3a7640000808204905090508181830110615770578082019050905061042051600280820282158284830414171561577057809050905090506103e051808015615770578204905090508181830110615770578082019050905061044051610360518082028215828483041417156157705780905090509050670de0b6b3a7640000808204905090508082106157705780820390509050610460526103605161046051610380518181830110615770578082019050905080820282158284830414171561577057809050905090506104605180801561577057820490509050610480526103605161036051808202821582848304141715615770578090509050905061046051808015615770578204905090506104a0526103e051670de0b6b3a76400001115612bc4576104a08051610360516104205161046051808015615770578204905090508082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050670de0b6b3a76400006103e051808210615770578082039050905080820282158284830414171561577057809050905090506103e0518080156157705782049050905081818301106157705780820190509050815250612c5e565b6104a08051610360516104205161046051808015615770578204905090508082028215828483041417156157705780905090509050670de0b6b3a7640000808204905090506103e051670de0b6b3a7640000808210615770578082039050905080820282158284830414171561577057809050905090506103e0518080156157705782049050905080821061577057808203905090508152505b6104a051610480511115612c8b57610480516104a051808210615770578082039050905061036052612caf565b6104a051610480518082106157705780820390509050600280820490509050610360525b60006104c0526103c051610360511115612ce257610360516103c05180821061577057808203905090506104c052612cfd565b6103c0516103605180821061577057808203905090506104c0525b662386f26fc100006103605180821015612d175780612d19565b815b905090506104c051655af3107a400080820282158284830414171561577057809050905090501015612de75761050060006002818352015b6020610500510261032001516104e0526104e051670de0b6b3a76400008082028215828483041417156157705780905090509050610360518080156157705782049050905061052052662386f26fc0ffff610520511115612dc05768056bc75e2d631000016105205110612dc3565b60005b15615770578151600101808352811415612d51575050505061036051815250612e3d565b81516001018083528114156127f55750506308c379a06103a05260206103c05260106103e0527f446964206e6f7420636f6e766572676500000000000000000000000000000000610400526103e05060646103bcfd5b565b610f9f610140511115612e5b5763ee6b28016101405110612e5e565b60005b15615770576402540be3ff610160511115612e855766470de4df8200016101605110612e88565b60005b156157705767016345785d89ffff6101c0511115612eb9576d314dc6448d9338c15b0a000000016101c05110612ebc565b60005b156157705761018060016101e05180821061577057808203905090506002811015615770576020020151610200527001000000000000000000000000000000006101c05110156157705760026101c0510a61020051600480820282158284830414171561577057809050905090508080156157705782049050905061022052671bc16d674ec800006102005180820282158284830414171561577057809050905090506101c051808015615770578204905090506102405266470de4df81ffff610240511115612f9a57680ad78ebc5ac62000016102405110612f9d565b60005b156157705761020051655af3107a4000808204905090506101c051655af3107a40008082049050905080821015612fd45780612fd6565b815b90509050606480821015612fea5780612fec565b815b9050905061026052610280600060ff818352015b610220516102a05261024051610220518082028215828483041417156157705780905090509050600280820282158284830414171561577057809050905090506101c051808015615770578204905090506102c0526102005161022051818183011061577057808201905090506102e05261016051670de0b6b3a764000081818301106157705780820190509050610300526102c0516103005111156130d157610300516102c0518082106157705780820390509050600181818301106157705780820190509050610300526130fe565b6102c051610300518082106157705780820390509050600181818301106157705780820190509050610300525b670de0b6b3a76400006101c0518082028215828483041417156157705780905090509050610160518080156157705782049050905061030051808202821582848304141715615770578090509050905061016051808015615770578204905090506103005180820282158284830414171561577057809050905090506127108082028215828483041417156157705780905090509050610140518080156157705782049050905061032052670de0b6b3a7640000671bc16d674ec800006102c051808202821582848304141715615770578090509050905061030051808015615770578204905090508181830110615770578082019050905061034052670de0b6b3a76400006102205180820282158284830414171561577057809050905090506102e051610340518082028215828483041417156157705780905090509050818183011061577057808201905090506103205181818301106157705780820190509050610360526101c05161034051808202821582848304141715615770578090509050905061038052610380516103605110156132b1576102a05160028082049050905061022052613514566132cc565b61036080516103805180821061577057808203905090508152505b6103605161022051808015615770578204905090506103a052610320516103a051808015615770578204905090506103c05261036051670de0b6b3a76400006101c0518082028215828483041417156157705780905090509050818183011061577057808201905090506103a051808015615770578204905090506103c051670de0b6b3a764000080820282158284830414171561577057809050905090506102c05180801561577057820490509050818183011061577057808201905090506103e0526103c08051670de0b6b3a76400006102e05180820282158284830414171561577057809050905090506103a05180801561577057820490509050818183011061577057808201905090508152506103c0516103e0511015613401576102a0516002808204905090506102205261341c565b6103e0516103c0518082106157705780820390509050610220525b6000610400526102a05161022051111561344f57610220516102a05180821061577057808203905090506104005261346a565b6102a051610220518082106157705780820390509050610400525b6102605161022051655af3107a4000808204905090508082101561348e5780613490565b815b905090506104005110156135135761022051670de0b6b3a764000080820282158284830414171561577057809050905090506101c0518080156157705782049050905061042052662386f26fc0ffff6104205111156134fd5768056bc75e2d631000016104205110613500565b60005b156157705750506102205181525061356a565b5b81516001018083528114156130005750506308c379a06102805260206102a05260106102c0527f446964206e6f7420636f6e7665726765000000000000000000000000000000006102e0526102c050606461029cfd5b565b61014051670de0b6b3a764000080820490509050610160526101405161016051670de0b6b3a76400008082028215828483041417156157705780905090509050808210615770578082039050905061018052603b6101605111156135d457600081525061382a565b670de0b6b3a7640000610100610160511015615770576101605160020a808015615770578204905090506101a05261018051613616576101a05181525061382a565b670de0b6b3a76400006101c0526706f05b59d3b200006101e052670de0b6b3a764000061020052600061022052610240600160ff818352015b61024051670de0b6b3a764000080820282158284830414171561577057809050905090506102605261026051670de0b6b3a7640000808210615770578082039050905061028052610280516101805111156136cc5761018051610280518082106157705780820390509050610280526102205115610220526136e7565b61028080516101805180821061577057808203905090508152505b6101c051610280516101e0518082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050808202821582848304141715615770578090509050905061026051808015615770578204905090506101c052610220511561376e5761020080516101c051808210615770578082039050905081525061378b565b61020080516101c051818183011061577057808201905090508152505b6402540be4006101c05110156137d45750506101a051610200518082028215828483041417156157705780905090509050670de0b6b3a76400008082049050905081525061382a565b815160010180835281141561364f5750506308c379a0610240526020610260526010610280527f446964206e6f7420636f6e7665726765000000000000000000000000000000006102a05261028050606461025cfd5b565b601d54600180820282158284830414171561577057809050905090508152601e54600180820282158284830414171561577057809050905090506007548082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050816020015250565b600e5461014052600c54610160526fffffffffffffffffffffffffffffffff6101605116610180526101605160801c6101a05261014051421015613a0b57600b546101c052600d546101e05261014080516101e0518082106157705780820390509050815250426101e05180821061577057808203905090506101e052610140516101e0518082106157705780820390509050610200526101c05160801c6102005180820282158284830414171561577057809050905090506101a0516101e05180820282158284830414171561577057809050905090508181830110615770578082019050905061014051808015615770578204905090506101a0526fffffffffffffffffffffffffffffffff6101c05116610200518082028215828483041417156157705780905090509050610180516101e0518082028215828483041417156157705780905090509050818183011061577057808201905090506101405180801561577057820490509050610180525b6101a051815261018051816020015250565b601154610180526101405161016051818183011061577057808201905090506101a05261018051670de0b6b3a7640000808202821582848304141715615770578090509050905061018051670de0b6b3a764000081818301106157705780820190509050673782dace9d9000006101405180820282158284830414171561577057809050905090506101a051808015615770578204905090506101605180820282158284830414171561577057809050905090506101a051808015615770578204905090508082106157705780820390509050808015615770578204905090506101a0526017546101a0518082028215828483041417156157705780905090509050601854670de0b6b3a76400006101a0518082106157705780820390509050808202821582848304141715615770578090509050905081818301106157705780820190509050670de0b6b3a764000080820490509050815250565b6102a0516002808204905090506102c0526102a051670de0b6b3a7640000808202821582848304141715615770578090509050905060075460028082028215828483041417156157705780905090509050808015615770578204905090506102e0526102c051610140526102e05161016052600161018052613bfc6103006124fa565b61030051815250565b613c10610580613898565b61058080516105405280602001516105605250602254610580526023546105a05273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26105c05273d533a949740bb3306d119cc777fa900ba034cd526105e05261060060006002818352015b61060051613c91574760016106005160028110156157705702601d0155613ce7565b6370a082316106205230610640526020610620602461063c6105c06106005160028110156157705760200201515afa1561577057601f3d1115615770576106205160016106005160028110156157705702601d01555b8151600101808352811415613c6f575050602454610600526105a051610580511115613e9157610580516105a051808210615770578082039050905060195480820282158284830414171561577057809050905090506404a817c80080820490509050610620526000610620511115613e9057602a54610640526000610640511815613e8f5761060051670de0b6b3a764000080820282158284830414171561577057809050905090506106005161062051808210615770578082039050905080801561577057820490509050670de0b6b3a7640000808210615770578082039050905061066052636962f8456106a052610640516106c052610660516106e05260206106a060446106bc600073ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5af11561577057601f3d1115615770576106a0516106805261058080516106205160028082028215828483041417156157705780905090509050808210615770578082039050905081525061058051602255610640517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf59610680516106a05260206106a0a25b5b5b6318160ddd610640526020610640600461065c73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d1115615770576106405161062052610540516106c052610560516106e052613eec61066061382c565b610660805161070052806020015161072052506106c0516102a0526106e0516102c052610700516102e0526107205161030052613f2a6106a061269c565b6106a0516106405261064051601f55670de0b6b3a7640000610640516102a052613f55610660613b79565b61066051808202821582848304141715615770578090509050905061062051808015615770578204905090506024556105a051610580511115613f9a57610580516023555b565b600854610800526009546108205260075461084052600a5461086052600061088052426108605110156140b0576015546108a05242610860518082106157705780820390509050670de0b6b3a764000080820282158284830414171561577057809050905090506108a05180801561577057820490509050610140526140236108e061356c565b6108e0516108c05261082051670de0b6b3a76400006108c05180821061577057808203905090508082028215828483041417156157705780905090509050610800516108c051808202821582848304141715615770578090509050905081818301106157705780820190509050670de0b6b3a764000080820490509050610800526108005160085542600a555b6107e0516108a0526107e0516140f457610740516102a052610760516102c052610780516102e0526107a051610300526140eb6108c061269c565b6108c0516108a0525b60006107c051111561410d576107c051610820526141cc565b610780516108c0526107a0516108e0526108c051620f424080820490509050610900526108c080516109005181818301106157705780820190509050815250610840516109005180820282158284830414171561577057809050905090506107a051610740516101405261076051610160526108c051610180526108e0516101a0526108a0516101c05260016101e0526141a8610920612e3f565b61092051808210615770578082039050905080801561577057820490509050610820525b610820516009556318160ddd6108e05260206108e060046108fc73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d1115615770576108e0516108c0526022546108e052602454610900526108a051600280820490509050610920526108a051670de0b6b3a7640000808202821582848304141715615770578090509050905060026108405180820282158284830414171561577057809050905090508080156157705782049050905061094052670de0b6b3a764000061096052670de0b6b3a76400006109805260006109005111156143bf57610920516101405261094051610160526001610180526142cb6109c06124fa565b6109c0516109a052670de0b6b3a76400006109a05180820282158284830414171561577057809050905090506108c05180801561577057820490509050610980526108e051610980518082028215828483041417156157705780905090509050610900518080156157705782049050905061096052600e546109c0526109005161098051101561435f576109c05115614362565b60005b156143ac576308c379a06109e0526020610a00526004610a20527f4c6f737300000000000000000000000000000000000000000000000000000000610a4052610a205060646109fcfd5b60016109c05114156143be576000600e555b5b610960516022556025546109a0526109a05161443f57610960516002600f548082028215828483041417156157705780905090509050818183011061577057808201905090506109805160028082028215828483041417156157705780905090509050670de0b6b3a7640000808210615770578082039050905011614442565b60005b156144535760016109a05260016025555b6109a051156147705761080051670de0b6b3a7640000808202821582848304141715615770578090509050905061084051808015615770578204905090506109c052670de0b6b3a76400006109c05111156144cc576109c08051670de0b6b3a764000080821061577057808203905090508152506144ec565b670de0b6b3a76400006109c05180821061577057808203905090506109c0525b6013546109c051600a808204905090508082101561450a578061450c565b815b905090506109e0526109e0516109c051111561452e5760006109005111614531565b60005b1561476f57610840516109c0516109e051808210615770578082039050905080820282158284830414171561577057809050905090506109e051610800518082028215828483041417156157705780905090509050818183011061577057808201905090506109c051808015615770578204905090506108805261078051610920526107a051610880518082028215828483041417156157705780905090509050610840518080156157705782049050905061094052610740516102a052610760516102c052610920516102e0526109405161030052614612610a2061269c565b610a2051610a0052610a005160028082049050905061092052610a0051670de0b6b3a7640000808202821582848304141715615770578090509050905060026108805180820282158284830414171561577057809050905090508080156157705782049050905061094052670de0b6b3a7640000610920516101405261094051610160526001610180526146a7610a206124fa565b610a205180820282158284830414171561577057809050905090506108c0518080156157705782049050905061090052670de0b6b3a764000061090051111561472857610960516002610900518082028215828483041417156157705780905090509050670de0b6b3a764000080821061577057808203905090501161472b565b60005b1561474e5761088051600755610a0051601f556109005160245561477f5661476e565b60006025556108a051601f5561098051602455614769613c05565b61477f565b5b5b6108a051601f55610980516024555b565b60265461577057610ac051610aa0511815615770576002610aa0511015615770576002610ac0511015615770576000610ae0511115615770576147c5610b80613898565b610b808051610b40528060200151610b605250601d54610b8052601e54610ba052604036610bc03773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610c005273d533a949740bb3306d119cc777fa900ba034cd52610c2052610b20511561483257610aa05115614835565b60005b1561484d57610ae051610a805114156157705761490a565b610a8051615770576323b872dd610c4052610a6051610c605230610c8052610ae051610ca0526020610c406064610c5c6000610c00610aa05160028110156157705760200201515af11561577057601f3d111561577057610c40511561577057610aa05161490957632e1a7d4d610c4052610ae051610c6052610c00610aa05160028110156157705760200201513b1561577057600060006024610c5c6000610c00610aa05160028110156157705760200201515af115615770575b5b610b80610ac0516002811015615770576020020151610c4052610b80610aa0516002811015615770576020020151610c6052610c6051610ae05181818301106157705780820190509050610b80610aa0516002811015615770576020020152610b80610aa05160028110156157705760200201516001610aa05160028110156157705702601d0155600754610c8052610b805160018082028215828483041417156157705780905090509050610b8052610ba051610c8051808202821582848304141715615770578090509050905060018082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050610ba0526001610ca0526001610cc0526001610aa0511415614a2b576001610ca0526001610cc0525b600e54610ce0526000610ce0511115614b2f57610c608051610ca05180820282158284830414171561577057809050905090508152506000610aa0511115614aa157610c6051610c80518082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050610c60525b610b80610aa0516002811015615770576020020151610d0052610c6051610b80610aa0516002811015615770576020020152610b40516102a052610b60516102c052610b80516102e052610ba05161030052614afe610d2061269c565b610d2051601f55610d0051610b80610aa0516002811015615770576020020152610ce0514210614b2e576001600e555b5b610b80610ac0516002811015615770576020020151610b405161014052610b605161016052610b805161018052610ba0516101a052601f546101c052610ac0516101e052614b7e610d00612e3f565b610d00518082106157705780820390509050610be052610b80610ac051600281101561577057602002018051610be0518082106157705780820390509050815250610be08051600180821061577057808203905090508152506000610ac0511115614c1d57610be051670de0b6b3a76400008082028215828483041417156157705780905090509050610c805180801561577057820490509050610be0525b610be08051610cc05180801561577057820490509050815250610be08051610b805161014052610ba05161016052614c56610d00613a1d565b610d0051610be05180820282158284830414171561577057809050905090506402540be400808204905090508082106157705780820390509050815250610b0051610be0511015614ce6576308c379a0610d00526020610d20526008610d40527f536c697070616765000000000000000000000000000000000000000000000000610d6052610d40506064610d1cfd5b610c408051610be0518082106157705780820390509050815250610c40516001610ac05160028110156157705702601d0155610b205115614d2b57610ac05115614d2e565b60005b15614d73576000610d0052610d00805160200180610d208284600060045af11561577057505060006000610d2051610d40610be051610a60515af11561577057614e1d565b610ac051614dc95763d0e30db0610d0052610c00610ac05160028110156157705760200201513b1561577057600060006004610d1c610be051610c00610ac05160028110156157705760200201515af115615770575b63a9059cbb610d0052610a6051610d2052610be051610d40526020610d006044610d1c6000610c00610ac05160028110156157705760200201515af11561577057601f3d111561577057610d005115615770575b610c408051610cc05180820282158284830414171561577057809050905090508152506000610ac0511115614e8057610c4051610c80518082028215828483041417156157705780905090509050670de0b6b3a764000080820490509050610c40525b610c4051610b80610ac0516002811015615770576020020152620186a0610ae0511115614eb557620186a0610be05111614eb8565b60005b15614f8457610ae051610ca0518082028215828483041417156157705780905090509050610d0052610be051610cc0518082028215828483041417156157705780905090509050610d2052610aa051614f4957610d0051670de0b6b3a76400008082028215828483041417156157705780905090509050610d205180801561577057820490509050610bc052614f83565b610d2051670de0b6b3a76400008082028215828483041417156157705780905090509050610d005180801561577057820490509050610bc0525b5b610b405161074052610b605161076052610b805161078052610ba0516107a052610bc0516107c05260006107e052614fba613f9c565b610a60517fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc98610aa051610d0052610ae051610d2052610ac051610d4052610be051610d60526080610d00a2610be051815250565b61020051610140526102205161016052615029610260613a1d565b6102605160028082028215828483041417156157705780905090509050600480820490509050610240526000610260526102a060006002818352015b60206102a051026101c0015161028052610260805161028051818183011061577057808201905090508152508151600101808352811415615065575050610260516002808204905090506102805260006102a0526102e060006002818352015b60206102e051026101c001516102c052610280516102c0511115615116576102a080516102c05161028051808210615770578082039050905081818301106157705780820190509050815250615145565b6102a08051610280516102c0518082106157705780820390509050818183011061577057808201905090508152505b81516001018083528114156150c5575050610240516102a05180820282158284830414171561577057809050905090506102605180801561577057820490509050620186a081818301106157705780820190509050815250565b6318160ddd610620526020610620600461063c73ed4064f376cb8d68f770fb1ff088a3d0f3ff5c4d5afa1561577057601f3d11156157705761062051610600526106005161058051116157705760026105a051101561577057601d5461062052601e5461064052600061066052600754600180820282158284830414171561577057809050905090506106805261062051600180820282158284830414171561577057809050905090506106a05261064051610680518082028215828483041417156157705780905090509050670de0b6b3a7640000808204905090506106c0526105a05161529657670de0b6b3a7640000610680525b6105c051156152d757610540516102a052610560516102c0526106a0516102e0526106c051610300526152ca6106e061269c565b6106e051610660526152df565b601f54610660525b610660516106e0526106a051610140526106c05161016052615302610720613a1d565b6107205161070052610580516106e05180820282158284830414171561577057809050905090506106005180801561577057820490509050610720526106e0805161072051610700516107205180820282158284830414171561577057809050905090506404a817c8008082049050905060018181830110615770578082019050905080821061577057808203905090508082106157705780820390509050815250610540516101405261056051610160526106a051610180526106c0516101a0526106e0516101c0526105a0516101e0526153df610760612e3f565b61076051610740526106a06105a0516002811015615770576020020151610740518082106157705780820390509050670de0b6b3a76400008082028215828483041417156157705780905090509050610680518080156157705782049050905061076052610740516106a06105a05160028110156157705760200201526000610780526105e0511561548f57620186a061076051111561548757620186a0610580511161548a565b60005b615492565b60005b1561561e5760006107a05260016107c05260016105a05114156154db5761062051600180820282158284830414171561577057809050905090506107a05260016107c0526154fd565b61064051600180820282158284830414171561577057809050905090506107a0525b6107a05161072051808202821582848304141715615770578090509050905061066051808015615770578204905090506107a0526107a051670de0b6b3a76400008082028215828483041417156157705780905090509050610760516107c0518082028215828483041417156157705780905090509050610720516106206105a051600281101561577057602002015180820282158284830414171561577057809050905090506107c05180820282158284830414171561577057809050905090506106605180801561577057820490509050808210615770578082039050905080801561577057820490509050610780526105a05161561d576ec097ce7bc90715b34b9f10000000006107805180801561577057820490509050610780525b5b6107605181526107805160208201526106e0516040820152606081016106a05181526106c05181602001525050565b6101405161565f57600081525061576e565b61014051670de0b6b3a7640000818183011061577057808201905090506002808204905090506101605261014051610180526101a06000610100818352015b610180516101605114156156ba5750506101805181525061576e565b610160516101805261014051670de0b6b3a764000080820282158284830414171561577057809050905090506101605180801561577057820490509050610160518181830110615770578082019050905060028082049050905061016052815160010180835281141561569e5750506308c379a06101a05260206101c05260106101e0527f446964206e6f7420636f6e766572676500000000000000000000000000000000610200526101e05060646101bcfd5b565b600080fd
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67000000000000000000000000ecb456ea5365865ebab8a2661b0c503410e9b3470000000000000000000000000000000000000000000000000000000000061a80000000000000000000000000000000000000000000000000000083e0717e100000000000000000000000000000000000000000000000000000000000018cba800000000000000000000000000000000000000000000000000000000002aea540000000000000000000000000000000000000000000000000000001d1a94a20000000000000000000000000000000000000000000000000000000d12f0c4c6000000000000000000000000000000000000000000000000000000084c946232000000000000000000000000000000000000000000000000000000000012a05f20000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000003f6fa5779f7ff
-----Decoded View---------------
Arg [0] : owner (address): 0xbabe61887f1de2713c6f97e567623453d3C79f67
Arg [1] : admin_fee_receiver (address): 0xeCb456EA5365865EbAb8a2661B0c503410e9B347
Arg [2] : A (uint256): 400000
Arg [3] : gamma (uint256): 145000000000000
Arg [4] : mid_fee (uint256): 26000000
Arg [5] : out_fee (uint256): 45000000
Arg [6] : allowed_extra_profit (uint256): 2000000000000
Arg [7] : fee_gamma (uint256): 230000000000000
Arg [8] : adjustment_step (uint256): 146000000000000
Arg [9] : admin_fee (uint256): 5000000000
Arg [10] : ma_half_time (uint256): 600
Arg [11] : initial_price (uint256): 1115979999999999
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67
Arg [1] : 000000000000000000000000ecb456ea5365865ebab8a2661b0c503410e9b347
Arg [2] : 0000000000000000000000000000000000000000000000000000000000061a80
Arg [3] : 000000000000000000000000000000000000000000000000000083e0717e1000
Arg [4] : 00000000000000000000000000000000000000000000000000000000018cba80
Arg [5] : 0000000000000000000000000000000000000000000000000000000002aea540
Arg [6] : 000000000000000000000000000000000000000000000000000001d1a94a2000
Arg [7] : 0000000000000000000000000000000000000000000000000000d12f0c4c6000
Arg [8] : 000000000000000000000000000000000000000000000000000084c946232000
Arg [9] : 000000000000000000000000000000000000000000000000000000012a05f200
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [11] : 0000000000000000000000000000000000000000000000000003f6fa5779f7ff
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.