Contract 0x2477fb288c5b4118315714ad3c7fd7cc69b00bf9

 
Txn Hash
Block
From
To
Value [Txn Fee]
0x0ed70d330ed41c2a363524684c66aece96621301aacda7bccf456bd7af64515884666092021-06-20 17:06:322 hrs 30 mins ago0x1dc2dc7110f8ee61650864ad6680fe8144b7d6f9 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000551315
0x207fc3512a9a57cb665a1cbfed413352bf66d6df8ea66c0a6af1075670a3828e84643292021-06-20 15:12:324 hrs 24 mins ago0x212f7d290dd23d0df08e9f9959758ed4eb6705e9 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.00049649
0x538e59ad0214ff1d2d86746f45c26a1a3851b9c8da03f2fa5383669600c8477984602992021-06-20 11:51:027 hrs 45 mins ago0x8a53501ad6450330e6f5397af182bfefbc159799 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.00049551
0x4837b8ea96804e854b41997ea19637b6930c768fb163ffa8937355d067c2cb5684585342021-06-20 10:22:469 hrs 14 mins ago0x91199826dbc27ae3033357d91b6fd3b7eb4d2149 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.00049539
0xe7bbd085fbb7bc8cb12d9c6168078ec7c0dc2f0ea15687d33c777c50254f18e084565632021-06-20 8:43:1610 hrs 53 mins ago0x589f24cc3bba5bf077009c22c25bf6829a588e53 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.00049533
0xbb1f26f8a9c7dd6c0853ced21b205b8a4e3dee4c8e5bc24979c1a3c3b8e02e2984563382021-06-20 8:31:5911 hrs 4 mins ago0x589f24cc3bba5bf077009c22c25bf6829a588e53 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000551315
0x25020ea1588479687dcb206af46b923df9a639d351659f48f9716c00066dfee284529632021-06-20 5:43:1413 hrs 53 mins ago0x8971339ec48877b0372ab9b46e63a424d5c1182c IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000551315
0x6e9c378c9f20894552e9d98e02bafb8b8fbb14c9a0a8fe52ebffafb1f20f961584438862021-06-19 22:08:5521 hrs 28 mins ago0x6c50e49774204936dda6312c09d906eff81dfb8f IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000626315
0x2c098d7725c336e0d8687cafacd1409087b1c2dce858bf5af637b7dbd5950b4c84404362021-06-19 19:16:251 day 20 mins ago0x4852d27a3f66fe8c4e91885b8446630a8d4dae52 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000626315
0x0d23915efd0970707c6b6c48a7d9c7c2d74c33811e89bbc9149fc336348c2ad984384922021-06-19 17:39:001 day 1 hr ago0x94b5cc439593fa2cfc76e5a2916ea501cea0079e IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000626255
0x6c6fc0f853a0c69259e20ddeb9013b7fbc412b36e7c08b2b4439500344c9084484370002021-06-19 16:24:061 day 3 hrs ago0x1dc2dc7110f8ee61650864ad6680fe8144b7d6f9 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000551315
0x29ef374d4d1e6cd4a3a3bb72c0eb0c345455ac105411fbf789c29dd4d33de8d584323182021-06-19 12:24:021 day 7 hrs ago0x95abd722117bb04ecb291dc8026b78938d982639 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000551375
0x7c54f8150d021df3ecae757fc41d28116d626c991883520f53d45ff356e37ae284320972021-06-19 12:12:591 day 7 hrs ago0x41f4cba42c41f217424821be2ff845be34503299 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000551315
0xfa643f1753ae76caf844a9e44fabb28d66ab10ed05df040119f899f2c379020f84315002021-06-19 11:43:071 day 7 hrs ago0xa9f06e57c66e2504a02a7cdd3e3448795b388d22 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000487125
0xbc7f951f680a23def4e0338061869352872d4d2f032f39d131f0beff4c1a483a84311002021-06-19 11:21:581 day 8 hrs ago0x41f4cba42c41f217424821be2ff845be34503299 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000626255
0x560fd572b72cec5e37cf241f2c64177db28821b400327a141363b2bd9aa6496f84310802021-06-19 11:20:581 day 8 hrs ago0xd19e280c4ce5442a407f8b7159295b3b7b393725 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000551255
0x55754cbba4b239ce9c8b3d1d4da77ddcd57ef016101575c1e46cc1f776a6742c84299662021-06-19 10:23:531 day 9 hrs ago0xbff21ac88b4fad2978661ee89ccc5c4a1107caf3 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000626255
0xc19c4a7b201315d13ad0ea9fbe899ec7c2db4bf8a565f29af6214718a9dcb0ce84298102021-06-19 10:16:051 day 9 hrs ago0x5a3d5c2d396d0388dff18ce1999ecaf4240f5820 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.00042051
0x8433da461ca6345f8662928c9dc9d51974a0db636786f9969721009e0d2dfc9984243352021-06-19 5:42:111 day 13 hrs ago0x8971339ec48877b0372ab9b46e63a424d5c1182c IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000626255
0xa0d5355f95b7e461ce72bc115bdfba5e53b4fa27afafe7f15afcbe8578c457dd84223732021-06-19 4:03:251 day 15 hrs ago0xd300c4d11702f5e726590857250bcab5b927c7b7 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000544625
0x6bc673e9fea304cc76488441ba7806c1f6a78c7876f60ac30deeb98f445728d184216042021-06-19 3:24:581 day 16 hrs ago0x5b912772f9edbe71793b9fb42f161b759a2ee6cd IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.00041376
0xaf505052fea1e2dd7f457f1546e173f6f53ed379ed1a8e30680dc1b490be01d284190052021-06-19 1:14:151 day 18 hrs ago0x445ba5093698e59d81dc4137c85779a99ec13177 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.000531065
0x1f22a15ed96886b63885afdac19da0eaf02abd12eb9a6fc54bfd7cf44ef77f6284154672021-06-18 22:15:181 day 21 hrs ago0xe3c09691dacb8086288daa66104e3b4682d76bb5 IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.00049546
0xa2dea6c447b467e942de95674bef80dce08828802da2c5e171ef9387338375b484135362021-06-18 20:36:021 day 23 hrs ago0x403d37c861fb54b8f37a3a1870abce335954840b IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.00042137
0xf1653f3224302a4336da7049465f4e67cbb6d951cad3a711a349e95d89a305e684133402021-06-18 20:26:141 day 23 hrs ago0x403d37c861fb54b8f37a3a1870abce335954840b IN  0x2477fb288c5b4118315714ad3c7fd7cc69b00bf90 BNB0.00049649
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.11

Optimization Enabled:
N/A

Other Settings:
, None license

Contract Source Code (Vyper language format)

# @version 0.2.11
# (c) Curve.Fi, 2020

from vyper.interfaces import ERC20

interface CurveToken:
    def totalSupply() -> uint256: view
    def mint(_to: address, _value: uint256) -> bool: nonpayable
    def burnFrom(_to: address, _value: uint256) -> bool: nonpayable


interface FeeConverter:
    def convertFees(i: uint256, j: uint256): nonpayable
    def notify(addr: address): nonpayable


# Events
event TokenExchange:
    buyer: indexed(address)
    sold_id: int128
    tokens_sold: uint256
    bought_id: int128
    tokens_bought: uint256

event AddLiquidity:
    provider: indexed(address)
    token_amounts: uint256[N_COINS]
    fees: uint256[N_COINS]
    invariant: uint256
    token_supply: uint256

event RemoveLiquidity:
    provider: indexed(address)
    token_amounts: uint256[N_COINS]
    fees: uint256[N_COINS]
    token_supply: uint256

event RemoveLiquidityOne:
    provider: indexed(address)
    token_amount: uint256
    coin_amount: uint256

event RemoveLiquidityImbalance:
    provider: indexed(address)
    token_amounts: uint256[N_COINS]
    fees: uint256[N_COINS]
    invariant: uint256
    token_supply: uint256

event CommitNewAdmin:
    deadline: indexed(uint256)
    admin: indexed(address)

event NewAdmin:
    admin: indexed(address)

event CommitNewFee:
    deadline: indexed(uint256)
    fee: uint256
    admin_fee: uint256

event NewFee:
    fee: uint256
    admin_fee: uint256

event RampA:
    old_A: uint256
    new_A: uint256
    initial_time: uint256
    future_time: uint256

event StopRampA:
    A: uint256
    t: uint256

event CommitNewFeeConverter:
    deadline: indexed(uint256)
    fee_converter: indexed(address)

