Polygon Sponsored slots available. Book your slot here!
Latest 25 from a total of 30,730 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Remove_liquidity | 80961789 | 25 days ago | IN | 0 POL | 0.01181102 | ||||
| Remove_liquidity... | 80390621 | 39 days ago | IN | 0 POL | 0.06191819 | ||||
| Exchange | 80366642 | 39 days ago | IN | 0 POL | 0.0169597 | ||||
| Exchange | 80366543 | 39 days ago | IN | 0 POL | 0.01709953 | ||||
| Exchange | 80366458 | 39 days ago | IN | 0 POL | 0.01740422 | ||||
| Exchange | 80366326 | 39 days ago | IN | 0 POL | 0.01641416 | ||||
| Exchange | 80366249 | 39 days ago | IN | 0 POL | 0.01645373 | ||||
| Exchange | 80366138 | 39 days ago | IN | 0 POL | 0.01652002 | ||||
| Exchange | 80365223 | 39 days ago | IN | 0 POL | 0.01326959 | ||||
| Exchange | 80364429 | 39 days ago | IN | 0 POL | 0.01365014 | ||||
| Exchange | 80364300 | 39 days ago | IN | 0 POL | 0.01220298 | ||||
| Exchange | 80364229 | 39 days ago | IN | 0 POL | 0.01220289 | ||||
| Exchange | 80364161 | 39 days ago | IN | 0 POL | 0.01162179 | ||||
| Exchange | 80364042 | 39 days ago | IN | 0 POL | 0.01366526 | ||||
| Exchange | 80363763 | 39 days ago | IN | 0 POL | 0.01162189 | ||||
| Exchange | 80363672 | 39 days ago | IN | 0 POL | 0.01162198 | ||||
| Exchange | 80363456 | 39 days ago | IN | 0 POL | 0.01291227 | ||||
| Exchange | 80363373 | 39 days ago | IN | 0 POL | 0.01162222 | ||||
| Exchange | 80363272 | 39 days ago | IN | 0 POL | 0.0116223 | ||||
| Exchange | 80362297 | 39 days ago | IN | 0 POL | 0.01162901 | ||||
| Exchange | 80350264 | 40 days ago | IN | 0 POL | 0.00870155 | ||||
| Remove_liquidity | 80310104 | 41 days ago | IN | 0 POL | 0.01060598 | ||||
| Remove_liquidity | 80143063 | 44 days ago | IN | 0 POL | 0.01060598 | ||||
| Remove_liquidity | 80025125 | 47 days ago | IN | 0 POL | 0.01069245 | ||||
| Remove_liquidity... | 79386062 | 62 days ago | IN | 0 POL | 0.05094392 |
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.2.12
Contract Source Code (Vyper language format)
# @version 0.2.12
"""
@title Curve aPool for use on Polygon
@author Curve.Fi
@license Copyright (c) Curve.Fi, 2020 - all rights reserved
@notice Pool implementation with aToken-style lending
"""
from vyper.interfaces import ERC20
interface LendingPool:
def withdraw(_underlying_asset: address, _amount: uint256, _receiver: address): nonpayable
interface CurveToken:
def mint(_to: address, _value: uint256) -> bool: nonpayable
def burnFrom(_to: address, _value: uint256) -> bool: nonpayable
# Events
event TokenExchange:
buyer: indexed(address)
sold_id: int128
tokens_sold: uint256
bought_id: int128
tokens_bought: uint256
event TokenExchangeUnderlying:
buyer: indexed(address)
sold_id: int128
tokens_sold: uint256
bought_id: int128
tokens_bought: uint256
event AddLiquidity:
provider: indexed(address)
token_amounts: uint256[N_COINS]
fees: uint256[N_COINS]
invariant: uint256
token_supply: uint256
event RemoveLiquidity:
provider: indexed(address)
token_amounts: uint256[N_COINS]
fees: uint256[N_COINS]
token_supply: uint256
event RemoveLiquidityOne:
provider: indexed(address)
token_amount: uint256
coin_amount: uint256
event RemoveLiquidityImbalance:
provider: indexed(address)
token_amounts: uint256[N_COINS]
fees: uint256[N_COINS]
invariant: uint256
token_supply: uint256
event CommitNewAdmin:
deadline: indexed(uint256)
admin: indexed(address)
event NewAdmin:
admin: indexed(address)
event CommitNewFee:
deadline: indexed(uint256)
fee: uint256
admin_fee: uint256
offpeg_fee_multiplier: uint256
event NewFee:
fee: uint256
admin_fee: uint256
offpeg_fee_multiplier: uint256
event RampA:
old_A: uint256
new_A: uint256
initial_time: uint256
future_time: uint256
event StopRampA:
A: uint256
t: uint256
N_COINS: constant(int128) = 2
PRECISION_MUL: constant(uint256[N_COINS]) = [10000000000, 10000000000]
PRECISION: constant(uint256) = 10 ** 18
FEE_DENOMINATOR: constant(uint256) = 10 ** 10
MAX_ADMIN_FEE: constant(uint256) = 10 * 10 ** 9
MAX_FEE: constant(uint256) = 5 * 10 ** 9
MAX_A: constant(uint256) = 10 ** 6
MAX_A_CHANGE: constant(uint256) = 10
A_PRECISION: constant(uint256) = 100
ADMIN_ACTIONS_DELAY: constant(uint256) = 3 * 86400
MIN_RAMP_TIME: constant(uint256) = 86400
MATIC_REWARDS: constant(address) = 0x357D51124f59836DeD84c8a1730D72B749d8BC23
AAVE_LENDING_POOL: constant(address) = 0x8dFf5E27EA6b7AC08EbFdf9eB090F32ee9a30fcf
WMATIC: constant(address) = 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270
WBTC: constant(address) = 0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6
coins: public(address[N_COINS])
underlying_coins: public(address[N_COINS])
admin_balances: public(uint256[N_COINS])
fee: public(uint256) # fee * 1e10
offpeg_fee_multiplier: public(uint256) # * 1e10
admin_fee: public(uint256) # admin_fee * 1e10
owner: public(address)
lp_token: public(address)
aave_referral: uint256
initial_A: public(uint256)
future_A: public(uint256)
initial_A_time: public(uint256)
future_A_time: public(uint256)
admin_actions_deadline: public(uint256)
transfer_ownership_deadline: public(uint256)
future_fee: public(uint256)
future_admin_fee: public(uint256)
future_offpeg_fee_multiplier: public(uint256) # * 1e10
future_owner: public(address)
is_killed: bool
kill_deadline: uint256
KILL_DEADLINE_DT: constant(uint256) = 2 * 30 * 86400
reward_receiver: public(address)
admin_fee_receiver: public(address)
@external
def __init__(
_coins: address[N_COINS],
_underlying_coins: address[N_COINS],
_pool_token: address,
_A: uint256,
_fee: uint256,
_admin_fee: uint256,
_offpeg_fee_multiplier: uint256,
):
"""
@notice Contract constructor
@param _coins List of wrapped coin addresses
@param _underlying_coins List of underlying coin addresses
@param _pool_token Pool LP token address
@param _A Amplification coefficient multiplied by n * (n - 1)
@param _fee Swap fee expressed as an integer with 1e10 precision
@param _admin_fee Percentage of fee taken as an admin fee,
expressed as an integer with 1e10 precision
@param _offpeg_fee_multiplier Offpeg fee multiplier
"""
for i in range(N_COINS):
assert _coins[i] != ZERO_ADDRESS
assert _underlying_coins[i] != ZERO_ADDRESS
assert _underlying_coins[0] == WBTC
self.coins = _coins
self.underlying_coins = _underlying_coins
self.initial_A = _A * A_PRECISION
self.future_A = _A * A_PRECISION
self.fee = _fee
self.admin_fee = _admin_fee
self.offpeg_fee_multiplier = _offpeg_fee_multiplier
self.owner = msg.sender
self.admin_fee_receiver = msg.sender
self.kill_deadline = block.timestamp + KILL_DEADLINE_DT
self.lp_token = _pool_token
# approve transfer of wbtc underlying coin to aave lending pool
_response: Bytes[32] = raw_call(
WBTC,
concat(
method_id("approve(address,uint256)"),
convert(AAVE_LENDING_POOL, bytes32),
convert(MAX_UINT256, bytes32)
),
max_outsize=32
)
if len(_response) != 0:
assert convert(_response, bool)
@view
@internal
def _A() -> uint256:
t1: uint256 = self.future_A_time
A1: uint256 = self.future_A
if block.timestamp < t1:
# handle ramping up and down of A
A0: uint256 = self.initial_A
t0: uint256 = self.initial_A_time
# Expressions in uint256 cannot have negative numbers, thus "if"
if A1 > A0:
return A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0)
else:
return A0 - (A0 - A1) * (block.timestamp - t0) / (t1 - t0)
else: # when t1 == 0 or block.timestamp >= t1
return A1
@view
@external
def A() -> uint256:
return self._A() / A_PRECISION
@view
@external
def A_precise() -> uint256:
return self._A()
@pure
@internal
def _dynamic_fee(xpi: uint256, xpj: uint256, _fee: uint256, _feemul: uint256) -> uint256:
if _feemul <= FEE_DENOMINATOR:
return _fee
else:
xps2: uint256 = (xpi + xpj)
xps2 *= xps2 # Doing just ** 2 can overflow apparently
return (_feemul * _fee) / (
(_feemul - FEE_DENOMINATOR) * 4 * xpi * xpj / xps2 + \
FEE_DENOMINATOR)
@view
@external
def dynamic_fee(i: int128, j: int128) -> uint256:
"""
@notice Return the fee for swapping between `i` and `j`
@param i Index value for the coin to send
@param j Index value of the coin to recieve
@return Swap fee expressed as an integer with 1e10 precision
"""
precisions: uint256[N_COINS] = PRECISION_MUL
xpi: uint256 = (ERC20(self.coins[i]).balanceOf(self) - self.admin_balances[i]) * precisions[i]
xpj: uint256 = (ERC20(self.coins[j]).balanceOf(self) - self.admin_balances[j]) * precisions[j]
return self._dynamic_fee(xpi, xpj, self.fee, self.offpeg_fee_multiplier)
@view
@external
def balances(i: uint256) -> uint256:
"""
@notice Get the current balance of a coin within the
pool, less the accrued admin fees
@param i Index value for the coin to query balance of
@return Token balance
"""
return ERC20(self.coins[i]).balanceOf(self) - self.admin_balances[i]
@view
@internal
def _balances() -> uint256[N_COINS]:
result: uint256[N_COINS] = empty(uint256[N_COINS])
for i in range(N_COINS):
result[i] = ERC20(self.coins[i]).balanceOf(self) - self.admin_balances[i]
return result
@pure
@internal
def get_D(xp: uint256[N_COINS], amp: uint256) -> uint256:
"""
D invariant calculation in non-overflowing integer operations
iteratively
A * sum(x_i) * n**n + D = A * D * n**n + D**(n+1) / (n**n * prod(x_i))
Converging solution:
D[j+1] = (A * n**n * sum(x_i) - D[j]**(n+1) / (n**n prod(x_i))) / (A * n**n - 1)
"""
S: uint256 = 0
for _x in xp:
S += _x
if S == 0:
return 0
Dprev: uint256 = 0
D: uint256 = S
Ann: uint256 = amp * N_COINS
for _i in range(255):
D_P: uint256 = D
for _x in xp:
D_P = D_P * D / (_x * N_COINS + 1) # +1 is to prevent /0
Dprev = D
D = (Ann * S / A_PRECISION + D_P * N_COINS) * D / ((Ann - A_PRECISION) * D / A_PRECISION + (N_COINS + 1) * D_P)
# Equality with the precision of 1
if D > Dprev:
if D - Dprev <= 1:
return D
else:
if Dprev - D <= 1:
return D
# convergence typically occurs in 4 rounds or less, this should be unreachable!
# if it does happen the pool is borked and LPs can withdraw via `remove_liquidity`
raise
@view
@internal
def get_D_precisions(coin_balances: uint256[N_COINS], amp: uint256) -> uint256:
xp: uint256[N_COINS] = PRECISION_MUL
for i in range(N_COINS):
xp[i] *= coin_balances[i]
return self.get_D(xp, amp)
@view
@external
def get_virtual_price() -> uint256:
"""
@notice The current virtual price of the pool LP token
@dev Useful for calculating profits
@return LP token virtual price normalized to 1e18
"""
D: uint256 = self.get_D_precisions(self._balances(), self._A())
# D is in the units similar to DAI (e.g. converted to precision 1e18)
# When balanced, D = n * x_u - total virtual value of the portfolio
token_supply: uint256 = ERC20(self.lp_token).totalSupply()
return D * PRECISION / token_supply
@view
@external
def calc_token_amount(_amounts: uint256[N_COINS], is_deposit: bool) -> uint256:
"""
@notice Calculate addition or reduction in token supply from a deposit or withdrawal
@dev This calculation accounts for slippage, but not fees.
Needed to prevent front-running, not for precise calculations!
@param _amounts Amount of each coin being deposited
@param is_deposit set True for deposits, False for withdrawals
@return Expected amount of LP tokens received
"""
coin_balances: uint256[N_COINS] = self._balances()
amp: uint256 = self._A()
D0: uint256 = self.get_D_precisions(coin_balances, amp)
for i in range(N_COINS):
if is_deposit:
coin_balances[i] += _amounts[i]
else:
coin_balances[i] -= _amounts[i]
D1: uint256 = self.get_D_precisions(coin_balances, amp)
token_amount: uint256 = ERC20(self.lp_token).totalSupply()
diff: uint256 = 0
if is_deposit:
diff = D1 - D0
else:
diff = D0 - D1
return diff * token_amount / D0
@internal
def _claim_rewards():
# push wMatic rewards into the reward receiver
reward_receiver: address = self.reward_receiver
if reward_receiver != ZERO_ADDRESS:
response: Bytes[32] = raw_call(
MATIC_REWARDS,
concat(
method_id("claimRewards(address[],uint256,address)"),
convert(32 * 3, bytes32),
convert(MAX_UINT256, bytes32),
convert(self, bytes32),
convert(1, bytes32),
convert(self.coins[0], bytes32)
),
max_outsize=32
)
amount: uint256 = convert(response, uint256)
if amount > 0:
assert ERC20(WMATIC).transfer(reward_receiver, amount)
@external
@nonreentrant('lock')
def add_liquidity(_amounts: uint256[N_COINS], _min_mint_amount: uint256, _use_underlying: bool = False) -> uint256:
"""
@notice Deposit coins into the pool
@param _amounts List of amounts of coins to deposit
@param _min_mint_amount Minimum amount of LP tokens to mint from the deposit
@param _use_underlying If True, deposit underlying assets instead of aTokens
@return Amount of LP tokens received by depositing
"""
assert not self.is_killed # dev: is killed
self._claim_rewards()
# Initial invariant
amp: uint256 = self._A()
old_balances: uint256[N_COINS] = self._balances()
lp_token: address = self.lp_token
token_supply: uint256 = ERC20(lp_token).totalSupply()
D0: uint256 = 0
if token_supply != 0:
D0 = self.get_D_precisions(old_balances, amp)
new_balances: uint256[N_COINS] = old_balances
for i in range(N_COINS):
if token_supply == 0:
assert _amounts[i] != 0 # dev: initial deposit requires all coins
new_balances[i] += _amounts[i]
# Invariant after change
D1: uint256 = self.get_D_precisions(new_balances, amp)
assert D1 > D0
# We need to recalculate the invariant accounting for fees
# to calculate fair user's share
fees: uint256[N_COINS] = empty(uint256[N_COINS])
mint_amount: uint256 = 0
if token_supply != 0:
# Only account for fees if we are not the first to deposit
ys: uint256 = (D0 + D1) / N_COINS
_fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
_feemul: uint256 = self.offpeg_fee_multiplier
_admin_fee: uint256 = self.admin_fee
difference: uint256 = 0
for i in range(N_COINS):
ideal_balance: uint256 = D1 * old_balances[i] / D0
new_balance: uint256 = new_balances[i]
if ideal_balance > new_balance:
difference = ideal_balance - new_balance
else:
difference = new_balance - ideal_balance
xs: uint256 = old_balances[i] + new_balance
fees[i] = self._dynamic_fee(xs, ys, _fee, _feemul) * difference / FEE_DENOMINATOR
if _admin_fee != 0:
self.admin_balances[i] += fees[i] * _admin_fee / FEE_DENOMINATOR
new_balances[i] = new_balance - fees[i]
D2: uint256 = self.get_D_precisions(new_balances, amp)
mint_amount = token_supply * (D2 - D0) / D0
else:
mint_amount = D1 # Take the dust if there was any
assert mint_amount >= _min_mint_amount, "Slippage screwed you"
# Take coins from the sender
if _use_underlying:
aave_referral: bytes32 = convert(self.aave_referral, bytes32)
# Take coins from the sender
amount: uint256 = _amounts[0] # wbtc amount
if amount != 0:
# transfer underlying coin from msg.sender to self
_response: Bytes[32] = raw_call(
WBTC,
concat(
method_id("transferFrom(address,address,uint256)"),
convert(msg.sender, bytes32),
convert(self, bytes32),
convert(amount, bytes32)
),
max_outsize=32
)
if len(_response) != 0:
assert convert(_response, bool)
# deposit to aave lending pool
raw_call(
AAVE_LENDING_POOL,
concat(
method_id("deposit(address,uint256,address,uint16)"),
convert(WBTC, bytes32),
convert(amount, bytes32),
convert(self, bytes32),
aave_referral,
)
)
else:
amount: uint256 = _amounts[0]
if amount != 0:
assert ERC20(self.coins[0]).transferFrom(msg.sender, self, amount) # dev: failed transfer
# renBTC
amount: uint256 = _amounts[1]
if amount != 0:
assert ERC20(self.underlying_coins[1]).transferFrom(msg.sender, self, amount)
# Mint pool tokens
CurveToken(lp_token).mint(msg.sender, mint_amount)
log AddLiquidity(msg.sender, _amounts, fees, D1, token_supply + mint_amount)
return mint_amount
@view
@internal
def get_y(i: int128, j: int128, x: uint256, xp: uint256[N_COINS]) -> uint256:
"""
Calculate x[j] if one makes x[i] = x
Done by solving quadratic equation iteratively.
x_1**2 + x1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n + 1) / (n ** (2 * n) * prod' * A)
x_1**2 + b*x_1 = c
x_1 = (x_1**2 + c) / (2*x_1 + b)
"""
# x in the input is converted to the same price/precision
assert i != j # dev: same coin
assert j >= 0 # dev: j below zero
assert j < N_COINS # dev: j above N_COINS
# should be unreachable, but good for safety
assert i >= 0
assert i < N_COINS
amp: uint256 = self._A()
D: uint256 = self.get_D(xp, amp)
Ann: uint256 = amp * N_COINS
c: uint256 = D
S_: uint256 = 0
_x: uint256 = 0
y_prev: uint256 = 0
for _i in range(N_COINS):
if _i == i:
_x = x
elif _i != j:
_x = xp[_i]
else:
continue
S_ += _x
c = c * D / (_x * N_COINS)
c = c * D * A_PRECISION / (Ann * N_COINS)
b: uint256 = S_ + D * A_PRECISION / Ann # - D
y: uint256 = D
for _i in range(255):
y_prev = y
y = (y*y + c) / (2 * y + b - D)
# Equality with the precision of 1
if y > y_prev:
if y - y_prev <= 1:
return y
else:
if y_prev - y <= 1:
return y
raise
@view
@internal
def _get_dy(i: int128, j: int128, dx: uint256) -> uint256:
xp: uint256[N_COINS] = self._balances()
precisions: uint256[N_COINS] = PRECISION_MUL
for k in range(N_COINS):
xp[k] *= precisions[k]
x: uint256 = xp[i] + dx * precisions[i]
y: uint256 = self.get_y(i, j, x, xp)
dy: uint256 = (xp[j] - y) / precisions[j]
_fee: uint256 = self._dynamic_fee(
(xp[i] + x) / 2, (xp[j] + y) / 2, self.fee, self.offpeg_fee_multiplier
) * dy / FEE_DENOMINATOR
return dy - _fee
@view
@external
def get_dy(i: int128, j: int128, dx: uint256) -> uint256:
return self._get_dy(i, j, dx)
@view
@external
def get_dy_underlying(i: int128, j: int128, dx: uint256) -> uint256:
return self._get_dy(i, j, dx)
@internal
def _exchange(i: int128, j: int128, dx: uint256) -> uint256:
assert not self.is_killed # dev: is killed
# dx and dy are in aTokens
self._claim_rewards()
xp: uint256[N_COINS] = self._balances()
precisions: uint256[N_COINS] = PRECISION_MUL
for k in range(N_COINS):
xp[k] *= precisions[k]
x: uint256 = xp[i] + dx * precisions[i]
y: uint256 = self.get_y(i, j, x, xp)
dy: uint256 = xp[j] - y
dy_fee: uint256 = dy * self._dynamic_fee(
(xp[i] + x) / 2, (xp[j] + y) / 2, self.fee, self.offpeg_fee_multiplier
) / FEE_DENOMINATOR
admin_fee: uint256 = self.admin_fee
if admin_fee != 0:
dy_admin_fee: uint256 = dy_fee * admin_fee / FEE_DENOMINATOR
if dy_admin_fee != 0:
self.admin_balances[j] += dy_admin_fee / precisions[j]
return (dy - dy_fee) / precisions[j]
@external
@nonreentrant('lock')
def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256) -> uint256:
"""
@notice Perform an exchange between two coins
@dev Index values can be found via the `coins` public getter method
@param i Index value for the coin to send
@param j Index valie of the coin to recieve
@param dx Amount of `i` being exchanged
@param min_dy Minimum amount of `j` to receive
@return Actual amount of `j` received
"""
dy: uint256 = self._exchange(i, j, dx)
assert dy >= min_dy, "Exchange resulted in fewer coins than expected"
assert ERC20(self.coins[i]).transferFrom(msg.sender, self, dx)
assert ERC20(self.coins[j]).transfer(msg.sender, dy)
log TokenExchange(msg.sender, i, dx, j, dy)
return dy
@external
@nonreentrant('lock')
def exchange_underlying(i: int128, j: int128, dx: uint256, min_dy: uint256) -> uint256:
"""
@notice Perform an exchange between two underlying coins
@dev Index values can be found via the `underlying_coins` public getter method
@param i Index value for the underlying coin to send
@param j Index valie of the underlying coin to recieve
@param dx Amount of `i` being exchanged
@param min_dy Minimum amount of `j` to receive
@return Actual amount of `j` received
"""
dy: uint256 = self._exchange(i, j, dx)
assert dy >= min_dy, "Exchange resulted in fewer coins than expected"
u_coin_i: address = self.underlying_coins[i]
u_coin_j: address = self.underlying_coins[j]
# transfer underlying coin from msg.sender to self
_response: Bytes[32] = raw_call(
u_coin_i,
concat(
method_id("transferFrom(address,address,uint256)"),
convert(msg.sender, bytes32),
convert(self, bytes32),
convert(dx, bytes32)
),
max_outsize=32
)
if len(_response) != 0:
assert convert(_response, bool)
if u_coin_i == WBTC:
# deposit to aave lending pool
raw_call(
AAVE_LENDING_POOL,
concat(
method_id("deposit(address,uint256,address,uint16)"),
convert(u_coin_i, bytes32),
convert(dx, bytes32),
convert(self, bytes32),
convert(self.aave_referral, bytes32),
)
)
ERC20(u_coin_j).transfer(msg.sender, dy) # transfer renBTC
else:
# we already have the renBTC from msg.sender transferred in
# withdraw `j` underlying from lending pool and transfer to caller
LendingPool(AAVE_LENDING_POOL).withdraw(u_coin_j, dy, msg.sender)
log TokenExchangeUnderlying(msg.sender, i, dx, j, dy)
return dy
@external
@nonreentrant('lock')
def remove_liquidity(
_amount: uint256,
_min_amounts: uint256[N_COINS],
_use_underlying: bool = False,
) -> uint256[N_COINS]:
"""
@notice Withdraw coins from the pool
@dev Withdrawal amounts are based on current deposit ratios
@param _amount Quantity of LP tokens to burn in the withdrawal
@param _min_amounts Minimum amounts of underlying coins to receive
@param _use_underlying If True, withdraw underlying assets instead of aTokens
@return List of amounts of coins that were withdrawn
"""
if not self.is_killed:
self._claim_rewards()
amounts: uint256[N_COINS] = self._balances()
lp_token: address = self.lp_token
total_supply: uint256 = ERC20(lp_token).totalSupply()
CurveToken(lp_token).burnFrom(msg.sender, _amount) # dev: insufficient funds
for i in range(N_COINS):
value: uint256 = amounts[i] * _amount / total_supply
assert value >= _min_amounts[i], "Withdrawal resulted in fewer coins than expected"
amounts[i] = value
if _use_underlying and i == 0: # WBTC
LendingPool(AAVE_LENDING_POOL).withdraw(self.underlying_coins[0], value, msg.sender)
else:
assert ERC20(self.coins[i]).transfer(msg.sender, value)
log RemoveLiquidity(msg.sender, amounts, empty(uint256[N_COINS]), total_supply - _amount)
return amounts
@external
@nonreentrant('lock')
def remove_liquidity_imbalance(
_amounts: uint256[N_COINS],
_max_burn_amount: uint256,
_use_underlying: bool = False
) -> uint256:
"""
@notice Withdraw coins from the pool in an imbalanced amount
@param _amounts List of amounts of underlying coins to withdraw
@param _max_burn_amount Maximum amount of LP token to burn in the withdrawal
@param _use_underlying If True, withdraw underlying assets instead of aTokens
@return Actual amount of the LP token burned in the withdrawal
"""
assert not self.is_killed # dev: is killed
self._claim_rewards()
amp: uint256 = self._A()
old_balances: uint256[N_COINS] = self._balances()
D0: uint256 = self.get_D_precisions(old_balances, amp)
new_balances: uint256[N_COINS] = old_balances
for i in range(N_COINS):
new_balances[i] -= _amounts[i]
D1: uint256 = self.get_D_precisions(new_balances, amp)
ys: uint256 = (D0 + D1) / N_COINS
lp_token: address = self.lp_token
token_supply: uint256 = ERC20(lp_token).totalSupply()
assert token_supply != 0 # dev: zero total supply
_fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
_feemul: uint256 = self.offpeg_fee_multiplier
_admin_fee: uint256 = self.admin_fee
fees: uint256[N_COINS] = empty(uint256[N_COINS])
for i in range(N_COINS):
ideal_balance: uint256 = D1 * old_balances[i] / D0
new_balance: uint256 = new_balances[i]
difference: uint256 = 0
if ideal_balance > new_balance:
difference = ideal_balance - new_balance
else:
difference = new_balance - ideal_balance
xs: uint256 = new_balance + old_balances[i]
fees[i] = self._dynamic_fee(xs, ys, _fee, _feemul) * difference / FEE_DENOMINATOR
if _admin_fee != 0:
self.admin_balances[i] += fees[i] * _admin_fee / FEE_DENOMINATOR
new_balances[i] -= fees[i]
D2: uint256 = self.get_D_precisions(new_balances, amp)
token_amount: uint256 = (D0 - D2) * token_supply / D0
assert token_amount != 0 # dev: zero tokens burned
assert token_amount <= _max_burn_amount, "Slippage screwed you"
CurveToken(lp_token).burnFrom(msg.sender, token_amount) # dev: insufficient funds
for i in range(N_COINS):
amount: uint256 = _amounts[i]
if amount != 0:
if _use_underlying and i == 0:
LendingPool(AAVE_LENDING_POOL).withdraw(self.underlying_coins[0], amount, msg.sender)
else:
assert ERC20(self.coins[i]).transfer(msg.sender, amount)
log RemoveLiquidityImbalance(msg.sender, _amounts, fees, D1, token_supply - token_amount)
return token_amount
@pure
@internal
def get_y_D(A_: uint256, i: int128, xp: uint256[N_COINS], D: uint256) -> uint256:
"""
Calculate x[i] if one reduces D from being calculated for xp to D
Done by solving quadratic equation iteratively.
x_1**2 + x1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n + 1) / (n ** (2 * n) * prod' * A)
x_1**2 + b*x_1 = c
x_1 = (x_1**2 + c) / (2*x_1 + b)
"""
# x in the input is converted to the same price/precision
assert i >= 0 # dev: i below zero
assert i < N_COINS # dev: i above N_COINS
Ann: uint256 = A_ * N_COINS
c: uint256 = D
S_: uint256 = 0
_x: uint256 = 0
y_prev: uint256 = 0
for _i in range(N_COINS):
if _i != i:
_x = xp[_i]
else:
continue
S_ += _x
c = c * D / (_x * N_COINS)
c = c * D * A_PRECISION / (Ann * N_COINS)
b: uint256 = S_ + D * A_PRECISION / Ann
y: uint256 = D
for _i in range(255):
y_prev = y
y = (y*y + c) / (2 * y + b - D)
# Equality with the precision of 1
if y > y_prev:
if y - y_prev <= 1:
return y
else:
if y_prev - y <= 1:
return y
raise
@view
@internal
def _calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> uint256:
# First, need to calculate
# * Get current D
# * Solve Eqn against y_i for D - _token_amount
amp: uint256 = self._A()
xp: uint256[N_COINS] = self._balances()
precisions: uint256[N_COINS] = PRECISION_MUL
for j in range(N_COINS):
xp[j] *= precisions[j]
D0: uint256 = self.get_D(xp, amp)
D1: uint256 = D0 - _token_amount * D0 / ERC20(self.lp_token).totalSupply()
new_y: uint256 = self.get_y_D(amp, i, xp, D1)
xp_reduced: uint256[N_COINS] = xp
ys: uint256 = (D0 + D1) / (2 * N_COINS)
_fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
feemul: uint256 = self.offpeg_fee_multiplier
for j in range(N_COINS):
dx_expected: uint256 = 0
xavg: uint256 = 0
if j == i:
dx_expected = xp[j] * D1 / D0 - new_y
xavg = (xp[j] + new_y) / 2
else:
dx_expected = xp[j] - xp[j] * D1 / D0
xavg = xp[j]
xp_reduced[j] -= self._dynamic_fee(xavg, ys, _fee, feemul) * dx_expected / FEE_DENOMINATOR
dy: uint256 = xp_reduced[i] - self.get_y_D(amp, i, xp_reduced, D1)
return (dy - 1) / precisions[i]
@view
@external
def calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> uint256:
"""
@notice Calculate the amount received when withdrawing a single coin
@dev Result is the same for underlying or wrapped asset withdrawals
@param _token_amount Amount of LP tokens to burn in the withdrawal
@param i Index value of the coin to withdraw
@return Amount of coin received
"""
return self._calc_withdraw_one_coin(_token_amount, i)
@external
@nonreentrant('lock')
def remove_liquidity_one_coin(
_token_amount: uint256,
i: int128,
_min_amount: uint256,
_use_underlying: bool = False
) -> uint256:
"""
@notice Withdraw a single coin from the pool
@param _token_amount Amount of LP tokens to burn in the withdrawal
@param i Index value of the coin to withdraw
@param _min_amount Minimum amount of coin to receive
@param _use_underlying If True, withdraw underlying assets instead of aTokens
@return Amount of coin received
"""
assert not self.is_killed # dev: is killed
self._claim_rewards()
dy: uint256 = self._calc_withdraw_one_coin(_token_amount, i)
assert dy >= _min_amount, "Not enough coins removed"
CurveToken(self.lp_token).burnFrom(msg.sender, _token_amount) # dev: insufficient funds
if _use_underlying and i == 0:
LendingPool(AAVE_LENDING_POOL).withdraw(self.underlying_coins[0], dy, msg.sender)
else:
assert ERC20(self.coins[i]).transfer(msg.sender, dy)
log RemoveLiquidityOne(msg.sender, _token_amount, dy)
return dy
### Admin functions ###
@external
def ramp_A(_future_A: uint256, _future_time: uint256):
assert msg.sender == self.owner # dev: only owner
assert block.timestamp >= self.initial_A_time + MIN_RAMP_TIME
assert _future_time >= block.timestamp + MIN_RAMP_TIME # dev: insufficient time
_initial_A: uint256 = self._A()
_future_A_p: uint256 = _future_A * A_PRECISION
assert _future_A > 0 and _future_A < MAX_A
if _future_A_p < _initial_A:
assert _future_A_p * MAX_A_CHANGE >= _initial_A
else:
assert _future_A_p <= _initial_A * MAX_A_CHANGE
self.initial_A = _initial_A
self.future_A = _future_A_p
self.initial_A_time = block.timestamp
self.future_A_time = _future_time
log RampA(_initial_A, _future_A_p, block.timestamp, _future_time)
@external
def stop_ramp_A():
assert msg.sender == self.owner # dev: only owner
current_A: uint256 = self._A()
self.initial_A = current_A
self.future_A = current_A
self.initial_A_time = block.timestamp
self.future_A_time = block.timestamp
# now (block.timestamp < t1) is always False, so we return saved A
log StopRampA(current_A, block.timestamp)
@external
def commit_new_fee(new_fee: uint256, new_admin_fee: uint256, new_offpeg_fee_multiplier: uint256):
assert msg.sender == self.owner # dev: only owner
assert self.admin_actions_deadline == 0 # dev: active action
assert new_fee <= MAX_FEE # dev: fee exceeds maximum
assert new_admin_fee <= MAX_ADMIN_FEE # dev: admin fee exceeds maximum
assert new_offpeg_fee_multiplier * new_fee <= MAX_FEE * FEE_DENOMINATOR # dev: offpeg multiplier exceeds maximum
_deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY
self.admin_actions_deadline = _deadline
self.future_fee = new_fee
self.future_admin_fee = new_admin_fee
self.future_offpeg_fee_multiplier = new_offpeg_fee_multiplier
log CommitNewFee(_deadline, new_fee, new_admin_fee, new_offpeg_fee_multiplier)
@external
def apply_new_fee():
assert msg.sender == self.owner # dev: only owner
assert block.timestamp >= self.admin_actions_deadline # dev: insufficient time
assert self.admin_actions_deadline != 0 # dev: no active action
self.admin_actions_deadline = 0
_fee: uint256 = self.future_fee
_admin_fee: uint256 = self.future_admin_fee
_fml: uint256 = self.future_offpeg_fee_multiplier
self.fee = _fee
self.admin_fee = _admin_fee
self.offpeg_fee_multiplier = _fml
log NewFee(_fee, _admin_fee, _fml)
@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 withdraw_admin_fees():
assert msg.sender == self.owner # dev: only owner
for i in range(N_COINS):
value: uint256 = self.admin_balances[i]
if value != 0:
assert ERC20(self.coins[i]).transfer(self.admin_fee_receiver, value)
self.admin_balances[i] = 0
@external
def donate_admin_fees():
"""
Just in case admin balances somehow become higher than total (rounding error?)
this can be used to fix the state, too
"""
assert msg.sender == self.owner # dev: only owner
self.admin_balances = empty(uint256[N_COINS])
@external
def kill_me():
assert msg.sender == self.owner # dev: only owner
assert self.kill_deadline > block.timestamp # dev: deadline has passed
self.is_killed = True
@external
def unkill_me():
assert msg.sender == self.owner # dev: only owner
self.is_killed = False
@external
def set_aave_referral(referral_code: uint256):
assert msg.sender == self.owner # dev: only owner
assert referral_code < 2 ** 16 # dev: uint16 overflow
self.aave_referral = referral_code
@external
def set_reward_receiver(_reward_receiver: address):
assert msg.sender == self.owner
self.reward_receiver = _reward_receiver
@external
def set_admin_fee_receiver(_admin_fee_receiver: address):
assert msg.sender == self.owner
self.admin_fee_receiver = _admin_fee_receiverContract 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":"int128","indexed":false},{"name":"tokens_sold","type":"uint256","indexed":false},{"name":"bought_id","type":"int128","indexed":false},{"name":"tokens_bought","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"TokenExchangeUnderlying","inputs":[{"name":"buyer","type":"address","indexed":true},{"name":"sold_id","type":"int128","indexed":false},{"name":"tokens_sold","type":"uint256","indexed":false},{"name":"bought_id","type":"int128","indexed":false},{"name":"tokens_bought","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[2]","indexed":false},{"name":"fees","type":"uint256[2]","indexed":false},{"name":"invariant","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[2]","indexed":false},{"name":"fees","type":"uint256[2]","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amount","type":"uint256","indexed":false},{"name":"coin_amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[2]","indexed":false},{"name":"fees","type":"uint256[2]","indexed":false},{"name":"invariant","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewFee","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"fee","type":"uint256","indexed":false},{"name":"admin_fee","type":"uint256","indexed":false},{"name":"offpeg_fee_multiplier","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewFee","inputs":[{"name":"fee","type":"uint256","indexed":false},{"name":"admin_fee","type":"uint256","indexed":false},{"name":"offpeg_fee_multiplier","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampA","inputs":[{"name":"old_A","type":"uint256","indexed":false},{"name":"new_A","type":"uint256","indexed":false},{"name":"initial_time","type":"uint256","indexed":false},{"name":"future_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"name":"A","type":"uint256","indexed":false},{"name":"t","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_coins","type":"address[2]"},{"name":"_underlying_coins","type":"address[2]"},{"name":"_pool_token","type":"address"},{"name":"_A","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_admin_fee","type":"uint256"},{"name":"_offpeg_fee_multiplier","type":"uint256"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":10374},{"stateMutability":"view","type":"function","name":"A_precise","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":10336},{"stateMutability":"view","type":"function","name":"dynamic_fee","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"}],"outputs":[{"name":"","type":"uint256"}],"gas":22089},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":7358},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2237133},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"_amounts","type":"uint256[2]"},{"name":"is_deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}],"gas":4445096},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"_amounts","type":"uint256[2]"},{"name":"_min_mint_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"_amounts","type":"uint256[2]"},{"name":"_min_mint_amount","type":"uint256"},{"name":"_use_underlying","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":5357975},{"stateMutability":"view","type":"function","name":"get_dy_underlying","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":5358005},{"stateMutability":"nonpayable","type":"function","name":"exchange","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":5525027},{"stateMutability":"nonpayable","type":"function","name":"exchange_underlying","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":5541345},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[2]"}],"outputs":[{"name":"","type":"uint256[2]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[2]"},{"name":"_use_underlying","type":"bool"}],"outputs":[{"name":"","type":"uint256[2]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_amounts","type":"uint256[2]"},{"name":"_max_burn_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_amounts","type":"uint256[2]"},{"name":"_max_burn_amount","type":"uint256"},{"name":"_use_underlying","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"_token_amount","type":"uint256"},{"name":"i","type":"int128"}],"outputs":[{"name":"","type":"uint256"}],"gas":4008194},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_token_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"_min_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_token_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"_min_amount","type":"uint256"},{"name":"_use_underlying","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"ramp_A","inputs":[{"name":"_future_A","type":"uint256"},{"name":"_future_time","type":"uint256"}],"outputs":[],"gas":159459},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A","inputs":[],"outputs":[],"gas":154920},{"stateMutability":"nonpayable","type":"function","name":"commit_new_fee","inputs":[{"name":"new_fee","type":"uint256"},{"name":"new_admin_fee","type":"uint256"},{"name":"new_offpeg_fee_multiplier","type":"uint256"}],"outputs":[],"gas":148809},{"stateMutability":"nonpayable","type":"function","name":"apply_new_fee","inputs":[],"outputs":[],"gas":141271},{"stateMutability":"nonpayable","type":"function","name":"revert_new_parameters","inputs":[],"outputs":[],"gas":23012},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_owner","type":"address"}],"outputs":[],"gas":77050},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":65727},{"stateMutability":"nonpayable","type":"function","name":"revert_transfer_ownership","inputs":[],"outputs":[],"gas":23102},{"stateMutability":"nonpayable","type":"function","name":"withdraw_admin_fees","inputs":[],"outputs":[],"gas":61714},{"stateMutability":"nonpayable","type":"function","name":"donate_admin_fees","inputs":[],"outputs":[],"gas":43291},{"stateMutability":"nonpayable","type":"function","name":"kill_me","inputs":[],"outputs":[],"gas":40385},{"stateMutability":"nonpayable","type":"function","name":"unkill_me","inputs":[],"outputs":[],"gas":23222},{"stateMutability":"nonpayable","type":"function","name":"set_aave_referral","inputs":[{"name":"referral_code","type":"uint256"}],"outputs":[],"gas":38352},{"stateMutability":"nonpayable","type":"function","name":"set_reward_receiver","inputs":[{"name":"_reward_receiver","type":"address"}],"outputs":[],"gas":38385},{"stateMutability":"nonpayable","type":"function","name":"set_admin_fee_receiver","inputs":[{"name":"_admin_fee_receiver","type":"address"}],"outputs":[],"gas":38415},{"stateMutability":"view","type":"function","name":"coins","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":3397},{"stateMutability":"view","type":"function","name":"underlying_coins","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":3427},{"stateMutability":"view","type":"function","name":"admin_balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3457},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3378},{"stateMutability":"view","type":"function","name":"offpeg_fee_multiplier","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3408},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3438},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3468},{"stateMutability":"view","type":"function","name":"lp_token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3498},{"stateMutability":"view","type":"function","name":"initial_A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3528},{"stateMutability":"view","type":"function","name":"future_A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3558},{"stateMutability":"view","type":"function","name":"initial_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3588},{"stateMutability":"view","type":"function","name":"future_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3618},{"stateMutability":"view","type":"function","name":"admin_actions_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3648},{"stateMutability":"view","type":"function","name":"transfer_ownership_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3678},{"stateMutability":"view","type":"function","name":"future_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3708},{"stateMutability":"view","type":"function","name":"future_admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3738},{"stateMutability":"view","type":"function","name":"future_offpeg_fee_multiplier","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3768},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3798},{"stateMutability":"view","type":"function","name":"reward_receiver","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3828},{"stateMutability":"view","type":"function","name":"admin_fee_receiver","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3858}]Contract Creation Code
6101206158d36101403960206158d360c03960c05160a01c1561002157600080fd5b602060206158d30160c03960c05160a01c1561003c57600080fd5b602060406158d30160c03960c05160a01c1561005757600080fd5b602060606158d30160c03960c05160a01c1561007257600080fd5b602060806158d30160c03960c05160a01c1561008d57600080fd5b61026060006002818352015b600061014061026051600281106100af57600080fd5b6020020151186100be57600080fd5b600061018061026051600281106100d457600080fd5b6020020151186100e357600080fd5b8151600101808352811415610099575b5050731bfd67037b42cf73acf2047067bd4f2c47d9bfd6610180511461011857600080fd5b600060c052602060c02061014051815561016051600182015550600160c052602060c0206101805181556101a0516001820155506101e0516064808202821582848304141761016657600080fd5b809050905090506009556101e0516064808202821582848304141761018a57600080fd5b80905090509050600a55610200516003556102205160055561024051600455336006553360165542624f1a008181830110156101c557600080fd5b808201905090506014556101c051600755600060046102c0527f095ea7b3000000000000000000000000000000000000000000000000000000006102e0526102c060048060208461032001018260208501600060045af1505080518201915050738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf6020826103200101526020810190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602082610320010152602081019050806103205261032090508051602001806103c08284600060045af161029d57600080fd5b505060206104806103c0516103e06000731bfd67037b42cf73acf2047067bd4f2c47d9bfd65af16102cd57600080fd5b60203d808211156102de57806102e0565b815b90509050610460526104608051602001806102608284600060045af161030557600080fd5b505060006102605118156103575761026080602001516000825180602090131561032e57600080fd5b809190121561033c57600080fd5b806020036101000a8204905090509050151561035757600080fd5b6158bb56600436101561000d5761340e565b600035601c52600051341561002157600080fd5b63f446c1d08114156100505760065801613414565b610140526101405160648082049050905060005260206000f35b6376a2f0f08114156100765760065801613414565b610140526101405160005260206000f35b6376a9cd3e8114156102b2576004358080600081121561009257195b607f1c1561009f57600080fd5b905050602435808060008112156100b257195b607f1c156100bf57600080fd5b9050506402540be400610140526402540be40061016052602061022060246370a082316101a052306101c0526101bc600435600281106100fe57600080fd5b600060c052602060c02001545afa61011557600080fd5b601f3d1161012257600080fd5b600050610220516004356002811061013957600080fd5b600260c052602060c02001548082101561015257600080fd5b808203905090506101406004356002811061016c57600080fd5b6020020151808202821582848304141761018557600080fd5b8090509050905061018052602061024060246370a082316101c052306101e0526101dc602435600281106101b857600080fd5b600060c052602060c02001545afa6101cf57600080fd5b601f3d116101dc57600080fd5b60005061024051602435600281106101f357600080fd5b600260c052602060c02001548082101561020c57600080fd5b808203905090506101406024356002811061022657600080fd5b6020020151808202821582848304141761023f57600080fd5b809050905090506101a0526101405161016051610180516101a051610180516101c0526101a0516101e052600354610200526004546102205261022051610200516101e0516101c051600658016135ac565b610280526101a0526101805261016052610140526102805160005260206000f35b634903b0d181141561034a5760206101c060246370a0823161014052306101605261015c600435600281106102e657600080fd5b600060c052602060c02001545afa6102fd57600080fd5b601f3d1161030a57600080fd5b6000506101c0516004356002811061032157600080fd5b600260c052602060c02001548082101561033a57600080fd5b8082039050905060005260206000f35b63bb7b8b808114156104af57610140516006580161371a565b61016052610180526101405261016080516101a05280602001516101c052506101405161016051610180516101a0516101c05160065801613414565b6101e0526101c0526101a0526101805261016052610140526101e051610200526101405161016051610180516101a0516101c0516101e051610200516101a051610220526101c05161024052610200516102605261026051610240516102205160065801613b34565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c0516101405260206101e060046318160ddd6101805261019c6007545afa61045157600080fd5b601f3d1161045e57600080fd5b6000506101e0516101605261014051670de0b6b3a7640000808202821582848304141761048a57600080fd5b809050905090506101605180806104a057600080fd5b82049050905060005260206000f35b63ed8e84f38114156107745760443560011c156104cb57600080fd5b61014051610160516006580161371a565b610180526101a05261016052610140526101808051610140528060200151610160525061014051610160516101805160065801613414565b6101a0526101805261016052610140526101a051610180526101405161016051610180516101a051610140516101c052610160516101e0526101805161020052610200516101e0516101c05160065801613b34565b610260526101a052610180526101605261014052610260516101a0526101c060006002818352015b604435156105e9576101406101c051600281106105ad57600080fd5b60200201805160046101c051600281106105c657600080fd5b60200201358181830110156105da57600080fd5b80820190509050815250610633565b6101406101c051600281106105fd57600080fd5b60200201805160046101c0516002811061061657600080fd5b60200201358082101561062857600080fd5b808203905090508152505b8151600101808352811415610591575b50506101405161016051610180516101a0516101c051610140516101e0526101605161020052610180516102205261022051610200516101e05160065801613b34565b610280526101c0526101a052610180526101605261014052610280516101c052602061026060046318160ddd6102005261021c6007545afa6106c757600080fd5b601f3d116106d457600080fd5b600050610260516101e05260006102005260443515610712576101c0516101a0518082101561070257600080fd5b8082039050905061020052610733565b6101a0516101c0518082101561072757600080fd5b80820390509050610200525b610200516101e051808202821582848304141761074f57600080fd5b809050905090506101a051808061076557600080fd5b82049050905060005260206000f35b630b4c7e4d81141561078b576000610140526107bc565b63ee22be238114156107b75760643560011c156107a757600080fd5b60206064610140376000506107bc565b61130b565b601754156107c957600080fd5b6001601755601354156107db57600080fd5b6101405160065801613c39565b61014052600050610140516101605160065801613414565b61018052610160526101405261018051610160526101405161016051610180516101a0516006580161371a565b6101c0526101e0526101a0526101805261016052610140526101c080516101805280602001516101a052506007546101c052602061026060046318160ddd6102005261021c6101c0515afa61088157600080fd5b601f3d1161088e57600080fd5b600050610260516101e05260006102005260006101e051181561091d576101405161016051610180516101a0516101c0516101e0516102005161018051610220526101a05161024052610160516102605261026051610240516102205160065801613b34565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c051610200525b61018051610220526101a0516102405261026060006002818352015b6101e05115156109675760006004610260516002811061095857600080fd5b60200201351861096757600080fd5b610220610260516002811061097b57600080fd5b6020020180516004610260516002811061099457600080fd5b60200201358181830110156109a857600080fd5b808201905090508152505b8151600101808352811415610939575b50506101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516102205161028052610240516102a052610160516102c0526102c0516102a0516102805160065801613b34565b61032052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103205161026052610200516102605111610a6057600080fd5b6060366102803760006101e0511815610e8c576102005161026051818183011015610a8a57600080fd5b808201905090506002808204905090506102e05260035460028082028215828483041417610ab757600080fd5b8090509050905060048082049050905061030052600454610320526005546103405260006103605261038060006002818352015b610260516101806103805160028110610b0357600080fd5b60200201518082028215828483041417610b1c57600080fd5b80905090509050610200518080610b3257600080fd5b8204905090506103a0526102206103805160028110610b5057600080fd5b60200201516103c0526103c0516103a0511115610b8c576103a0516103c05180821015610b7c57600080fd5b8082039050905061036052610bad565b6103c0516103a05180821015610ba157600080fd5b80820390509050610360525b6101806103805160028110610bc157600080fd5b60200201516103c051818183011015610bd957600080fd5b808201905090506103e052610140610400525b61040051516020610400510161040052610400610400511015610c0e57610bec565b6103e051610420526102e051610440526103005161046052610320516104805261048051610460516104405161042051600658016135ac565b6104e0526103e0610400525b6104005152602061040051036104005261014061040051101515610c7657610c53565b6104e051610360518082028215828483041417610c9257600080fd5b809050905090506402540be400808204905090506102806103805160028110610cba57600080fd5b60200201526000610340511815610d48576103805160028110610cdc57600080fd5b600260c052602060c0200180546102806103805160028110610cfd57600080fd5b6020020151610340518082028215828483041417610d1a57600080fd5b809050905090506402540be40080820490509050818183011015610d3d57600080fd5b808201905090508155505b6103c0516102806103805160028110610d6057600080fd5b602002015180821015610d7257600080fd5b808203905090506102206103805160028110610d8d57600080fd5b60200201525b8151600101808352811415610aeb575b50506101406103a0525b6103a0515160206103a051016103a0526103a06103a0511015610dcf57610dad565b610220516103c052610240516103e0526101605161040052610400516103e0516103c05160065801613b34565b610460526103806103a0525b6103a0515260206103a051036103a0526101406103a051101515610e2b57610e08565b61046051610380526101e051610380516102005180821015610e4c57600080fd5b808203905090508082028215828483041417610e6757600080fd5b80905090509050610200518080610e7d57600080fd5b8204905090506102c052610e95565b610260516102c0525b6044356102c05110151515610ee9576308c379a06102e0526020610300526014610320527f536c697070616765207363726577656420796f75000000000000000000000000610340526103205060646102fcfd5b610140511561116d576008546102e0526004356103005260006103005118156111685760006004610380527f23b872dd000000000000000000000000000000000000000000000000000000006103a0526103806004806020846103e001018260208501600060045af1505080518201915050336020826103e0010152602081019050306020826103e0010152602081019050610300516020826103e0010152602081019050806103e0526103e090508051602001806104a08284600060045af1610fb257600080fd5b505060206105806104a0516104c06000731bfd67037b42cf73acf2047067bd4f2c47d9bfd65af1610fe257600080fd5b60203d80821115610ff35780610ff5565b815b90509050610560526105608051602001806103208284600060045af161101a57600080fd5b5050600061032051181561106c5761032080602001516000825180602090131561104357600080fd5b809190121561105157600080fd5b806020036101000a8204905090509050151561106c57600080fd5b60006004610380527fe8eda9df000000000000000000000000000000000000000000000000000000006103a0526103806004806020846103e001018260208501600060045af1505080518201915050731bfd67037b42cf73acf2047067bd4f2c47d9bfd66020826103e0010152602081019050610300516020826103e0010152602081019050306020826103e00101526020810190506102e0516020826103e0010152602081019050806103e0526103e090508051602001806104c08284600060045af161113957600080fd5b5050600060006104c0516104e06000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af161116857600080fd5b6111da565b6004356102e05260006102e05118156111da5760206103c060646323b872dd61030052336103205230610340526102e0516103605261031c6000600060c052602060c020545af16111bd57600080fd5b601f3d116111ca57600080fd5b6000506103c0516111da57600080fd5b6024356102e05260006102e051181561124a5760206103c060646323b872dd61030052336103205230610340526102e0516103605261031c60006001600160c052602060c02001545af161122d57600080fd5b601f3d1161123a57600080fd5b6000506103c05161124a57600080fd5b60206103a060446340c10f196103005233610320526102c0516103405261031c60006101c0515af161127b57600080fd5b601f3d1161128857600080fd5b6000506103a050604060046103003761028051610340526102a0516103605261026051610380526101e0516102c0518181830110156112c657600080fd5b808201905090506103a052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c0610300a26102c051600052600060175560206000f35b635e0d443f811415611392576004358080600081121561132757195b607f1c1561133457600080fd5b9050506024358080600081121561134757195b607f1c1561135457600080fd5b905050600435610140526024356101605260443561018052610180516101605161014051600658016142ce565b6101e0526101e05160005260206000f35b6307211ef781141561141957600435808060008112156113ae57195b607f1c156113bb57600080fd5b905050602435808060008112156113ce57195b607f1c156113db57600080fd5b905050600435610140526024356101605260443561018052610180516101605161014051600658016142ce565b6101e0526101e05160005260206000f35b633df02124811415611655576017541561143257600080fd5b60016017556004358080600081121561144757195b607f1c1561145457600080fd5b9050506024358080600081121561146757195b607f1c1561147457600080fd5b9050506101405160043561016052602435610180526044356101a0526101a051610180516101605160065801614688565b61020052610140526102005161014052606435610140511015151561152e576308c379a061016052602061018052602e6101a0527f45786368616e676520726573756c74656420696e20666577657220636f696e736101c0527f207468616e2065787065637465640000000000000000000000000000000000006101e0526101a050608461017cfd5b602061022060646323b872dd610160523361018052306101a0526044356101c05261017c60006004356002811061156457600080fd5b600060c052602060c02001545af161157b57600080fd5b601f3d1161158857600080fd5b6000506102205161159857600080fd5b6020610200604463a9059cbb610160523361018052610140516101a05261017c6000602435600281106115ca57600080fd5b600060c052602060c02001545af16115e157600080fd5b601f3d116115ee57600080fd5b600050610200516115fe57600080fd5b60043561016052604435610180526024356101a052610140516101c052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610160a261014051600052600060175560206000f35b63a6417ed6811415611b09576017541561166e57600080fd5b60016017556004358080600081121561168357195b607f1c1561169057600080fd5b905050602435808060008112156116a357195b607f1c156116b057600080fd5b9050506101405160043561016052602435610180526044356101a0526101a051610180516101605160065801614688565b61020052610140526102005161014052606435610140511015151561176a576308c379a061016052602061018052602e6101a0527f45786368616e676520726573756c74656420696e20666577657220636f696e736101c0527f207468616e2065787065637465640000000000000000000000000000000000006101e0526101a050608461017cfd5b6004356002811061177a57600080fd5b600160c052602060c0200154610160526024356002811061179a57600080fd5b600160c052602060c02001546101805260006004610200527f23b872dd000000000000000000000000000000000000000000000000000000006102205261020060048060208461026001018260208501600060045af15050805182019150503360208261026001015260208101905030602082610260010152602081019050604435602082610260010152602081019050806102605261026090508051602001806103208284600060045af161184f57600080fd5b50506020610400610320516103406000610160515af161186e57600080fd5b60203d8082111561187f5780611881565b815b905090506103e0526103e08051602001806101a08284600060045af16118a657600080fd5b505060006101a05118156118f8576101a08060200151600082518060209013156118cf57600080fd5b80919012156118dd57600080fd5b806020036101000a820490509050905015156118f857600080fd5b731bfd67037b42cf73acf2047067bd4f2c47d9bfd6610160511415611a4a5760006004610200527fe8eda9df000000000000000000000000000000000000000000000000000000006102205261020060048060208461026001018260208501600060045af15050805182019150506101605160208261026001015260208101905060443560208261026001015260208101905030602082610260010152602081019050600854602082610260010152602081019050806102605261026090508051602001806103408284600060045af16119d157600080fd5b505060006000610340516103606000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af1611a0057600080fd5b60206102a0604463a9059cbb610200523361022052610140516102405261021c6000610180515af1611a3157600080fd5b601f3d11611a3e57600080fd5b6000506102a050611ab2565b738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf3b611a6957600080fd5b6000600060646369328dec6102005261018051610220526101405161024052336102605261021c6000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af1611ab257600080fd5b6004356102005260443561022052602435610240526101405161026052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b6080610200a261014051600052600060175560206000f35b635b36389c811415611b2057600061014052611b51565b63269b5581811415611b4c5760643560011c15611b3c57600080fd5b6020606461014037600050611b51565b611ebb565b60175415611b5e57600080fd5b60016017556013541515611b81576101405160065801613c39565b610140526000505b6101405161016051610180516006580161371a565b6101a0526101c0526101805261016052610140526101a0805161016052806020015161018052506007546101a052602061024060046318160ddd6101e0526101fc6101a0515afa611be657600080fd5b601f3d11611bf357600080fd5b600050610240516101c052602061028060446379cc67906101e0523361020052600435610220526101fc60006101a0515af1611c2e57600080fd5b601f3d11611c3b57600080fd5b600050610280506101e060006002818352015b6101606101e05160028110611c6257600080fd5b60200201516004358082028215828483041417611c7e57600080fd5b809050905090506101c0518080611c9457600080fd5b8204905090506102005260246101e05160028110611cb157600080fd5b60200201356102005110151515611d2c576308c379a0610220526020610240526030610260527f5769746864726177616c20726573756c74656420696e20666577657220636f69610280527f6e73207468616e206578706563746564000000000000000000000000000000006102a05261026050608461023cfd5b610200516101606101e05160028110611d4457600080fd5b60200201526101405115611d5c576101e05115611d5f565b60005b15611dd857738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf3b611d8357600080fd5b6000600060646369328dec61022052600160c052602060c02054610240526102005161026052336102805261023c6000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af1611dd357600080fd5b611e3f565b60206102c0604463a9059cbb610220523361024052610200516102605261023c60006101e05160028110611e0b57600080fd5b600060c052602060c02001545af1611e2257600080fd5b601f3d11611e2f57600080fd5b6000506102c051611e3f57600080fd5b8151600101808352811415611c4e575b5050610160516101e0526101805161020052604036610220376101c05160043580821015611e7c57600080fd5b8082039050905061026052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a06101e0a260006017556040610160f35b63e3103273811415611ed257600061014052611f03565b63e1df4f63811415611efe5760643560011c15611eee57600080fd5b6020606461014037600050611f03565b6127bc565b60175415611f1057600080fd5b600160175560135415611f2257600080fd5b6101405160065801613c39565b61014052600050610140516101605160065801613414565b61018052610160526101405261018051610160526101405161016051610180516101a0516006580161371a565b6101c0526101e0526101a0526101805261016052610140526101c080516101805280602001516101a052506101405161016051610180516101a0516101c051610180516101e0526101a05161020052610160516102205261022051610200516101e05160065801613b34565b610280526101c0526101a052610180526101605261014052610280516101c052610180516101e0526101a0516102005261022060006002818352015b6101e0610220516002811061203057600080fd5b6020020180516004610220516002811061204957600080fd5b60200201358082101561205b57600080fd5b808203905090508152505b815160010180835281141561201c575b50506101405161016051610180516101a0516101c0516101e05161020051610220516101e051610240526102005161026052610160516102805261028051610260516102405160065801613b34565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e051610220526101c0516102205181818301101561210857600080fd5b808201905090506002808204905090506102405260075461026052602061030060046318160ddd6102a0526102bc610260515afa61214557600080fd5b601f3d1161215257600080fd5b60005061030051610280526000610280511861216d57600080fd5b6003546002808202821582848304141761218657600080fd5b809050905090506004808204905090506102a0526004546102c0526005546102e0526040366103003761034060006002818352015b6102205161018061034051600281106121d357600080fd5b602002015180820282158284830414176121ec57600080fd5b809050905090506101c051808061220257600080fd5b820490509050610360526101e0610340516002811061222057600080fd5b60200201516103805260006103a052610380516103605111156122625761036051610380518082101561225257600080fd5b808203905090506103a052612283565b61038051610360518082101561227757600080fd5b808203905090506103a0525b61038051610180610340516002811061229b57600080fd5b60200201518181830110156122af57600080fd5b808201905090506103c0526101406103e0525b6103e0515160206103e051016103e0526103e06103e05110156122e4576122c2565b6103c0516104005261024051610420526102a051610440526102c0516104605261046051610440516104205161040051600658016135ac565b6104c0526103c06103e0525b6103e0515260206103e051036103e0526101406103e05110151561234c57612329565b6104c0516103a051808202821582848304141761236857600080fd5b809050905090506402540be40080820490509050610300610340516002811061239057600080fd5b602002015260006102e051181561241e5761034051600281106123b257600080fd5b600260c052602060c02001805461030061034051600281106123d357600080fd5b60200201516102e05180820282158284830414176123f057600080fd5b809050905090506402540be4008082049050905081818301101561241357600080fd5b808201905090508155505b6101e0610340516002811061243257600080fd5b602002018051610300610340516002811061244c57600080fd5b60200201518082101561245e57600080fd5b808203905090508152505b81516001018083528114156121bb575b5050610140610360525b610360515160206103605101610360526103606103605110156124a557612483565b6101e05161038052610200516103a052610160516103c0526103c0516103a0516103805160065801613b34565b61042052610340610360525b6103605152602061036051036103605261014061036051101515612501576124de565b61042051610340526101c051610340518082101561251e57600080fd5b8082039050905061028051808202821582848304141761253d57600080fd5b809050905090506101c051808061255357600080fd5b820490509050610360526000610360511861256d57600080fd5b60443561036051111515156125c1576308c379a06103805260206103a05260146103c0527f536c697070616765207363726577656420796f750000000000000000000000006103e0526103c050606461039cfd5b602061042060446379cc679061038052336103a052610360516103c05261039c6000610260515af16125f257600080fd5b601f3d116125ff57600080fd5b6000506104205061038060006002818352015b6004610380516002811061262557600080fd5b60200201356103a05260006103a051181561273057610140511561264d576103805115612650565b60005b156126c957738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf3b61267457600080fd5b6000600060646369328dec6103c052600160c052602060c020546103e0526103a0516104005233610420526103dc6000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af16126c457600080fd5b612730565b6020610460604463a9059cbb6103c052336103e0526103a051610400526103dc600061038051600281106126fc57600080fd5b600060c052602060c02001545af161271357600080fd5b601f3d1161272057600080fd5b6000506104605161273057600080fd5b8151600101808352811415612612575b50506040600461038037610300516103c052610320516103e052610220516104005261028051610360518082101561277757600080fd5b8082039050905061042052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c0610380a261036051600052600060175560206000f35b63cc2b27d781141561281857602435808060008112156127d857195b607f1c156127e557600080fd5b9050506004356101405260243561016052610160516101405160065801614e94565b6101c0526101c05160005260206000f35b631a4d01d281141561282f57600061014052612860565b63517a55a381141561285b5760643560011c1561284b57600080fd5b6020606461014037600050612860565b612ac2565b6017541561286d57600080fd5b60016017556024358080600081121561288257195b607f1c1561288f57600080fd5b9050506013541561289f57600080fd5b6101405160065801613c39565b610140526000506101405161016051600435610180526024356101a0526101a0516101805160065801614e94565b61020052610160526101405261020051610160526044356101605110151515612942576308c379a06101805260206101a05260186101c0527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006101e0526101c050606461019cfd5b602061022060446379cc679061018052336101a0526004356101c05261019c60006007545af161297157600080fd5b601f3d1161297e57600080fd5b600050610220506101405115612997576024351561299a565b60005b15612a1357738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf3b6129be57600080fd5b6000600060646369328dec61018052600160c052602060c020546101a052610160516101c052336101e05261019c6000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af1612a0e57600080fd5b612a79565b6020610220604463a9059cbb61018052336101a052610160516101c05261019c600060243560028110612a4557600080fd5b600060c052602060c02001545af1612a5c57600080fd5b601f3d11612a6957600080fd5b60005061022051612a7957600080fd5b60043561018052610160516101a052337f9e96dd3b997a2a257eec4df9bb6eaf626e206df5f543bd963682d143300be3106040610180a261016051600052600060175560206000f35b633c157e64811415612c63576006543314612adc57600080fd5b600b5462015180818183011015612af257600080fd5b80820190509050421015612b0557600080fd5b4262015180818183011015612b1957600080fd5b808201905090506024351015612b2e57600080fd5b6101405160065801613414565b6101605261014052610160516101405260043560648082028215828483041417612b6457600080fd5b809050905090506101605260006004351115612b8757620f424060043510612b8a565b60005b612b9357600080fd5b61014051610160511015612bd6576101405161016051600a8082028215828483041417612bbf57600080fd5b809050905090501015612bd157600080fd5b612c06565b61014051600a8082028215828483041417612bf057600080fd5b80905090509050610160511115612c0657600080fd5b6101405160095561016051600a5542600b55602435600c556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a6588811415612ce6576006543314612c7d57600080fd5b6101405160065801613414565b610160526101405261016051610140526101405160095561014051600a5542600b5542600c55610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b630746dd5a811415612de5576006543314612d0057600080fd5b600d5415612d0d57600080fd5b64012a05f2006004351115612d2157600080fd5b6402540be4006024351115612d3557600080fd5b6802b5e3af16b18800006044356004358082028215828483041417612d5957600080fd5b809050905090501115612d6b57600080fd5b426203f480818183011015612d7f57600080fd5b808201905090506101405261014051600d55600435600f5560243560105560443560115560043561016052602435610180526044356101a052610140517fe347cde074ab87e09449fa2b03e8f2cf79094cb1265f4c914365d2247d4147a36060610160a2005b634f12fe97811415612e8d576006543314612dff57600080fd5b600d54421015612e0e57600080fd5b6000600d5418612e1d57600080fd5b6000600d55600f54610140526010546101605260115461018052610140516003556101605160055561018051600455610140516101a052610160516101c052610180516101e0527fcfca96e0fef3432146913b2a5a2268a55d3f475fe057e7ffde1082b77693f4f360606101a0a1005b63226840fb811415612eae576006543314612ea757600080fd5b6000600d55005b636b441a40811415612f405760043560a01c15612eca57600080fd5b6006543314612ed857600080fd5b600e5415612ee557600080fd5b426203f480818183011015612ef957600080fd5b808201905090506101405261014051600e55600435601255600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae811415612fb7576006543314612f5a57600080fd5b600e54421015612f6957600080fd5b6000600e5418612f7857600080fd5b6000600e556012546101405261014051600655610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf193811415612fd8576006543314612fd157600080fd5b6000600e55005b6330c540858114156130c8576006543314612ff257600080fd5b61014060006002818352015b610140516002811061300f57600080fd5b600260c052602060c02001546101605260006101605118156130b4576020610220604463a9059cbb610180526016546101a052610160516101c05261019c6000610140516002811061306057600080fd5b600060c052602060c02001545af161307757600080fd5b601f3d1161308457600080fd5b6000506102205161309457600080fd5b600061014051600281106130a757600080fd5b600260c052602060c02001555b8151600101808352811415612ffe575b5050005b63524c39018114156130fa5760065433146130e257600080fd5b600260c052602060c020600081556000600182015550005b63e369885381141561312957600654331461311457600080fd5b426014541161312257600080fd5b6001601355005b633046f97281141561314a57600654331461314357600080fd5b6000601355005b63b6aa64c581141561317d57600654331461316457600080fd5b620100006004351061317557600080fd5b600435600855005b63c51b88618114156131af5760043560a01c1561319957600080fd5b60065433146131a757600080fd5b600435601555005b637242e5248114156131e15760043560a01c156131cb57600080fd5b60065433146131d957600080fd5b600435601655005b63c661065781141561321257600435600281106131fd57600080fd5b600060c052602060c020015460005260206000f35b63b9947eb0811415613243576004356002811061322e57600080fd5b600160c052602060c020015460005260206000f35b63e2e7d264811415613274576004356002811061325f57600080fd5b600260c052602060c020015460005260206000f35b63ddca3f4381141561328c5760035460005260206000f35b638edfdd5f8114156132a45760045460005260206000f35b63fee3f7f98114156132bc5760055460005260206000f35b638da5cb5b8114156132d45760065460005260206000f35b6382c630668114156132ec5760075460005260206000f35b635409491a8114156133045760095460005260206000f35b63b4b577ad81141561331c57600a5460005260206000f35b632081066c81141561333457600b5460005260206000f35b631405228881141561334c57600c5460005260206000f35b63405e28f881141561336457600d5460005260206000f35b63e0a0b58681141561337c57600e5460005260206000f35b6358680d0b81141561339457600f5460005260206000f35b63e38244628114156133ac5760105460005260206000f35b631e4c4ef88114156133c45760115460005260206000f35b631ec0cdc18114156133dc5760125460005260206000f35b63b618ba628114156133f45760155460005260206000f35b636e42e4d281141561340c5760165460005260206000f35b505b60006000fd5b61014052600c5461016052600a54610180526101605142101561359a576009546101a052600b546101c0526101a0516101805111156134f4576101a051610180516101a0518082101561346657600080fd5b80820390509050426101c0518082101561347f57600080fd5b80820390509050808202821582848304141761349a57600080fd5b80905090509050610160516101c051808210156134b657600080fd5b8082039050905080806134c857600080fd5b8204905090508181830110156134dd57600080fd5b808201905090506000526000516101405156613595565b6101a0516101a051610180518082101561350d57600080fd5b80820390509050426101c0518082101561352657600080fd5b80820390509050808202821582848304141761354157600080fd5b80905090509050610160516101c0518082101561355d57600080fd5b80820390509050808061356f57600080fd5b8204905090508082101561358257600080fd5b8082039050905060005260005161014051565b6135aa565b6101805160005260005161014051565b005b6101c0526101405261016052610180526101a0526402540be4006101a0511115156135e557610180516000526000516101c05156613718565b61014051610160518181830110156135fc57600080fd5b808201905090506101e0526101e080516101e051808202821582848304141761362457600080fd5b809050905090508152506101a05161018051808202821582848304141761364a57600080fd5b809050905090506101a0516402540be4008082101561366857600080fd5b808203905090506004808202821582848304141761368557600080fd5b809050905090506101405180820282158284830414176136a457600080fd5b809050905090506101605180820282158284830414176136c357600080fd5b809050905090506101e05180806136d957600080fd5b8204905090506402540be4008181830110156136f457600080fd5b80820190509050808061370657600080fd5b8204905090506000526000516101c051565b005b61014052604036610160376101a060006002818352015b602061024060246370a082316101c052306101e0526101dc6101a0516002811061375a57600080fd5b600060c052602060c02001545afa61377157600080fd5b601f3d1161377e57600080fd5b600050610240516101a0516002811061379657600080fd5b600260c052602060c0200154808210156137af57600080fd5b808203905090506101606101a051600281106137ca57600080fd5b60200201525b8151600101808352811415613731575b505060406101a0525b60006101a0511115156137fb57613817565b60206101a05103610160015160206101a051036101a0526137e9565b61014051565b6101a05261014052610160526101805260006101c05261020060006002818352015b6020610200510261014001516101e0526101c080516101e05181818301101561386757600080fd5b808201905090508152505b815160010180835281141561383f575b50506101c051151561389c5760006000526000516101a051565b60006101e0526101c0516102005261018051600280820282158284830414176138c457600080fd5b8090509050905061022052610240600060ff818352015b61020051610260526102a060006002818352015b60206102a051026101400151610280526102605161020051808202821582848304141761391b57600080fd5b80905090509050610280516002808202821582848304141761393c57600080fd5b80905090509050600181818301101561395457600080fd5b80820190509050808061396657600080fd5b820490509050610260525b81516001018083528114156138ef575b5050610200516101e052610220516101c05180820282158284830414176139a757600080fd5b8090509050905060648082049050905061026051600280820282158284830414176139d157600080fd5b809050905090508181830110156139e757600080fd5b80820190509050610200518082028215828483041417613a0657600080fd5b8090509050905061022051606480821015613a2057600080fd5b80820390509050610200518082028215828483041417613a3f57600080fd5b809050905090506064808204905090506003610260518082028215828483041417613a6957600080fd5b80905090509050818183011015613a7f57600080fd5b808201905090508080613a9157600080fd5b820490509050610200526101e051610200511115613ae5576001610200516101e05180821015613ac057600080fd5b80820390509050111515613ae0576102005160005250506000516101a051565b613b1c565b60016101e0516102005180821015613afc57600080fd5b80820390509050111515613b1c576102005160005250506000516101a051565b81516001018083528114156138db575b505060006000fd5b6101a0526101405261016052610180526402540be4006101c0526402540be4006101e05261020060006002818352015b6101c06102005160028110613b7857600080fd5b6020020180516101406102005160028110613b9257600080fd5b60200201518082028215828483041417613bab57600080fd5b809050905090508152505b8151600101808352811415613b64575b50506101405161016051610180516101a0516101c0516101e0516101c051610200526101e0516102205261018051610240526102405161022051610200516006580161381d565b6102a0526101e0526101c0526101a0526101805261016052610140526102a0516000526000516101a051565b61014052601554610160526000610160511815613e5457600060046101e0527f3111e7b300000000000000000000000000000000000000000000000000000000610200526101e060048060208461024001018260208501600060045af150508051820191505060606020826102400101526020810190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602082610240010152602081019050306020826102400101526020810190506001602082610240010152602081019050600060c052602060c02054602082610240010152602081019050806102405261024090508051602001806103408284600060045af1613d3f57600080fd5b5050602061046061034051610360600073357d51124f59836ded84c8a1730d72b749d8bc235af1613d6f57600080fd5b60203d80821115613d805780613d82565b815b90509050610440526104408051602001806101808284600060045af1613da757600080fd5b5050610180806020015160008251806020901315613dc457600080fd5b8091901215613dd257600080fd5b806020036101000a82049050905090506101e05260006101e0511115613e545760206102a0604463a9059cbb6102005261016051610220526101e0516102405261021c6000730d500b1d8e8ef31e21c99d1db9a6444d3adf12705af1613e3757600080fd5b601f3d11613e4457600080fd5b6000506102a051613e5457600080fd5b61014051565b6101e0526101405261016052610180526101a0526101c052610160516101405118613e8457600080fd5b6000610160511215613e9557600080fd5b60026101605112613ea557600080fd5b6000610140511215613eb657600080fd5b60026101405112613ec657600080fd5b6101405161016051610180516101a0516101c0516101e0516102005160065801613414565b61022052610200526101e0526101c0526101a05261018052610160526101405261022051610200526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c0516102605261020051610280526102805161026051610240516006580161381d565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e051610220526102005160028082028215828483041417613fa657600080fd5b80905090509050610240526102205161026052606036610280376102e060006002818352015b610140516102e0511415613fe757610180516102a05261401c565b610160516102e0511815614017576101a06102e0516002811061400957600080fd5b60200201516102a05261401c565b614098565b61028080516102a05181818301101561403457600080fd5b808201905090508152506102605161022051808202821582848304141761405a57600080fd5b809050905090506102a0516002808202821582848304141761407b57600080fd5b80905090509050808061408d57600080fd5b820490509050610260525b8151600101808352811415613fcc575b5050610260516102205180820282158284830414176140c657600080fd5b80905090509050606480820282158284830414176140e357600080fd5b80905090509050610240516002808202821582848304141761410457600080fd5b80905090509050808061411657600080fd5b8204905090506102605261028051610220516064808202821582848304141761413e57600080fd5b8090509050905061024051808061415457600080fd5b82049050905081818301101561416957600080fd5b808201905090506102e0526102205161030052610320600060ff818352015b610300516102c052610300516103005180820282158284830414176141ac57600080fd5b80905090509050610260518181830110156141c657600080fd5b8082019050905060026103005180820282158284830414176141e757600080fd5b809050905090506102e05181818301101561420157600080fd5b80820190509050610220518082101561421957600080fd5b80820390509050808061422b57600080fd5b820490509050610300526102c05161030051111561427f576001610300516102c0518082101561425a57600080fd5b8082039050905011151561427a576103005160005250506000516101e051565b6142b6565b60016102c051610300518082101561429657600080fd5b808203905090501115156142b6576103005160005250506000516101e051565b8151600101808352811415614188575b505060006000fd5b6101a0526101405261016052610180526101405161016051610180516101a0516101c0516101e0516006580161371a565b61020052610220526101e0526101c0526101a05261018052610160526101405261020080516101c05280602001516101e052506402540be400610200526402540be4006102205261024060006002818352015b6101c0610240516002811061436657600080fd5b602002018051610200610240516002811061438057600080fd5b6020020151808202821582848304141761439957600080fd5b809050905090508152505b8151600101808352811415614352575b50506101c061014051600281106143ca57600080fd5b60200201516101805161020061014051600281106143e757600080fd5b6020020151808202821582848304141761440057600080fd5b8090509050905081818301101561441657600080fd5b80820190509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101405161028052610160516102a052610240516102c0526101c0516102e0526101e05161030052610300516102e0516102c0516102a0516102805160065801613e5a565b61036052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036051610260526101c061016051600281106144d657600080fd5b602002015161026051808210156144ec57600080fd5b80820390509050610200610160516002811061450757600080fd5b6020020151808061451757600080fd5b820490509050610280526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516101c0610140516002811061456557600080fd5b60200201516102405181818301101561457d57600080fd5b808201905090506002808204905090506102c0526101c061016051600281106145a557600080fd5b6020020151610260518181830110156145bd57600080fd5b808201905090506002808204905090506102e052600354610300526004546103205261032051610300516102e0516102c051600658016135ac565b610380526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103805161028051808202821582848304141761464857600080fd5b809050905090506402540be400808204905090506102a052610280516102a0518082101561467557600080fd5b808203905090506000526000516101a051565b6101a052610140526101605261018052601354156146a557600080fd5b6101405161016051610180516101a05160065801613c39565b6101a0526101805261016052610140526000506101405161016051610180516101a0516101c0516101e0516006580161371a565b61020052610220526101e0526101c0526101a05261018052610160526101405261020080516101c05280602001516101e052506402540be400610200526402540be4006102205261024060006002818352015b6101c0610240516002811061475957600080fd5b602002018051610200610240516002811061477357600080fd5b6020020151808202821582848304141761478c57600080fd5b809050905090508152505b8151600101808352811415614745575b50506101c061014051600281106147bd57600080fd5b60200201516101805161020061014051600281106147da57600080fd5b602002015180820282158284830414176147f357600080fd5b8090509050905081818301101561480957600080fd5b80820190509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101405161028052610160516102a052610240516102c0526101c0516102e0526101e05161030052610300516102e0516102c0516102a0516102805160065801613e5a565b61036052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036051610260526101c061016051600281106148c957600080fd5b602002015161026051808210156148df57600080fd5b8082039050905061028052610280516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516101c0610140516002811061493257600080fd5b60200201516102405181818301101561494a57600080fd5b808201905090506002808204905090506102c0526101c0610160516002811061497257600080fd5b60200201516102605181818301101561498a57600080fd5b808201905090506002808204905090506102e052600354610300526004546103205261032051610300516102e0516102c051600658016135ac565b610380526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380518082028215828483041417614a1157600080fd5b809050905090506402540be400808204905090506102a0526005546102c05260006102c0511815614ae2576102a0516102c0518082028215828483041417614a5857600080fd5b809050905090506402540be400808204905090506102e05260006102e0511815614ae2576101605160028110614a8d57600080fd5b600260c052602060c0200180546102e0516102006101605160028110614ab257600080fd5b60200201518080614ac257600080fd5b820490509050818183011015614ad757600080fd5b808201905090508155505b610280516102a05180821015614af757600080fd5b808203905090506102006101605160028110614b1257600080fd5b60200201518080614b2257600080fd5b8204905090506000526000516101a051565b6101e0526101405261016052610180526101a0526101c0526000610160511215614b5d57600080fd5b60026101605112614b6d57600080fd5b6101405160028082028215828483041417614b8757600080fd5b80905090509050610200526101c05161022052606036610240376102a060006002818352015b610160516102a0511815614bdd576101806102a05160028110614bcf57600080fd5b602002015161026052614be2565b614c5e565b610240805161026051818183011015614bfa57600080fd5b80820190509050815250610220516101c0518082028215828483041417614c2057600080fd5b809050905090506102605160028082028215828483041417614c4157600080fd5b809050905090508080614c5357600080fd5b820490509050610220525b8151600101808352811415614bad575b5050610220516101c0518082028215828483041417614c8c57600080fd5b8090509050905060648082028215828483041417614ca957600080fd5b809050905090506102005160028082028215828483041417614cca57600080fd5b809050905090508080614cdc57600080fd5b82049050905061022052610240516101c05160648082028215828483041417614d0457600080fd5b80905090509050610200518080614d1a57600080fd5b820490509050818183011015614d2f57600080fd5b808201905090506102a0526101c0516102c0526102e0600060ff818352015b6102c051610280526102c0516102c0518082028215828483041417614d7257600080fd5b8090509050905061022051818183011015614d8c57600080fd5b8082019050905060026102c0518082028215828483041417614dad57600080fd5b809050905090506102a051818183011015614dc757600080fd5b808201905090506101c05180821015614ddf57600080fd5b808203905090508080614df157600080fd5b8204905090506102c052610280516102c0511115614e455760016102c0516102805180821015614e2057600080fd5b80820390509050111515614e40576102c05160005250506000516101e051565b614e7c565b6001610280516102c05180821015614e5c57600080fd5b80820390509050111515614e7c576102c05160005250506000516101e051565b8151600101808352811415614d4e575b505060006000fd5b6101805261014052610160526101405161016051610180516101a05160065801613414565b6101c0526101a0526101805261016052610140526101c0516101a0526101405161016051610180516101a0516101c0516101e0516006580161371a565b61020052610220526101e0526101c0526101a05261018052610160526101405261020080516101c05280602001516101e052506402540be400610200526402540be4006102205261024060006002818352015b6101c06102405160028110614f5d57600080fd5b6020020180516102006102405160028110614f7757600080fd5b60200201518082028215828483041417614f9057600080fd5b809050905090508152505b8151600101808352811415614f49575b50506101405161016051610180516101a0516101c0516101e0516102005161022051610240516101c051610260526101e051610280526101a0516102a0526102a05161028051610260516006580161381d565b610300526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103005161024052610240516101405161024051808202821582848304141761504e57600080fd5b8090509050905060206102e060046318160ddd6102805261029c6007545afa61507657600080fd5b601f3d1161508357600080fd5b6000506102e051808061509557600080fd5b820490509050808210156150a857600080fd5b80820390509050610260526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516101a0516102a052610160516102c0526101c0516102e0526101e05161030052610260516103205261032051610300516102e0516102c0516102a05160065801614b34565b6103805261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261038051610280526101c0516102a0526101e0516102c052610240516102605181818301101561518357600080fd5b808201905090506004808204905090506102e052600354600280820282158284830414176151b057600080fd5b80905090509050600480820490509050610300526004546103205261034060006002818352015b604036610360376101605161034051141561529a576101c0610340516002811061520057600080fd5b602002015161026051808202821582848304141761521d57600080fd5b8090509050905061024051808061523357600080fd5b820490509050610280518082101561524a57600080fd5b80820390509050610360526101c0610340516002811061526957600080fd5b60200201516102805181818301101561528157600080fd5b8082019050905060028082049050905061038052615336565b6101c061034051600281106152ae57600080fd5b60200201516101c061034051600281106152c757600080fd5b60200201516102605180820282158284830414176152e457600080fd5b809050905090506102405180806152fa57600080fd5b8204905090508082101561530d57600080fd5b80820390509050610360526101c0610340516002811061532c57600080fd5b6020020151610380525b6102a0610340516002811061534a57600080fd5b6020020180516101406103a0525b6103a0515160206103a051016103a0526103a06103a051101561537a57615358565b610380516103c0526102e0516103e0526103005161040052610320516104205261042051610400516103e0516103c051600658016135ac565b610480526103806103a0525b6103a0515260206103a051036103a0526101406103a0511015156153e2576153bf565b610480516103605180820282158284830414176153fe57600080fd5b809050905090506402540be400808204905090508082101561541f57600080fd5b808203905090508152505b81516001018083528114156151d7575b50506102a0610160516002811061545057600080fd5b6020020151610140610360525b6103605151602061036051016103605261036061036051101561547f5761545d565b6101a05161038052610160516103a0526102a0516103c0526102c0516103e0526102605161040052610400516103e0516103c0516103a0516103805160065801614b34565b61046052610340610360525b61036051526020610360510361036052610140610360511015156154f3576154d0565b610460518082101561550457600080fd5b80820390509050610340526103405160018082101561552257600080fd5b80820390509050610200610160516002811061553d57600080fd5b6020020151808061554d57600080fd5b82049050905060005260005161018051565b61035c6158bb0361035c60003961035c6158bb036000f30000000000000000000000005c2ed810328349100a66b82b78a1791b101c9d61000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e145010000000000000000000000001bfd67037b42cf73acf2047067bd4f2c47d9bfd6000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e14501000000000000000000000000f8a57c1d3b9629b77b6726a042ca48990a84fb4900000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f20000000000000000000000000000000000000000000000000000000004a817c800
Deployed Bytecode
0x600436101561000d5761340e565b600035601c52600051341561002157600080fd5b63f446c1d08114156100505760065801613414565b610140526101405160648082049050905060005260206000f35b6376a2f0f08114156100765760065801613414565b610140526101405160005260206000f35b6376a9cd3e8114156102b2576004358080600081121561009257195b607f1c1561009f57600080fd5b905050602435808060008112156100b257195b607f1c156100bf57600080fd5b9050506402540be400610140526402540be40061016052602061022060246370a082316101a052306101c0526101bc600435600281106100fe57600080fd5b600060c052602060c02001545afa61011557600080fd5b601f3d1161012257600080fd5b600050610220516004356002811061013957600080fd5b600260c052602060c02001548082101561015257600080fd5b808203905090506101406004356002811061016c57600080fd5b6020020151808202821582848304141761018557600080fd5b8090509050905061018052602061024060246370a082316101c052306101e0526101dc602435600281106101b857600080fd5b600060c052602060c02001545afa6101cf57600080fd5b601f3d116101dc57600080fd5b60005061024051602435600281106101f357600080fd5b600260c052602060c02001548082101561020c57600080fd5b808203905090506101406024356002811061022657600080fd5b6020020151808202821582848304141761023f57600080fd5b809050905090506101a0526101405161016051610180516101a051610180516101c0526101a0516101e052600354610200526004546102205261022051610200516101e0516101c051600658016135ac565b610280526101a0526101805261016052610140526102805160005260206000f35b634903b0d181141561034a5760206101c060246370a0823161014052306101605261015c600435600281106102e657600080fd5b600060c052602060c02001545afa6102fd57600080fd5b601f3d1161030a57600080fd5b6000506101c0516004356002811061032157600080fd5b600260c052602060c02001548082101561033a57600080fd5b8082039050905060005260206000f35b63bb7b8b808114156104af57610140516006580161371a565b61016052610180526101405261016080516101a05280602001516101c052506101405161016051610180516101a0516101c05160065801613414565b6101e0526101c0526101a0526101805261016052610140526101e051610200526101405161016051610180516101a0516101c0516101e051610200516101a051610220526101c05161024052610200516102605261026051610240516102205160065801613b34565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c0516101405260206101e060046318160ddd6101805261019c6007545afa61045157600080fd5b601f3d1161045e57600080fd5b6000506101e0516101605261014051670de0b6b3a7640000808202821582848304141761048a57600080fd5b809050905090506101605180806104a057600080fd5b82049050905060005260206000f35b63ed8e84f38114156107745760443560011c156104cb57600080fd5b61014051610160516006580161371a565b610180526101a05261016052610140526101808051610140528060200151610160525061014051610160516101805160065801613414565b6101a0526101805261016052610140526101a051610180526101405161016051610180516101a051610140516101c052610160516101e0526101805161020052610200516101e0516101c05160065801613b34565b610260526101a052610180526101605261014052610260516101a0526101c060006002818352015b604435156105e9576101406101c051600281106105ad57600080fd5b60200201805160046101c051600281106105c657600080fd5b60200201358181830110156105da57600080fd5b80820190509050815250610633565b6101406101c051600281106105fd57600080fd5b60200201805160046101c0516002811061061657600080fd5b60200201358082101561062857600080fd5b808203905090508152505b8151600101808352811415610591575b50506101405161016051610180516101a0516101c051610140516101e0526101605161020052610180516102205261022051610200516101e05160065801613b34565b610280526101c0526101a052610180526101605261014052610280516101c052602061026060046318160ddd6102005261021c6007545afa6106c757600080fd5b601f3d116106d457600080fd5b600050610260516101e05260006102005260443515610712576101c0516101a0518082101561070257600080fd5b8082039050905061020052610733565b6101a0516101c0518082101561072757600080fd5b80820390509050610200525b610200516101e051808202821582848304141761074f57600080fd5b809050905090506101a051808061076557600080fd5b82049050905060005260206000f35b630b4c7e4d81141561078b576000610140526107bc565b63ee22be238114156107b75760643560011c156107a757600080fd5b60206064610140376000506107bc565b61130b565b601754156107c957600080fd5b6001601755601354156107db57600080fd5b6101405160065801613c39565b61014052600050610140516101605160065801613414565b61018052610160526101405261018051610160526101405161016051610180516101a0516006580161371a565b6101c0526101e0526101a0526101805261016052610140526101c080516101805280602001516101a052506007546101c052602061026060046318160ddd6102005261021c6101c0515afa61088157600080fd5b601f3d1161088e57600080fd5b600050610260516101e05260006102005260006101e051181561091d576101405161016051610180516101a0516101c0516101e0516102005161018051610220526101a05161024052610160516102605261026051610240516102205160065801613b34565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c051610200525b61018051610220526101a0516102405261026060006002818352015b6101e05115156109675760006004610260516002811061095857600080fd5b60200201351861096757600080fd5b610220610260516002811061097b57600080fd5b6020020180516004610260516002811061099457600080fd5b60200201358181830110156109a857600080fd5b808201905090508152505b8151600101808352811415610939575b50506101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516102205161028052610240516102a052610160516102c0526102c0516102a0516102805160065801613b34565b61032052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103205161026052610200516102605111610a6057600080fd5b6060366102803760006101e0511815610e8c576102005161026051818183011015610a8a57600080fd5b808201905090506002808204905090506102e05260035460028082028215828483041417610ab757600080fd5b8090509050905060048082049050905061030052600454610320526005546103405260006103605261038060006002818352015b610260516101806103805160028110610b0357600080fd5b60200201518082028215828483041417610b1c57600080fd5b80905090509050610200518080610b3257600080fd5b8204905090506103a0526102206103805160028110610b5057600080fd5b60200201516103c0526103c0516103a0511115610b8c576103a0516103c05180821015610b7c57600080fd5b8082039050905061036052610bad565b6103c0516103a05180821015610ba157600080fd5b80820390509050610360525b6101806103805160028110610bc157600080fd5b60200201516103c051818183011015610bd957600080fd5b808201905090506103e052610140610400525b61040051516020610400510161040052610400610400511015610c0e57610bec565b6103e051610420526102e051610440526103005161046052610320516104805261048051610460516104405161042051600658016135ac565b6104e0526103e0610400525b6104005152602061040051036104005261014061040051101515610c7657610c53565b6104e051610360518082028215828483041417610c9257600080fd5b809050905090506402540be400808204905090506102806103805160028110610cba57600080fd5b60200201526000610340511815610d48576103805160028110610cdc57600080fd5b600260c052602060c0200180546102806103805160028110610cfd57600080fd5b6020020151610340518082028215828483041417610d1a57600080fd5b809050905090506402540be40080820490509050818183011015610d3d57600080fd5b808201905090508155505b6103c0516102806103805160028110610d6057600080fd5b602002015180821015610d7257600080fd5b808203905090506102206103805160028110610d8d57600080fd5b60200201525b8151600101808352811415610aeb575b50506101406103a0525b6103a0515160206103a051016103a0526103a06103a0511015610dcf57610dad565b610220516103c052610240516103e0526101605161040052610400516103e0516103c05160065801613b34565b610460526103806103a0525b6103a0515260206103a051036103a0526101406103a051101515610e2b57610e08565b61046051610380526101e051610380516102005180821015610e4c57600080fd5b808203905090508082028215828483041417610e6757600080fd5b80905090509050610200518080610e7d57600080fd5b8204905090506102c052610e95565b610260516102c0525b6044356102c05110151515610ee9576308c379a06102e0526020610300526014610320527f536c697070616765207363726577656420796f75000000000000000000000000610340526103205060646102fcfd5b610140511561116d576008546102e0526004356103005260006103005118156111685760006004610380527f23b872dd000000000000000000000000000000000000000000000000000000006103a0526103806004806020846103e001018260208501600060045af1505080518201915050336020826103e0010152602081019050306020826103e0010152602081019050610300516020826103e0010152602081019050806103e0526103e090508051602001806104a08284600060045af1610fb257600080fd5b505060206105806104a0516104c06000731bfd67037b42cf73acf2047067bd4f2c47d9bfd65af1610fe257600080fd5b60203d80821115610ff35780610ff5565b815b90509050610560526105608051602001806103208284600060045af161101a57600080fd5b5050600061032051181561106c5761032080602001516000825180602090131561104357600080fd5b809190121561105157600080fd5b806020036101000a8204905090509050151561106c57600080fd5b60006004610380527fe8eda9df000000000000000000000000000000000000000000000000000000006103a0526103806004806020846103e001018260208501600060045af1505080518201915050731bfd67037b42cf73acf2047067bd4f2c47d9bfd66020826103e0010152602081019050610300516020826103e0010152602081019050306020826103e00101526020810190506102e0516020826103e0010152602081019050806103e0526103e090508051602001806104c08284600060045af161113957600080fd5b5050600060006104c0516104e06000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af161116857600080fd5b6111da565b6004356102e05260006102e05118156111da5760206103c060646323b872dd61030052336103205230610340526102e0516103605261031c6000600060c052602060c020545af16111bd57600080fd5b601f3d116111ca57600080fd5b6000506103c0516111da57600080fd5b6024356102e05260006102e051181561124a5760206103c060646323b872dd61030052336103205230610340526102e0516103605261031c60006001600160c052602060c02001545af161122d57600080fd5b601f3d1161123a57600080fd5b6000506103c05161124a57600080fd5b60206103a060446340c10f196103005233610320526102c0516103405261031c60006101c0515af161127b57600080fd5b601f3d1161128857600080fd5b6000506103a050604060046103003761028051610340526102a0516103605261026051610380526101e0516102c0518181830110156112c657600080fd5b808201905090506103a052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c0610300a26102c051600052600060175560206000f35b635e0d443f811415611392576004358080600081121561132757195b607f1c1561133457600080fd5b9050506024358080600081121561134757195b607f1c1561135457600080fd5b905050600435610140526024356101605260443561018052610180516101605161014051600658016142ce565b6101e0526101e05160005260206000f35b6307211ef781141561141957600435808060008112156113ae57195b607f1c156113bb57600080fd5b905050602435808060008112156113ce57195b607f1c156113db57600080fd5b905050600435610140526024356101605260443561018052610180516101605161014051600658016142ce565b6101e0526101e05160005260206000f35b633df02124811415611655576017541561143257600080fd5b60016017556004358080600081121561144757195b607f1c1561145457600080fd5b9050506024358080600081121561146757195b607f1c1561147457600080fd5b9050506101405160043561016052602435610180526044356101a0526101a051610180516101605160065801614688565b61020052610140526102005161014052606435610140511015151561152e576308c379a061016052602061018052602e6101a0527f45786368616e676520726573756c74656420696e20666577657220636f696e736101c0527f207468616e2065787065637465640000000000000000000000000000000000006101e0526101a050608461017cfd5b602061022060646323b872dd610160523361018052306101a0526044356101c05261017c60006004356002811061156457600080fd5b600060c052602060c02001545af161157b57600080fd5b601f3d1161158857600080fd5b6000506102205161159857600080fd5b6020610200604463a9059cbb610160523361018052610140516101a05261017c6000602435600281106115ca57600080fd5b600060c052602060c02001545af16115e157600080fd5b601f3d116115ee57600080fd5b600050610200516115fe57600080fd5b60043561016052604435610180526024356101a052610140516101c052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610160a261014051600052600060175560206000f35b63a6417ed6811415611b09576017541561166e57600080fd5b60016017556004358080600081121561168357195b607f1c1561169057600080fd5b905050602435808060008112156116a357195b607f1c156116b057600080fd5b9050506101405160043561016052602435610180526044356101a0526101a051610180516101605160065801614688565b61020052610140526102005161014052606435610140511015151561176a576308c379a061016052602061018052602e6101a0527f45786368616e676520726573756c74656420696e20666577657220636f696e736101c0527f207468616e2065787065637465640000000000000000000000000000000000006101e0526101a050608461017cfd5b6004356002811061177a57600080fd5b600160c052602060c0200154610160526024356002811061179a57600080fd5b600160c052602060c02001546101805260006004610200527f23b872dd000000000000000000000000000000000000000000000000000000006102205261020060048060208461026001018260208501600060045af15050805182019150503360208261026001015260208101905030602082610260010152602081019050604435602082610260010152602081019050806102605261026090508051602001806103208284600060045af161184f57600080fd5b50506020610400610320516103406000610160515af161186e57600080fd5b60203d8082111561187f5780611881565b815b905090506103e0526103e08051602001806101a08284600060045af16118a657600080fd5b505060006101a05118156118f8576101a08060200151600082518060209013156118cf57600080fd5b80919012156118dd57600080fd5b806020036101000a820490509050905015156118f857600080fd5b731bfd67037b42cf73acf2047067bd4f2c47d9bfd6610160511415611a4a5760006004610200527fe8eda9df000000000000000000000000000000000000000000000000000000006102205261020060048060208461026001018260208501600060045af15050805182019150506101605160208261026001015260208101905060443560208261026001015260208101905030602082610260010152602081019050600854602082610260010152602081019050806102605261026090508051602001806103408284600060045af16119d157600080fd5b505060006000610340516103606000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af1611a0057600080fd5b60206102a0604463a9059cbb610200523361022052610140516102405261021c6000610180515af1611a3157600080fd5b601f3d11611a3e57600080fd5b6000506102a050611ab2565b738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf3b611a6957600080fd5b6000600060646369328dec6102005261018051610220526101405161024052336102605261021c6000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af1611ab257600080fd5b6004356102005260443561022052602435610240526101405161026052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b6080610200a261014051600052600060175560206000f35b635b36389c811415611b2057600061014052611b51565b63269b5581811415611b4c5760643560011c15611b3c57600080fd5b6020606461014037600050611b51565b611ebb565b60175415611b5e57600080fd5b60016017556013541515611b81576101405160065801613c39565b610140526000505b6101405161016051610180516006580161371a565b6101a0526101c0526101805261016052610140526101a0805161016052806020015161018052506007546101a052602061024060046318160ddd6101e0526101fc6101a0515afa611be657600080fd5b601f3d11611bf357600080fd5b600050610240516101c052602061028060446379cc67906101e0523361020052600435610220526101fc60006101a0515af1611c2e57600080fd5b601f3d11611c3b57600080fd5b600050610280506101e060006002818352015b6101606101e05160028110611c6257600080fd5b60200201516004358082028215828483041417611c7e57600080fd5b809050905090506101c0518080611c9457600080fd5b8204905090506102005260246101e05160028110611cb157600080fd5b60200201356102005110151515611d2c576308c379a0610220526020610240526030610260527f5769746864726177616c20726573756c74656420696e20666577657220636f69610280527f6e73207468616e206578706563746564000000000000000000000000000000006102a05261026050608461023cfd5b610200516101606101e05160028110611d4457600080fd5b60200201526101405115611d5c576101e05115611d5f565b60005b15611dd857738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf3b611d8357600080fd5b6000600060646369328dec61022052600160c052602060c02054610240526102005161026052336102805261023c6000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af1611dd357600080fd5b611e3f565b60206102c0604463a9059cbb610220523361024052610200516102605261023c60006101e05160028110611e0b57600080fd5b600060c052602060c02001545af1611e2257600080fd5b601f3d11611e2f57600080fd5b6000506102c051611e3f57600080fd5b8151600101808352811415611c4e575b5050610160516101e0526101805161020052604036610220376101c05160043580821015611e7c57600080fd5b8082039050905061026052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a06101e0a260006017556040610160f35b63e3103273811415611ed257600061014052611f03565b63e1df4f63811415611efe5760643560011c15611eee57600080fd5b6020606461014037600050611f03565b6127bc565b60175415611f1057600080fd5b600160175560135415611f2257600080fd5b6101405160065801613c39565b61014052600050610140516101605160065801613414565b61018052610160526101405261018051610160526101405161016051610180516101a0516006580161371a565b6101c0526101e0526101a0526101805261016052610140526101c080516101805280602001516101a052506101405161016051610180516101a0516101c051610180516101e0526101a05161020052610160516102205261022051610200516101e05160065801613b34565b610280526101c0526101a052610180526101605261014052610280516101c052610180516101e0526101a0516102005261022060006002818352015b6101e0610220516002811061203057600080fd5b6020020180516004610220516002811061204957600080fd5b60200201358082101561205b57600080fd5b808203905090508152505b815160010180835281141561201c575b50506101405161016051610180516101a0516101c0516101e05161020051610220516101e051610240526102005161026052610160516102805261028051610260516102405160065801613b34565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e051610220526101c0516102205181818301101561210857600080fd5b808201905090506002808204905090506102405260075461026052602061030060046318160ddd6102a0526102bc610260515afa61214557600080fd5b601f3d1161215257600080fd5b60005061030051610280526000610280511861216d57600080fd5b6003546002808202821582848304141761218657600080fd5b809050905090506004808204905090506102a0526004546102c0526005546102e0526040366103003761034060006002818352015b6102205161018061034051600281106121d357600080fd5b602002015180820282158284830414176121ec57600080fd5b809050905090506101c051808061220257600080fd5b820490509050610360526101e0610340516002811061222057600080fd5b60200201516103805260006103a052610380516103605111156122625761036051610380518082101561225257600080fd5b808203905090506103a052612283565b61038051610360518082101561227757600080fd5b808203905090506103a0525b61038051610180610340516002811061229b57600080fd5b60200201518181830110156122af57600080fd5b808201905090506103c0526101406103e0525b6103e0515160206103e051016103e0526103e06103e05110156122e4576122c2565b6103c0516104005261024051610420526102a051610440526102c0516104605261046051610440516104205161040051600658016135ac565b6104c0526103c06103e0525b6103e0515260206103e051036103e0526101406103e05110151561234c57612329565b6104c0516103a051808202821582848304141761236857600080fd5b809050905090506402540be40080820490509050610300610340516002811061239057600080fd5b602002015260006102e051181561241e5761034051600281106123b257600080fd5b600260c052602060c02001805461030061034051600281106123d357600080fd5b60200201516102e05180820282158284830414176123f057600080fd5b809050905090506402540be4008082049050905081818301101561241357600080fd5b808201905090508155505b6101e0610340516002811061243257600080fd5b602002018051610300610340516002811061244c57600080fd5b60200201518082101561245e57600080fd5b808203905090508152505b81516001018083528114156121bb575b5050610140610360525b610360515160206103605101610360526103606103605110156124a557612483565b6101e05161038052610200516103a052610160516103c0526103c0516103a0516103805160065801613b34565b61042052610340610360525b6103605152602061036051036103605261014061036051101515612501576124de565b61042051610340526101c051610340518082101561251e57600080fd5b8082039050905061028051808202821582848304141761253d57600080fd5b809050905090506101c051808061255357600080fd5b820490509050610360526000610360511861256d57600080fd5b60443561036051111515156125c1576308c379a06103805260206103a05260146103c0527f536c697070616765207363726577656420796f750000000000000000000000006103e0526103c050606461039cfd5b602061042060446379cc679061038052336103a052610360516103c05261039c6000610260515af16125f257600080fd5b601f3d116125ff57600080fd5b6000506104205061038060006002818352015b6004610380516002811061262557600080fd5b60200201356103a05260006103a051181561273057610140511561264d576103805115612650565b60005b156126c957738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf3b61267457600080fd5b6000600060646369328dec6103c052600160c052602060c020546103e0526103a0516104005233610420526103dc6000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af16126c457600080fd5b612730565b6020610460604463a9059cbb6103c052336103e0526103a051610400526103dc600061038051600281106126fc57600080fd5b600060c052602060c02001545af161271357600080fd5b601f3d1161272057600080fd5b6000506104605161273057600080fd5b8151600101808352811415612612575b50506040600461038037610300516103c052610320516103e052610220516104005261028051610360518082101561277757600080fd5b8082039050905061042052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c0610380a261036051600052600060175560206000f35b63cc2b27d781141561281857602435808060008112156127d857195b607f1c156127e557600080fd5b9050506004356101405260243561016052610160516101405160065801614e94565b6101c0526101c05160005260206000f35b631a4d01d281141561282f57600061014052612860565b63517a55a381141561285b5760643560011c1561284b57600080fd5b6020606461014037600050612860565b612ac2565b6017541561286d57600080fd5b60016017556024358080600081121561288257195b607f1c1561288f57600080fd5b9050506013541561289f57600080fd5b6101405160065801613c39565b610140526000506101405161016051600435610180526024356101a0526101a0516101805160065801614e94565b61020052610160526101405261020051610160526044356101605110151515612942576308c379a06101805260206101a05260186101c0527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006101e0526101c050606461019cfd5b602061022060446379cc679061018052336101a0526004356101c05261019c60006007545af161297157600080fd5b601f3d1161297e57600080fd5b600050610220506101405115612997576024351561299a565b60005b15612a1357738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf3b6129be57600080fd5b6000600060646369328dec61018052600160c052602060c020546101a052610160516101c052336101e05261019c6000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af1612a0e57600080fd5b612a79565b6020610220604463a9059cbb61018052336101a052610160516101c05261019c600060243560028110612a4557600080fd5b600060c052602060c02001545af1612a5c57600080fd5b601f3d11612a6957600080fd5b60005061022051612a7957600080fd5b60043561018052610160516101a052337f9e96dd3b997a2a257eec4df9bb6eaf626e206df5f543bd963682d143300be3106040610180a261016051600052600060175560206000f35b633c157e64811415612c63576006543314612adc57600080fd5b600b5462015180818183011015612af257600080fd5b80820190509050421015612b0557600080fd5b4262015180818183011015612b1957600080fd5b808201905090506024351015612b2e57600080fd5b6101405160065801613414565b6101605261014052610160516101405260043560648082028215828483041417612b6457600080fd5b809050905090506101605260006004351115612b8757620f424060043510612b8a565b60005b612b9357600080fd5b61014051610160511015612bd6576101405161016051600a8082028215828483041417612bbf57600080fd5b809050905090501015612bd157600080fd5b612c06565b61014051600a8082028215828483041417612bf057600080fd5b80905090509050610160511115612c0657600080fd5b6101405160095561016051600a5542600b55602435600c556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a6588811415612ce6576006543314612c7d57600080fd5b6101405160065801613414565b610160526101405261016051610140526101405160095561014051600a5542600b5542600c55610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b630746dd5a811415612de5576006543314612d0057600080fd5b600d5415612d0d57600080fd5b64012a05f2006004351115612d2157600080fd5b6402540be4006024351115612d3557600080fd5b6802b5e3af16b18800006044356004358082028215828483041417612d5957600080fd5b809050905090501115612d6b57600080fd5b426203f480818183011015612d7f57600080fd5b808201905090506101405261014051600d55600435600f5560243560105560443560115560043561016052602435610180526044356101a052610140517fe347cde074ab87e09449fa2b03e8f2cf79094cb1265f4c914365d2247d4147a36060610160a2005b634f12fe97811415612e8d576006543314612dff57600080fd5b600d54421015612e0e57600080fd5b6000600d5418612e1d57600080fd5b6000600d55600f54610140526010546101605260115461018052610140516003556101605160055561018051600455610140516101a052610160516101c052610180516101e0527fcfca96e0fef3432146913b2a5a2268a55d3f475fe057e7ffde1082b77693f4f360606101a0a1005b63226840fb811415612eae576006543314612ea757600080fd5b6000600d55005b636b441a40811415612f405760043560a01c15612eca57600080fd5b6006543314612ed857600080fd5b600e5415612ee557600080fd5b426203f480818183011015612ef957600080fd5b808201905090506101405261014051600e55600435601255600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae811415612fb7576006543314612f5a57600080fd5b600e54421015612f6957600080fd5b6000600e5418612f7857600080fd5b6000600e556012546101405261014051600655610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf193811415612fd8576006543314612fd157600080fd5b6000600e55005b6330c540858114156130c8576006543314612ff257600080fd5b61014060006002818352015b610140516002811061300f57600080fd5b600260c052602060c02001546101605260006101605118156130b4576020610220604463a9059cbb610180526016546101a052610160516101c05261019c6000610140516002811061306057600080fd5b600060c052602060c02001545af161307757600080fd5b601f3d1161308457600080fd5b6000506102205161309457600080fd5b600061014051600281106130a757600080fd5b600260c052602060c02001555b8151600101808352811415612ffe575b5050005b63524c39018114156130fa5760065433146130e257600080fd5b600260c052602060c020600081556000600182015550005b63e369885381141561312957600654331461311457600080fd5b426014541161312257600080fd5b6001601355005b633046f97281141561314a57600654331461314357600080fd5b6000601355005b63b6aa64c581141561317d57600654331461316457600080fd5b620100006004351061317557600080fd5b600435600855005b63c51b88618114156131af5760043560a01c1561319957600080fd5b60065433146131a757600080fd5b600435601555005b637242e5248114156131e15760043560a01c156131cb57600080fd5b60065433146131d957600080fd5b600435601655005b63c661065781141561321257600435600281106131fd57600080fd5b600060c052602060c020015460005260206000f35b63b9947eb0811415613243576004356002811061322e57600080fd5b600160c052602060c020015460005260206000f35b63e2e7d264811415613274576004356002811061325f57600080fd5b600260c052602060c020015460005260206000f35b63ddca3f4381141561328c5760035460005260206000f35b638edfdd5f8114156132a45760045460005260206000f35b63fee3f7f98114156132bc5760055460005260206000f35b638da5cb5b8114156132d45760065460005260206000f35b6382c630668114156132ec5760075460005260206000f35b635409491a8114156133045760095460005260206000f35b63b4b577ad81141561331c57600a5460005260206000f35b632081066c81141561333457600b5460005260206000f35b631405228881141561334c57600c5460005260206000f35b63405e28f881141561336457600d5460005260206000f35b63e0a0b58681141561337c57600e5460005260206000f35b6358680d0b81141561339457600f5460005260206000f35b63e38244628114156133ac5760105460005260206000f35b631e4c4ef88114156133c45760115460005260206000f35b631ec0cdc18114156133dc5760125460005260206000f35b63b618ba628114156133f45760155460005260206000f35b636e42e4d281141561340c5760165460005260206000f35b505b60006000fd5b61014052600c5461016052600a54610180526101605142101561359a576009546101a052600b546101c0526101a0516101805111156134f4576101a051610180516101a0518082101561346657600080fd5b80820390509050426101c0518082101561347f57600080fd5b80820390509050808202821582848304141761349a57600080fd5b80905090509050610160516101c051808210156134b657600080fd5b8082039050905080806134c857600080fd5b8204905090508181830110156134dd57600080fd5b808201905090506000526000516101405156613595565b6101a0516101a051610180518082101561350d57600080fd5b80820390509050426101c0518082101561352657600080fd5b80820390509050808202821582848304141761354157600080fd5b80905090509050610160516101c0518082101561355d57600080fd5b80820390509050808061356f57600080fd5b8204905090508082101561358257600080fd5b8082039050905060005260005161014051565b6135aa565b6101805160005260005161014051565b005b6101c0526101405261016052610180526101a0526402540be4006101a0511115156135e557610180516000526000516101c05156613718565b61014051610160518181830110156135fc57600080fd5b808201905090506101e0526101e080516101e051808202821582848304141761362457600080fd5b809050905090508152506101a05161018051808202821582848304141761364a57600080fd5b809050905090506101a0516402540be4008082101561366857600080fd5b808203905090506004808202821582848304141761368557600080fd5b809050905090506101405180820282158284830414176136a457600080fd5b809050905090506101605180820282158284830414176136c357600080fd5b809050905090506101e05180806136d957600080fd5b8204905090506402540be4008181830110156136f457600080fd5b80820190509050808061370657600080fd5b8204905090506000526000516101c051565b005b61014052604036610160376101a060006002818352015b602061024060246370a082316101c052306101e0526101dc6101a0516002811061375a57600080fd5b600060c052602060c02001545afa61377157600080fd5b601f3d1161377e57600080fd5b600050610240516101a0516002811061379657600080fd5b600260c052602060c0200154808210156137af57600080fd5b808203905090506101606101a051600281106137ca57600080fd5b60200201525b8151600101808352811415613731575b505060406101a0525b60006101a0511115156137fb57613817565b60206101a05103610160015160206101a051036101a0526137e9565b61014051565b6101a05261014052610160526101805260006101c05261020060006002818352015b6020610200510261014001516101e0526101c080516101e05181818301101561386757600080fd5b808201905090508152505b815160010180835281141561383f575b50506101c051151561389c5760006000526000516101a051565b60006101e0526101c0516102005261018051600280820282158284830414176138c457600080fd5b8090509050905061022052610240600060ff818352015b61020051610260526102a060006002818352015b60206102a051026101400151610280526102605161020051808202821582848304141761391b57600080fd5b80905090509050610280516002808202821582848304141761393c57600080fd5b80905090509050600181818301101561395457600080fd5b80820190509050808061396657600080fd5b820490509050610260525b81516001018083528114156138ef575b5050610200516101e052610220516101c05180820282158284830414176139a757600080fd5b8090509050905060648082049050905061026051600280820282158284830414176139d157600080fd5b809050905090508181830110156139e757600080fd5b80820190509050610200518082028215828483041417613a0657600080fd5b8090509050905061022051606480821015613a2057600080fd5b80820390509050610200518082028215828483041417613a3f57600080fd5b809050905090506064808204905090506003610260518082028215828483041417613a6957600080fd5b80905090509050818183011015613a7f57600080fd5b808201905090508080613a9157600080fd5b820490509050610200526101e051610200511115613ae5576001610200516101e05180821015613ac057600080fd5b80820390509050111515613ae0576102005160005250506000516101a051565b613b1c565b60016101e0516102005180821015613afc57600080fd5b80820390509050111515613b1c576102005160005250506000516101a051565b81516001018083528114156138db575b505060006000fd5b6101a0526101405261016052610180526402540be4006101c0526402540be4006101e05261020060006002818352015b6101c06102005160028110613b7857600080fd5b6020020180516101406102005160028110613b9257600080fd5b60200201518082028215828483041417613bab57600080fd5b809050905090508152505b8151600101808352811415613b64575b50506101405161016051610180516101a0516101c0516101e0516101c051610200526101e0516102205261018051610240526102405161022051610200516006580161381d565b6102a0526101e0526101c0526101a0526101805261016052610140526102a0516000526000516101a051565b61014052601554610160526000610160511815613e5457600060046101e0527f3111e7b300000000000000000000000000000000000000000000000000000000610200526101e060048060208461024001018260208501600060045af150508051820191505060606020826102400101526020810190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602082610240010152602081019050306020826102400101526020810190506001602082610240010152602081019050600060c052602060c02054602082610240010152602081019050806102405261024090508051602001806103408284600060045af1613d3f57600080fd5b5050602061046061034051610360600073357d51124f59836ded84c8a1730d72b749d8bc235af1613d6f57600080fd5b60203d80821115613d805780613d82565b815b90509050610440526104408051602001806101808284600060045af1613da757600080fd5b5050610180806020015160008251806020901315613dc457600080fd5b8091901215613dd257600080fd5b806020036101000a82049050905090506101e05260006101e0511115613e545760206102a0604463a9059cbb6102005261016051610220526101e0516102405261021c6000730d500b1d8e8ef31e21c99d1db9a6444d3adf12705af1613e3757600080fd5b601f3d11613e4457600080fd5b6000506102a051613e5457600080fd5b61014051565b6101e0526101405261016052610180526101a0526101c052610160516101405118613e8457600080fd5b6000610160511215613e9557600080fd5b60026101605112613ea557600080fd5b6000610140511215613eb657600080fd5b60026101405112613ec657600080fd5b6101405161016051610180516101a0516101c0516101e0516102005160065801613414565b61022052610200526101e0526101c0526101a05261018052610160526101405261022051610200526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c0516102605261020051610280526102805161026051610240516006580161381d565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e051610220526102005160028082028215828483041417613fa657600080fd5b80905090509050610240526102205161026052606036610280376102e060006002818352015b610140516102e0511415613fe757610180516102a05261401c565b610160516102e0511815614017576101a06102e0516002811061400957600080fd5b60200201516102a05261401c565b614098565b61028080516102a05181818301101561403457600080fd5b808201905090508152506102605161022051808202821582848304141761405a57600080fd5b809050905090506102a0516002808202821582848304141761407b57600080fd5b80905090509050808061408d57600080fd5b820490509050610260525b8151600101808352811415613fcc575b5050610260516102205180820282158284830414176140c657600080fd5b80905090509050606480820282158284830414176140e357600080fd5b80905090509050610240516002808202821582848304141761410457600080fd5b80905090509050808061411657600080fd5b8204905090506102605261028051610220516064808202821582848304141761413e57600080fd5b8090509050905061024051808061415457600080fd5b82049050905081818301101561416957600080fd5b808201905090506102e0526102205161030052610320600060ff818352015b610300516102c052610300516103005180820282158284830414176141ac57600080fd5b80905090509050610260518181830110156141c657600080fd5b8082019050905060026103005180820282158284830414176141e757600080fd5b809050905090506102e05181818301101561420157600080fd5b80820190509050610220518082101561421957600080fd5b80820390509050808061422b57600080fd5b820490509050610300526102c05161030051111561427f576001610300516102c0518082101561425a57600080fd5b8082039050905011151561427a576103005160005250506000516101e051565b6142b6565b60016102c051610300518082101561429657600080fd5b808203905090501115156142b6576103005160005250506000516101e051565b8151600101808352811415614188575b505060006000fd5b6101a0526101405261016052610180526101405161016051610180516101a0516101c0516101e0516006580161371a565b61020052610220526101e0526101c0526101a05261018052610160526101405261020080516101c05280602001516101e052506402540be400610200526402540be4006102205261024060006002818352015b6101c0610240516002811061436657600080fd5b602002018051610200610240516002811061438057600080fd5b6020020151808202821582848304141761439957600080fd5b809050905090508152505b8151600101808352811415614352575b50506101c061014051600281106143ca57600080fd5b60200201516101805161020061014051600281106143e757600080fd5b6020020151808202821582848304141761440057600080fd5b8090509050905081818301101561441657600080fd5b80820190509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101405161028052610160516102a052610240516102c0526101c0516102e0526101e05161030052610300516102e0516102c0516102a0516102805160065801613e5a565b61036052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036051610260526101c061016051600281106144d657600080fd5b602002015161026051808210156144ec57600080fd5b80820390509050610200610160516002811061450757600080fd5b6020020151808061451757600080fd5b820490509050610280526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516101c0610140516002811061456557600080fd5b60200201516102405181818301101561457d57600080fd5b808201905090506002808204905090506102c0526101c061016051600281106145a557600080fd5b6020020151610260518181830110156145bd57600080fd5b808201905090506002808204905090506102e052600354610300526004546103205261032051610300516102e0516102c051600658016135ac565b610380526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103805161028051808202821582848304141761464857600080fd5b809050905090506402540be400808204905090506102a052610280516102a0518082101561467557600080fd5b808203905090506000526000516101a051565b6101a052610140526101605261018052601354156146a557600080fd5b6101405161016051610180516101a05160065801613c39565b6101a0526101805261016052610140526000506101405161016051610180516101a0516101c0516101e0516006580161371a565b61020052610220526101e0526101c0526101a05261018052610160526101405261020080516101c05280602001516101e052506402540be400610200526402540be4006102205261024060006002818352015b6101c0610240516002811061475957600080fd5b602002018051610200610240516002811061477357600080fd5b6020020151808202821582848304141761478c57600080fd5b809050905090508152505b8151600101808352811415614745575b50506101c061014051600281106147bd57600080fd5b60200201516101805161020061014051600281106147da57600080fd5b602002015180820282158284830414176147f357600080fd5b8090509050905081818301101561480957600080fd5b80820190509050610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516101405161028052610160516102a052610240516102c0526101c0516102e0526101e05161030052610300516102e0516102c0516102a0516102805160065801613e5a565b61036052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036051610260526101c061016051600281106148c957600080fd5b602002015161026051808210156148df57600080fd5b8082039050905061028052610280516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516101c0610140516002811061493257600080fd5b60200201516102405181818301101561494a57600080fd5b808201905090506002808204905090506102c0526101c0610160516002811061497257600080fd5b60200201516102605181818301101561498a57600080fd5b808201905090506002808204905090506102e052600354610300526004546103205261032051610300516102e0516102c051600658016135ac565b610380526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380518082028215828483041417614a1157600080fd5b809050905090506402540be400808204905090506102a0526005546102c05260006102c0511815614ae2576102a0516102c0518082028215828483041417614a5857600080fd5b809050905090506402540be400808204905090506102e05260006102e0511815614ae2576101605160028110614a8d57600080fd5b600260c052602060c0200180546102e0516102006101605160028110614ab257600080fd5b60200201518080614ac257600080fd5b820490509050818183011015614ad757600080fd5b808201905090508155505b610280516102a05180821015614af757600080fd5b808203905090506102006101605160028110614b1257600080fd5b60200201518080614b2257600080fd5b8204905090506000526000516101a051565b6101e0526101405261016052610180526101a0526101c0526000610160511215614b5d57600080fd5b60026101605112614b6d57600080fd5b6101405160028082028215828483041417614b8757600080fd5b80905090509050610200526101c05161022052606036610240376102a060006002818352015b610160516102a0511815614bdd576101806102a05160028110614bcf57600080fd5b602002015161026052614be2565b614c5e565b610240805161026051818183011015614bfa57600080fd5b80820190509050815250610220516101c0518082028215828483041417614c2057600080fd5b809050905090506102605160028082028215828483041417614c4157600080fd5b809050905090508080614c5357600080fd5b820490509050610220525b8151600101808352811415614bad575b5050610220516101c0518082028215828483041417614c8c57600080fd5b8090509050905060648082028215828483041417614ca957600080fd5b809050905090506102005160028082028215828483041417614cca57600080fd5b809050905090508080614cdc57600080fd5b82049050905061022052610240516101c05160648082028215828483041417614d0457600080fd5b80905090509050610200518080614d1a57600080fd5b820490509050818183011015614d2f57600080fd5b808201905090506102a0526101c0516102c0526102e0600060ff818352015b6102c051610280526102c0516102c0518082028215828483041417614d7257600080fd5b8090509050905061022051818183011015614d8c57600080fd5b8082019050905060026102c0518082028215828483041417614dad57600080fd5b809050905090506102a051818183011015614dc757600080fd5b808201905090506101c05180821015614ddf57600080fd5b808203905090508080614df157600080fd5b8204905090506102c052610280516102c0511115614e455760016102c0516102805180821015614e2057600080fd5b80820390509050111515614e40576102c05160005250506000516101e051565b614e7c565b6001610280516102c05180821015614e5c57600080fd5b80820390509050111515614e7c576102c05160005250506000516101e051565b8151600101808352811415614d4e575b505060006000fd5b6101805261014052610160526101405161016051610180516101a05160065801613414565b6101c0526101a0526101805261016052610140526101c0516101a0526101405161016051610180516101a0516101c0516101e0516006580161371a565b61020052610220526101e0526101c0526101a05261018052610160526101405261020080516101c05280602001516101e052506402540be400610200526402540be4006102205261024060006002818352015b6101c06102405160028110614f5d57600080fd5b6020020180516102006102405160028110614f7757600080fd5b60200201518082028215828483041417614f9057600080fd5b809050905090508152505b8151600101808352811415614f49575b50506101405161016051610180516101a0516101c0516101e0516102005161022051610240516101c051610260526101e051610280526101a0516102a0526102a05161028051610260516006580161381d565b610300526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103005161024052610240516101405161024051808202821582848304141761504e57600080fd5b8090509050905060206102e060046318160ddd6102805261029c6007545afa61507657600080fd5b601f3d1161508357600080fd5b6000506102e051808061509557600080fd5b820490509050808210156150a857600080fd5b80820390509050610260526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516101a0516102a052610160516102c0526101c0516102e0526101e05161030052610260516103205261032051610300516102e0516102c0516102a05160065801614b34565b6103805261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261038051610280526101c0516102a0526101e0516102c052610240516102605181818301101561518357600080fd5b808201905090506004808204905090506102e052600354600280820282158284830414176151b057600080fd5b80905090509050600480820490509050610300526004546103205261034060006002818352015b604036610360376101605161034051141561529a576101c0610340516002811061520057600080fd5b602002015161026051808202821582848304141761521d57600080fd5b8090509050905061024051808061523357600080fd5b820490509050610280518082101561524a57600080fd5b80820390509050610360526101c0610340516002811061526957600080fd5b60200201516102805181818301101561528157600080fd5b8082019050905060028082049050905061038052615336565b6101c061034051600281106152ae57600080fd5b60200201516101c061034051600281106152c757600080fd5b60200201516102605180820282158284830414176152e457600080fd5b809050905090506102405180806152fa57600080fd5b8204905090508082101561530d57600080fd5b80820390509050610360526101c0610340516002811061532c57600080fd5b6020020151610380525b6102a0610340516002811061534a57600080fd5b6020020180516101406103a0525b6103a0515160206103a051016103a0526103a06103a051101561537a57615358565b610380516103c0526102e0516103e0526103005161040052610320516104205261042051610400516103e0516103c051600658016135ac565b610480526103806103a0525b6103a0515260206103a051036103a0526101406103a0511015156153e2576153bf565b610480516103605180820282158284830414176153fe57600080fd5b809050905090506402540be400808204905090508082101561541f57600080fd5b808203905090508152505b81516001018083528114156151d7575b50506102a0610160516002811061545057600080fd5b6020020151610140610360525b6103605151602061036051016103605261036061036051101561547f5761545d565b6101a05161038052610160516103a0526102a0516103c0526102c0516103e0526102605161040052610400516103e0516103c0516103a0516103805160065801614b34565b61046052610340610360525b61036051526020610360510361036052610140610360511015156154f3576154d0565b610460518082101561550457600080fd5b80820390509050610340526103405160018082101561552257600080fd5b80820390509050610200610160516002811061553d57600080fd5b6020020151808061554d57600080fd5b8204905090506000526000516101805156
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005c2ed810328349100a66b82b78a1791b101c9d61000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e145010000000000000000000000001bfd67037b42cf73acf2047067bd4f2c47d9bfd6000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e14501000000000000000000000000f8a57c1d3b9629b77b6726a042ca48990a84fb4900000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f20000000000000000000000000000000000000000000000000000000004a817c800
-----Decoded View---------------
Arg [0] : _coins (address[2]): 0x5c2ed810328349100A66B82b78a1791B101C9D61,0xDBf31dF14B66535aF65AaC99C32e9eA844e14501
Arg [1] : _underlying_coins (address[2]): 0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6,0xDBf31dF14B66535aF65AaC99C32e9eA844e14501
Arg [2] : _pool_token (address): 0xf8a57c1d3b9629b77b6726a042ca48990A84Fb49
Arg [3] : _A (uint256): 200
Arg [4] : _fee (uint256): 4000000
Arg [5] : _admin_fee (uint256): 5000000000
Arg [6] : _offpeg_fee_multiplier (uint256): 20000000000
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c2ed810328349100a66b82b78a1791b101c9d61
Arg [1] : 000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e14501
Arg [2] : 0000000000000000000000001bfd67037b42cf73acf2047067bd4f2c47d9bfd6
Arg [3] : 000000000000000000000000dbf31df14b66535af65aac99c32e9ea844e14501
Arg [4] : 000000000000000000000000f8a57c1d3b9629b77b6726a042ca48990a84fb49
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [6] : 00000000000000000000000000000000000000000000000000000000003d0900
Arg [7] : 000000000000000000000000000000000000000000000000000000012a05f200
Arg [8] : 00000000000000000000000000000000000000000000000000000004a817c800
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.