ETH Price: $2,440.50 (-1.89%)

Contract

0xBf7CCD6C446acfcc5dF023043f2167B62E81899b
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Remove_liquidity...184639152023-10-30 15:38:47343 days ago1698680327IN
0xBf7CCD6C...62E81899b
0 ETH0.0073260530.76831512
Exchange178431892023-08-04 17:44:59430 days ago1691171099IN
0xBf7CCD6C...62E81899b
0 ETH0.0050465930.023018
Exchange176076532023-07-02 16:57:11463 days ago1688317031IN
0xBf7CCD6C...62E81899b
0 ETH0.0031104715.9855934
Exchange173945502023-06-02 17:33:23493 days ago1685727203IN
0xBf7CCD6C...62E81899b
0 ETH0.0071322336.64997506
Remove_liquidity158657002022-10-31 4:38:59708 days ago1667191139IN
0xBf7CCD6C...62E81899b
0 ETH0.000754776
Remove_liquidity157755282022-10-18 14:16:23720 days ago1666102583IN
0xBf7CCD6C...62E81899b
0 ETH0.0035795728.45
Exchange154375882022-08-30 1:42:01770 days ago1661823721IN
0xBf7CCD6C...62E81899b
0 ETH0.0042228822.12
Remove_liquidity...154375172022-08-30 1:23:09770 days ago1661822589IN
0xBf7CCD6C...62E81899b
0 ETH0.0071431230
Remove_liquidity...151130682022-07-10 5:43:44820 days ago1657431824IN
0xBf7CCD6C...62E81899b
0 ETH0.001238015.2
Remove_liquidity148424472022-05-25 14:43:34866 days ago1653489814IN
0xBf7CCD6C...62E81899b
0 ETH0.0045103841.56425026
Remove_liquidity143789762022-03-13 14:59:31939 days ago1647183571IN
0xBf7CCD6C...62E81899b
0 ETH0.0038908835.8
Remove_liquidity143446372022-03-08 6:36:51944 days ago1646721411IN
0xBf7CCD6C...62E81899b
0 ETH0.00293423.35471048
Remove_liquidity142281162022-02-18 5:12:59962 days ago1645161179IN
0xBf7CCD6C...62E81899b
0 ETH0.0052758742
Remove_liquidity141500382022-02-06 3:28:04975 days ago1644118084IN
0xBf7CCD6C...62E81899b
0 ETH0.0090212971.7
Remove_liquidity...132300582021-09-15 11:32:111118 days ago1631705531IN
0xBf7CCD6C...62E81899b
0 ETH0.0092855839
Remove_liquidity...132277532021-09-15 2:56:321119 days ago1631674592IN
0xBf7CCD6C...62E81899b
0 ETH0.0156895871
Remove_liquidity...132276922021-09-15 2:41:261119 days ago1631673686IN
0xBf7CCD6C...62E81899b
0 ETH0.0169053871
Remove_liquidity130606512021-08-20 6:48:321144 days ago1629442112IN
0xBf7CCD6C...62E81899b
0 ETH0.0032716326
Remove_liquidity130047452021-08-11 15:43:301153 days ago1628696610IN
0xBf7CCD6C...62E81899b
0 ETH0.0104430683
Remove_liquidity...129730882021-08-06 18:43:411158 days ago1628275421IN
0xBf7CCD6C...62E81899b
0 ETH0.0132616860
Remove_liquidity129615422021-08-04 23:19:131160 days ago1628119153IN
0xBf7CCD6C...62E81899b
0 ETH0.0069391870.4
Remove_liquidity129387762021-08-01 9:14:441163 days ago1627809284IN
0xBf7CCD6C...62E81899b
0 ETH0.0017926218.2
Remove_liquidity129198712021-07-29 9:17:071166 days ago1627550227IN
0xBf7CCD6C...62E81899b
0 ETH0.0022760823.1
Remove_liquidity...129187722021-07-29 5:00:201166 days ago1627534820IN
0xBf7CCD6C...62E81899b
0 ETH0.0050495123
Remove_liquidity129121602021-07-28 3:50:031168 days ago1627444203IN
0xBf7CCD6C...62E81899b
0 ETH0.0040475435
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.1.0b17

Optimization Enabled:
N/A

Other Settings:
None license

Contract Source Code (Vyper language format)

# ███████╗███╗   ██╗ ██████╗ ██╗    ██╗███████╗██╗    ██╗ █████╗ ██████╗ 
# ██╔════╝████╗  ██║██╔═══██╗██║    ██║██╔════╝██║    ██║██╔══██╗██╔══██╗
# ███████╗██╔██╗ ██║██║   ██║██║ █╗ ██║███████╗██║ █╗ ██║███████║██████╔╝
# ╚════██║██║╚██╗██║██║   ██║██║███╗██║╚════██║██║███╗██║██╔══██║██╔═══╝ 
# ███████║██║ ╚████║╚██████╔╝╚███╔███╔╝███████║╚███╔███╔╝██║  ██║██║     
# ╚══════╝╚═╝  ╚═══╝ ╚═════╝  ╚══╝╚══╝ ╚══════╝ ╚══╝╚══╝ ╚═╝  ╚═╝╚═╝     
# 
# SnowSwap yVault DAI, USDC, USDT, TUSD Pool
# 
# Forked from Curve.fi       
# 
# WARNING: While Curve contracts are audited, SnowSwap is not. Use at your own risk!
# 
# Do not deposit funds you cannot afford to lose. 



# External Contracts
contract ERC20m:
    def totalSupply() -> uint256: constant
    def allowance(_owner: address, _spender: address) -> uint256: constant
    def transfer(_to: address, _value: uint256) -> bool: modifying
    def transferFrom(_from: address, _to: address, _value: uint256) -> bool: modifying
    def approve(_spender: address, _value: uint256) -> bool: modifying
    def mint(_to: address, _value: uint256): modifying
    def burn(_value: uint256): modifying
    def burnFrom(_to: address, _value: uint256): modifying
    def name() -> string[64]: constant
    def symbol() -> string[32]: constant
    def decimals() -> uint256: constant
    def balanceOf(arg0: address) -> uint256: constant
    def set_minter(_minter: address): modifying


#
# External Contracts
contract yvERC20:
    def totalSupply() -> uint256: constant
    def allowance(_owner: address, _spender: address) -> uint256: constant
    def transfer(_to: address, _value: uint256) -> bool: modifying
    def transferFrom(_from: address, _to: address, _value: uint256) -> bool: modifying
    def approve(_spender: address, _value: uint256) -> bool: modifying
    def name() -> string[64]: constant
    def symbol() -> string[32]: constant
    def decimals() -> uint256: constant
    def balanceOf(arg0: address) -> uint256: constant
    def deposit(depositAmount: uint256): modifying
    def withdraw(withdrawTokens: uint256): modifying
    def getPricePerFullShare() -> uint256: constant

from vyper.interfaces import ERC20

# Tether transfer-only ABI
contract USDT:
    def transfer(_to: address, _value: uint256): modifying
    def transferFrom(_from: address, _to: address, _value: uint256): modifying

# This can (and needs to) be changed at compile time
N_COINS: constant(int128) = 2  # <- change

ZERO256: constant(uint256) = 0  # This hack is really bad XXX
ZEROS: constant(uint256[N_COINS]) = [ZERO256, ZERO256]  # <- change

TETHERED: constant(bool[N_COINS]) = [False, False]

FEE_DENOMINATOR: constant(uint256) = 10 ** 10
PRECISION: constant(uint256) = 10 ** 18  # The precision to convert to
PRECISION_MUL: constant(uint256[N_COINS]) = [convert(1, uint256), convert(1, uint256)]
# PRECISION_MUL: constant(uint256[N_COINS]) = [
#     PRECISION / convert(10 ** 18, uint256),  # DAI
#     PRECISION / convert(10 ** 6, uint256),   # USDC
#     PRECISION / convert(10 ** 6, uint256),   # USDT
#     PRECISION / convert(10 ** 18, uint256)]  # TUSD

admin_actions_delay: constant(uint256) = 3 * 86400

# Events
TokenExchange: event({buyer: indexed(address), sold_id: int128, tokens_sold: uint256, bought_id: int128, tokens_bought: uint256})
TokenExchangeUnderlying: event({buyer: indexed(address), sold_id: int128, tokens_sold: uint256, bought_id: int128, tokens_bought: uint256})
AddLiquidity: event({provider: indexed(address), token_amounts: uint256[N_COINS], fees: uint256[N_COINS], invariant: uint256, token_supply: uint256})
RemoveLiquidity: event({provider: indexed(address), token_amounts: uint256[N_COINS], fees: uint256[N_COINS], token_supply: uint256})
RemoveLiquidityImbalance: event({provider: indexed(address), token_amounts: uint256[N_COINS], fees: uint256[N_COINS], invariant: uint256, token_supply: uint256})
CommitNewAdmin: event({deadline: indexed(timestamp), admin: indexed(address)})
NewAdmin: event({admin: indexed(address)})
CommitNewParameters: event({deadline: indexed(timestamp), A: uint256, fee: uint256, admin_fee: uint256})
NewParameters: event({A: uint256, fee: uint256, admin_fee: uint256})

coins: public(address[N_COINS])
underlying_coins: public(address[N_COINS])
balances: public(uint256[N_COINS])
A: public(uint256)  # 2 x amplification coefficient
fee: public(uint256)  # fee * 1e10
admin_fee: public(uint256)  # admin_fee * 1e10
max_admin_fee: constant(uint256) = 5 * 10 ** 9

owner: public(address)
token: ERC20m

admin_actions_deadline: public(timestamp)
transfer_ownership_deadline: public(timestamp)
future_A: public(uint256)
future_fee: public(uint256)
future_admin_fee: public(uint256)
future_owner: public(address)

kill_deadline: timestamp
kill_deadline_dt: constant(uint256) = 2 * 30 * 86400
is_killed: bool


@public
def __init__(_coins: address[N_COINS], _underlying_coins: address[N_COINS],
             _pool_token: address,
             _A: uint256, _fee: uint256):
    """
    _coins: Addresses of ERC20 contracts of coins (y-tokens) involved
    _underlying_coins: Addresses of plain coins (ERC20)
    _pool_token: Address of the token representing LP share
    _A: Amplification coefficient multiplied by n * (n - 1)
    _fee: Fee to charge for exchanges
    """
    for i in range(N_COINS):
        assert _coins[i] != ZERO_ADDRESS
        assert _underlying_coins[i] != ZERO_ADDRESS
        self.balances[i] = 0
    self.coins = _coins
    self.underlying_coins = _underlying_coins
    self.A = _A
    self.fee = _fee
    self.admin_fee = 0
    self.owner = msg.sender
    self.kill_deadline = block.timestamp + kill_deadline_dt
    self.is_killed = False
    self.token = ERC20m(_pool_token)


@private
@constant
def _stored_rates() -> uint256[N_COINS]:
    result: uint256[N_COINS] = PRECISION_MUL
    for i in range(N_COINS):
        result[i] *= yvERC20(self.coins[i]).getPricePerFullShare()
    return result


@private
@constant
def _xp(rates: uint256[N_COINS]) -> uint256[N_COINS]:
    result: uint256[N_COINS] = rates
    for i in range(N_COINS):
        result[i] = result[i] * self.balances[i] / PRECISION
    return result


@private
@constant
def _xp_mem(rates: uint256[N_COINS], _balances: uint256[N_COINS]) -> uint256[N_COINS]:
    result: uint256[N_COINS] = rates
    for i in range(N_COINS):
        result[i] = result[i] * _balances[i] / PRECISION
    return result


@private
@constant
def get_D(xp: uint256[N_COINS]) -> uint256:
    S: uint256 = 0
    for _x in xp:
        S += _x
    if S == 0:
        return 0

    Dprev: uint256 = 0
    D: uint256 = S
    Ann: uint256 = self.A * 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 + D_P * N_COINS) * D / ((Ann - 1) * D + (N_COINS + 1) * D_P)
        # Equality with the precision of 1
        if D > Dprev:
            if D - Dprev <= 1:
                break
        else:
            if Dprev - D <= 1:
                break
    return D


@private
@constant
def get_D_mem(rates: uint256[N_COINS], _balances: uint256[N_COINS]) -> uint256:
    return self.get_D(self._xp_mem(rates, _balances))


@public
@constant
def get_virtual_price() -> uint256:
    """
    Returns portfolio virtual price (for calculating profit)
    scaled up by 1e18
    """
    D: uint256 = self.get_D(self._xp(self._stored_rates()))
    # 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 = self.token.totalSupply()
    return D * PRECISION / token_supply


@public
@constant
def calc_token_amount(amounts: uint256[N_COINS], deposit: bool) -> uint256:
    """
    Simplified method to calculate addition or reduction in token supply at
    deposit or withdrawal without taking fees into account (but looking at
    slippage).
    Needed to prevent front-running, not for precise calculations!
    """
    _balances: uint256[N_COINS] = self.balances
    rates: uint256[N_COINS] = self._stored_rates()
    D0: uint256 = self.get_D_mem(rates, _balances)
    for i in range(N_COINS):
        if deposit:
            _balances[i] += amounts[i]
        else:
            _balances[i] -= amounts[i]
    D1: uint256 = self.get_D_mem(rates, _balances)
    token_amount: uint256 = self.token.totalSupply()
    diff: uint256 = 0
    if deposit:
        diff = D1 - D0
    else:
        diff = D0 - D1
    return diff * token_amount / D0