event NewFeeConverter:
    fee_converter: indexed(address)


N_COINS: constant(int128) = 2

FEE_DENOMINATOR: constant(uint256) = 10 ** 10
LENDING_PRECISION: constant(uint256) = 10 ** 18
PRECISION: constant(uint256) = 10 ** 18  # The precision to convert to
PRECISION_MUL: constant(uint256[N_COINS]) = [1, 10000000000]
RATES: constant(uint256[N_COINS]) = [1000000000000000000, 10000000000000000000000000000]

MAX_ADMIN_FEE: constant(uint256) = 10 * 10 ** 9
MAX_FEE: constant(uint256) = 5 * 10 ** 9
MAX_A: constant(uint256) = 10 ** 6
MAX_A_CHANGE: constant(uint256) = 10

ADMIN_ACTIONS_DELAY: constant(uint256) = 3 * 86400
MIN_RAMP_TIME: constant(uint256) = 86400

coins: public(address[N_COINS])
balances: public(uint256[N_COINS])
fee: public(uint256)  # fee * 1e10
admin_fee: public(uint256)  # admin_fee * 1e10

owner: public(address)
fee_converter: public(address)
token: CurveToken

initial_A: public(uint256)
future_A: public(uint256)
initial_A_time: public(uint256)
future_A_time: public(uint256)

admin_actions_deadline: public(uint256)
transfer_ownership_deadline: public(uint256)
future_fee: public(uint256)
future_admin_fee: public(uint256)
future_owner: public(address)
future_fee_converter: public(address)
fee_converter_deadline: public(uint256)

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


@external
def __init__(
    _owner: address,
    _coins: address[N_COINS],
    _pool_token: address,
    _A: uint256,
    _fee: uint256,
    _admin_fee: uint256,
    _fee_converter: address,
):
    """
    @notice Contract constructor
    @param _owner Contract owner address
    @param _coins Addresses of ERC20 conracts of coins
    @param _pool_token Address of the token representing LP share
    @param _A Amplification coefficient multiplied by n * (n - 1)
    @param _fee Fee to charge for exchanges
    @param _admin_fee Admin fee
    """
    for i in range(N_COINS):
        assert _coins[i] != ZERO_ADDRESS
    self.coins = _coins
    self.initial_A = _A
    self.future_A = _A
    self.fee = _fee
    self.admin_fee = _admin_fee
    self.owner = _owner
    self.kill_deadline = block.timestamp + KILL_DEADLINE_DT
    self.token = CurveToken(_pool_token)
    self.fee_converter = _fee_converter


@view
@internal
def _A() -> uint256:
    """
    Handle ramping A up or down
    """
    t1: uint256 = self.future_A_time
    A1: uint256 = self.future_A

    if block.timestamp < t1:
        A0: uint256 = self.initial_A
        t0: uint256 = self.initial_A_time
        # Expressions in uint256 cannot have negative numbers, thus "if"
        if A1 > A0:
            return A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0)
        else:
            return A0 - (A0 - A1) * (block.timestamp - t0) / (t1 - t0)

    else:  # when t1 == 0 or block.timestamp >= t1
        return A1


@view
@external
def A() -> uint256:
    return self._A()


@view
@internal
def _xp() -> uint256[N_COINS]:
    result: uint256[N_COINS] = RATES
    for i in range(N_COINS):
        result[i] = result[i] * self.balances[i] / LENDING_PRECISION
    return result


@pure
@internal
def _xp_mem(_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


@pure
@internal
def get_D(xp: uint256[N_COINS], amp: uint256) -> uint256:
    S: uint256 = 0
    for _x in xp:
        S += _x
    if S == 0:
        return 0

    Dprev: uint256 = 0
    D: uint256 = S
    Ann: uint256 = amp * N_COINS
    for _i in range(255):
        D_P: uint256 = D
        for _x in xp:
            D_P = D_P * D / (_x * N_COINS)  # If division by 0, this will be borked: only withdrawal will work. And that is good
        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


@view
@internal
def get_D_mem(_balances: uint256[N_COINS], amp: uint256) -> uint256:
    return self.get_D(self._xp_mem(_balances), amp)


@view
@external
def get_virtual_price() -> uint256:
    """
    Returns portfolio virtual price (for calculating profit)
    scaled up by 1e18
    """
    D: uint256 = self.get_D(self._xp(), self._A())
    # D is in the units similar to DAI (e.g. converted to precision 1e18)
    # When balanced, D = n * x_u - total virtual value of the portfolio
    token_supply: uint256 = self.token.totalSupply()
    return D * PRECISION / token_supply


@view
@external
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
    amp: uint256 = self._A()
    D0: uint256 = self.get_D_mem(_balances, amp)
    for i in range(N_COINS):
        if deposit:
            _balances[i] += amounts[i]
        else:
            _balances[i] -= amounts[i]
    D1: uint256 = self.get_D_mem(_balances, amp)
    token_amount: uint256 = self.token.totalSupply()
    diff: uint256 = 0
    if deposit:
        diff = D1 - D0
    else:
        diff = D0 - D1
    return diff * token_amount / D0


@external
@nonreentrant('lock')
def add_liquidity(amounts: uint256[N_COINS], min_mint_amount: uint256):
    assert not self.is_killed  # dev: is killed

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

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

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

    # Invariant after change
    D1: uint256 = self.get_D_mem(new_balances, amp)
    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(new_balances, amp)
    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):
        if amounts[i] > 0:
            assert ERC20(self.coins[i]).transferFrom(msg.sender, self, amounts[i])  # dev: failed transfer

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

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


@view
@internal
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       # dev: same coin
    assert j >= 0       # dev: j below zero
    assert j < N_COINS  # dev: j above N_COINS

    # should be unreachable, but good for safety
    assert i >= 0
    assert i < N_COINS

    amp: uint256 = self._A()
    D: uint256 = self.get_D(xp_, amp)
    c: uint256 = D
    S_: uint256 = 0
    Ann: uint256 = amp * 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


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

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


@view
@external
def get_dy_underlying(i: int128, j: int128, dx: uint256) -> uint256:
    # dx and dy in underlying units
    xp: uint256[N_COINS] = self._xp()
    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 - 1) / precisions[j]
    _fee: uint256 = self.fee * dy / FEE_DENOMINATOR
    return dy - _fee



@external
@nonreentrant('lock')
def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256):
    assert not self.is_killed  # dev: is killed
    rates: uint256[N_COINS] = RATES

    old_balances: uint256[N_COINS] = self.balances
    xp: uint256[N_COINS] = self._xp_mem(old_balances)

    x: uint256 = xp[i] + dx * rates[i] / PRECISION
    y: uint256 = self.get_y(i, j, x, xp)

    dy: uint256 = xp[j] - y - 1  # -1 just in case there were some rounding errors
    dy_fee: uint256 = dy * self.fee / FEE_DENOMINATOR

    # Convert all to real units
    dy = (dy - dy_fee) * PRECISION / rates[j]
    assert dy >= min_dy, "Exchange resulted in fewer coins than expected"

    dy_admin_fee: uint256 = dy_fee * self.admin_fee / FEE_DENOMINATOR
    dy_admin_fee = dy_admin_fee * PRECISION / rates[j]

    # Change balances exactly in same way as we change actual ERC20 coin amounts
    self.balances[i] = old_balances[i] + dx
    # When rounding errors happen, we undercharge admin fee in favor of LP
    self.balances[j] = old_balances[j] - dy - dy_admin_fee

    assert ERC20(self.coins[i]).transferFrom(msg.sender, self, dx)
    assert ERC20(self.coins[j]).transfer(msg.sender, dy)

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


@external
@nonreentrant('lock')
def remove_liquidity(_amount: uint256, min_amounts: uint256[N_COINS]):
    total_supply: uint256 = self.token.totalSupply()
    amounts: uint256[N_COINS] = empty(uint256[N_COINS])
    fees: uint256[N_COINS] = empty(uint256[N_COINS])  # Fees are unused but we've got them historically in event

    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 ERC20(self.coins[i]).transfer(msg.sender, value)

    self.token.burnFrom(msg.sender, _amount)  # dev: insufficient funds

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


@external
@nonreentrant('lock')
def remove_liquidity_imbalance(amounts: uint256[N_COINS], max_burn_amount: uint256):
    assert not self.is_killed  # dev: is killed

    token_supply: uint256 = self.token.totalSupply()
    assert token_supply != 0  # dev: zero total supply
    _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
    _admin_fee: uint256 = self.admin_fee
    amp: uint256 = self._A()

    old_balances: uint256[N_COINS] = self.balances
    new_balances: uint256[N_COINS] = old_balances
    D0: uint256 = self.get_D_mem(old_balances, amp)
    for i in range(N_COINS):
        new_balances[i] -= amounts[i]
    D1: uint256 = self.get_D_mem(new_balances, amp)
    fees: uint256[N_COINS] = empty(uint256[N_COINS])
    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(new_balances, amp)

    token_amount: uint256 = (D0 - D2) * token_supply / D0
    assert token_amount != 0  # dev: zero tokens burned
    token_amount += 1  # In case of rounding errors - make it unfavorable for the "attacker"
    assert token_amount <= max_burn_amount, "Slippage screwed you"

    self.token.burnFrom(msg.sender, token_amount)  # dev: insufficient funds
    for i in range(N_COINS):
        if amounts[i] != 0:
            assert ERC20(self.coins[i]).transfer(msg.sender, amounts[i])

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


@view
@internal
def get_y_D(A_: uint256, i: int128, xp: uint256[N_COINS], D: uint256) -> uint256:
    """
    Calculate x[i] if one reduces D from being calculated for xp to D

    Done by solving quadratic equation iteratively.
    x_1**2 + x1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n + 1) / (n ** (2 * n) * prod' * A)
    x_1**2 + b*x_1 = c

    x_1 = (x_1**2 + c) / (2*x_1 + b)
    """
    # x in the input is converted to the same price/precision

    assert i >= 0  # dev: i below zero
    assert i < N_COINS  # dev: i above N_COINS

    c: uint256 = D
    S_: uint256 = 0
    Ann: uint256 = A_ * N_COINS

    _x: uint256 = 0
    for _i in range(N_COINS):
        if _i != i:
            _x = xp[_i]
        else:
            continue
        S_ += _x
        c = c * D / (_x * N_COINS)
    c = c * D / (Ann * N_COINS)
    b: uint256 = S_ + D / Ann
    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


@view
@internal
def _calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> (uint256, uint256):
    # First, need to calculate
    # * Get current D
    # * Solve Eqn against y_i for D - _token_amount
    amp: uint256 = self._A()
    _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
    precisions: uint256[N_COINS] = PRECISION_MUL
    total_supply: uint256 = self.token.totalSupply()

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

    D0: uint256 = self.get_D(xp, amp)
    D1: uint256 = D0 - _token_amount * D0 / total_supply
    xp_reduced: uint256[N_COINS] = xp

    new_y: uint256 = self.get_y_D(amp, i, xp, D1)
    dy_0: uint256 = (xp[i] - new_y) / precisions[i]  # w/o fees

    for j in range(N_COINS):
        dx_expected: uint256 = 0
        if j == i:
            dx_expected = xp[j] * D1 / D0 - new_y
        else:
            dx_expected = xp[j] - xp[j] * D1 / D0
        xp_reduced[j] -= _fee * dx_expected / FEE_DENOMINATOR

    dy: uint256 = xp_reduced[i] - self.get_y_D(amp, i, xp_reduced, D1)
    dy = (dy - 1) / precisions[i]  # Withdraw less to account for rounding errors

    return dy, dy_0 - dy


@view
@external
def calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> uint256:
    return self._calc_withdraw_one_coin(_token_amount, i)[0]


@external
@nonreentrant('lock')
def remove_liquidity_one_coin(_token_amount: uint256, i: int128, min_amount: uint256):
    """
    Remove _amount of liquidity all in a form of coin i
    """
    assert not self.is_killed  # dev: is killed

    dy: uint256 = 0
    dy_fee: uint256 = 0
    dy, dy_fee = self._calc_withdraw_one_coin(_token_amount, i)
    assert dy >= min_amount, "Not enough coins removed"

    self.balances[i] -= (dy + dy_fee * self.admin_fee / FEE_DENOMINATOR)
    self.token.burnFrom(msg.sender, _token_amount)  # dev: insufficient funds
    assert ERC20(self.coins[i]).transfer(msg.sender, dy)

    log RemoveLiquidityOne(msg.sender, _token_amount, dy)


### Admin functions ###
@external
def ramp_A(_future_A: uint256, _future_time: uint256):
    assert msg.sender == self.owner  # dev: only owner
    assert block.timestamp >= self.initial_A_time + MIN_RAMP_TIME
    assert _future_time >= block.timestamp + MIN_RAMP_TIME  # dev: insufficient time

    _initial_A: uint256 = self._A()
    assert (_future_A > 0) and (_future_A < MAX_A)
    assert ((_future_A >= _initial_A) and (_future_A <= _initial_A * MAX_A_CHANGE)) or\
           ((_future_A < _initial_A) and (_future_A * MAX_A_CHANGE >= _initial_A))
    self.initial_A = _initial_A
    self.future_A = _future_A
    self.initial_A_time = block.timestamp
    self.future_A_time = _future_time

    log RampA(_initial_A, _future_A, block.timestamp, _future_time)


@external
def stop_ramp_A():
    assert msg.sender == self.owner  # dev: only owner

    current_A: uint256 = self._A()
    self.initial_A = current_A
    self.future_A = current_A
    self.initial_A_time = block.timestamp
    self.future_A_time = block.timestamp
    # now (block.timestamp < t1) is always False, so we return saved A

    log StopRampA(current_A, block.timestamp)


@external
def commit_new_fee(new_fee: uint256, new_admin_fee: uint256):
    assert msg.sender == self.owner  # dev: only owner
    assert self.admin_actions_deadline == 0  # dev: active action
    assert new_fee <= MAX_FEE  # dev: fee exceeds maximum
    assert new_admin_fee <= MAX_ADMIN_FEE  # dev: admin fee exceeds maximum

    _deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY
    self.admin_actions_deadline = _deadline
    self.future_fee = new_fee
    self.future_admin_fee = new_admin_fee

    log CommitNewFee(_deadline, new_fee, new_admin_fee)


@external
def apply_new_fee():
    assert msg.sender == self.owner  # dev: only owner
    assert block.timestamp >= self.admin_actions_deadline  # dev: insufficient time
    assert self.admin_actions_deadline != 0  # dev: no active action

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

    log NewFee(_fee, _admin_fee)


@external
def revert_new_parameters():
    assert msg.sender == self.owner  # dev: only owner

    self.admin_actions_deadline = 0


@external
def commit_transfer_ownership(_owner: address):
    assert msg.sender == self.owner  # dev: only owner
    assert self.transfer_ownership_deadline == 0  # dev: active transfer

    _deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY
    self.transfer_ownership_deadline = _deadline
    self.future_owner = _owner

    log CommitNewAdmin(_deadline, _owner)


@external
def apply_transfer_ownership():
    assert msg.sender == self.owner  # dev: only owner
    assert block.timestamp >= self.transfer_ownership_deadline  # dev: insufficient time
    assert self.transfer_ownership_deadline != 0  # dev: no active transfer

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

    log NewAdmin(_owner)


@external
def revert_transfer_ownership():
    assert msg.sender == self.owner  # dev: only owner

    self.transfer_ownership_deadline = 0


@view
@external
def admin_balances(i: uint256) -> uint256:
    return ERC20(self.coins[i]).balanceOf(self) - self.balances[i]


@external
def withdraw_admin_fees():
    fee_converter: address = self.fee_converter
    for i in range(N_COINS):
        c: address = self.coins[i]
        value: uint256 = ERC20(c).balanceOf(self) - self.balances[i]
        if value > 0:
            # "safeTransfer" which works for ERC20s which return bool or not
            _response: Bytes[32] = raw_call(
                c,
                concat(
                    method_id("transfer(address,uint256)"),
                    convert(fee_converter, bytes32),
                    convert(value, bytes32),
                ),
                max_outsize=32,
            )  # dev: failed transfer
            if len(_response) > 0:
                assert convert(_response, bool)  # dev: failed transfer
            if i != 0:
                FeeConverter(fee_converter).convertFees(i, 0)
    FeeConverter(fee_converter).notify(self.coins[0])


@external
def kill_me():
    assert msg.sender == self.owner  # dev: only owner
    assert self.kill_deadline > block.timestamp  # dev: deadline has passed
    self.is_killed = True


@external
def unkill_me():
    assert msg.sender == self.owner  # dev: only owner
    self.is_killed = False