@public
@nonreentrant('lock')
def add_liquidity(amounts: uint256[N_COINS], min_mint_amount: uint256):
    # Amounts is amounts of c-tokens
    assert not self.is_killed

    fees: uint256[N_COINS] = ZEROS
    _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
    _admin_fee: uint256 = self.admin_fee

    token_supply: uint256 = self.token.totalSupply()
    rates: uint256[N_COINS] = self._stored_rates()
    # Initial invariant
    D0: uint256 = 0
    old_balances: uint256[N_COINS] = self.balances
    if token_supply > 0:
        D0 = self.get_D_mem(rates, old_balances)
    new_balances: uint256[N_COINS] = old_balances

    for i in range(N_COINS):
        if token_supply == 0:
            assert amounts[i] > 0
        # balances store amounts of c-tokens
        new_balances[i] = old_balances[i] + amounts[i]

    # Invariant after change
    D1: uint256 = self.get_D_mem(rates, new_balances)
    assert D1 > D0

    # We need to recalculate the invariant accounting for fees
    # to calculate fair user's share
    D2: uint256 = D1
    if token_supply > 0:
        # Only account for fees if we are not the first to deposit
        for i in range(N_COINS):
            ideal_balance: uint256 = D1 * old_balances[i] / D0
            difference: uint256 = 0
            if ideal_balance > new_balances[i]:
                difference = ideal_balance - new_balances[i]
            else:
                difference = new_balances[i] - ideal_balance
            fees[i] = _fee * difference / FEE_DENOMINATOR
            self.balances[i] = new_balances[i] - fees[i] * _admin_fee / FEE_DENOMINATOR
            new_balances[i] -= fees[i]
        D2 = self.get_D_mem(rates, new_balances)
    else:
        self.balances = new_balances

    # Calculate, how much pool tokens to mint
    mint_amount: uint256 = 0
    if token_supply == 0:
        mint_amount = D1  # Take the dust if there was any
    else:
        mint_amount = token_supply * (D2 - D0) / D0

    assert mint_amount >= min_mint_amount, "Slippage screwed you"

    # Take coins from the sender
    for i in range(N_COINS):
        assert_modifiable(
            yvERC20(self.coins[i]).transferFrom(msg.sender, self, amounts[i]))


    # Mint pool tokens
    self.token.mint(msg.sender, mint_amount)

    log.AddLiquidity(msg.sender, amounts, fees, D1, token_supply + mint_amount)


@private
@constant
def get_y(i: int128, j: int128, x: uint256, _xp: uint256[N_COINS]) -> uint256:
    # x in the input is converted to the same price/precision

    assert (i != j) and (i >= 0) and (j >= 0) and (i < N_COINS) and (j < N_COINS)

    D: uint256 = self.get_D(_xp)
    c: uint256 = D
    S_: uint256 = 0
    Ann: uint256 = self.A * N_COINS

    _x: 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 / (Ann * N_COINS)
    b: uint256 = S_ + D / Ann  # - D
    y_prev: uint256 = 0
    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:
                break
        else:
            if y_prev - y <= 1:
                break
    return y


@public
@constant
def get_dy(i: int128, j: int128, dx: uint256) -> uint256:
    # dx and dy in c-units
    rates: uint256[N_COINS] = self._stored_rates()
    xp: uint256[N_COINS] = self._xp(rates)

    x: uint256 = xp[i] + dx * rates[i] / PRECISION
    y: uint256 = self.get_y(i, j, x, xp)
    dy: uint256 = (xp[j] - y) * PRECISION / rates[j]
    _fee: uint256 = self.fee * dy / FEE_DENOMINATOR
    return dy - _fee


@public
@constant
def get_dx(i: int128, j: int128, dy: uint256) -> uint256:
    # dx and dy in c-units
    rates: uint256[N_COINS] = self._stored_rates()
    xp: uint256[N_COINS] = self._xp(rates)

    y: uint256 = xp[j] - (dy * FEE_DENOMINATOR / (FEE_DENOMINATOR - self.fee)) * rates[j] / PRECISION
    x: uint256 = self.get_y(j, i, y, xp)
    dx: uint256 = (x - xp[i]) * PRECISION / rates[i]
    return dx

# TODO: update these to take into account withdrawal fees
@public
@constant
def get_dy_underlying(i: int128, j: int128, dx: uint256) -> uint256:
    # dx and dy in underlying units
    rates: uint256[N_COINS] = self._stored_rates()
    xp: uint256[N_COINS] = self._xp(rates)
    precisions: uint256[N_COINS] = PRECISION_MUL

    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.fee * dy / FEE_DENOMINATOR
    vault_fee: uint256 = 0

    balance_underlying: uint256 = ERC20(self.underlying_coins[j]).balanceOf(self.coins[j])
    # if withdrawal fee will be incurred, pass fee onto user
    # improved precision based on yVault contract logic
    # r: uint256 = (yvERC20(self.coins[j]).balance * dy_) / yvERC20(self.coins[j]).totalSupply()
    if balance_underlying < dy:
        # integer maths
        vault_fee = (5 * dy) / 1000

    return dy - _fee - vault_fee


@public
@constant
def get_dx_underlying(i: int128, j: int128, dy: uint256) -> uint256:
    # dx and dy in underlying units
    rates: uint256[N_COINS] = self._stored_rates()
    xp: uint256[N_COINS] = self._xp(rates)
    precisions: uint256[N_COINS] = PRECISION_MUL

    y: uint256 = xp[j] - (dy * FEE_DENOMINATOR / (FEE_DENOMINATOR - self.fee)) * precisions[j]
    x: uint256 = self.get_y(j, i, y, xp)
    dx: uint256 = (x - xp[i]) / precisions[i]
    return dx


@private
def _exchange(i: int128, j: int128, dx: uint256, rates: uint256[N_COINS]) -> uint256:
    assert not self.is_killed
    # dx and dy are in c-tokens

    xp: uint256[N_COINS] = self._xp(rates)

    x: uint256 = xp[i] + dx * rates[i] / PRECISION
    y: uint256 = self.get_y(i, j, x, xp)
    dy: uint256 = xp[j] - y
    dy_fee: uint256 = dy * self.fee / FEE_DENOMINATOR
    dy_admin_fee: uint256 = dy_fee * self.admin_fee / FEE_DENOMINATOR
    self.balances[i] = x * PRECISION / rates[i]
    self.balances[j] = (y + (dy_fee - dy_admin_fee)) * PRECISION / rates[j]

    _dy: uint256 = (dy - dy_fee) * PRECISION / rates[j]

    return _dy


@public
@nonreentrant('lock')
def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256):
    rates: uint256[N_COINS] = self._stored_rates()
    dy: uint256 = self._exchange(i, j, dx, rates)
    assert dy >= min_dy, "Exchange resulted in fewer coins than expected"

    assert_modifiable(yvERC20(self.coins[i]).transferFrom(msg.sender, self, dx))

    assert_modifiable(yvERC20(self.coins[j]).transfer(msg.sender, dy))

    log.TokenExchange(msg.sender, i, dx, j, dy)

@public
@nonreentrant('lock')
def exchange_underlying(i: int128, j: int128, dx: uint256, min_dy: uint256):
    rates: uint256[N_COINS] = self._stored_rates()
    precisions: uint256[N_COINS] = PRECISION_MUL
    rate_i: uint256 = rates[i] / precisions[i]
    rate_j: uint256 = rates[j] / precisions[j]
    dx_: uint256 = dx * PRECISION / rate_i

    dy_: uint256 = self._exchange(i, j, dx_, rates)
    dy: uint256 = dy_ * rate_j / PRECISION

    assert dy >= min_dy, "Exchange resulted in fewer coins than expected"
    tethered: bool[N_COINS] = TETHERED

    if tethered[i]:
        USDT(self.underlying_coins[i]).transferFrom(msg.sender, self, dx)
    else:
        assert_modifiable(ERC20(self.underlying_coins[i])\
            .transferFrom(msg.sender, self, dx))
    ERC20(self.underlying_coins[i]).approve(self.coins[i], dx)
    yvERC20(self.coins[i]).deposit(dx)
    yvERC20(self.coins[j]).withdraw(dy_)

    # y-tokens calculate imprecisely - use all available
    dy = ERC20(self.underlying_coins[j]).balanceOf(self)
    assert dy >= min_dy, "Exchange resulted in fewer coins than expected"

    if tethered[j]:
        USDT(self.underlying_coins[j]).transfer(msg.sender, dy)
    else:
        assert_modifiable(ERC20(self.underlying_coins[j])\
            .transfer(msg.sender, dy))


    log.TokenExchangeUnderlying(msg.sender, i, dx, j, dy)


@public
@nonreentrant('lock')
def remove_liquidity(_amount: uint256, min_amounts: uint256[N_COINS]):
    total_supply: uint256 = self.token.totalSupply()
    amounts: uint256[N_COINS] = ZEROS
    fees: uint256[N_COINS] = ZEROS

    for i in range(N_COINS):
        value: uint256 = self.balances[i] * _amount / total_supply
        assert value >= min_amounts[i], "Withdrawal resulted in fewer coins than expected"
        self.balances[i] -= value
        amounts[i] = value
        assert_modifiable(yvERC20(self.coins[i]).transfer(
            msg.sender, value))

    self.token.burnFrom(msg.sender, _amount)  # Will raise if not enough

    log.RemoveLiquidity(msg.sender, amounts, fees, total_supply - _amount)


@public
@nonreentrant('lock')
def remove_liquidity_imbalance(amounts: uint256[N_COINS], max_burn_amount: uint256):
    assert not self.is_killed

    token_supply: uint256 = self.token.totalSupply()
    assert token_supply > 0
    _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
    _admin_fee: uint256 = self.admin_fee
    rates: uint256[N_COINS] = self._stored_rates()

    old_balances: uint256[N_COINS] = self.balances
    new_balances: uint256[N_COINS] = old_balances
    D0: uint256 = self.get_D_mem(rates, old_balances)
    for i in range(N_COINS):
        new_balances[i] -= amounts[i]
    D1: uint256 = self.get_D_mem(rates, new_balances)
    fees: uint256[N_COINS] = ZEROS
    for i in range(N_COINS):
        ideal_balance: uint256 = D1 * old_balances[i] / D0
        difference: uint256 = 0
        if ideal_balance > new_balances[i]:
            difference = ideal_balance - new_balances[i]
        else:
            difference = new_balances[i] - ideal_balance
        fees[i] = _fee * difference / FEE_DENOMINATOR
        self.balances[i] = new_balances[i] - fees[i] * _admin_fee / FEE_DENOMINATOR
        new_balances[i] -= fees[i]
    D2: uint256 = self.get_D_mem(rates, new_balances)

    token_amount: uint256 = (D0 - D2) * token_supply / D0
    assert token_amount > 0
    assert token_amount <= max_burn_amount, "Slippage screwed you"

    for i in range(N_COINS):
        assert_modifiable(yvERC20(self.coins[i]).transfer(msg.sender, amounts[i]))
    self.token.burnFrom(msg.sender, token_amount)  # Will raise if not enough

    log.RemoveLiquidityImbalance(msg.sender, amounts, fees, D1, token_supply - token_amount)


### Admin functions ###
@public
def commit_new_parameters(amplification: uint256,
                          new_fee: uint256,
                          new_admin_fee: uint256):
    assert msg.sender == self.owner
    assert self.admin_actions_deadline == 0
    assert new_admin_fee <= max_admin_fee

    _deadline: timestamp = block.timestamp + admin_actions_delay
    self.admin_actions_deadline = _deadline
    self.future_A = amplification
    self.future_fee = new_fee
    self.future_admin_fee = new_admin_fee

    log.CommitNewParameters(_deadline, amplification, new_fee, new_admin_fee)


@public
def apply_new_parameters():
    assert msg.sender == self.owner
    assert self.admin_actions_deadline <= block.timestamp\
        and self.admin_actions_deadline > 0

    self.admin_actions_deadline = 0
    _A: uint256 = self.future_A
    _fee: uint256 = self.future_fee
    _admin_fee: uint256 = self.future_admin_fee
    self.A = _A
    self.fee = _fee
    self.admin_fee = _admin_fee

    log.NewParameters(_A, _fee, _admin_fee)


@public
def revert_new_parameters():
    assert msg.sender == self.owner

    self.admin_actions_deadline = 0


@public
def commit_transfer_ownership(_owner: address):
    assert msg.sender == self.owner
    assert self.transfer_ownership_deadline == 0

    _deadline: timestamp = block.timestamp + admin_actions_delay
    self.transfer_ownership_deadline = _deadline
    self.future_owner = _owner

    log.CommitNewAdmin(_deadline, _owner)


@public
def apply_transfer_ownership():
    assert msg.sender == self.owner
    assert block.timestamp >= self.transfer_ownership_deadline\
        and self.transfer_ownership_deadline > 0

    self.transfer_ownership_deadline = 0
    _owner: address = self.future_owner
    self.owner = _owner

    log.NewAdmin(_owner)


@public
def revert_transfer_ownership():
    assert msg.sender == self.owner

    self.transfer_ownership_deadline = 0


@public
def withdraw_admin_fees():
    assert msg.sender == self.owner
    _precisions: uint256[N_COINS] = PRECISION_MUL

    for i in range(N_COINS):
        c: address = self.coins[i]
        value: uint256 = yvERC20(c).balanceOf(self) - self.balances[i]
        if value > 0:
            assert_modifiable(yvERC20(c).transfer(msg.sender, value))


@public
def kill_me():
    assert msg.sender == self.owner
    assert self.kill_deadline > block.timestamp
    self.is_killed = True


@public
def unkill_me():
    assert msg.sender == self.owner
    self.is_killed = False

Contract Security Audit

Contract ABI