@external
def commit_set_fee_converter(_fee_converter: address):
    assert msg.sender == self.owner  # dev: only owner
    assert self.fee_converter_deadline == 0  # dev: active transfer

    _deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY
    self.fee_converter_deadline = _deadline
    self.future_fee_converter = _fee_converter

    log CommitNewFeeConverter(_deadline, _fee_converter)


@external
def apply_set_fee_converter():
    assert msg.sender == self.owner  # dev: only owner
    assert block.timestamp >= self.fee_converter_deadline  # dev: insufficient time
    assert self.fee_converter_deadline != 0  # dev: no active transfer

    fee_converter: address = self.future_fee_converter
    self.fee_converter = fee_converter
    self.future_fee_converter = ZERO_ADDRESS
    self.fee_converter_deadline = 0

    log NewFeeConverter(fee_converter)


@external
def revert_set_fee_converter():
    assert msg.sender == self.owner  # dev: only owner

    self.fee_converter_deadline = 0
    self.future_fee_converter = ZERO_ADDRESS

Contract ABI

[{"name":"TokenExchange","inputs":[{"name":"buyer","type":"address","indexed":true},{"name":"sold_id","type":"int128","indexed":false},{"name":"tokens_sold","type":"uint256","indexed":false},{"name":"bought_id","type":"int128","indexed":false},{"name":"tokens_bought","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[2]","indexed":false},{"name":"fees","type":"uint256[2]","indexed":false},{"name":"invariant","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[2]","indexed":false},{"name":"fees","type":"uint256[2]","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amount","type":"uint256","indexed":false},{"name":"coin_amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[2]","indexed":false},{"name":"fees","type":"uint256[2]","indexed":false},{"name":"invariant","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewFee","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"fee","type":"uint256","indexed":false},{"name":"admin_fee","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewFee","inputs":[{"name":"fee","type":"uint256","indexed":false},{"name":"admin_fee","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampA","inputs":[{"name":"old_A","type":"uint256","indexed":false},{"name":"new_A","type":"uint256","indexed":false},{"name":"initial_time","type":"uint256","indexed":false},{"name":"future_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"name":"A","type":"uint256","indexed":false},{"name":"t","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewFeeConverter","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"fee_converter","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewFeeConverter","inputs":[{"name":"fee_converter","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_owner","type":"address"},{"name":"_coins","type":"address[2]"},{"name":"_pool_token","type":"address"},{"name":"_A","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_admin_fee","type":"uint256"},{"name":"_fee_converter","type":"address"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":5106},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":954437},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"amounts","type":"uint256[2]"},{"name":"deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}],"gas":3794989},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"amounts","type":"uint256[2]"},{"name":"min_mint_amount","type":"uint256"}],"outputs":[],"gas":5832627},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":2316308},{"stateMutability":"view","type":"function","name":"get_dy_underlying","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":2316022},{"stateMutability":"nonpayable","type":"function","name":"exchange","inputs":[{"name":"i","type":"int128"},{"name":"j","type":"int128"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"}],"outputs":[],"gas":2453318},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"min_amounts","type":"uint256[2]"}],"outputs":[],"gas":142861},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"amounts","type":"uint256[2]"},{"name":"max_burn_amount","type":"uint256"}],"outputs":[],"gas":5832355},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"_token_amount","type":"uint256"},{"name":"i","type":"int128"}],"outputs":[{"name":"","type":"uint256"}],"gas":1162},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_token_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"min_amount","type":"uint256"}],"outputs":[],"gas":3657957},{"stateMutability":"nonpayable","type":"function","name":"ramp_A","inputs":[{"name":"_future_A","type":"uint256"},{"name":"_future_time","type":"uint256"}],"outputs":[],"gas":151582},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A","inputs":[],"outputs":[],"gas":148300},{"stateMutability":"nonpayable","type":"function","name":"commit_new_fee","inputs":[{"name":"new_fee","type":"uint256"},{"name":"new_admin_fee","type":"uint256"}],"outputs":[],"gas":110158},{"stateMutability":"nonpayable","type":"function","name":"apply_new_fee","inputs":[],"outputs":[],"gas":96939},{"stateMutability":"nonpayable","type":"function","name":"revert_new_parameters","inputs":[],"outputs":[],"gas":21592},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_owner","type":"address"}],"outputs":[],"gas":74330},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":60407},{"stateMutability":"nonpayable","type":"function","name":"revert_transfer_ownership","inputs":[],"outputs":[],"gas":21682},{"stateMutability":"view","type":"function","name":"admin_balances","inputs":[{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3178},{"stateMutability":"nonpayable","type":"function","name":"withdraw_admin_fees","inputs":[],"outputs":[],"gas":20620},{"stateMutability":"nonpayable","type":"function","name":"kill_me","inputs":[],"outputs":[],"gas":37665},{"stateMutability":"nonpayable","type":"function","name":"unkill_me","inputs":[],"outputs":[],"gas":21802},{"stateMutability":"nonpayable","type":"function","name":"commit_set_fee_converter","inputs":[{"name":"_fee_converter","type":"address"}],"outputs":[],"gas":74540},{"stateMutability":"nonpayable","type":"function","name":"apply_set_fee_converter","inputs":[],"outputs":[],"gas":80623},{"stateMutability":"nonpayable","type":"function","name":"revert_set_fee_converter","inputs":[],"outputs":[],"gas":41898},{"stateMutability":"view","type":"function","name":"coins","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":1977},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":2007},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":1928},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":1958},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":1988},{"stateMutability":"view","type":"function","name":"fee_converter","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2018},{"stateMutability":"view","type":"function","name":"initial_A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2048},{"stateMutability":"view","type":"function","name":"future_A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2078},{"stateMutability":"view","type":"function","name":"initial_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2108},{"stateMutability":"view","type":"function","name":"future_A_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2138},{"stateMutability":"view","type":"function","name":"admin_actions_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2168},{"stateMutability":"view","type":"function","name":"transfer_ownership_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2198},{"stateMutability":"view","type":"function","name":"future_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2228},{"stateMutability":"view","type":"function","name":"future_admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2258},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2288},{"stateMutability":"view","type":"function","name":"future_fee_converter","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2318},{"stateMutability":"view","type":"function","name":"fee_converter_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2348}]