[{"name":"TokenExchange","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"TokenExchangeUnderlying","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"type":"uint256","name":"deadline","indexed":true,"unit":"sec"},{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewParameters","inputs":[{"type":"uint256","name":"deadline","indexed":true,"unit":"sec"},{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewParameters","inputs":[{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"address[2]","name":"_coins"},{"type":"address[2]","name":"_underlying_coins"},{"type":"address","name":"_pool_token"},{"type":"uint256","name":"_A"},{"type":"uint256","name":"_fee"}],"constant":false,"payable":false,"type":"constructor"},{"name":"get_virtual_price","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":1066407},{"name":"calc_token_amount","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"amounts"},{"type":"bool","name":"deposit"}],"constant":true,"payable":false,"type":"function","gas":4221939},{"name":"add_liquidity","outputs":[],"inputs":[{"type":"uint256[2]","name":"amounts"},{"type":"uint256","name":"min_mint_amount"}],"constant":false,"payable":false,"type":"function","gas":6477361},{"name":"get_dy","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"constant":true,"payable":false,"type":"function","gas":2525861},{"name":"get_dx","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dy"}],"constant":true,"payable":false,"type":"function","gas":2525867},{"name":"get_dy_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"constant":true,"payable":false,"type":"function","gas":2531028},{"name":"get_dx_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dy"}],"constant":true,"payable":false,"type":"function","gas":2525692},{"name":"exchange","outputs":[],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"constant":false,"payable":false,"type":"function","gas":5182102},{"name":"exchange_underlying","outputs":[],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"constant":false,"payable":false,"type":"function","gas":5202048},{"name":"remove_liquidity","outputs":[],"inputs":[{"type":"uint256","name":"_amount"},{"type":"uint256[2]","name":"min_amounts"}],"constant":false,"payable":false,"type":"function","gas":153415},{"name":"remove_liquidity_imbalance","outputs":[],"inputs":[{"type":"uint256[2]","name":"amounts"},{"type":"uint256","name":"max_burn_amount"}],"constant":false,"payable":false,"type":"function","gas":6477013},{"name":"commit_new_parameters","outputs":[],"inputs":[{"type":"uint256","name":"amplification"},{"type":"uint256","name":"new_fee"},{"type":"uint256","name":"new_admin_fee"}],"constant":false,"payable":false,"type":"function","gas":145867},{"name":"apply_new_parameters","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":133482},{"name":"revert_new_parameters","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21805},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"_owner"}],"constant":false,"payable":false,"type":"function","gas":74482},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":60538},{"name":"revert_transfer_ownership","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21895},{"name":"withdraw_admin_fees","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":12349},{"name":"kill_me","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":37848},{"name":"unkill_me","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21985},{"name":"coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2160},{"name":"underlying_coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2190},{"name":"balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2220},{"name":"A","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2051},{"name":"fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2081},{"name":"admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2111},{"name":"owner","outputs":[{"type":"address","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2141},{"name":"admin_actions_deadline","outputs":[{"type":"uint256","unit":"sec","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2171},{"name":"transfer_ownership_deadline","outputs":[{"type":"uint256","unit":"sec","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2201},{"name":"future_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2231},{"name":"future_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2261},{"name":"future_admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2291},{"name":"future_owner","outputs":[{"type":"address","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2321}]

740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a05260e0614ec16101403934156100a157600080fd5b6020614ec160c03960c05160205181106100ba57600080fd5b5060206020614ec10160c03960c05160205181106100d757600080fd5b5060206040614ec10160c03960c05160205181106100f457600080fd5b5060206060614ec10160c03960c051602051811061011157600080fd5b5060206080614ec10160c03960c051602051811061012e57600080fd5b5061022060006002818352015b6000610140610220516002811061015157600080fd5b60200201511861016057600080fd5b6000610180610220516002811061017657600080fd5b60200201511861018557600080fd5b6000610220516002811061019857600080fd5b600260c052602060c02001555b815160010180835281141561013b575b5050600060c052602060c02061014080518255806020015160018301555050600160c052602060c020610180805182558060200151600183015550506101e0516003556102005160045560006005553360065542624f1a0081818301101561021c57600080fd5b80820190509050600e556000600f556101c051600755614ea956600436101561000d57614c6c565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526000156101e0575b610140526101606001815260018160200152506101a060006002818352015b6101606101a051600281106100dc57600080fd5b6020020180516101a051600281106100f357600080fd5b600060c052602060c02001543b61010957600080fd5b6101a0516002811061011a57600080fd5b600060c052602060c0200154301861013157600080fd5b602061022060046377c7b8fc6101c0526101dc6101a0516002811061015557600080fd5b600060c052602060c02001545afa61016c57600080fd5b60005061022051808202821582848304141761018757600080fd5b809050905090508152505b81516001018083528114156100c8575b50506040610240525b6000610240511115156101bd576101d9565b60206102405103610160015160206102405103610240526101ab565b6101405156005b6000156102e9575b6101805261014052610160526101a0610140805182528060200151826020015250506101e060006002818352015b6101a06101e0516002811061022a57600080fd5b60200201516101e0516002811061024057600080fd5b600260c052602060c0200154808202821582848304141761026057600080fd5b80905090509050670de0b6b3a7640000808061027b57600080fd5b8204905090506101a06101e0516002811061029557600080fd5b60200201525b8151600101808352811415610216575b50506040610200525b6000610200511115156102c6576102e2565b602061020051036101a0015160206102005103610200526102b4565b6101805156005b6000156103f6575b6101c0526101405261016052610180526101a0526101e06101408051825280602001518260200152505061022060006002818352015b6101e0610220516002811061033b57600080fd5b6020020151610180610220516002811061035457600080fd5b6020020151808202821582848304141761036d57600080fd5b80905090509050670de0b6b3a7640000808061038857600080fd5b8204905090506101e061022051600281106103a257600080fd5b60200201525b8151600101808352811415610327575b50506040610240525b6000610240511115156103d3576103ef565b602061024051036101e0015160206102405103610240526103c1565b6101c05156005b6000156106f3575b61018052610140526101605260006101a0526101e060006002818352015b60206101e0510261014001516101c0526101a080516101c05181818301101561044457600080fd5b808201905090508152505b815160010180835281141561041c575b50506101a051151561047a5760006000526000516101805156505b6000610220526101a05161024052600354600280820282158284830414176104a157600080fd5b8090509050905061026052610280600060ff818352015b610240516102a0526102e060006002818352015b60206102e0510261014001516102c0526102a0516102405180820282158284830414176104f857600080fd5b809050905090506102c0516002808202821582848304141761051957600080fd5b80905090509050600181818301101561053157600080fd5b80820190509050808061054357600080fd5b8204905090506102a0525b81516001018083528114156104cc575b50506102405161022052610260516101a051808202821582848304141761058457600080fd5b809050905090506102a051600280820282158284830414176105a557600080fd5b809050905090508181830110156105bb57600080fd5b808201905090506102405180820282158284830414176105da57600080fd5b80905090509050610260516001808210156105f457600080fd5b8082039050905061024051808202821582848304141761061357600080fd5b8090509050905060036102a051808202821582848304141761063457600080fd5b8090509050905081818301101561064a57600080fd5b80820190509050808061065c57600080fd5b82049050905061024052610220516102405111156106a357600161024051610220518082101561068b57600080fd5b8082039050905011151561069e576106df565b6106ce565b60016102205161024051808210156106ba57600080fd5b808203905090501115156106cd576106df565b5b5b81516001018083528114156104b8575b505061024051600052600051610180515650005b600015610855575b6101c0526101405261016052610180526101a052610140610460525b6104605151602061046051016104605261046061046051101561073957610717565b637b08bb90610480526104a0610140610320525b6103205151602061032051016103205261032061032051101561076f5761074d565b63575e285f61034052610360610140805182528060200151826020015250506103a0610180805182528060200151826020015250506103c0516103a0516103805161036051600658016102f1565b6104205261044052610300610320525b61032051526020610320510361032052610140610320511015156107f0576107cd565b610420805182528060200151826020015250506104c0516104a051600658016103fe565b61052052610440610460525b610460515260206104605103610460526101406104605110151561084357610820565b610520516000526000516101c0515650005b63bb7b8b806000511415610a8157341561086e57600080fd5b6101406104e0525b6104e0515160206104e051016104e0526104e06104e051101561089857610876565b637b08bb90610500526105206101406103e0525b6103e0515160206103e051016103e0526103e06103e05110156108ce576108ac565b6396b414ec61040052610420610140610380525b61038051516020610380510161038052610380610380511015610904576108e2565b600658016100a9565b6103a0526103c052610360610380525b61038051526020610380510361038052610140610380511015156109405761091d565b6103a0805182528060200151826020015250506104405161042051600658016101e8565b6104a0526104c0526103c06103e0525b6103e0515260206103e051036103e0526101406103e05110151561099757610974565b6104a0805182528060200151826020015250506105405161052051600658016103fe565b6105a0526104c06104e0525b6104e0515260206104e051036104e0526101406104e0511015156109ea576109c7565b6105a051610140526007543b6109ff57600080fd5b6007543018610a0d57600080fd5b602061064060046318160ddd6105e0526105fc6007545afa610a2e57600080fd5b600050610640516105c05261014051670de0b6b3a76400008082028215828483041417610a5a57600080fd5b809050905090506105c0518080610a7057600080fd5b82049050905060005260206000f350005b63ed8e84f36000511415610dff573415610a9a57600080fd5b60443560028110610aaa57600080fd5b5061014060028060c052602060c02054825260018160c052602060c0200154826020015250506101806101405161016051610180516101a051600658016100a9565b6101e052610200526101a0526101805261016052610140526101e0805182528060200151826020015250506101405161016051610180516101a0516101c0516101e0516102005161022051633927649861026052610280610180805182528060200151826020015250506102c0610140805182528060200151826020015250506102e0516102c0516102a05161028051600658016106fb565b6103405261022052610200526101e0526101c0526101a052610180526101605261014052610340516102205261036060006002818352015b60443515610c15576101406103605160028110610bd957600080fd5b60200201805160046103605160028110610bf257600080fd5b6020020135818183011015610c0657600080fd5b80820190509050815250610c5f565b6101406103605160028110610c2957600080fd5b60200201805160046103605160028110610c4257600080fd5b602002013580821015610c5457600080fd5b808203905090508152505b5b8151600101808352811415610bbd575b50506101406103a0525b6103a0515160206103a051016103a0526103a06103a0511015610c9c57610c7a565b63392764986103c0526103e061018080518252806020015182602001525050610420610140805182528060200151826020015250506104405161042051610400516103e051600658016106fb565b6104a0526103806103a0525b6103a0515260206103a051036103a0526101406103a051101515610d1957610cf6565b6104a051610380526007543b610d2e57600080fd5b6007543018610d3c57600080fd5b602061054060046318160ddd6104e0526104fc6007545afa610d5d57600080fd5b600050610540516104c05260006105605260443515610d9b57610380516102205180821015610d8b57600080fd5b8082039050905061056052610dbc565b610220516103805180821015610db057600080fd5b80820390509050610560525b610560516104c0518082028215828483041417610dd857600080fd5b80905090509050610220518080610dee57600080fd5b82049050905060005260206000f350005b630b4c7e4d60005114156117445762ffffff5415610e1c57600080fd5b600162ffffff553415610e2e57600080fd5b600f5415610e3b57600080fd5b61014060008152600081602001525060045460028082028215828483041417610e6357600080fd5b8090509050905060048080610e7757600080fd5b820490509050610180526005546101a0526007543b610e9557600080fd5b6007543018610ea357600080fd5b602061024060046318160ddd6101e0526101fc6007545afa610ec457600080fd5b600050610240516101c0526102606101406102a0525b6102a0515160206102a051016102a0526102a06102a0511015610efc57610eda565b600658016100a9565b6102c0526102e0526102806102a0525b6102a0515260206102a051036102a0526101406102a051101515610f3857610f15565b6102c08051825280602001518260200152505060006103005261032060028060c052602060c02054825260018160c052602060c02001548260200152505060006101c051111561103257610140610360525b61036051516020610360510161036052610360610360511015610fac57610f8a565b6339276498610380526103a0610260805182528060200151826020015250506103e061032080518252806020015182602001525050610400516103e0516103c0516103a051600658016106fb565b61046052610340610360525b610360515260206103605103610360526101406103605110151561102957611006565b61046051610300525b610480610320805182528060200151826020015250506104c060006002818352015b6101c051151561108357600060046104c0516002811061107357600080fd5b60200201351161108257600080fd5b5b6103206104c0516002811061109757600080fd5b602002015160046104c051600281106110af57600080fd5b60200201358181830110156110c357600080fd5b808201905090506104806104c051600281106110de57600080fd5b60200201525b8151600101808352811415611054575b5050610140610500525b61050051516020610500510161050052610500610500511015611120576110fe565b63392764986105205261054061026080518252806020015182602001525050610580610480805182528060200151826020015250506105a051610580516105605161054051600658016106fb565b610600526104e0610500525b610500515260206105005103610500526101406105005110151561119d5761117a565b610600516104e052610300516104e051116111b757600080fd5b6104e0516106205260006101c05111156114be5761064060006002818352015b6104e05161032061064051600281106111ef57600080fd5b6020020151808202821582848304141761120857600080fd5b8090509050905061030051808061121e57600080fd5b82049050905061066052600061068052610480610640516002811061124257600080fd5b602002015161066051111561128b5761066051610480610640516002811061126957600080fd5b60200201518082101561127b57600080fd5b80820390509050610680526112c1565b610480610640516002811061129f57600080fd5b602002015161066051808210156112b557600080fd5b80820390509050610680525b610180516106805180820282158284830414176112dd57600080fd5b809050905090506402540be40080806112f557600080fd5b820490509050610140610640516002811061130f57600080fd5b6020020152610480610640516002811061132857600080fd5b6020020151610140610640516002811061134157600080fd5b60200201516101a051808202821582848304141761135e57600080fd5b809050905090506402540be400808061137657600080fd5b8204905090508082101561138957600080fd5b8082039050905061064051600281106113a157600080fd5b600260c052602060c020015561048061064051600281106113c157600080fd5b60200201805161014061064051600281106113db57600080fd5b6020020151808210156113ed57600080fd5b808203905090508152505b81516001018083528114156111d7575b50506101406106a0525b6106a0515160206106a051016106a0526106406106a051101561143457611412565b63392764986106c0526106e061026080518252806020015182602001525050610720610480805182528060200151826020015250506107405161072051610700516106e051600658016106fb565b6107a0526106206106a0525b6106a0515260206106a051036106a0526101406106a0511015156114b15761148e565b6107a051610620526114dc565b600260c052602060c020610480805182558060200151600183015550505b60006107c0526101c05115156114f9576104e0516107c05261154e565b6101c05161062051610300518082101561151257600080fd5b80820390509050808202821582848304141761152d57600080fd5b8090509050905061030051808061154357600080fd5b8204905090506107c0525b6308c379a06107e0526020610800526014610820527f536c697070616765207363726577656420796f7500000000000000000000000061084052610820506044356107c05110156115a05760846107fcfd5b61088060006002818352015b61088051600281106115bd57600080fd5b600060c052602060c02001543b6115d357600080fd5b61088051600281106115e457600080fd5b600060c052602060c020015430186115fb57600080fd5b602061096060646323b872dd6108a052336108c052306108e0526004610880516002811061162857600080fd5b6020020135610900526108bc6000610880516002811061164757600080fd5b600060c052602060c02001545af161165e57600080fd5b6000506109605161166e57600080fd5b5b81516001018083528114156115ac575b50506007543b61168e57600080fd5b600754301861169c57600080fd5b6000600060446340c10f1961098052336109a0526107c0516109c05261099c60006007545af16116cb57600080fd5b600435610a2052602435610a405261014051610a605261016051610a80526104e051610aa0526101c0516107c05181818301101561170857600080fd5b80820190509050610ac052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c0610a20a2600062ffffff55005b600015611b14575b6101e0526101405261016052610180526101a0526101c052600061014051121561016051610140511415166000610160511215166002610140511216600261016051121661179957600080fd5b6101405161016051610180516101a0516101c0516101e05161020051637b08bb90610240526102606101a0805182528060200151826020015250506102805161026051600658016103fe565b6102e052610200526101e0526101c0526101a0526101805261016052610140526102e0516102005261020051610300526000610320526003546002808202821582848304141761183457600080fd5b809050905090506103405260006103605261038060006002818352015b6101405161038051141561186c5761018051610360526118a2565b6101605161038051181561189c576101a0610380516002811061188e57600080fd5b6020020151610360526118a1565b61191e565b5b6103208051610360518181830110156118ba57600080fd5b80820190509050815250610300516102005180820282158284830414176118e057600080fd5b80905090509050610360516002808202821582848304141761190157600080fd5b80905090509050808061191357600080fd5b820490509050610300525b8151600101808352811415611851575b50506103005161020051808202821582848304141761194c57600080fd5b80905090509050610340516002808202821582848304141761196d57600080fd5b80905090509050808061197f57600080fd5b8204905090506103005261032051610200516103405180806119a057600080fd5b8204905090508181830110156119b557600080fd5b808201905090506103a05260006103c052610200516103e052610400600060ff818352015b6103e0516103c0526103e0516103e05180820282158284830414176119fe57600080fd5b8090509050905061030051818183011015611a1857600080fd5b8082019050905060026103e0518082028215828483041417611a3957600080fd5b809050905090506103a051818183011015611a5357600080fd5b808201905090506102005180821015611a6b57600080fd5b808203905090508080611a7d57600080fd5b8204905090506103e0526103c0516103e0511115611ac45760016103e0516103c05180821015611aac57600080fd5b80820390509050111515611abf57611b00565b611aef565b60016103c0516103e05180821015611adb57600080fd5b80820390509050111515611aee57611b00565b5b5b81516001018083528114156119da575b50506103e0516000526000516101e0515650005b635e0d443f6000511415611e4e573415611b2d57600080fd5b60605160043580604051901315611b4357600080fd5b8091901215611b5157600080fd5b5060605160243580604051901315611b6857600080fd5b8091901215611b7657600080fd5b506101406101405161016051600658016100a9565b6101a0526101c05261016052610140526101a0805182528060200151826020015250506101e06101405161016051610180516101a0516101c0516101e051610200516396b414ec61024052610260610140805182528060200151826020015250506102805161026051600658016101e8565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e0805182528060200151826020015250506101e060043560028110611c4757600080fd5b602002015160443561014060043560028110611c6257600080fd5b60200201518082028215828483041417611c7b57600080fd5b80905090509050670de0b6b3a76400008080611c9657600080fd5b820490509050818183011015611cab57600080fd5b8082019050905061032052610140610360525b61036051516020610360510161036052610360610360511015611ce057611cbe565b63232dd1c9610380526004356103a0526024356103c052610320516103e0526104006101e08051825280602001518260200152505061042051610400516103e0516103c0516103a0516006580161174c565b61048052610340610360525b6103605152602061036051036103605261014061036051101515611d6157611d3e565b61048051610340526101e060243560028110611d7c57600080fd5b60200201516103405180821015611d9257600080fd5b80820390509050670de0b6b3a76400008082028215828483041417611db657600080fd5b8090509050905061014060243560028110611dd057600080fd5b60200201518080611de057600080fd5b8204905090506104a0526004546104a0518082028215828483041417611e0557600080fd5b809050905090506402540be4008080611e1d57600080fd5b8204905090506104c0526104a0516104c05180821015611e3c57600080fd5b8082039050905060005260206000f350005b6367df02ca6000511415612180573415611e6757600080fd5b60605160043580604051901315611e7d57600080fd5b8091901215611e8b57600080fd5b5060605160243580604051901315611ea257600080fd5b8091901215611eb057600080fd5b506101406101405161016051600658016100a9565b6101a0526101c05261016052610140526101a0805182528060200151826020015250506101e06101405161016051610180516101a0516101c0516101e051610200516396b414ec61024052610260610140805182528060200151826020015250506102805161026051600658016101e8565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e0805182528060200151826020015250506101e060243560028110611f8157600080fd5b60200201516044356402540be4008082028215828483041417611fa357600080fd5b809050905090506402540be40060045480821015611fc057600080fd5b808203905090508080611fd257600080fd5b82049050905061014060243560028110611feb57600080fd5b6020020151808202821582848304141761200457600080fd5b80905090509050670de0b6b3a7640000808061201f57600080fd5b8204905090508082101561203257600080fd5b8082039050905061032052610140610360525b6103605151602061036051016103605261036061036051101561206757612045565b63232dd1c9610380526024356103a0526004356103c052610320516103e0526104006101e08051825280602001518260200152505061042051610400516103e0516103c0516103a0516006580161174c565b61048052610340610360525b61036051526020610360510361036052610140610360511015156120e8576120c5565b6104805161034052610340516101e06004356002811061210757600080fd5b60200201518082101561211957600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761213d57600080fd5b809050905090506101406004356002811061215757600080fd5b6020020151808061216757600080fd5b8204905090506104a0526104a05160005260206000f350005b6307211ef760005114156125a357341561219957600080fd5b606051600435806040519013156121af57600080fd5b80919012156121bd57600080fd5b50606051602435806040519013156121d457600080fd5b80919012156121e257600080fd5b506101406101405161016051600658016100a9565b6101a0526101c05261016052610140526101a0805182528060200151826020015250506101e06101405161016051610180516101a0516101c0516101e051610200516396b414ec61024052610260610140805182528060200151826020015250506102805161026051600658016101e8565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e0805182528060200151826020015250506103206001815260018160200152506101e0600435600281106122c257600080fd5b6020020151604435610320600435600281106122dd57600080fd5b602002015180820282158284830414176122f657600080fd5b8090509050905081818301101561230c57600080fd5b80820190509050610360526101406103a0525b6103a0515160206103a051016103a0526103a06103a05110156123415761231f565b63232dd1c96103c0526004356103e0526024356104005261036051610420526104406101e080518252806020015182602001525050610460516104405161042051610400516103e0516006580161174c565b6104c0526103806103a0525b6103a0515260206103a051036103a0526101406103a0511015156123c25761239f565b6104c051610380526101e0602435600281106123dd57600080fd5b602002015161038051808210156123f357600080fd5b808203905090506103206024356002811061240d57600080fd5b6020020151808061241d57600080fd5b8204905090506104e0526004546104e051808202821582848304141761244257600080fd5b809050905090506402540be400808061245a57600080fd5b820490509050610500526000610520526024356002811061247a57600080fd5b600160c052602060c02001543b61249057600080fd5b602435600281106124a057600080fd5b600160c052602060c020015430186124b757600080fd5b60206105e060246370a0823161056052602435600281106124d757600080fd5b600060c052602060c02001546105805261057c602435600281106124fa57600080fd5b600160c052602060c02001545afa61251157600080fd5b6000506105e051610540526104e0516105405110156125645760056104e051808202821582848304141761254457600080fd5b809050905090506103e8808061255957600080fd5b820490509050610520525b6104e051610500518082101561257957600080fd5b80820390509050610520518082101561259157600080fd5b8082039050905060005260206000f350005b630e71d1b960005114156128a65734156125bc57600080fd5b606051600435806040519013156125d257600080fd5b80919012156125e057600080fd5b50606051602435806040519013156125f757600080fd5b809190121561260557600080fd5b506101406101405161016051600658016100a9565b6101a0526101c05261016052610140526101a0805182528060200151826020015250506101e06101405161016051610180516101a0516101c0516101e051610200516396b414ec61024052610260610140805182528060200151826020015250506102805161026051600658016101e8565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e0805182528060200151826020015250506103206001815260018160200152506101e0602435600281106126e557600080fd5b60200201516044356402540be400808202821582848304141761270757600080fd5b809050905090506402540be4006004548082101561272457600080fd5b80820390509050808061273657600080fd5b8204905090506103206024356002811061274f57600080fd5b6020020151808202821582848304141761276857600080fd5b809050905090508082101561277c57600080fd5b80820390509050610360526101406103a0525b6103a0515160206103a051016103a0526103a06103a05110156127b15761278f565b63232dd1c96103c0526024356103e0526004356104005261036051610420526104406101e080518252806020015182602001525050610460516104405161042051610400516103e0516006580161174c565b6104c0526103806103a0525b6103a0515260206103a051036103a0526101406103a0511015156128325761280f565b6104c05161038052610380516101e06004356002811061285157600080fd5b60200201518082101561286357600080fd5b808203905090506103206004356002811061287d57600080fd5b6020020151808061288d57600080fd5b8204905090506104e0526104e05160005260206000f350005b600015612cda575b6101e0526101405261016052610180526101a0526101c052600f54156128d357600080fd5b6102006101405161016051610180516101a0516101c0516101e05161020051610220516396b414ec610260526102806101a0805182528060200151826020015250506102a05161028051600658016101e8565b610300526103205261022052610200526101e0526101c0526101a05261018052610160526101405261030080518252806020015182602001525050610200610140516002811061297557600080fd5b6020020151610180516101a0610140516002811061299257600080fd5b602002015180820282158284830414176129ab57600080fd5b80905090509050670de0b6b3a764000080806129c657600080fd5b8204905090508181830110156129db57600080fd5b8082019050905061034052610140610380525b61038051516020610380510161038052610380610380511015612a10576129ee565b63232dd1c96103a052610140516103c052610160516103e0526103405161040052610420610200805182528060200151826020015250506104405161042051610400516103e0516103c0516006580161174c565b6104a052610360610380525b6103805152602061038051036103805261014061038051101515612a9357612a70565b6104a051610360526102006101605160028110612aaf57600080fd5b60200201516103605180821015612ac557600080fd5b808203905090506104c0526104c0516004548082028215828483041417612aeb57600080fd5b809050905090506402540be4008080612b0357600080fd5b8204905090506104e0526104e0516005548082028215828483041417612b2857600080fd5b809050905090506402540be4008080612b4057600080fd5b8204905090506105005261034051670de0b6b3a76400008082028215828483041417612b6b57600080fd5b809050905090506101a06101405160028110612b8657600080fd5b60200201518080612b9657600080fd5b8204905090506101405160028110612bad57600080fd5b600260c052602060c0200155610360516104e0516105005180821015612bd257600080fd5b80820390509050818183011015612be857600080fd5b80820190509050670de0b6b3a76400008082028215828483041417612c0c57600080fd5b809050905090506101a06101605160028110612c2757600080fd5b60200201518080612c3757600080fd5b8204905090506101605160028110612c4e57600080fd5b600260c052602060c02001556104c0516104e05180821015612c6f57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417612c9357600080fd5b809050905090506101a06101605160028110612cae57600080fd5b60200201518080612cbe57600080fd5b82049050905061052052610520516000526000516101e0515650005b633df02124600051141561302c5762ffffff5415612cf757600080fd5b600162ffffff553415612d0957600080fd5b60605160043580604051901315612d1f57600080fd5b8091901215612d2d57600080fd5b5060605160243580604051901315612d4457600080fd5b8091901215612d5257600080fd5b506101406101405161016051600658016100a9565b6101a0526101c05261016052610140526101a0805182528060200151826020015250506101405161016051610180516101a0516101c0516101e0516399a788e4610220526004356102405260243561026052604435610280526102a0610140805182528060200151826020015250506102c0516102a051610280516102605161024051600658016128ae565b610320526101e0526101c0526101a052610180526101605261014052610320516101e0526308c379a061034052602061036052602e610380527f45786368616e676520726573756c74656420696e20666577657220636f696e736103a0527f207468616e2065787065637465640000000000000000000000000000000000006103c052610380506064356101e0511015612e8e5760a461035cfd5b60043560028110612e9e57600080fd5b600060c052602060c02001543b612eb457600080fd5b60043560028110612ec457600080fd5b600060c052602060c02001543018612edb57600080fd5b60206104c060646323b872dd61040052336104205230610440526044356104605261041c600060043560028110612f1157600080fd5b600060c052602060c02001545af1612f2857600080fd5b6000506104c051612f3857600080fd5b60243560028110612f4857600080fd5b600060c052602060c02001543b612f5e57600080fd5b60243560028110612f6e57600080fd5b600060c052602060c02001543018612f8557600080fd5b6020610580604463a9059cbb6104e05233610500526101e051610520526104fc600060243560028110612fb757600080fd5b600060c052602060c02001545af1612fce57600080fd5b60005061058051612fde57600080fd5b6004356105a0526044356105c0526024356105e0526101e05161060052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd9714060806105a0a2600062ffffff55005b63a6417ed660005114156139255762ffffff541561304957600080fd5b600162ffffff55341561305b57600080fd5b6060516004358060405190131561307157600080fd5b809190121561307f57600080fd5b506060516024358060405190131561309657600080fd5b80919012156130a457600080fd5b506101406101405161016051600658016100a9565b6101a0526101c05261016052610140526101a0805182528060200151826020015250506101e0600181526001816020015250610140600435600281106130fe57600080fd5b60200201516101e06004356002811061311657600080fd5b6020020151808061312657600080fd5b820490509050610220526101406024356002811061314357600080fd5b60200201516101e06024356002811061315b57600080fd5b6020020151808061316b57600080fd5b82049050905061024052604435670de0b6b3a7640000808202821582848304141761319557600080fd5b809050905090506102205180806131ab57600080fd5b820490509050610260526101406102a0525b6102a0515160206102a051016102a0526102a06102a05110156131df576131bd565b6399a788e46102c0526004356102e05260243561030052610260516103205261034061014080518252806020015182602001525050610360516103405161032051610300516102e051600658016128ae565b6103c0526102806102a0525b6102a0515260206102a051036102a0526101406102a0511015156132605761323d565b6103c051610280526102805161024051808202821582848304141761328457600080fd5b80905090509050670de0b6b3a7640000808061329f57600080fd5b8204905090506103e0526308c379a061040052602061042052602e610440527f45786368616e676520726573756c74656420696e20666577657220636f696e73610460527f207468616e20657870656374656400000000000000000000000000000000000061048052610440506064356103e05110156133205760a461041cfd5b6104c06000815260008160200152506104c06004356002811061334257600080fd5b6020020151156133ea576004356002811061335c57600080fd5b600160c052602060c02001543b61337257600080fd5b6004356002811061338257600080fd5b600160c052602060c0200154301861339957600080fd5b6000600060646323b872dd6105e05233610600523061062052604435610640526105fc6000600435600281106133ce57600080fd5b600160c052602060c02001545af16133e557600080fd5b613495565b600435600281106133fa57600080fd5b600160c052602060c02001543b61341057600080fd5b6004356002811061342057600080fd5b600160c052602060c0200154301861343757600080fd5b60206105c060646323b872dd61050052336105205230610540526044356105605261051c60006004356002811061346d57600080fd5b600160c052602060c02001545af161348457600080fd5b6000506105c05161349457600080fd5b5b600435600281106134a557600080fd5b600160c052602060c02001543b6134bb57600080fd5b600435600281106134cb57600080fd5b600160c052602060c020015430186134e257600080fd5b6020610740604463095ea7b36106a0526004356002811061350257600080fd5b600060c052602060c02001546106c0526044356106e0526106bc60006004356002811061352e57600080fd5b600160c052602060c02001545af161354557600080fd5b600050610740506004356002811061355c57600080fd5b600060c052602060c02001543b61357257600080fd5b6004356002811061358257600080fd5b600060c052602060c0200154301861359957600080fd5b60006000602463b6b55f25610760526044356107805261077c6000600435600281106135c457600080fd5b600060c052602060c02001545af16135db57600080fd5b602435600281106135eb57600080fd5b600060c052602060c02001543b61360157600080fd5b6024356002811061361157600080fd5b600060c052602060c0200154301861362857600080fd5b600060006024632e1a7d4d6107e05261028051610800526107fc60006024356002811061365457600080fd5b600060c052602060c02001545af161366b57600080fd5b6024356002811061367b57600080fd5b600160c052602060c02001543b61369157600080fd5b602435600281106136a157600080fd5b600160c052602060c020015430186136b857600080fd5b60206108e060246370a0823161086052306108805261087c602435600281106136e057600080fd5b600160c052602060c02001545afa6136f757600080fd5b6000506108e0516103e0526308c379a061090052602061092052602e610940527f45786368616e676520726573756c74656420696e20666577657220636f696e73610960527f207468616e20657870656374656400000000000000000000000000000000000061098052610940506064356103e05110156137795760a461091cfd5b6104c06024356002811061378c57600080fd5b60200201511561383057602435600281106137a657600080fd5b600160c052602060c02001543b6137bc57600080fd5b602435600281106137cc57600080fd5b600160c052602060c020015430186137e357600080fd5b60006000604463a9059cbb610a805233610aa0526103e051610ac052610a9c60006024356002811061381457600080fd5b600160c052602060c02001545af161382b57600080fd5b6138d7565b6024356002811061384057600080fd5b600160c052602060c02001543b61385657600080fd5b6024356002811061386657600080fd5b600160c052602060c0200154301861387d57600080fd5b6020610a60604463a9059cbb6109c052336109e0526103e051610a00526109dc6000602435600281106138af57600080fd5b600160c052602060c02001545af16138c657600080fd5b600050610a60516138d657600080fd5b5b600435610b2052604435610b4052602435610b60526103e051610b8052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b6080610b20a2600062ffffff55005b635b36389c6000511415613c705762ffffff541561394257600080fd5b600162ffffff55341561395457600080fd5b6007543b61396157600080fd5b600754301861396f57600080fd5b60206101c060046318160ddd6101605261017c6007545afa61399057600080fd5b6000506101c051610140526101e060008152600081602001525061022060008152600081602001525061026060006002818352015b61026051600281106139d657600080fd5b600260c052602060c020015460043580820282158284830414176139f957600080fd5b80905090509050610140518080613a0f57600080fd5b820490509050610280526308c379a06102a05260206102c05260306102e0527f5769746864726177616c20726573756c74656420696e20666577657220636f69610300527f6e73207468616e20657870656374656400000000000000000000000000000000610320526102e05060246102605160028110613a8f57600080fd5b6020020135610280511015613aa55760a46102bcfd5b6102605160028110613ab657600080fd5b600260c052602060c0200180546102805180821015613ad457600080fd5b80820390509050815550610280516101e06102605160028110613af657600080fd5b60200201526102605160028110613b0c57600080fd5b600060c052602060c02001543b613b2257600080fd5b6102605160028110613b3357600080fd5b600060c052602060c02001543018613b4a57600080fd5b6020610400604463a9059cbb610360523361038052610280516103a05261037c60006102605160028110613b7d57600080fd5b600060c052602060c02001545af1613b9457600080fd5b60005061040051613ba457600080fd5b5b81516001018083528114156139c5575b50506007543b613bc457600080fd5b6007543018613bd257600080fd5b6000600060446379cc67906104205233610440526004356104605261043c60006007545af1613c0057600080fd5b6101e0516104c052610200516104e052610220516105005261024051610520526101405160043580821015613c3457600080fd5b8082039050905061054052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a06104c0a2600062ffffff55005b63e310327360005114156145015762ffffff5415613c8d57600080fd5b600162ffffff553415613c9f57600080fd5b600f5415613cac57600080fd5b6007543b613cb957600080fd5b6007543018613cc757600080fd5b60206101c060046318160ddd6101605261017c6007545afa613ce857600080fd5b6000506101c0516101405260006101405111613d0357600080fd5b60045460028082028215828483041417613d1c57600080fd5b8090509050905060048080613d3057600080fd5b8204905090506101e052600554610200526102206101405161016051610180516101a0516101c0516101e051610200516102205161024051600658016100a9565b610280526102a0526102405261022052610200526101e0526101c0526101a052610180526101605261014052610280805182528060200151826020015250506102c060028060c052602060c02054825260018160c052602060c0200154826020015250506103006102c080518252806020015182602001525050610140610360525b61036051516020610360510161036052610360610360511015613e1557613df3565b6339276498610380526103a0610220805182528060200151826020015250506103e06102c080518252806020015182602001525050610400516103e0516103c0516103a051600658016106fb565b61046052610340610360525b6103605152602061036051036103605261014061036051101515613e9257613e6f565b610460516103405261048060006002818352015b6103006104805160028110613eba57600080fd5b60200201805160046104805160028110613ed357600080fd5b602002013580821015613ee557600080fd5b808203905090508152505b8151600101808352811415613ea6575b50506101406104c0525b6104c0515160206104c051016104c0526104c06104c0511015613f2c57613f0a565b63392764986104e052610500610220805182528060200151826020015250506105406103008051825280602001518260200152505061056051610540516105205161050051600658016106fb565b6105c0526104a06104c0525b6104c0515260206104c051036104c0526101406104c051101515613fa957613f86565b6105c0516104a0526105e060008152600081602001525061062060006002818352015b6104a0516102c06106205160028110613fe457600080fd5b60200201518082028215828483041417613ffd57600080fd5b8090509050905061034051808061401357600080fd5b82049050905061064052600061066052610300610620516002811061403757600080fd5b60200201516106405111156140805761064051610300610620516002811061405e57600080fd5b60200201518082101561407057600080fd5b80820390509050610660526140b6565b610300610620516002811061409457600080fd5b602002015161064051808210156140aa57600080fd5b80820390509050610660525b6101e0516106605180820282158284830414176140d257600080fd5b809050905090506402540be40080806140ea57600080fd5b8204905090506105e0610620516002811061410457600080fd5b6020020152610300610620516002811061411d57600080fd5b60200201516105e0610620516002811061413657600080fd5b602002015161020051808202821582848304141761415357600080fd5b809050905090506402540be400808061416b57600080fd5b8204905090508082101561417e57600080fd5b80820390509050610620516002811061419657600080fd5b600260c052602060c020015561030061062051600281106141b657600080fd5b6020020180516105e061062051600281106141d057600080fd5b6020020151808210156141e257600080fd5b808203905090508152505b8151600101808352811415613fcc575b50506101406106a0525b6106a0515160206106a051016106a0526106a06106a051101561422957614207565b63392764986106c0526106e061022080518252806020015182602001525050610720610300805182528060200151826020015250506107405161072051610700516106e051600658016106fb565b6107a0526106806106a0525b6106a0515260206106a051036106a0526101406106a0511015156142a657614283565b6107a051610680526103405161068051808210156142c357600080fd5b808203905090506101405180820282158284830414176142e257600080fd5b809050905090506103405180806142f857600080fd5b8204905090506107c05260006107c0511161431257600080fd5b6308c379a06107e0526020610800526014610820527f536c697070616765207363726577656420796f7500000000000000000000000061084052610820506044356107c05111156143645760846107fcfd5b61088060006002818352015b610880516002811061438157600080fd5b600060c052602060c02001543b61439757600080fd5b61088051600281106143a857600080fd5b600060c052602060c020015430186143bf57600080fd5b6020610940604463a9059cbb6108a052336108c052600461088051600281106143e757600080fd5b60200201356108e0526108bc6000610880516002811061440657600080fd5b600060c052602060c02001545af161441d57600080fd5b6000506109405161442d57600080fd5b5b8151600101808352811415614370575b50506007543b61444d57600080fd5b600754301861445b57600080fd5b6000600060446379cc67906109605233610980526107c0516109a05261097c60006007545af161448a57600080fd5b600435610a0052602435610a20526105e051610a405261060051610a60526104a051610a8052610140516107c051808210156144c557600080fd5b80820390509050610aa052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c0610a00a2600062ffffff55005b63ee11f5b660005114156145c357341561451a57600080fd5b600654331461452857600080fd5b6008541561453557600080fd5b64012a05f200604435111561454957600080fd5b426203f48081818301101561455d57600080fd5b808201905090506101405261014051600855600435600a55602435600b55604435600c5560043561016052602435610180526044356101a052610140517f6081daa3b61098baf24d9c69bcd53af932e0635c89c6fd0617534b9ba76a7f736060610160a2005b632a7dd7cd60005114156146705734156145dc57600080fd5b60065433146145ea57600080fd5b6000600854114260085411151661460057600080fd5b6000600855600a5461014052600b5461016052600c5461018052610140516003556101605160045561018051600555610140516101a052610160516101c052610180516101e0527f752a27d1853eb7af3ee4ff764f2c4a51619386af721573dd3809e929c39db99e60606101a0a1005b63226840fb600051141561469e57341561468957600080fd5b600654331461469757600080fd5b6000600855005b636b441a40600051141561473f5734156146b757600080fd5b60043560205181106146c857600080fd5b5060065433146146d757600080fd5b600954156146e457600080fd5b426203f4808181830110156146f857600080fd5b808201905090506101405261014051600955600435600d55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae60005114156147bb57341561475857600080fd5b600654331461476657600080fd5b6000600954116009544210151661477c57600080fd5b6000600955600d546101405261014051600655610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19360005114156147e95734156147d457600080fd5b60065433146147e257600080fd5b6000600955005b6330c54085600051141561494c57341561480257600080fd5b600654331461481057600080fd5b61014060018152600181602001525061018060006002818352015b610180516002811061483c57600080fd5b600060c052602060c02001546101a0526101a0513b61485a57600080fd5b6101a051301861486957600080fd5b602061026060246370a082316101e05230610200526101fc6101a0515afa61489057600080fd5b6000506102605161018051600281106148a857600080fd5b600260c052602060c0200154808210156148c157600080fd5b808203905090506101c05260006101c0511115614937576101a0513b6148e657600080fd5b6101a05130186148f557600080fd5b6020610320604463a9059cbb61028052336102a0526101c0516102c05261029c60006101a0515af161492657600080fd5b6000506103205161493657600080fd5b5b5b815160010180835281141561482b575b5050005b63e3698853600051141561498857341561496557600080fd5b600654331461497357600080fd5b42600e541161498157600080fd5b6001600f55005b633046f97260005114156149b65734156149a157600080fd5b60065433146149af57600080fd5b6000600f55005b6323746eb86000511415614a1b5734156149cf57600080fd5b606051600435806040519013156149e557600080fd5b80919012156149f357600080fd5b5060043560028110614a0457600080fd5b600060c052602060c020015460005260206000f350005b63b739953e6000511415614a80573415614a3457600080fd5b60605160043580604051901315614a4a57600080fd5b8091901215614a5857600080fd5b5060043560028110614a6957600080fd5b600160c052602060c020015460005260206000f350005b63065a80d86000511415614ae5573415614a9957600080fd5b60605160043580604051901315614aaf57600080fd5b8091901215614abd57600080fd5b5060043560028110614ace57600080fd5b600260c052602060c020015460005260206000f350005b63f446c1d06000511415614b0c573415614afe57600080fd5b60035460005260206000f350005b63ddca3f436000511415614b33573415614b2557600080fd5b60045460005260206000f350005b63fee3f7f96000511415614b5a573415614b4c57600080fd5b60055460005260206000f350005b638da5cb5b6000511415614b81573415614b7357600080fd5b60065460005260206000f350005b63405e28f86000511415614ba8573415614b9a57600080fd5b60085460005260206000f350005b63e0a0b5866000511415614bcf573415614bc157600080fd5b60095460005260206000f350005b63b4b577ad6000511415614bf6573415614be857600080fd5b600a5460005260206000f350005b6358680d0b6000511415614c1d573415614c0f57600080fd5b600b5460005260206000f350005b63e38244626000511415614c44573415614c3657600080fd5b600c5460005260206000f350005b631ec0cdc16000511415614c6b573415614c5d57600080fd5b600d5460005260206000f350005b5b60006000fd5b610237614ea903610237600039610237614ea9036000f30000000000000000000000005dbcf33d8c2e976c6b560249878e6f1491bca25c0000000000000000000000002994529c0652d127b7842094103715ec5299bbed000000000000000000000000df5e0e81dff6faf3a7e52ba697820c5e32d806a80000000000000000000000003b3ac5386837dc563660fb6a0937dfaa5924333b000000000000000000000000078b728243b975d1a284666c30b30530a8c087fe000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000003d0900

Deployed Bytecode

0x600436101561000d57614c6c565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526000156101e0575b610140526101606001815260018160200152506101a060006002818352015b6101606101a051600281106100dc57600080fd5b6020020180516101a051600281106100f357600080fd5b600060c052602060c02001543b61010957600080fd5b6101a0516002811061011a57600080fd5b600060c052602060c0200154301861013157600080fd5b602061022060046377c7b8fc6101c0526101dc6101a0516002811061015557600080fd5b600060c052602060c02001545afa61016c57600080fd5b60005061022051808202821582848304141761018757600080fd5b809050905090508152505b81516001018083528114156100c8575b50506040610240525b6000610240511115156101bd576101d9565b60206102405103610160015160206102405103610240526101ab565b6101405156005b6000156102e9575b6101805261014052610160526101a0610140805182528060200151826020015250506101e060006002818352015b6101a06101e0516002811061022a57600080fd5b60200201516101e0516002811061024057600080fd5b600260c052602060c0200154808202821582848304141761026057600080fd5b80905090509050670de0b6b3a7640000808061027b57600080fd5b8204905090506101a06101e0516002811061029557600080fd5b60200201525b8151600101808352811415610216575b50506040610200525b6000610200511115156102c6576102e2565b602061020051036101a0015160206102005103610200526102b4565b6101805156005b6000156103f6575b6101c0526101405261016052610180526101a0526101e06101408051825280602001518260200152505061022060006002818352015b6101e0610220516002811061033b57600080fd5b6020020151610180610220516002811061035457600080fd5b6020020151808202821582848304141761036d57600080fd5b80905090509050670de0b6b3a7640000808061038857600080fd5b8204905090506101e061022051600281106103a257600080fd5b60200201525b8151600101808352811415610327575b50506040610240525b6000610240511115156103d3576103ef565b602061024051036101e0015160206102405103610240526103c1565b6101c05156005b6000156106f3575b61018052610140526101605260006101a0526101e060006002818352015b60206101e0510261014001516101c0526101a080516101c05181818301101561044457600080fd5b808201905090508152505b815160010180835281141561041c575b50506101a051151561047a5760006000526000516101805156505b6000610220526101a05161024052600354600280820282158284830414176104a157600080fd5b8090509050905061026052610280600060ff818352015b610240516102a0526102e060006002818352015b60206102e0510261014001516102c0526102a0516102405180820282158284830414176104f857600080fd5b809050905090506102c0516002808202821582848304141761051957600080fd5b80905090509050600181818301101561053157600080fd5b80820190509050808061054357600080fd5b8204905090506102a0525b81516001018083528114156104cc575b50506102405161022052610260516101a051808202821582848304141761058457600080fd5b809050905090506102a051600280820282158284830414176105a557600080fd5b809050905090508181830110156105bb57600080fd5b808201905090506102405180820282158284830414176105da57600080fd5b80905090509050610260516001808210156105f457600080fd5b8082039050905061024051808202821582848304141761061357600080fd5b8090509050905060036102a051808202821582848304141761063457600080fd5b8090509050905081818301101561064a57600080fd5b80820190509050808061065c57600080fd5b82049050905061024052610220516102405111156106a357600161024051610220518082101561068b57600080fd5b8082039050905011151561069e576106df565b6106ce565b60016102205161024051808210156106ba57600080fd5b808203905090501115156106cd576106df565b5b5b81516001018083528114156104b8575b505061024051600052600051610180515650005b600015610855575b6101c0526101405261016052610180526101a052610140610460525b6104605151602061046051016104605261046061046051101561073957610717565b637b08bb90610480526104a0610140610320525b6103205151602061032051016103205261032061032051101561076f5761074d565b63575e285f61034052610360610140805182528060200151826020015250506103a0610180805182528060200151826020015250506103c0516103a0516103805161036051600658016102f1565b6104205261044052610300610320525b61032051526020610320510361032052610140610320511015156107f0576107cd565b610420805182528060200151826020015250506104c0516104a051600658016103fe565b61052052610440610460525b610460515260206104605103610460526101406104605110151561084357610820565b610520516000526000516101c0515650005b63bb7b8b806000511415610a8157341561086e57600080fd5b6101406104e0525b6104e0515160206104e051016104e0526104e06104e051101561089857610876565b637b08bb90610500526105206101406103e0525b6103e0515160206103e051016103e0526103e06103e05110156108ce576108ac565b6396b414ec61040052610420610140610380525b61038051516020610380510161038052610380610380511015610904576108e2565b600658016100a9565b6103a0526103c052610360610380525b61038051526020610380510361038052610140610380511015156109405761091d565b6103a0805182528060200151826020015250506104405161042051600658016101e8565b6104a0526104c0526103c06103e0525b6103e0515260206103e051036103e0526101406103e05110151561099757610974565b6104a0805182528060200151826020015250506105405161052051600658016103fe565b6105a0526104c06104e0525b6104e0515260206104e051036104e0526101406104e0511015156109ea576109c7565b6105a051610140526007543b6109ff57600080fd5b6007543018610a0d57600080fd5b602061064060046318160ddd6105e0526105fc6007545afa610a2e57600080fd5b600050610640516105c05261014051670de0b6b3a76400008082028215828483041417610a5a57600080fd5b809050905090506105c0518080610a7057600080fd5b82049050905060005260206000f350005b63ed8e84f36000511415610dff573415610a9a57600080fd5b60443560028110610aaa57600080fd5b5061014060028060c052602060c02054825260018160c052602060c0200154826020015250506101806101405161016051610180516101a051600658016100a9565b6101e052610200526101a0526101805261016052610140526101e0805182528060200151826020015250506101405161016051610180516101a0516101c0516101e0516102005161022051633927649861026052610280610180805182528060200151826020015250506102c0610140805182528060200151826020015250506102e0516102c0516102a05161028051600658016106fb565b6103405261022052610200526101e0526101c0526101a052610180526101605261014052610340516102205261036060006002818352015b60443515610c15576101406103605160028110610bd957600080fd5b60200201805160046103605160028110610bf257600080fd5b6020020135818183011015610c0657600080fd5b80820190509050815250610c5f565b6101406103605160028110610c2957600080fd5b60200201805160046103605160028110610c4257600080fd5b602002013580821015610c5457600080fd5b808203905090508152505b5b8151600101808352811415610bbd575b50506101406103a0525b6103a0515160206103a051016103a0526103a06103a0511015610c9c57610c7a565b63392764986103c0526103e061018080518252806020015182602001525050610420610140805182528060200151826020015250506104405161042051610400516103e051600658016106fb565b6104a0526103806103a0525b6103a0515260206103a051036103a0526101406103a051101515610d1957610cf6565b6104a051610380526007543b610d2e57600080fd5b6007543018610d3c57600080fd5b602061054060046318160ddd6104e0526104fc6007545afa610d5d57600080fd5b600050610540516104c05260006105605260443515610d9b57610380516102205180821015610d8b57600080fd5b8082039050905061056052610dbc565b610220516103805180821015610db057600080fd5b80820390509050610560525b610560516104c0518082028215828483041417610dd857600080fd5b80905090509050610220518080610dee57600080fd5b82049050905060005260206000f350005b630b4c7e4d60005114156117445762ffffff5415610e1c57600080fd5b600162ffffff553415610e2e57600080fd5b600f5415610e3b57600080fd5b61014060008152600081602001525060045460028082028215828483041417610e6357600080fd5b8090509050905060048080610e7757600080fd5b820490509050610180526005546101a0526007543b610e9557600080fd5b6007543018610ea357600080fd5b602061024060046318160ddd6101e0526101fc6007545afa610ec457600080fd5b600050610240516101c0526102606101406102a0525b6102a0515160206102a051016102a0526102a06102a0511015610efc57610eda565b600658016100a9565b6102c0526102e0526102806102a0525b6102a0515260206102a051036102a0526101406102a051101515610f3857610f15565b6102c08051825280602001518260200152505060006103005261032060028060c052602060c02054825260018160c052602060c02001548260200152505060006101c051111561103257610140610360525b61036051516020610360510161036052610360610360511015610fac57610f8a565b6339276498610380526103a0610260805182528060200151826020015250506103e061032080518252806020015182602001525050610400516103e0516103c0516103a051600658016106fb565b61046052610340610360525b610360515260206103605103610360526101406103605110151561102957611006565b61046051610300525b610480610320805182528060200151826020015250506104c060006002818352015b6101c051151561108357600060046104c0516002811061107357600080fd5b60200201351161108257600080fd5b5b6103206104c0516002811061109757600080fd5b602002015160046104c051600281106110af57600080fd5b60200201358181830110156110c357600080fd5b808201905090506104806104c051600281106110de57600080fd5b60200201525b8151600101808352811415611054575b5050610140610500525b61050051516020610500510161050052610500610500511015611120576110fe565b63392764986105205261054061026080518252806020015182602001525050610580610480805182528060200151826020015250506105a051610580516105605161054051600658016106fb565b610600526104e0610500525b610500515260206105005103610500526101406105005110151561119d5761117a565b610600516104e052610300516104e051116111b757600080fd5b6104e0516106205260006101c05111156114be5761064060006002818352015b6104e05161032061064051600281106111ef57600080fd5b6020020151808202821582848304141761120857600080fd5b8090509050905061030051808061121e57600080fd5b82049050905061066052600061068052610480610640516002811061124257600080fd5b602002015161066051111561128b5761066051610480610640516002811061126957600080fd5b60200201518082101561127b57600080fd5b80820390509050610680526112c1565b610480610640516002811061129f57600080fd5b602002015161066051808210156112b557600080fd5b80820390509050610680525b610180516106805180820282158284830414176112dd57600080fd5b809050905090506402540be40080806112f557600080fd5b820490509050610140610640516002811061130f57600080fd5b6020020152610480610640516002811061132857600080fd5b6020020151610140610640516002811061134157600080fd5b60200201516101a051808202821582848304141761135e57600080fd5b809050905090506402540be400808061137657600080fd5b8204905090508082101561138957600080fd5b8082039050905061064051600281106113a157600080fd5b600260c052602060c020015561048061064051600281106113c157600080fd5b60200201805161014061064051600281106113db57600080fd5b6020020151808210156113ed57600080fd5b808203905090508152505b81516001018083528114156111d7575b50506101406106a0525b6106a0515160206106a051016106a0526106406106a051101561143457611412565b63392764986106c0526106e061026080518252806020015182602001525050610720610480805182528060200151826020015250506107405161072051610700516106e051600658016106fb565b6107a0526106206106a0525b6106a0515260206106a051036106a0526101406106a0511015156114b15761148e565b6107a051610620526114dc565b600260c052602060c020610480805182558060200151600183015550505b60006107c0526101c05115156114f9576104e0516107c05261154e565b6101c05161062051610300518082101561151257600080fd5b80820390509050808202821582848304141761152d57600080fd5b8090509050905061030051808061154357600080fd5b8204905090506107c0525b6308c379a06107e0526020610800526014610820527f536c697070616765207363726577656420796f7500000000000000000000000061084052610820506044356107c05110156115a05760846107fcfd5b61088060006002818352015b61088051600281106115bd57600080fd5b600060c052602060c02001543b6115d357600080fd5b61088051600281106115e457600080fd5b600060c052602060c020015430186115fb57600080fd5b602061096060646323b872dd6108a052336108c052306108e0526004610880516002811061162857600080fd5b6020020135610900526108bc6000610880516002811061164757600080fd5b600060c052602060c02001545af161165e57600080fd5b6000506109605161166e57600080fd5b5b81516001018083528114156115ac575b50506007543b61168e57600080fd5b600754301861169c57600080fd5b6000600060446340c10f1961098052336109a0526107c0516109c05261099c60006007545af16116cb57600080fd5b600435610a2052602435610a405261014051610a605261016051610a80526104e051610aa0526101c0516107c05181818301101561170857600080fd5b80820190509050610ac052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c0610a20a2600062ffffff55005b600015611b14575b6101e0526101405261016052610180526101a0526101c052600061014051121561016051610140511415166000610160511215166002610140511216600261016051121661179957600080fd5b6101405161016051610180516101a0516101c0516101e05161020051637b08bb90610240526102606101a0805182528060200151826020015250506102805161026051600658016103fe565b6102e052610200526101e0526101c0526101a0526101805261016052610140526102e0516102005261020051610300526000610320526003546002808202821582848304141761183457600080fd5b809050905090506103405260006103605261038060006002818352015b6101405161038051141561186c5761018051610360526118a2565b6101605161038051181561189c576101a0610380516002811061188e57600080fd5b6020020151610360526118a1565b61191e565b5b6103208051610360518181830110156118ba57600080fd5b80820190509050815250610300516102005180820282158284830414176118e057600080fd5b80905090509050610360516002808202821582848304141761190157600080fd5b80905090509050808061191357600080fd5b820490509050610300525b8151600101808352811415611851575b50506103005161020051808202821582848304141761194c57600080fd5b80905090509050610340516002808202821582848304141761196d57600080fd5b80905090509050808061197f57600080fd5b8204905090506103005261032051610200516103405180806119a057600080fd5b8204905090508181830110156119b557600080fd5b808201905090506103a05260006103c052610200516103e052610400600060ff818352015b6103e0516103c0526103e0516103e05180820282158284830414176119fe57600080fd5b8090509050905061030051818183011015611a1857600080fd5b8082019050905060026103e0518082028215828483041417611a3957600080fd5b809050905090506103a051818183011015611a5357600080fd5b808201905090506102005180821015611a6b57600080fd5b808203905090508080611a7d57600080fd5b8204905090506103e0526103c0516103e0511115611ac45760016103e0516103c05180821015611aac57600080fd5b80820390509050111515611abf57611b00565b611aef565b60016103c0516103e05180821015611adb57600080fd5b80820390509050111515611aee57611b00565b5b5b81516001018083528114156119da575b50506103e0516000526000516101e0515650005b635e0d443f6000511415611e4e573415611b2d57600080fd5b60605160043580604051901315611b4357600080fd5b8091901215611b5157600080fd5b5060605160243580604051901315611b6857600080fd5b8091901215611b7657600080fd5b506101406101405161016051600658016100a9565b6101a0526101c05261016052610140526101a0805182528060200151826020015250506101e06101405161016051610180516101a0516101c0516101e051610200516396b414ec61024052610260610140805182528060200151826020015250506102805161026051600658016101e8565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e0805182528060200151826020015250506101e060043560028110611c4757600080fd5b602002015160443561014060043560028110611c6257600080fd5b60200201518082028215828483041417611c7b57600080fd5b80905090509050670de0b6b3a76400008080611c9657600080fd5b820490509050818183011015611cab57600080fd5b8082019050905061032052610140610360525b61036051516020610360510161036052610360610360511015611ce057611cbe565b63232dd1c9610380526004356103a0526024356103c052610320516103e0526104006101e08051825280602001518260200152505061042051610400516103e0516103c0516103a0516006580161174c565b61048052610340610360525b6103605152602061036051036103605261014061036051101515611d6157611d3e565b61048051610340526101e060243560028110611d7c57600080fd5b60200201516103405180821015611d9257600080fd5b80820390509050670de0b6b3a76400008082028215828483041417611db657600080fd5b8090509050905061014060243560028110611dd057600080fd5b60200201518080611de057600080fd5b8204905090506104a0526004546104a0518082028215828483041417611e0557600080fd5b809050905090506402540be4008080611e1d57600080fd5b8204905090506104c0526104a0516104c05180821015611e3c57600080fd5b8082039050905060005260206000f350005b6367df02ca6000511415612180573415611e6757600080fd5b60605160043580604051901315611e7d57600080fd5b8091901215611e8b57600080fd5b5060605160243580604051901315611ea257600080fd5b8091901215611eb057600080fd5b506101406101405161016051600658016100a9565b6101a0526101c05261016052610140526101a0805182528060200151826020015250506101e06101405161016051610180516101a0516101c0516101e051610200516396b414ec61024052610260610140805182528060200151826020015250506102805161026051600658016101e8565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e0805182528060200151826020015250506101e060243560028110611f8157600080fd5b60200201516044356402540be4008082028215828483041417611fa357600080fd5b809050905090506402540be40060045480821015611fc057600080fd5b808203905090508080611fd257600080fd5b82049050905061014060243560028110611feb57600080fd5b6020020151808202821582848304141761200457600080fd5b80905090509050670de0b6b3a7640000808061201f57600080fd5b8204905090508082101561203257600080fd5b8082039050905061032052610140610360525b6103605151602061036051016103605261036061036051101561206757612045565b63232dd1c9610380526024356103a0526004356103c052610320516103e0526104006101e08051825280602001518260200152505061042051610400516103e0516103c0516103a0516006580161174c565b61048052610340610360525b61036051526020610360510361036052610140610360511015156120e8576120c5565b6104805161034052610340516101e06004356002811061210757600080fd5b60200201518082101561211957600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761213d57600080fd5b809050905090506101406004356002811061215757600080fd5b6020020151808061216757600080fd5b8204905090506104a0526104a05160005260206000f350005b6307211ef760005114156125a357341561219957600080fd5b606051600435806040519013156121af57600080fd5b80919012156121bd57600080fd5b50606051602435806040519013156121d457600080fd5b80919012156121e257600080fd5b506101406101405161016051600658016100a9565b6101a0526101c05261016052610140526101a0805182528060200151826020015250506101e06101405161016051610180516101a0516101c0516101e051610200516396b414ec61024052610260610140805182528060200151826020015250506102805161026051600658016101e8565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e0805182528060200151826020015250506103206001815260018160200152506101e0600435600281106122c257600080fd5b6020020151604435610320600435600281106122dd57600080fd5b602002015180820282158284830414176122f657600080fd5b8090509050905081818301101561230c57600080fd5b80820190509050610360526101406103a0525b6103a0515160206103a051016103a0526103a06103a05110156123415761231f565b63232dd1c96103c0526004356103e0526024356104005261036051610420526104406101e080518252806020015182602001525050610460516104405161042051610400516103e0516006580161174c565b6104c0526103806103a0525b6103a0515260206103a051036103a0526101406103a0511015156123c25761239f565b6104c051610380526101e0602435600281106123dd57600080fd5b602002015161038051808210156123f357600080fd5b808203905090506103206024356002811061240d57600080fd5b6020020151808061241d57600080fd5b8204905090506104e0526004546104e051808202821582848304141761244257600080fd5b809050905090506402540be400808061245a57600080fd5b820490509050610500526000610520526024356002811061247a57600080fd5b600160c052602060c02001543b61249057600080fd5b602435600281106124a057600080fd5b600160c052602060c020015430186124b757600080fd5b60206105e060246370a0823161056052602435600281106124d757600080fd5b600060c052602060c02001546105805261057c602435600281106124fa57600080fd5b600160c052602060c02001545afa61251157600080fd5b6000506105e051610540526104e0516105405110156125645760056104e051808202821582848304141761254457600080fd5b809050905090506103e8808061255957600080fd5b820490509050610520525b6104e051610500518082101561257957600080fd5b80820390509050610520518082101561259157600080fd5b8082039050905060005260206000f350005b630e71d1b960005114156128a65734156125bc57600080fd5b606051600435806040519013156125d257600080fd5b80919012156125e057600080fd5b50606051602435806040519013156125f757600080fd5b809190121561260557600080fd5b506101406101405161016051600658016100a9565b6101a0526101c05261016052610140526101a0805182528060200151826020015250506101e06101405161016051610180516101a0516101c0516101e051610200516396b414ec61024052610260610140805182528060200151826020015250506102805161026051600658016101e8565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e0805182528060200151826020015250506103206001815260018160200152506101e0602435600281106126e557600080fd5b60200201516044356402540be400808202821582848304141761270757600080fd5b809050905090506402540be4006004548082101561272457600080fd5b80820390509050808061273657600080fd5b8204905090506103206024356002811061274f57600080fd5b6020020151808202821582848304141761276857600080fd5b809050905090508082101561277c57600080fd5b80820390509050610360526101406103a0525b6103a0515160206103a051016103a0526103a06103a05110156127b15761278f565b63232dd1c96103c0526024356103e0526004356104005261036051610420526104406101e080518252806020015182602001525050610460516104405161042051610400516103e0516006580161174c565b6104c0526103806103a0525b6103a0515260206103a051036103a0526101406103a0511015156128325761280f565b6104c05161038052610380516101e06004356002811061285157600080fd5b60200201518082101561286357600080fd5b808203905090506103206004356002811061287d57600080fd5b6020020151808061288d57600080fd5b8204905090506104e0526104e05160005260206000f350005b600015612cda575b6101e0526101405261016052610180526101a0526101c052600f54156128d357600080fd5b6102006101405161016051610180516101a0516101c0516101e05161020051610220516396b414ec610260526102806101a0805182528060200151826020015250506102a05161028051600658016101e8565b610300526103205261022052610200526101e0526101c0526101a05261018052610160526101405261030080518252806020015182602001525050610200610140516002811061297557600080fd5b6020020151610180516101a0610140516002811061299257600080fd5b602002015180820282158284830414176129ab57600080fd5b80905090509050670de0b6b3a764000080806129c657600080fd5b8204905090508181830110156129db57600080fd5b8082019050905061034052610140610380525b61038051516020610380510161038052610380610380511015612a10576129ee565b63232dd1c96103a052610140516103c052610160516103e0526103405161040052610420610200805182528060200151826020015250506104405161042051610400516103e0516103c0516006580161174c565b6104a052610360610380525b6103805152602061038051036103805261014061038051101515612a9357612a70565b6104a051610360526102006101605160028110612aaf57600080fd5b60200201516103605180821015612ac557600080fd5b808203905090506104c0526104c0516004548082028215828483041417612aeb57600080fd5b809050905090506402540be4008080612b0357600080fd5b8204905090506104e0526104e0516005548082028215828483041417612b2857600080fd5b809050905090506402540be4008080612b4057600080fd5b8204905090506105005261034051670de0b6b3a76400008082028215828483041417612b6b57600080fd5b809050905090506101a06101405160028110612b8657600080fd5b60200201518080612b9657600080fd5b8204905090506101405160028110612bad57600080fd5b600260c052602060c0200155610360516104e0516105005180821015612bd257600080fd5b80820390509050818183011015612be857600080fd5b80820190509050670de0b6b3a76400008082028215828483041417612c0c57600080fd5b809050905090506101a06101605160028110612c2757600080fd5b60200201518080612c3757600080fd5b8204905090506101605160028110612c4e57600080fd5b600260c052602060c02001556104c0516104e05180821015612c6f57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417612c9357600080fd5b809050905090506101a06101605160028110612cae57600080fd5b60200201518080612cbe57600080fd5b82049050905061052052610520516000526000516101e0515650005b633df02124600051141561302c5762ffffff5415612cf757600080fd5b600162ffffff553415612d0957600080fd5b60605160043580604051901315612d1f57600080fd5b8091901215612d2d57600080fd5b5060605160243580604051901315612d4457600080fd5b8091901215612d5257600080fd5b506101406101405161016051600658016100a9565b6101a0526101c05261016052610140526101a0805182528060200151826020015250506101405161016051610180516101a0516101c0516101e0516399a788e4610220526004356102405260243561026052604435610280526102a0610140805182528060200151826020015250506102c0516102a051610280516102605161024051600658016128ae565b610320526101e0526101c0526101a052610180526101605261014052610320516101e0526308c379a061034052602061036052602e610380527f45786368616e676520726573756c74656420696e20666577657220636f696e736103a0527f207468616e2065787065637465640000000000000000000000000000000000006103c052610380506064356101e0511015612e8e5760a461035cfd5b60043560028110612e9e57600080fd5b600060c052602060c02001543b612eb457600080fd5b60043560028110612ec457600080fd5b600060c052602060c02001543018612edb57600080fd5b60206104c060646323b872dd61040052336104205230610440526044356104605261041c600060043560028110612f1157600080fd5b600060c052602060c02001545af1612f2857600080fd5b6000506104c051612f3857600080fd5b60243560028110612f4857600080fd5b600060c052602060c02001543b612f5e57600080fd5b60243560028110612f6e57600080fd5b600060c052602060c02001543018612f8557600080fd5b6020610580604463a9059cbb6104e05233610500526101e051610520526104fc600060243560028110612fb757600080fd5b600060c052602060c02001545af1612fce57600080fd5b60005061058051612fde57600080fd5b6004356105a0526044356105c0526024356105e0526101e05161060052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd9714060806105a0a2600062ffffff55005b63a6417ed660005114156139255762ffffff541561304957600080fd5b600162ffffff55341561305b57600080fd5b6060516004358060405190131561307157600080fd5b809190121561307f57600080fd5b506060516024358060405190131561309657600080fd5b80919012156130a457600080fd5b506101406101405161016051600658016100a9565b6101a0526101c05261016052610140526101a0805182528060200151826020015250506101e0600181526001816020015250610140600435600281106130fe57600080fd5b60200201516101e06004356002811061311657600080fd5b6020020151808061312657600080fd5b820490509050610220526101406024356002811061314357600080fd5b60200201516101e06024356002811061315b57600080fd5b6020020151808061316b57600080fd5b82049050905061024052604435670de0b6b3a7640000808202821582848304141761319557600080fd5b809050905090506102205180806131ab57600080fd5b820490509050610260526101406102a0525b6102a0515160206102a051016102a0526102a06102a05110156131df576131bd565b6399a788e46102c0526004356102e05260243561030052610260516103205261034061014080518252806020015182602001525050610360516103405161032051610300516102e051600658016128ae565b6103c0526102806102a0525b6102a0515260206102a051036102a0526101406102a0511015156132605761323d565b6103c051610280526102805161024051808202821582848304141761328457600080fd5b80905090509050670de0b6b3a7640000808061329f57600080fd5b8204905090506103e0526308c379a061040052602061042052602e610440527f45786368616e676520726573756c74656420696e20666577657220636f696e73610460527f207468616e20657870656374656400000000000000000000000000000000000061048052610440506064356103e05110156133205760a461041cfd5b6104c06000815260008160200152506104c06004356002811061334257600080fd5b6020020151156133ea576004356002811061335c57600080fd5b600160c052602060c02001543b61337257600080fd5b6004356002811061338257600080fd5b600160c052602060c0200154301861339957600080fd5b6000600060646323b872dd6105e05233610600523061062052604435610640526105fc6000600435600281106133ce57600080fd5b600160c052602060c02001545af16133e557600080fd5b613495565b600435600281106133fa57600080fd5b600160c052602060c02001543b61341057600080fd5b6004356002811061342057600080fd5b600160c052602060c0200154301861343757600080fd5b60206105c060646323b872dd61050052336105205230610540526044356105605261051c60006004356002811061346d57600080fd5b600160c052602060c02001545af161348457600080fd5b6000506105c05161349457600080fd5b5b600435600281106134a557600080fd5b600160c052602060c02001543b6134bb57600080fd5b600435600281106134cb57600080fd5b600160c052602060c020015430186134e257600080fd5b6020610740604463095ea7b36106a0526004356002811061350257600080fd5b600060c052602060c02001546106c0526044356106e0526106bc60006004356002811061352e57600080fd5b600160c052602060c02001545af161354557600080fd5b600050610740506004356002811061355c57600080fd5b600060c052602060c02001543b61357257600080fd5b6004356002811061358257600080fd5b600060c052602060c0200154301861359957600080fd5b60006000602463b6b55f25610760526044356107805261077c6000600435600281106135c457600080fd5b600060c052602060c02001545af16135db57600080fd5b602435600281106135eb57600080fd5b600060c052602060c02001543b61360157600080fd5b6024356002811061361157600080fd5b600060c052602060c0200154301861362857600080fd5b600060006024632e1a7d4d6107e05261028051610800526107fc60006024356002811061365457600080fd5b600060c052602060c02001545af161366b57600080fd5b6024356002811061367b57600080fd5b600160c052602060c02001543b61369157600080fd5b602435600281106136a157600080fd5b600160c052602060c020015430186136b857600080fd5b60206108e060246370a0823161086052306108805261087c602435600281106136e057600080fd5b600160c052602060c02001545afa6136f757600080fd5b6000506108e0516103e0526308c379a061090052602061092052602e610940527f45786368616e676520726573756c74656420696e20666577657220636f696e73610960527f207468616e20657870656374656400000000000000000000000000000000000061098052610940506064356103e05110156137795760a461091cfd5b6104c06024356002811061378c57600080fd5b60200201511561383057602435600281106137a657600080fd5b600160c052602060c02001543b6137bc57600080fd5b602435600281106137cc57600080fd5b600160c052602060c020015430186137e357600080fd5b60006000604463a9059cbb610a805233610aa0526103e051610ac052610a9c60006024356002811061381457600080fd5b600160c052602060c02001545af161382b57600080fd5b6138d7565b6024356002811061384057600080fd5b600160c052602060c02001543b61385657600080fd5b6024356002811061386657600080fd5b600160c052602060c0200154301861387d57600080fd5b6020610a60604463a9059cbb6109c052336109e0526103e051610a00526109dc6000602435600281106138af57600080fd5b600160c052602060c02001545af16138c657600080fd5b600050610a60516138d657600080fd5b5b600435610b2052604435610b4052602435610b60526103e051610b8052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b6080610b20a2600062ffffff55005b635b36389c6000511415613c705762ffffff541561394257600080fd5b600162ffffff55341561395457600080fd5b6007543b61396157600080fd5b600754301861396f57600080fd5b60206101c060046318160ddd6101605261017c6007545afa61399057600080fd5b6000506101c051610140526101e060008152600081602001525061022060008152600081602001525061026060006002818352015b61026051600281106139d657600080fd5b600260c052602060c020015460043580820282158284830414176139f957600080fd5b80905090509050610140518080613a0f57600080fd5b820490509050610280526308c379a06102a05260206102c05260306102e0527f5769746864726177616c20726573756c74656420696e20666577657220636f69610300527f6e73207468616e20657870656374656400000000000000000000000000000000610320526102e05060246102605160028110613a8f57600080fd5b6020020135610280511015613aa55760a46102bcfd5b6102605160028110613ab657600080fd5b600260c052602060c0200180546102805180821015613ad457600080fd5b80820390509050815550610280516101e06102605160028110613af657600080fd5b60200201526102605160028110613b0c57600080fd5b600060c052602060c02001543b613b2257600080fd5b6102605160028110613b3357600080fd5b600060c052602060c02001543018613b4a57600080fd5b6020610400604463a9059cbb610360523361038052610280516103a05261037c60006102605160028110613b7d57600080fd5b600060c052602060c02001545af1613b9457600080fd5b60005061040051613ba457600080fd5b5b81516001018083528114156139c5575b50506007543b613bc457600080fd5b6007543018613bd257600080fd5b6000600060446379cc67906104205233610440526004356104605261043c60006007545af1613c0057600080fd5b6101e0516104c052610200516104e052610220516105005261024051610520526101405160043580821015613c3457600080fd5b8082039050905061054052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a06104c0a2600062ffffff55005b63e310327360005114156145015762ffffff5415613c8d57600080fd5b600162ffffff553415613c9f57600080fd5b600f5415613cac57600080fd5b6007543b613cb957600080fd5b6007543018613cc757600080fd5b60206101c060046318160ddd6101605261017c6007545afa613ce857600080fd5b6000506101c0516101405260006101405111613d0357600080fd5b60045460028082028215828483041417613d1c57600080fd5b8090509050905060048080613d3057600080fd5b8204905090506101e052600554610200526102206101405161016051610180516101a0516101c0516101e051610200516102205161024051600658016100a9565b610280526102a0526102405261022052610200526101e0526101c0526101a052610180526101605261014052610280805182528060200151826020015250506102c060028060c052602060c02054825260018160c052602060c0200154826020015250506103006102c080518252806020015182602001525050610140610360525b61036051516020610360510161036052610360610360511015613e1557613df3565b6339276498610380526103a0610220805182528060200151826020015250506103e06102c080518252806020015182602001525050610400516103e0516103c0516103a051600658016106fb565b61046052610340610360525b6103605152602061036051036103605261014061036051101515613e9257613e6f565b610460516103405261048060006002818352015b6103006104805160028110613eba57600080fd5b60200201805160046104805160028110613ed357600080fd5b602002013580821015613ee557600080fd5b808203905090508152505b8151600101808352811415613ea6575b50506101406104c0525b6104c0515160206104c051016104c0526104c06104c0511015613f2c57613f0a565b63392764986104e052610500610220805182528060200151826020015250506105406103008051825280602001518260200152505061056051610540516105205161050051600658016106fb565b6105c0526104a06104c0525b6104c0515260206104c051036104c0526101406104c051101515613fa957613f86565b6105c0516104a0526105e060008152600081602001525061062060006002818352015b6104a0516102c06106205160028110613fe457600080fd5b60200201518082028215828483041417613ffd57600080fd5b8090509050905061034051808061401357600080fd5b82049050905061064052600061066052610300610620516002811061403757600080fd5b60200201516106405111156140805761064051610300610620516002811061405e57600080fd5b60200201518082101561407057600080fd5b80820390509050610660526140b6565b610300610620516002811061409457600080fd5b602002015161064051808210156140aa57600080fd5b80820390509050610660525b6101e0516106605180820282158284830414176140d257600080fd5b809050905090506402540be40080806140ea57600080fd5b8204905090506105e0610620516002811061410457600080fd5b6020020152610300610620516002811061411d57600080fd5b60200201516105e0610620516002811061413657600080fd5b602002015161020051808202821582848304141761415357600080fd5b809050905090506402540be400808061416b57600080fd5b8204905090508082101561417e57600080fd5b80820390509050610620516002811061419657600080fd5b600260c052602060c020015561030061062051600281106141b657600080fd5b6020020180516105e061062051600281106141d057600080fd5b6020020151808210156141e257600080fd5b808203905090508152505b8151600101808352811415613fcc575b50506101406106a0525b6106a0515160206106a051016106a0526106a06106a051101561422957614207565b63392764986106c0526106e061022080518252806020015182602001525050610720610300805182528060200151826020015250506107405161072051610700516106e051600658016106fb565b6107a0526106806106a0525b6106a0515260206106a051036106a0526101406106a0511015156142a657614283565b6107a051610680526103405161068051808210156142c357600080fd5b808203905090506101405180820282158284830414176142e257600080fd5b809050905090506103405180806142f857600080fd5b8204905090506107c05260006107c0511161431257600080fd5b6308c379a06107e0526020610800526014610820527f536c697070616765207363726577656420796f7500000000000000000000000061084052610820506044356107c05111156143645760846107fcfd5b61088060006002818352015b610880516002811061438157600080fd5b600060c052602060c02001543b61439757600080fd5b61088051600281106143a857600080fd5b600060c052602060c020015430186143bf57600080fd5b6020610940604463a9059cbb6108a052336108c052600461088051600281106143e757600080fd5b60200201356108e0526108bc6000610880516002811061440657600080fd5b600060c052602060c02001545af161441d57600080fd5b6000506109405161442d57600080fd5b5b8151600101808352811415614370575b50506007543b61444d57600080fd5b600754301861445b57600080fd5b6000600060446379cc67906109605233610980526107c0516109a05261097c60006007545af161448a57600080fd5b600435610a0052602435610a20526105e051610a405261060051610a60526104a051610a8052610140516107c051808210156144c557600080fd5b80820390509050610aa052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c0610a00a2600062ffffff55005b63ee11f5b660005114156145c357341561451a57600080fd5b600654331461452857600080fd5b6008541561453557600080fd5b64012a05f200604435111561454957600080fd5b426203f48081818301101561455d57600080fd5b808201905090506101405261014051600855600435600a55602435600b55604435600c5560043561016052602435610180526044356101a052610140517f6081daa3b61098baf24d9c69bcd53af932e0635c89c6fd0617534b9ba76a7f736060610160a2005b632a7dd7cd60005114156146705734156145dc57600080fd5b60065433146145ea57600080fd5b6000600854114260085411151661460057600080fd5b6000600855600a5461014052600b5461016052600c5461018052610140516003556101605160045561018051600555610140516101a052610160516101c052610180516101e0527f752a27d1853eb7af3ee4ff764f2c4a51619386af721573dd3809e929c39db99e60606101a0a1005b63226840fb600051141561469e57341561468957600080fd5b600654331461469757600080fd5b6000600855005b636b441a40600051141561473f5734156146b757600080fd5b60043560205181106146c857600080fd5b5060065433146146d757600080fd5b600954156146e457600080fd5b426203f4808181830110156146f857600080fd5b808201905090506101405261014051600955600435600d55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae60005114156147bb57341561475857600080fd5b600654331461476657600080fd5b6000600954116009544210151661477c57600080fd5b6000600955600d546101405261014051600655610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19360005114156147e95734156147d457600080fd5b60065433146147e257600080fd5b6000600955005b6330c54085600051141561494c57341561480257600080fd5b600654331461481057600080fd5b61014060018152600181602001525061018060006002818352015b610180516002811061483c57600080fd5b600060c052602060c02001546101a0526101a0513b61485a57600080fd5b6101a051301861486957600080fd5b602061026060246370a082316101e05230610200526101fc6101a0515afa61489057600080fd5b6000506102605161018051600281106148a857600080fd5b600260c052602060c0200154808210156148c157600080fd5b808203905090506101c05260006101c0511115614937576101a0513b6148e657600080fd5b6101a05130186148f557600080fd5b6020610320604463a9059cbb61028052336102a0526101c0516102c05261029c60006101a0515af161492657600080fd5b6000506103205161493657600080fd5b5b5b815160010180835281141561482b575b5050005b63e3698853600051141561498857341561496557600080fd5b600654331461497357600080fd5b42600e541161498157600080fd5b6001600f55005b633046f97260005114156149b65734156149a157600080fd5b60065433146149af57600080fd5b6000600f55005b6323746eb86000511415614a1b5734156149cf57600080fd5b606051600435806040519013156149e557600080fd5b80919012156149f357600080fd5b5060043560028110614a0457600080fd5b600060c052602060c020015460005260206000f350005b63b739953e6000511415614a80573415614a3457600080fd5b60605160043580604051901315614a4a57600080fd5b8091901215614a5857600080fd5b5060043560028110614a6957600080fd5b600160c052602060c020015460005260206000f350005b63065a80d86000511415614ae5573415614a9957600080fd5b60605160043580604051901315614aaf57600080fd5b8091901215614abd57600080fd5b5060043560028110614ace57600080fd5b600260c052602060c020015460005260206000f350005b63f446c1d06000511415614b0c573415614afe57600080fd5b60035460005260206000f350005b63ddca3f436000511415614b33573415614b2557600080fd5b60045460005260206000f350005b63fee3f7f96000511415614b5a573415614b4c57600080fd5b60055460005260206000f350005b638da5cb5b6000511415614b81573415614b7357600080fd5b60065460005260206000f350005b63405e28f86000511415614ba8573415614b9a57600080fd5b60085460005260206000f350005b63e0a0b5866000511415614bcf573415614bc157600080fd5b60095460005260206000f350005b63b4b577ad6000511415614bf6573415614be857600080fd5b600a5460005260206000f350005b6358680d0b6000511415614c1d573415614c0f57600080fd5b600b5460005260206000f350005b63e38244626000511415614c44573415614c3657600080fd5b600c5460005260206000f350005b631ec0cdc16000511415614c6b573415614c5d57600080fd5b600d5460005260206000f350005b5b60006000fd

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005dbcf33d8c2e976c6b560249878e6f1491bca25c0000000000000000000000002994529c0652d127b7842094103715ec5299bbed000000000000000000000000df5e0e81dff6faf3a7e52ba697820c5e32d806a80000000000000000000000003b3ac5386837dc563660fb6a0937dfaa5924333b000000000000000000000000078b728243b975d1a284666c30b30530a8c087fe000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000003d0900

-----Decoded View---------------
Arg [0] : _coins (address[2]): 0x5dbcF33D8c2E976c6b560249878e6F1491Bca25c,0x2994529C0652D127b7842094103715ec5299bBed
Arg [1] : _underlying_coins (address[2]): 0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8,0x3B3Ac5386837Dc563660FB6a0937DFAa5924333B
Arg [2] : _pool_token (address): 0x078b728243b975d1a284666C30B30530a8c087fe
Arg [3] : _A (uint256): 70
Arg [4] : _fee (uint256): 4000000

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000005dbcf33d8c2e976c6b560249878e6f1491bca25c
Arg [1] : 0000000000000000000000002994529c0652d127b7842094103715ec5299bbed
Arg [2] : 000000000000000000000000df5e0e81dff6faf3a7e52ba697820c5e32d806a8
Arg [3] : 0000000000000000000000003b3ac5386837dc563660fb6a0937dfaa5924333b
Arg [4] : 000000000000000000000000078b728243b975d1a284666c30b30530a8c087fe
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000046
Arg [6] : 00000000000000000000000000000000000000000000000000000000003d0900


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.