61010061462261014039602061462260c03960c05160a01c1561002157600080fd5b602060206146220160c03960c05160a01c1561003c57600080fd5b602060406146220160c03960c05160a01c1561005757600080fd5b602060606146220160c03960c05160a01c1561007257600080fd5b602060e06146220160c03960c05160a01c1561008d57600080fd5b61024060006002818352015b600061016061024051600281106100af57600080fd5b6020020151186100be57600080fd5b8151600101808352811415610099575b5050600060c052602060c020610160518155610180516001820155506101c0516007556101c0516008556101e051600255610200516003556101405160045542624f1a0081818301101561012157600080fd5b808201905090506013556101a0516006556102205160055561460a56600436101561000d57612fd7565b600035601c52600051341561002157600080fd5b63f446c1d08114156100475760065801612fdd565b610140526101405160005260206000f35b63bb7b8b808114156101ac576101405160065801613175565b61016052610180526101405261016080516101a05280602001516101c052506101405161016051610180516101a0516101c05160065801612fdd565b6101e0526101c0526101a0526101805261016052610140526101e051610200526101405161016051610180516101a0516101c0516101e051610200516101a051610220526101c05161024052610200516102605261026051610240516102205160065801613365565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c0516101405260206101e060046318160ddd6101805261019c6006545afa61014e57600080fd5b601f3d1161015b57600080fd5b6000506101e0516101605261014051670de0b6b3a7640000808202821582848304141761018757600080fd5b8090509050905061016051808061019d57600080fd5b82049050905060005260206000f35b63ed8e84f381141561045f5760443560011c156101c857600080fd5b60018060c052602060c020546101405260018160c052602060c0200154610160525061014051610160516101805160065801612fdd565b6101a0526101805261016052610140526101a051610180526101405161016051610180516101a051610140516101c052610160516101e0526101805161020052610200516101e0516101c05160065801613642565b610260526101a052610180526101605261014052610260516101a0526101c060006002818352015b604435156102d4576101406101c0516002811061029857600080fd5b60200201805160046101c051600281106102b157600080fd5b60200201358181830110156102c557600080fd5b8082019050905081525061031e565b6101406101c051600281106102e857600080fd5b60200201805160046101c0516002811061030157600080fd5b60200201358082101561031357600080fd5b808203905090508152505b815160010180835281141561027c575b50506101405161016051610180516101a0516101c051610140516101e0526101605161020052610180516102205261022051610200516101e05160065801613642565b610280526101c0526101a052610180526101605261014052610280516101c052602061026060046318160ddd6102005261021c6006545afa6103b257600080fd5b601f3d116103bf57600080fd5b600050610260516101e052600061020052604435156103fd576101c0516101a051808210156103ed57600080fd5b808203905090506102005261041e565b6101a0516101c0518082101561041257600080fd5b80820390509050610200525b610200516101e051808202821582848304141761043a57600080fd5b809050905090506101a051808061045057600080fd5b82049050905060005260206000f35b630b4c7e4d811415610c98576014541561047857600080fd5b60016014556012541561048a57600080fd5b60403661014037600254600280820282158284830414176104aa57600080fd5b80905090509050600480820490509050610180526003546101a0526101405161016051610180516101a0516101c05160065801612fdd565b6101e0526101c0526101a0526101805261016052610140526101e0516101c052602061026060046318160ddd6102005261021c6006545afa61052357600080fd5b601f3d1161053057600080fd5b600050610260516101e05260006102005260018060c052602060c020546102205260018160c052602060c0200154610240525060006101e05111156105f1576101405161016051610180516101a0516101c0516101e051610200516102205161024051610220516102605261024051610280526101c0516102a0526102a051610280516102605160065801613642565b610300526102405261022052610200526101e0526101c0526101a05261018052610160526101405261030051610200525b610220516102605261024051610280526102a060006002818352015b6101e051151561063b57600060046102a0516002811061062c57600080fd5b60200201351161063b57600080fd5b6102206102a0516002811061064f57600080fd5b602002015160046102a0516002811061066757600080fd5b602002013581818301101561067b57600080fd5b808201905090506102606102a0516002811061069657600080fd5b60200201525b815160010180835281141561060d575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610260516102c052610280516102e0526101c05161030052610300516102e0516102c05160065801613642565b610360526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610360516102a052610200516102a0511161075957600080fd5b6102a0516102c05260006101e0511115610a3e576102e060006002818352015b6102a0516102206102e0516002811061079157600080fd5b602002015180820282158284830414176107aa57600080fd5b809050905090506102005180806107c057600080fd5b820490509050610300526000610320526102606102e051600281106107e457600080fd5b602002015161030051111561082d57610300516102606102e0516002811061080b57600080fd5b60200201518082101561081d57600080fd5b8082039050905061032052610863565b6102606102e0516002811061084157600080fd5b6020020151610300518082101561085757600080fd5b80820390509050610320525b6101805161032051808202821582848304141761087f57600080fd5b809050905090506402540be400808204905090506101406102e051600281106108a757600080fd5b60200201526102606102e051600281106108c057600080fd5b60200201516101406102e051600281106108d957600080fd5b60200201516101a05180820282158284830414176108f657600080fd5b809050905090506402540be400808204905090508082101561091757600080fd5b808203905090506102e0516002811061092f57600080fd5b600160c052602060c02001556102606102e0516002811061094f57600080fd5b6020020180516101406102e0516002811061096957600080fd5b60200201518082101561097b57600080fd5b808203905090508152505b8151600101808352811415610779575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c051610260516102e05261028051610300526101c0516103205261032051610300516102e05160065801613642565b610380526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516102c052610a59565b600160c052602060c020610260518155610280516001820155505b60006102e0526101e0511515610a76576102a0516102e052610acb565b6101e0516102c0516102005180821015610a8f57600080fd5b808203905090508082028215828483041417610aaa57600080fd5b80905090509050610200518080610ac057600080fd5b8204905090506102e0525b6044356102e05110151515610b1f576308c379a0610300526020610320526014610340527f536c697070616765207363726577656420796f750000000000000000000000006103605261034050606461031cfd5b61030060006002818352015b600060046103005160028110610b4057600080fd5b60200201351115610bcb5760206103e060646323b872dd610320523361034052306103605260046103005160028110610b7857600080fd5b60200201356103805261033c60006103005160028110610b9757600080fd5b600060c052602060c02001545af1610bae57600080fd5b601f3d11610bbb57600080fd5b6000506103e051610bcb57600080fd5b8151600101808352811415610b2b575b505060206103a060446340c10f196103005233610320526102e0516103405261031c60006006545af1610c0d57600080fd5b601f3d11610c1a57600080fd5b6000506103a0506004356103005260243561032052610140516103405261016051610360526102a051610380526101e0516102e051818183011015610c5e57600080fd5b808201905090506103a052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c0610300a26000601455005b635e0d443f811415610f2c5760043580806000811215610cb457195b607f1c15610cc157600080fd5b90505060243580806000811215610cd457195b607f1c15610ce157600080fd5b905050670de0b6b3a7640000610140526b204fce5e3e25026110000000610160526101405161016051610180516101a05160065801613175565b6101c0526101e0526101a0526101805261016052610140526101c080516101805280602001516101a0525061018060043560028110610d5957600080fd5b602002015160443561014060043560028110610d7457600080fd5b60200201518082028215828483041417610d8d57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015610db357600080fd5b808201905090506101c0526101405161016051610180516101a0516101c0516101e05160043561020052602435610220526101c0516102405261018051610260526101a0516102805261028051610260516102405161022051610200516006580161374f565b6102e0526101e0526101c0526101a0526101805261016052610140526102e0516101e05261018060243560028110610e5057600080fd5b60200201516101e05180821015610e6657600080fd5b80820390509050600180821015610e7c57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417610ea057600080fd5b8090509050905061014060243560028110610eba57600080fd5b60200201518080610eca57600080fd5b82049050905061020052600254610200518082028215828483041417610eef57600080fd5b809050905090506402540be4008082049050905061022052610200516102205180821015610f1c57600080fd5b8082039050905060005260206000f35b6307211ef781141561116e5760043580806000811215610f4857195b607f1c15610f5557600080fd5b90505060243580806000811215610f6857195b607f1c15610f7557600080fd5b905050610140516101605160065801613175565b610180526101a0526101605261014052610180805161014052806020015161016052506001610180526402540be4006101a05261014060043560028110610fcf57600080fd5b602002015160443561018060043560028110610fea57600080fd5b6020020151808202821582848304141761100357600080fd5b8090509050905081818301101561101957600080fd5b808201905090506101c0526101405161016051610180516101a0516101c0516101e05160043561020052602435610220526101c051610240526101405161026052610160516102805261028051610260516102405161022051610200516006580161374f565b6102e0526101e0526101c0526101a0526101805261016052610140526102e0516101e052610140602435600281106110b657600080fd5b60200201516101e051808210156110cc57600080fd5b808203905090506001808210156110e257600080fd5b80820390509050610180602435600281106110fc57600080fd5b6020020151808061110c57600080fd5b8204905090506102005260025461020051808202821582848304141761113157600080fd5b809050905090506402540be400808204905090506102205261020051610220518082101561115e57600080fd5b8082039050905060005260206000f35b633df02124811415611744576014541561118757600080fd5b60016014556004358080600081121561119c57195b607f1c156111a957600080fd5b905050602435808060008112156111bc57195b607f1c156111c957600080fd5b905050601254156111d957600080fd5b670de0b6b3a7640000610140526b204fce5e3e250261100000006101605260018060c052602060c020546101805260018160c052602060c02001546101a052506101405161016051610180516101a0516101c0516101e05161018051610200526101a0516102205261022051610200516006580161326b565b610280526102a0526101e0526101c0526101a05261018052610160526101405261028080516101c05280602001516101e052506101c06004356002811061129857600080fd5b6020020151604435610140600435600281106112b357600080fd5b602002015180820282158284830414176112cc57600080fd5b80905090509050670de0b6b3a7640000808204905090508181830110156112f257600080fd5b80820190509050610200526101405161016051610180516101a0516101c0516101e0516102005161022051600435610240526024356102605261020051610280526101c0516102a0526101e0516102c0526102c0516102a0516102805161026051610240516006580161374f565b6103205261022052610200526101e0526101c0526101a05261018052610160526101405261032051610220526101c06024356002811061139f57600080fd5b602002015161022051808210156113b557600080fd5b808203905090506001808210156113cb57600080fd5b80820390509050610240526102405160025480820282158284830414176113f157600080fd5b809050905090506402540be400808204905090506102605261024051610260518082101561141e57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761144257600080fd5b809050905090506101406024356002811061145c57600080fd5b6020020151808061146c57600080fd5b8204905090506102405260643561024051101515156114ef576308c379a06102805260206102a052602e6102c0527f45786368616e676520726573756c74656420696e20666577657220636f696e736102e0527f207468616e206578706563746564000000000000000000000000000000000000610300526102c050608461029cfd5b61026051600354808202821582848304141761150a57600080fd5b809050905090506402540be400808204905090506102805261028051670de0b6b3a7640000808202821582848304141761154357600080fd5b809050905090506101406024356002811061155d57600080fd5b6020020151808061156d57600080fd5b820490509050610280526101806004356002811061158a57600080fd5b60200201516044358181830110156115a157600080fd5b80820190509050600435600281106115b857600080fd5b600160c052602060c0200155610180602435600281106115d757600080fd5b602002015161024051808210156115ed57600080fd5b80820390509050610280518082101561160557600080fd5b808203905090506024356002811061161c57600080fd5b600160c052602060c0200155602061036060646323b872dd6102a052336102c052306102e052604435610300526102bc60006004356002811061165e57600080fd5b600060c052602060c02001545af161167557600080fd5b601f3d1161168257600080fd5b6000506103605161169257600080fd5b6020610340604463a9059cbb6102a052336102c052610240516102e0526102bc6000602435600281106116c457600080fd5b600060c052602060c02001545af16116db57600080fd5b601f3d116116e857600080fd5b600050610340516116f857600080fd5b6004356102a0526044356102c0526024356102e0526102405161030052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd9714060806102a0a26000601455005b635b36389c811415611a10576014541561175d57600080fd5b600160145560206101c060046318160ddd6101605261017c6006545afa61178357600080fd5b601f3d1161179057600080fd5b6000506101c05161014052608036610160376101e060006002818352015b6101e051600281106117bf57600080fd5b600160c052602060c020015460043580820282158284830414176117e257600080fd5b809050905090506101405180806117f857600080fd5b8204905090506102005260246101e0516002811061181557600080fd5b60200201356102005110151515611890576308c379a0610220526020610240526030610260527f5769746864726177616c20726573756c74656420696e20666577657220636f69610280527f6e73207468616e206578706563746564000000000000000000000000000000006102a05261026050608461023cfd5b6101e051600281106118a157600080fd5b600160c052602060c02001805461020051808210156118bf57600080fd5b80820390509050815550610200516101606101e051600281106118e157600080fd5b602002015260206102c0604463a9059cbb610220523361024052610200516102605261023c60006101e0516002811061191957600080fd5b600060c052602060c02001545af161193057600080fd5b601f3d1161193d57600080fd5b6000506102c05161194d57600080fd5b81516001018083528114156117ae575b5050602061028060446379cc67906101e0523361020052600435610220526101fc60006006545af161198e57600080fd5b601f3d1161199b57600080fd5b60005061028050610160516101e05261018051610200526101a051610220526101c0516102405261014051600435808210156119d657600080fd5b8082039050905061026052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a06101e0a26000601455005b63e31032738114156121ae5760145415611a2957600080fd5b600160145560125415611a3b57600080fd5b60206101c060046318160ddd6101605261017c6006545afa611a5c57600080fd5b601f3d11611a6957600080fd5b6000506101c0516101405260006101405118611a8457600080fd5b60025460028082028215828483041417611a9d57600080fd5b8090509050905060048082049050905061016052600354610180526101405161016051610180516101a05160065801612fdd565b6101c0526101a0526101805261016052610140526101c0516101a05260018060c052602060c020546101c05260018160c052602060c02001546101e052506101c051610200526101e051610220526101405161016051610180516101a0516101c0516101e0516102005161022051610240516101c051610260526101e051610280526101a0516102a0526102a051610280516102605160065801613642565b610300526102405261022052610200526101e0526101c0526101a052610180526101605261014052610300516102405261026060006002818352015b6102006102605160028110611bc057600080fd5b60200201805160046102605160028110611bd957600080fd5b602002013580821015611beb57600080fd5b808203905090508152505b8151600101808352811415611bac575b50506101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516102005161028052610220516102a0526101a0516102c0526102c0516102a0516102805160065801613642565b61032052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103205161026052604036610280376102c060006002818352015b610260516101c06102c05160028110611cbc57600080fd5b60200201518082028215828483041417611cd557600080fd5b80905090509050610240518080611ceb57600080fd5b8204905090506102e0526000610300526102006102c05160028110611d0f57600080fd5b60200201516102e0511115611d58576102e0516102006102c05160028110611d3657600080fd5b602002015180821015611d4857600080fd5b8082039050905061030052611d8e565b6102006102c05160028110611d6c57600080fd5b60200201516102e05180821015611d8257600080fd5b80820390509050610300525b61016051610300518082028215828483041417611daa57600080fd5b809050905090506402540be400808204905090506102806102c05160028110611dd257600080fd5b60200201526102006102c05160028110611deb57600080fd5b60200201516102806102c05160028110611e0457600080fd5b6020020151610180518082028215828483041417611e2157600080fd5b809050905090506402540be4008082049050905080821015611e4257600080fd5b808203905090506102c05160028110611e5a57600080fd5b600160c052602060c02001556102006102c05160028110611e7a57600080fd5b6020020180516102806102c05160028110611e9457600080fd5b602002015180821015611ea657600080fd5b808203905090508152505b8151600101808352811415611ca4575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c051610200516102e05261022051610300526101a0516103205261032051610300516102e05160065801613642565b610380526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516102c052610240516102c05180821015611f7957600080fd5b80820390509050610140518082028215828483041417611f9857600080fd5b80905090509050610240518080611fae57600080fd5b8204905090506102e05260006102e05118611fc857600080fd5b6102e080516001818183011015611fde57600080fd5b808201905090508152506044356102e0511115151561203c576308c379a0610300526020610320526014610340527f536c697070616765207363726577656420796f750000000000000000000000006103605261034050606461031cfd5b60206103a060446379cc67906103005233610320526102e0516103405261031c60006006545af161206c57600080fd5b601f3d1161207957600080fd5b6000506103a05061030060006002818352015b6000600461030051600281106120a157600080fd5b602002013518156121275760206103c0604463a9059cbb610320523361034052600461030051600281106120d457600080fd5b60200201356103605261033c600061030051600281106120f357600080fd5b600060c052602060c02001545af161210a57600080fd5b601f3d1161211757600080fd5b6000506103c05161212757600080fd5b815160010180835281141561208c575b5050600435610300526024356103205261028051610340526102a051610360526102605161038052610140516102e0518082101561217457600080fd5b808203905090506103a052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c0610300a26000601455005b63cc2b27d781141561222e57602435808060008112156121ca57195b607f1c156121d757600080fd5b9050506004356101405260243561016052610160516101405160065801613ea5565b6101c0526101e0526101c080808080516102005250506020810190508080805161022052505050506102005160005260206000f35b631a4d01d28114156124a2576014541561224757600080fd5b60016014556024358080600081121561225c57195b607f1c1561226957600080fd5b9050506012541561227957600080fd5b604036610140376101405161016051600435610180526024356101a0526101a0516101805160065801613ea5565b61020052610220526101605261014052610200808080805161024052505060208101905080808051610260525050505061024080516101405280602001516101605250604435610140511015151561233e576308c379a06101805260206101a05260186101c0527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006101e0526101c050606461019cfd5b6024356002811061234e57600080fd5b600160c052602060c0200180546101405161016051600354808202821582848304141761237a57600080fd5b809050905090506402540be4008082049050905081818301101561239d57600080fd5b80820190509050808210156123b157600080fd5b80820390509050815550602061022060446379cc679061018052336101a0526004356101c05261019c60006006545af16123ea57600080fd5b601f3d116123f757600080fd5b600050610220506020610220604463a9059cbb61018052336101a052610140516101c05261019c60006024356002811061243057600080fd5b600060c052602060c02001545af161244757600080fd5b601f3d1161245457600080fd5b6000506102205161246457600080fd5b60043561018052610140516101a052337f9e96dd3b997a2a257eec4df9bb6eaf626e206df5f543bd963682d143300be3106040610180a26000601455005b633c157e648114156126365760045433146124bc57600080fd5b600954620151808181830110156124d257600080fd5b808201905090504210156124e557600080fd5b42620151808181830110156124f957600080fd5b80820190509050602435101561250e57600080fd5b6101405160065801612fdd565b610160526101405261016051610140526000600435111561254357620f424060043510612546565b60005b61254f57600080fd5b610140516004351015156125885761014051600a808202821582848304141761257757600080fd5b80905090509050600435111561258b565b60005b156125975760016125d2565b6101405160043510156125cf5761014051600435600a80820282158284830414176125c157600080fd5b8090509050905010156125d2565b60005b6125db57600080fd5b6101405160075560043560085542600955602435600a55610140516101605260043561018052426101a0526024356101c0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610160a1005b63551a65888114156126b957600454331461265057600080fd5b6101405160065801612fdd565b6101605261014052610160516101405261014051600755610140516008554260095542600a55610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b635b5a14678114156127755760045433146126d357600080fd5b600b54156126e057600080fd5b64012a05f20060043511156126f457600080fd5b6402540be400602435111561270857600080fd5b426203f48081818301101561271c57600080fd5b808201905090506101405261014051600b55600435600d55602435600e556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe9781141561280757600454331461278f57600080fd5b600b5442101561279e57600080fd5b6000600b54186127ad57600080fd5b6000600b55600d5461014052600e546101605261014051600255610160516003556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb81141561282857600454331461282157600080fd5b6000600b55005b636b441a408114156128ba5760043560a01c1561284457600080fd5b600454331461285257600080fd5b600c541561285f57600080fd5b426203f48081818301101561287357600080fd5b808201905090506101405261014051600c55600435600f55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae8114156129315760045433146128d457600080fd5b600c544210156128e357600080fd5b6000600c54186128f257600080fd5b6000600c55600f546101405261014051600455610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19381141561295257600454331461294b57600080fd5b6000600c55005b63e2e7d2648114156129ea5760206101c060246370a0823161014052306101605261015c6004356002811061298657600080fd5b600060c052602060c02001545afa61299d57600080fd5b601f3d116129aa57600080fd5b6000506101c051600435600281106129c157600080fd5b600160c052602060c0200154808210156129da57600080fd5b8082039050905060005260206000f35b6330c54085811415612c87576005546101405261016060006002818352015b6101605160028110612a1a57600080fd5b600060c052602060c020015461018052602061024060246370a082316101c052306101e0526101dc610180515afa612a5157600080fd5b601f3d11612a5e57600080fd5b600050610240516101605160028110612a7657600080fd5b600160c052602060c020015480821015612a8f57600080fd5b808203905090506101a05260006101a0511115612c335760006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af1505080518201915050610140516020826102800101526020810190506101a051602082610280010152602081019050806102805261028090508051602001806103208284600060045af1612b3f57600080fd5b505060206103e0610320516103406000610180515af1612b5e57600080fd5b60203d80821115612b6f5780612b71565b815b905090506103c0526103c08051602001806101c08284600060045af1612b9657600080fd5b505060006101c0511115612be8576101c0806020015160008251806020901315612bbf57600080fd5b8091901215612bcd57600080fd5b806020036101000a82049050905090501515612be857600080fd5b6000610160511815612c3357610140513b612c0257600080fd5b600060006044632047fcf561022052610160516102405260006102605261023c6000610140515af1612c3357600080fd5b8151600101808352811415612a09575b5050610140513b612c5357600080fd5b600060006024635fb9cf2061016052600060c052602060c020546101805261017c6000610140515af1612c8557600080fd5b005b63e3698853811415612cb6576004543314612ca157600080fd5b4260135411612caf57600080fd5b6001601255005b633046f972811415612cd7576004543314612cd057600080fd5b6000601255005b63685b60b0811415612d695760043560a01c15612cf357600080fd5b6004543314612d0157600080fd5b60115415612d0e57600080fd5b426203f480818183011015612d2257600080fd5b808201905090506101405261014051601155600435601055600435610140517fac9dc361d59a2ae9618a69c5bed17746a6a658725ffc407eb6830fe59a1da86560006000a3005b63e7c8b42a811415612de5576004543314612d8357600080fd5b601154421015612d9257600080fd5b600060115418612da157600080fd5b601054610140526101405160055560006010556000601155610140517f4b4ec814d485fb853d2c9f8d6cae7e3b31a53ac5e208796481991f2f2401c02e60006000a2005b632e9f6845811415612e0b576004543314612dff57600080fd5b60006011556000601055005b63c6610657811415612e3c5760043560028110612e2757600080fd5b600060c052602060c020015460005260206000f35b634903b0d1811415612e6d5760043560028110612e5857600080fd5b600160c052602060c020015460005260206000f35b63ddca3f43811415612e855760025460005260206000f35b63fee3f7f9811415612e9d5760035460005260206000f35b638da5cb5b811415612eb55760045460005260206000f35b63d90097f7811415612ecd5760055460005260206000f35b635409491a811415612ee55760075460005260206000f35b63b4b577ad811415612efd5760085460005260206000f35b632081066c811415612f155760095460005260206000f35b6314052288811415612f2d57600a5460005260206000f35b63405e28f8811415612f4557600b5460005260206000f35b63e0a0b586811415612f5d57600c5460005260206000f35b6358680d0b811415612f7557600d5460005260206000f35b63e3824462811415612f8d57600e5460005260206000f35b631ec0cdc1811415612fa557600f5460005260206000f35b63e06148f4811415612fbd5760105460005260206000f35b63f345e4a8811415612fd55760115460005260206000f35b505b60006000fd5b61014052600a54610160526008546101805261016051421015613163576007546101a0526009546101c0526101a0516101805111156130bd576101a051610180516101a0518082101561302f57600080fd5b80820390509050426101c0518082101561304857600080fd5b80820390509050808202821582848304141761306357600080fd5b80905090509050610160516101c0518082101561307f57600080fd5b80820390509050808061309157600080fd5b8204905090508181830110156130a657600080fd5b80820190509050600052600051610140515661315e565b6101a0516101a05161018051808210156130d657600080fd5b80820390509050426101c051808210156130ef57600080fd5b80820390509050808202821582848304141761310a57600080fd5b80905090509050610160516101c0518082101561312657600080fd5b80820390509050808061313857600080fd5b8204905090508082101561314b57600080fd5b8082039050905060005260005161014051565b613173565b6101805160005260005161014051565b005b61014052670de0b6b3a7640000610160526b204fce5e3e25026110000000610180526101a060006002818352015b6101606101a051600281106131b757600080fd5b60200201516101a051600281106131cd57600080fd5b600160c052602060c020015480820282158284830414176131ed57600080fd5b80905090509050670de0b6b3a7640000808204905090506101606101a0516002811061321857600080fd5b60200201525b81516001018083528114156131a3575b505060406101a0525b60006101a05111151561324957613265565b60206101a05103610160015160206101a051036101a052613237565b61014051565b610180526101405261016052670de0b6b3a76400006101a0526b204fce5e3e250261100000006101c0526101e060006002818352015b6101a06101e051600281106132b557600080fd5b60200201516101406101e051600281106132ce57600080fd5b602002015180820282158284830414176132e757600080fd5b80905090509050670de0b6b3a7640000808204905090506101a06101e0516002811061331257600080fd5b60200201525b81516001018083528114156132a1575b505060406101e0525b60006101e0511115156133435761335f565b60206101e051036101a0015160206101e051036101e052613331565b61018051565b6101a05261014052610160526101805260006101c05261020060006002818352015b6020610200510261014001516101e0526101c080516101e0518181830110156133af57600080fd5b808201905090508152505b8151600101808352811415613387575b50506101c05115156133e45760006000526000516101a051565b60006101e0526101c05161020052610180516002808202821582848304141761340c57600080fd5b8090509050905061022052610240600060ff818352015b61020051610260526102a060006002818352015b60206102a051026101400151610280526102605161020051808202821582848304141761346357600080fd5b80905090509050610280516002808202821582848304141761348457600080fd5b80905090509050808061349657600080fd5b820490509050610260525b8151600101808352811415613437575b5050610200516101e052610220516101c05180820282158284830414176134d757600080fd5b8090509050905061026051600280820282158284830414176134f857600080fd5b8090509050905081818301101561350e57600080fd5b8082019050905061020051808202821582848304141761352d57600080fd5b809050905090506102205160018082101561354757600080fd5b8082039050905061020051808202821582848304141761356657600080fd5b80905090509050600361026051808202821582848304141761358757600080fd5b8090509050905081818301101561359d57600080fd5b8082019050905080806135af57600080fd5b820490509050610200526101e0516102005111156135f6576001610200516101e051808210156135de57600080fd5b808203905090501115156135f157613630565b613620565b60016101e051610200518082101561360d57600080fd5b8082039050905011151561362057613630565b8151600101808352811415613423575b5050610200516000526000516101a051565b6101a0526101405261016052610180526101405161016051610180516101a051610140516101c052610160516101e0526101e0516101c0516006580161326b565b61024052610260526101a05261018052610160526101405261024080516102805280602001516102a052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610280516102c0526102a0516102e0526101805161030052610300516102e0516102c05160065801613365565b610360526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610360516000526000516101a051565b6101e0526101405261016052610180526101a0526101c05261016051610140511861377957600080fd5b600061016051121561378a57600080fd5b6002610160511261379a57600080fd5b60006101405112156137ab57600080fd5b600261014051126137bb57600080fd5b6101405161016051610180516101a0516101c0516101e0516102005160065801612fdd565b61022052610200526101e0526101c0526101a05261018052610160526101405261022051610200526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c05161026052610200516102805261028051610260516102405160065801613365565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e05161022052610220516102405260006102605261020051600280820282158284830414176138a957600080fd5b809050905090506102805260006102a0526102c060006002818352015b610140516102c05114156138e157610180516102a052613916565b610160516102c0511815613911576101a06102c0516002811061390357600080fd5b60200201516102a052613916565b613992565b61026080516102a05181818301101561392e57600080fd5b808201905090508152506102405161022051808202821582848304141761395457600080fd5b809050905090506102a0516002808202821582848304141761397557600080fd5b80905090509050808061398757600080fd5b820490509050610240525b81516001018083528114156138c6575b5050610240516102205180820282158284830414176139c057600080fd5b8090509050905061028051600280820282158284830414176139e157600080fd5b8090509050905080806139f357600080fd5b820490509050610240526102605161022051610280518080613a1457600080fd5b820490509050818183011015613a2957600080fd5b808201905090506102c05260006102e0526102205161030052610320600060ff818352015b610300516102e05261030051610300518082028215828483041417613a7257600080fd5b8090509050905061024051818183011015613a8c57600080fd5b808201905090506002610300518082028215828483041417613aad57600080fd5b809050905090506102c051818183011015613ac757600080fd5b808201905090506102205180821015613adf57600080fd5b808203905090508080613af157600080fd5b820490509050610300526102e051610300511115613b38576001610300516102e05180821015613b2057600080fd5b80820390509050111515613b3357613b72565b613b62565b60016102e0516103005180821015613b4f57600080fd5b80820390509050111515613b6257613b72565b8151600101808352811415613a4e575b5050610300516000526000516101e051565b6101e0526101405261016052610180526101a0526101c0526000610160511215613bad57600080fd5b60026101605112613bbd57600080fd5b6101c051610200526000610220526101405160028082028215828483041417613be557600080fd5b809050905090506102405260006102605261028060006002818352015b61016051610280511815613c32576101806102805160028110613c2457600080fd5b602002015161026052613c37565b613cb3565b610220805161026051818183011015613c4f57600080fd5b80820190509050815250610200516101c0518082028215828483041417613c7557600080fd5b809050905090506102605160028082028215828483041417613c9657600080fd5b809050905090508080613ca857600080fd5b820490509050610200525b8151600101808352811415613c02575b5050610200516101c0518082028215828483041417613ce157600080fd5b809050905090506102405160028082028215828483041417613d0257600080fd5b809050905090508080613d1457600080fd5b82049050905061020052610220516101c051610240518080613d3557600080fd5b820490509050818183011015613d4a57600080fd5b808201905090506102805260006102a0526101c0516102c0526102e0600060ff818352015b6102c0516102a0526102c0516102c0518082028215828483041417613d9357600080fd5b8090509050905061020051818183011015613dad57600080fd5b8082019050905060026102c0518082028215828483041417613dce57600080fd5b8090509050905061028051818183011015613de857600080fd5b808201905090506101c05180821015613e0057600080fd5b808203905090508080613e1257600080fd5b8204905090506102c0526102a0516102c0511115613e595760016102c0516102a05180821015613e4157600080fd5b80820390509050111515613e5457613e93565b613e83565b60016102a0516102c05180821015613e7057600080fd5b80820390509050111515613e8357613e93565b8151600101808352811415613d6f575b50506102c0516000526000516101e051565b6101805261014052610160526101405161016051610180516101a05160065801612fdd565b6101c0526101a0526101805261016052610140526101c0516101a05260025460028082028215828483041417613eff57600080fd5b809050905090506004808204905090506101c05260016101e0526402540be4006102005260206102a060046318160ddd6102405261025c6006545afa613f4457600080fd5b601f3d11613f5157600080fd5b6000506102a051610220526101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605160065801613175565b610280526102a052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610280805161024052806020015161026052506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610240516102a052610260516102c0526101a0516102e0526102e0516102c0516102a05160065801613365565b6103405261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103405161028052610280516101405161028051808202821582848304141761408157600080fd5b8090509050905061022051808061409757600080fd5b820490509050808210156140aa57600080fd5b808203905090506102a052610240516102c052610260516102e052610140610320525b610320515160206103205101610320526103206103205110156140ef576140cd565b6101a0516103405261016051610360526102405161038052610260516103a0526102a0516103c0526103c0516103a05161038051610360516103405160065801613b84565b61042052610300610320525b610320515260206103205103610320526101406103205110151561416357614140565b6104205161030052610240610160516002811061417f57600080fd5b6020020151610300518082101561419557600080fd5b808203905090506101e061016051600281106141b057600080fd5b602002015180806141c057600080fd5b8204905090506103205261034060006002818352015b600061036052610160516103405114156142585761024061034051600281106141fe57600080fd5b60200201516102a051808202821582848304141761421b57600080fd5b8090509050905061028051808061423157600080fd5b820490509050610300518082101561424857600080fd5b80820390509050610360526142d7565b610240610340516002811061426c57600080fd5b6020020151610240610340516002811061428557600080fd5b60200201516102a05180820282158284830414176142a257600080fd5b809050905090506102805180806142b857600080fd5b820490509050808210156142cb57600080fd5b80820390509050610360525b6102c061034051600281106142eb57600080fd5b6020020180516101c05161036051808202821582848304141761430d57600080fd5b809050905090506402540be400808204905090508082101561432e57600080fd5b808203905090508152505b81516001018083528114156141d6575b50506102c0610160516002811061435f57600080fd5b6020020151610140610360525b6103605151602061036051016103605261036061036051101561438e5761436c565b6101a05161038052610160516103a0526102c0516103c0526102e0516103e0526102a05161040052610400516103e0516103c0516103a0516103805160065801613b84565b61046052610340610360525b6103605152602061036051036103605261014061036051101515614402576143df565b610460518082101561441357600080fd5b80820390509050610340526103405160018082101561443157600080fd5b808203905090506101e0610160516002811061444c57600080fd5b6020020151808061445c57600080fd5b820490509050610340526103a061034051815261032051610340518082101561448457600080fd5b8082039050905081602001525060406103e0525b60006103e0511115156144aa576144c6565b60206103e051036103a0015160206103e051036103e052614498565b61018051565b61013e61460a0361013e60003961013e61460a036000f3000000000000000000000000bbcf44d219d57fd81771ec5053faea5fc86421930000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c000000000000000000000000fce146bf3146100cfe5db4129cf6c82b0ef4ad8c0000000000000000000000002a435ecb3fcc0e316492dc1cdd62d0f189be5640000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f200000000000000000000000000d7571f3e67b553ecd344a713785399471b627a4f

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

000000000000000000000000bbcf44d219d57fd81771ec5053faea5fc86421930000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c000000000000000000000000fce146bf3146100cfe5db4129cf6c82b0ef4ad8c0000000000000000000000002a435ecb3fcc0e316492dc1cdd62d0f189be5640000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f200000000000000000000000000d7571f3e67b553ecd344a713785399471b627a4f

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000bbcf44d219d57fd81771ec5053faea5fc8642193
Arg [1] : 0000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c
Arg [2] : 000000000000000000000000fce146bf3146100cfe5db4129cf6c82b0ef4ad8c
Arg [3] : 0000000000000000000000002a435ecb3fcc0e316492dc1cdd62d0f189be5640
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [5] : 00000000000000000000000000000000000000000000000000000000003d0900
Arg [6] : 000000000000000000000000000000000000000000000000000000012a05f200
Arg [7] : 000000000000000000000000d7571f3e67b553ecd344a713785399471b627a4f


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.