Contract 0xAEA4f7dcd172997947809CE6F12018a6D5c1E8b6

 
Txn Hash
Block
From
To
Value [Txn Fee]
0x38300af16794ced60dc865537393af471ac47b37c46c806d6f33836397cc632f83070072021-06-15 2:58:3248 mins ago0xc85b73be2d42b47e55278218bab88fdae0ccecf5 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.015850355
0x18bf15bb6f20cb19477eee15138131413e2d30c24607e511ceedd55083a230a783060582021-06-15 2:10:591 hr 36 mins ago0xb4989157aa07878c5066274e48660f80e5322129 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.01805188
0x500d56fe7d62ba008448664dbdded321cff0ee1e0fd55dff33628fc6448deab983045382021-06-15 0:53:282 hrs 53 mins ago0xc8171237ad47ed4912767d806472a1260efe2e5f IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.016959765
0xc990052de5374cfafeb1bacd0237dc0eff4d39d67b13c4b58858be3a1c7d51cc83045292021-06-15 0:53:012 hrs 54 mins ago0xc8171237ad47ed4912767d806472a1260efe2e5f IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.01850283
0xdb94511d8ef600ebf47884c83865de247109efce7cf8be8732da40294e608c5183041512021-06-15 0:33:423 hrs 13 mins ago0xc8171237ad47ed4912767d806472a1260efe2e5f IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.017034765
0x1776b2af1c2c6099fe0bdd92fd8a0a9fcf6e10d991766eebb00b7a8493d2961583041092021-06-15 0:31:143 hrs 15 mins ago0xc8171237ad47ed4912767d806472a1260efe2e5f IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.01873773
0x9827e4f075aa9c3d02b61d8f9ee44d24eca7b1f2406be4bebf7a886d7d6ca64283041002021-06-15 0:30:433 hrs 16 mins ago0xc8171237ad47ed4912767d806472a1260efe2e5f IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.01911444
0x420b81b5abae512cefb7e59c25e4f2288f94ac8c66f8a5b4867d8d480b520dd983031032021-06-14 23:40:214 hrs 6 mins ago0x3b27caaab1d3fe0a3e21dab63d8450de4fc86166 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.01016841
0xa7963ca3df5c3a59a4cf1b48ec0e59a78bd079249e3fe50633784760cd72a0fe83030862021-06-14 23:39:304 hrs 7 mins ago0x3b27caaab1d3fe0a3e21dab63d8450de4fc86166 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.01533343
0x7ea888c09e77ee0a24047ea7148976a2a49ff8b9cc5d769fa257a1993869bb2583030722021-06-14 23:38:484 hrs 8 mins ago0x3b27caaab1d3fe0a3e21dab63d8450de4fc86166 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.011899135
0xd6b55ca9c69a86ce675dc3897d9cc9d629190abb21e57778b2915072ab0e185183028052021-06-14 23:25:224 hrs 21 mins ago0xcb83f02548d97535075bbd4b201e8bde106b0c60 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.018130935
0x3de855d1d0556171adde8553cb3e856fc3295ac50d2dd14e21ba5570a671b6c783005362021-06-14 21:28:266 hrs 18 mins ago0xc7777c1a0cf7e22c51b44f7ced65cf2a6b06dc5c IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.015773885
0x99abced17e84ae675848f8cba8d1176b9d6472e98f6ea1e5e417a1b10038de2282993262021-06-14 20:26:187 hrs 20 mins ago0xc69a15a40691c911907e7d4cf710485a76239ad8 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.01584467
0xb6f87b1a560ac227f6814bcff9bc097b95ab2b092065903e2e1c14194c76e89f82992962021-06-14 20:24:487 hrs 22 mins ago0xc69a15a40691c911907e7d4cf710485a76239ad8 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.012708535
0x90afbf1d5888baccbf5e1c3be2520c40a3cd7ab0c7389223558659c30c0464a482987972021-06-14 19:59:407 hrs 47 mins ago0x85fa878202187c519db62e1107f454fd5e5d7d5b IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.05647376
0xde82a49717e60936bc6adca103d82a6e88130e5e0ee8a9bdbc6f1b904c5d182a82968102021-06-14 18:20:069 hrs 27 mins ago0x73af3d07fce8e718464a7f23484451dfd909cb1b IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.01842778
0x5c88dedfe3e0a88ad9d9c1b63da3745c36f14b157d4b981478beff496bf569fe82965842021-06-14 18:08:349 hrs 38 mins ago0x73af3d07fce8e718464a7f23484451dfd909cb1b IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.017505165
0xb1836d0b3a2f0296632bfce8646f0d09200c8c52b4f0b6cd4486279de857e28c82961002021-06-14 17:44:2210 hrs 2 mins ago0x34bc81192b1787ae0c03820cacd2cc32518d3699 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.01617465
0xb40a246f0025a1e633b98ef9d10657f68468be37fe11220652b29d53c06e25ce82960752021-06-14 17:43:0710 hrs 4 mins ago0x34bc81192b1787ae0c03820cacd2cc32518d3699 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.01530432
0xd2514d34a330252ebdf69e984cf89640880745c58a99dde9bbbbe22ee08a0aec82960612021-06-14 17:42:2510 hrs 4 mins ago0x34bc81192b1787ae0c03820cacd2cc32518d3699 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.016178525
0x5619a19b155fac9a7aac5476df20950abff50e21928d0f4a8a9cd40e156b032382960502021-06-14 17:41:5210 hrs 5 mins ago0x34bc81192b1787ae0c03820cacd2cc32518d3699 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.014910525
0x1a4152197ae45b452343151ba244ed6a5194b7effb83dff8c883a31eaea94de082959032021-06-14 17:34:3110 hrs 12 mins ago0x68bedaa9f574f8a6fee8b8da75b83f6772947790 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.015309785
0x4e6b9fd22c2040772007c6af429c20cd376b50218975e2c1a2e1af7763e6221682947712021-06-14 16:37:3711 hrs 9 mins ago0x34bc81192b1787ae0c03820cacd2cc32518d3699 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.01250072
0x56235483d4815f717027c6e40983d11e26734997da90471a3b42b3b854886a6382947632021-06-14 16:37:1311 hrs 9 mins ago0x34bc81192b1787ae0c03820cacd2cc32518d3699 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.01451941
0xdf74a57ad0758fc9cc7d709973a37382864f7b6b2283707a5f9d6a5c0081578482947542021-06-14 16:36:4611 hrs 10 mins ago0x34bc81192b1787ae0c03820cacd2cc32518d3699 IN  0xaea4f7dcd172997947809ce6f12018a6d5c1e8b60 BNB0.014909765
[ 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.1.0b16

Optimization Enabled:
N/A

Other Settings:
, None license

Contract Source Code (Vyper language format)

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

contract bERC20:
    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, minShare: uint256): modifying
    def withdraw(withdrawTokens: uint256, minShare: uint256): modifying
    def getPricePerFullShare() -> uint256: constant


from vyper.interfaces import ERC20

N_COINS: constant(int128) = 4  # <- change

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

TETHERED: constant(bool[N_COINS]) = [False, False, 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), convert(1, uint256), convert(1, uint256)]

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, buyback_fee: uint256, buyback_addr: address})
NewParameters: event({A: uint256, fee: uint256, buyback_fee: uint256, buyback_addr: address})

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
buyback_fee: public(uint256)  # buyback_fee * 1e10
max_buyback_fee: constant(uint256) = 5 * 10 ** 9

owner: public(address)
buyback_addr: public(address)
token: ERC20m

admin_actions_deadline: public(timestamp)
transfer_ownership_deadline: public(timestamp)
future_A: public(uint256)
future_fee: public(uint256)
future_buyback_fee: public(uint256)
future_owner: public(address)
future_buyback_addr: 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, _buyback_fee: uint256,_buyback_addr: address):
    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.buyback_fee = _buyback_fee
    self.owner = msg.sender
    self.kill_deadline = block.timestamp + kill_deadline_dt
    self.is_killed = False
    self.token = ERC20m(_pool_token)
    self.buyback_addr = _buyback_addr


@public
@constant
def pool_token() -> address:
    return self.token

@private
@constant
def _stored_rates() -> uint256[N_COINS]:
    result: uint256[N_COINS] = PRECISION_MUL
    for i in range(N_COINS):
        result[i] *= bERC20(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)

        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:
    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:
    _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):
    assert not self.is_killed

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

    token_supply: uint256 = self.token.totalSupply()
    rates: uint256[N_COINS] = self._stored_rates()

    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

        new_balances[i] = old_balances[i] + amounts[i]


    D1: uint256 = self.get_D_mem(rates, new_balances)
    assert D1 > D0

    D2: uint256 = D1
    if token_supply > 0:
        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] * _buyback_fee / FEE_DENOMINATOR
            new_balances[i] -= fees[i]
        D2 = self.get_D_mem(rates, new_balances)
    else:
        self.balances = new_balances

    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"

    for i in range(N_COINS):
        assert_modifiable(
            bERC20(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:

    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:
    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:
    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


@public
@constant
def get_dy_underlying(i: int128, j: int128, dx: uint256) -> uint256:
    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
    return dy - _fee


@public
@constant
def get_dx_underlying(i: int128, j: int128, dy: uint256) -> uint256:
    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

    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_buyback_fee: uint256 = dy_fee * self.buyback_fee / FEE_DENOMINATOR
    self.balances[i] = x * PRECISION / rates[i]
    self.balances[j] = (y + (dy_fee - dy_buyback_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(bERC20(self.coins[i]).transferFrom(msg.sender, self, dx))

    assert_modifiable(bERC20(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]
    
    assert_modifiable(ERC20(self.underlying_coins[i])\
        .transferFrom(msg.sender, self, dx))
    ERC20(self.underlying_coins[i]).approve(self.coins[i], dx)
    
    dx_: uint256 = ERC20(self.coins[i]).balanceOf(self)
    bERC20(self.coins[i]).deposit(dx, 0)
    dx_ = ERC20(self.coins[i]).balanceOf(self) - dx_
    
    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

    ok: uint256 = 0
    bERC20(self.coins[j]).withdraw(dy_, 0)
    dy = ERC20(self.underlying_coins[j]).balanceOf(self)
    assert dy >= min_dy, "Exchange resulted in fewer coins than expected"

    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(bERC20(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))
    _buyback_fee: uint256 = self.buyback_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] * _buyback_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(bERC20(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)


@public
def commit_new_parameters(amplification: uint256,
                          new_fee: uint256,
                          new_buyback_fee: uint256,
                          new_buyback_addr: address):
    assert msg.sender == self.owner
    assert self.admin_actions_deadline == 0
    assert new_buyback_fee <= max_buyback_fee

    _deadline: timestamp = block.timestamp + admin_actions_delay
    self.admin_actions_deadline = _deadline
    self.future_A = amplification
    self.future_fee = new_fee
    self.future_buyback_fee = new_buyback_fee
    self.future_buyback_addr = new_buyback_addr


    log.CommitNewParameters(_deadline, amplification, new_fee, new_buyback_fee, new_buyback_addr)


@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
    _buyback_fee: uint256 = self.future_buyback_fee
    _buyback_addr: address = self.future_buyback_addr
    self.A = _A
    self.fee = _fee
    self.buyback_fee = _buyback_fee
    self.buyback_addr = _buyback_addr

    log.NewParameters(_A, _fee, _buyback_fee,_buyback_addr)


@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_buyback_fees():
    _precisions: uint256[N_COINS] = PRECISION_MUL

    for i in range(N_COINS):
        c: address = self.coins[i]
        value: uint256 = bERC20(c).balanceOf(self) - self.balances[i]
        if value > 0:
            assert_modifiable(bERC20(c).transfer(self.buyback_addr, 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 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[4]","name":"token_amounts","indexed":false},{"type":"uint256[4]","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[4]","name":"token_amounts","indexed":false},{"type":"uint256[4]","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[4]","name":"token_amounts","indexed":false},{"type":"uint256[4]","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":"buyback_fee","indexed":false},{"type":"address","name":"buyback_addr","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewParameters","inputs":[{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"buyback_fee","indexed":false},{"type":"address","name":"buyback_addr","indexed":false}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"address[4]","name":"_coins"},{"type":"address[4]","name":"_underlying_coins"},{"type":"address","name":"_pool_token"},{"type":"uint256","name":"_A"},{"type":"uint256","name":"_fee"},{"type":"uint256","name":"_buyback_fee"},{"type":"address","name":"_buyback_addr"}],"constant":false,"payable":false,"type":"constructor"},{"name":"pool_token","outputs":[{"type":"address","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":1151},{"name":"get_virtual_price","outputs":[{"type":"uint256","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":1535305},{"name":"calc_token_amount","outputs":[{"type":"uint256","name":"out"}],"inputs":[{"type":"uint256[4]","name":"amounts"},{"type":"bool","name":"deposit"}],"constant":true,"payable":false,"type":"function","gas":6068241},{"name":"add_liquidity","outputs":[],"inputs":[{"type":"uint256[4]","name":"amounts"},{"type":"uint256","name":"min_mint_amount"}],"constant":false,"payable":false,"type":"function","gas":9327593},{"name":"get_dy","outputs":[{"type":"uint256","name":"out"}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"constant":true,"payable":false,"type":"function","gas":3454407},{"name":"get_dx","outputs":[{"type":"uint256","name":"out"}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dy"}],"constant":true,"payable":false,"type":"function","gas":3454412},{"name":"get_dy_underlying","outputs":[{"type":"uint256","name":"out"}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"constant":true,"payable":false,"type":"function","gas":3454267},{"name":"get_dx_underlying","outputs":[{"type":"uint256","name":"out"}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dy"}],"constant":true,"payable":false,"type":"function","gas":3454273},{"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":7030538},{"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":7057905},{"name":"remove_liquidity","outputs":[],"inputs":[{"type":"uint256","name":"_amount"},{"type":"uint256[4]","name":"min_amounts"}],"constant":false,"payable":false,"type":"function","gas":240439},{"name":"remove_liquidity_imbalance","outputs":[],"inputs":[{"type":"uint256[4]","name":"amounts"},{"type":"uint256","name":"max_burn_amount"}],"constant":false,"payable":false,"type":"function","gas":9326820},{"name":"commit_new_parameters","outputs":[],"inputs":[{"type":"uint256","name":"amplification"},{"type":"uint256","name":"new_fee"},{"type":"uint256","name":"new_buyback_fee"},{"type":"address","name":"new_buyback_addr"}],"constant":false,"payable":false,"type":"function","gas":181536},{"name":"apply_new_parameters","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":169924},{"name":"revert_new_parameters","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21835},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"_owner"}],"constant":false,"payable":false,"type":"function","gas":74512},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":60568},{"name":"revert_transfer_ownership","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21925},{"name":"withdraw_buyback_fees","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":25008},{"name":"kill_me","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":37878},{"name":"unkill_me","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":22015},{"name":"coins","outputs":[{"type":"address","name":"out"}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2190},{"name":"underlying_coins","outputs":[{"type":"address","name":"out"}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2220},{"name":"balances","outputs":[{"type":"uint256","name":"out"}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2250},{"name":"A","outputs":[{"type":"uint256","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2081},{"name":"fee","outputs":[{"type":"uint256","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2111},{"name":"buyback_fee","outputs":[{"type":"uint256","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2141},{"name":"owner","outputs":[{"type":"address","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2171},{"name":"buyback_addr","outputs":[{"type":"address","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2201},{"name":"admin_actions_deadline","outputs":[{"type":"uint256","unit":"sec","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2231},{"name":"transfer_ownership_deadline","outputs":[{"type":"uint256","unit":"sec","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2261},{"name":"future_A","outputs":[{"type":"uint256","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2291},{"name":"future_fee","outputs":[{"type":"uint256","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2321},{"name":"future_buyback_fee","outputs":[{"type":"uint256","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2351},{"name":"future_owner","outputs":[{"type":"address","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2381},{"name":"future_buyback_addr","outputs":[{"type":"address","name":"out"}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2411}]

740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526101a061575e6101403934156100a257600080fd5b602061575e60c03960c05160205181106100bb57600080fd5b506020602061575e0160c03960c05160205181106100d857600080fd5b506020604061575e0160c03960c05160205181106100f557600080fd5b506020606061575e0160c03960c051602051811061011257600080fd5b506020608061575e0160c03960c051602051811061012f57600080fd5b50602060a061575e0160c03960c051602051811061014c57600080fd5b50602060c061575e0160c03960c051602051811061016957600080fd5b50602060e061575e0160c03960c051602051811061018657600080fd5b50602061010061575e0160c03960c05160205181106101a457600080fd5b50602061018061575e0160c03960c05160205181106101c257600080fd5b506102e060006004818352015b60006101406102e051600481106101e557600080fd5b6020020151186101f457600080fd5b60006101c06102e0516004811061020a57600080fd5b60200201511861021957600080fd5b60006102e0516004811061022c57600080fd5b600260c052602060c02001555b81516001018083528114156101cf575b5050600060c052602060c020610140805182558060200151600183015580604001516002830155806060015160038301555050600160c052602060c0206101c080518255806020015160018301558060400151600283015580606001516003830155505061026051600355610280516004556102a0516005553360065542624f1a008181830110156102da57600080fd5b808201905090506010556000601155610240516008556102c05160075561574656600436101561000d57615444565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a05263c3b9fe5960005114156100c85734156100ba57600080fd5b60085460005260206000f350005b600015610215575b6101405261016060018152600181602001526001816040015260018160600152506101e060006004818352015b6101606101e0516004811061011157600080fd5b6020020180516101e0516004811061012857600080fd5b600060c052602060c02001543b61013e57600080fd5b6101e0516004811061014f57600080fd5b600060c052602060c0200154301861016657600080fd5b602061026060046377c7b8fc6102005261021c6101e0516004811061018a57600080fd5b600060c052602060c02001545afa6101a157600080fd5b6000506102605180820282158284830414176101bc57600080fd5b809050905090508152505b81516001018083528114156100fd575b50506080610280525b6000610280511115156101f25761020e565b60206102805103610160015160206102805103610280526101e0565b6101405156005b60001561033a575b6101c0526101405261016052610180526101a0526101e061014080518252806020015182602001528060400151826040015280606001518260600152505061026060006004818352015b6101e0610260516004811061027b57600080fd5b6020020151610260516004811061029157600080fd5b600260c052602060c020015480820282158284830414176102b157600080fd5b80905090509050670de0b6b3a764000080806102cc57600080fd5b8204905090506101e061026051600481106102e657600080fd5b60200201525b8151600101808352811415610267575b50506080610280525b60006102805111151561031757610333565b602061028051036101e001516020610280510361028052610305565b6101c05156005b60001561046b575b610240526101405261016052610180526101a0526101c0526101e05261020052610220526102606101408051825280602001518260200152806040015182604001528060600151826060015250506102e060006004818352015b6102606102e051600481106103b057600080fd5b60200201516101c06102e051600481106103c957600080fd5b602002015180820282158284830414176103e257600080fd5b80905090509050670de0b6b3a764000080806103fd57600080fd5b8204905090506102606102e0516004811061041757600080fd5b60200201525b815160010180835281141561039c575b50506080610300525b60006103005111151561044857610464565b6020610300510361026001516020610300510361030052610436565b6102405156005b600015610770575b6101c0526101405261016052610180526101a05260006101e05261022060006004818352015b602061022051026101400151610200526101e08051610200518181830110156104c157600080fd5b808201905090508152505b8151600101808352811415610499575b50506101e05115156104f75760006000526000516101c05156505b6000610260526101e051610280526003546004808202821582848304141761051e57600080fd5b809050905090506102a0526102c0600060ff818352015b610280516102e05261032060006004818352015b602061032051026101400151610300526102e05161028051808202821582848304141761057557600080fd5b80905090509050610300516004808202821582848304141761059657600080fd5b8090509050905060018181830110156105ae57600080fd5b8082019050905080806105c057600080fd5b8204905090506102e0525b8151600101808352811415610549575b505061028051610260526102a0516101e051808202821582848304141761060157600080fd5b809050905090506102e0516004808202821582848304141761062257600080fd5b8090509050905081818301101561063857600080fd5b8082019050905061028051808202821582848304141761065757600080fd5b809050905090506102a05160018082101561067157600080fd5b8082039050905061028051808202821582848304141761069057600080fd5b8090509050905060056102e05180820282158284830414176106b157600080fd5b809050905090508181830110156106c757600080fd5b8082019050905080806106d957600080fd5b820490509050610280526102605161028051111561072057600161028051610260518082101561070857600080fd5b8082039050905011151561071b5761075c565b61074b565b600161026051610280518082101561073757600080fd5b8082039050905011151561074a5761075c565b5b5b8151600101808352811415610535575b5050610280516000526000516101c0515650005b60001561093e575b610240526101405261016052610180526101a0526101c0526101e0526102005261022052610140610660525b610660515160206106605101610660526106606106605110156107c6576107a4565b6305eb8fa6610680526106a0610140610460525b610460515160206104605101610460526104606104605110156107fc576107da565b6342d3b3c3610480526104a06101408051825280602001518260200152806040015182604001528060600151826060015250506105206101c080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c0516104a05160065801610342565b6105e052610600526106205261064052610440610460525b61046051526020610460510361046052610140610460511015156108bd5761089a565b6105e0805182528060200151826020015280604001518260400152806060015182606001525050610700516106e0516106c0516106a05160065801610473565b61076052610640610660525b610660515260206106605103610660526101406106605110151561092c57610909565b61076051600052600051610240515650005b63bb7b8b806000511415610bb257341561095757600080fd5b6101406106e0525b6106e0515160206106e051016106e0526106e06106e05110156109815761095f565b6305eb8fa661070052610720610140610560525b610560515160206105605101610560526105606105605110156109b757610995565b631db7662b610580526105a06101406104c0525b6104c0515160206104c051016104c0526104c06104c05110156109ed576109cb565b600658016100d0565b6104e0526105005261052052610540526104a06104c0525b6104c0515260206104c051036104c0526101406104c051101515610a3157610a0e565b6104e0805182528060200151826020015280604001518260400152806060015182606001525050610600516105e0516105c0516105a0516006580161021d565b61066052610680526106a0526106c052610540610560525b6105605152602061056051036105605261014061056051101515610aac57610a89565b6106608051825280602001518260200152806040015182604001528060600151826060015250506107805161076051610740516107205160065801610473565b6107e0526106c06106e0525b6106e0515260206106e051036106e0526101406106e051101515610b1b57610af8565b6107e051610140526008543b610b3057600080fd5b6008543018610b3e57600080fd5b602061088060046318160ddd6108205261083c6008545afa610b5f57600080fd5b600050610880516108005261014051670de0b6b3a76400008082028215828483041417610b8b57600080fd5b80905090509050610800518080610ba157600080fd5b82049050905060005260206000f350005b63cf701ff76000511415611015573415610bcb57600080fd5b60843560028110610bdb57600080fd5b5061014060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506101c06101405161016051610180516101a0516101c0516101e0516102005161022051600658016100d0565b61026052610280526102a0526102c05261022052610200526101e0526101c0526101a052610180526101605261014052610260805182528060200151826020015280604001518260400152806060015182606001525050610140610300525b61030051516020610300510161030052610300610300511015610cd257610cb0565b631f30ab74610320526103406101c08051825280602001518260200152806040015182604001528060600151826060015250506103c061014080518252806020015182602001528060400151826040015280606001518260600152505061042051610400516103e0516103c0516103a05161038051610360516103405160065801610778565b610480526102e0610300525b6103005152602061030051036103005261014061030051101515610d8757610d64565b610480516102e0526104a060006004818352015b60843515610df3576101406104a05160048110610db757600080fd5b60200201805160046104a05160048110610dd057600080fd5b6020020135818183011015610de457600080fd5b80820190509050815250610e3d565b6101406104a05160048110610e0757600080fd5b60200201805160046104a05160048110610e2057600080fd5b602002013580821015610e3257600080fd5b808203905090508152505b5b8151600101808352811415610d9b575b50506101406104e0525b6104e0515160206104e051016104e0526104e06104e0511015610e7a57610e58565b631f30ab74610500526105206101c08051825280602001518260200152806040015182604001528060600151826060015250506105a0610140805182528060200151826020015280604001518260400152806060015182606001525050610600516105e0516105c0516105a0516105805161056051610540516105205160065801610778565b610660526104c06104e0525b6104e0515260206104e051036104e0526101406104e051101515610f2f57610f0c565b610660516104c0526008543b610f4457600080fd5b6008543018610f5257600080fd5b602061070060046318160ddd6106a0526106bc6008545afa610f7357600080fd5b600050610700516106805260006107205260843515610fb1576104c0516102e05180821015610fa157600080fd5b8082039050905061072052610fd2565b6102e0516104c05180821015610fc657600080fd5b80820390509050610720525b61072051610680518082028215828483041417610fee57600080fd5b809050905090506102e051808061100457600080fd5b82049050905060005260206000f350005b63029b2f346000511415611a975762ffffff541561103257600080fd5b600162ffffff55341561104457600080fd5b6011541561105157600080fd5b61014060008152600081602001526000816040015260008160600152506004546004808202821582848304141761108757600080fd5b80905090509050600c808061109b57600080fd5b8204905090506101c0526005546101e0526008543b6110b957600080fd5b60085430186110c757600080fd5b602061028060046318160ddd6102205261023c6008545afa6110e857600080fd5b60005061028051610200526102a0610140610320525b61032051516020610320510161032052610320610320511015611120576110fe565b600658016100d0565b6103405261036052610380526103a052610300610320525b610320515260206103205103610320526101406103205110151561116457611141565b61034080518252806020015182602001528060400151826040015280606001518260600152505060006103c0526103e060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505060006102005111156112ce57610140610460525b61046051516020610460510161046052610460610460511015611210576111ee565b631f30ab74610480526104a06102a08051825280602001518260200152806040015182604001528060600151826060015250506105206103e080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c0516104a05160065801610778565b6105e052610440610460525b61046051526020610460510361046052610140610460511015156112c5576112a2565b6105e0516103c0525b6106006103e080518252806020015182602001528060400151826040015280606001518260600152505061068060006004818352015b6102005115156113335760006004610680516004811061132357600080fd5b60200201351161133257600080fd5b5b6103e0610680516004811061134757600080fd5b60200201516004610680516004811061135f57600080fd5b602002013581818301101561137357600080fd5b80820190509050610600610680516004811061138e57600080fd5b60200201525b8151600101808352811415611304575b50506101406106c0525b6106c0515160206106c051016106c0526106c06106c05110156113d0576113ae565b631f30ab746106e0526107006102a08051825280602001518260200152806040015182604001528060600151826060015250506107806106008051825280602001518260200152806040015182604001528060600151826060015250506107e0516107c0516107a051610780516107605161074051610720516107005160065801610778565b610840526106a06106c0525b6106c0515260206106c051036106c0526101406106c05110151561148557611462565b610840516106a0526103c0516106a0511161149f57600080fd5b6106a0516108605260006102005111156117de5761088060006004818352015b6106a0516103e061088051600481106114d757600080fd5b602002015180820282158284830414176114f057600080fd5b809050905090506103c051808061150657600080fd5b8204905090506108a05260006108c052610600610880516004811061152a57600080fd5b60200201516108a0511115611573576108a051610600610880516004811061155157600080fd5b60200201518082101561156357600080fd5b808203905090506108c0526115a9565b610600610880516004811061158757600080fd5b60200201516108a0518082101561159d57600080fd5b808203905090506108c0525b6101c0516108c05180820282158284830414176115c557600080fd5b809050905090506402540be40080806115dd57600080fd5b82049050905061014061088051600481106115f757600080fd5b6020020152610600610880516004811061161057600080fd5b6020020151610140610880516004811061162957600080fd5b60200201516101e051808202821582848304141761164657600080fd5b809050905090506402540be400808061165e57600080fd5b8204905090508082101561167157600080fd5b80820390509050610880516004811061168957600080fd5b600260c052602060c020015561060061088051600481106116a957600080fd5b60200201805161014061088051600481106116c357600080fd5b6020020151808210156116d557600080fd5b808203905090508152505b81516001018083528114156114bf575b50506101406108e0525b6108e0515160206108e051016108e0526108806108e051101561171c576116fa565b631f30ab74610900526109206102a08051825280602001518260200152806040015182604001528060600151826060015250506109a0610600805182528060200151826020015280604001518260400152806060015182606001525050610a00516109e0516109c0516109a0516109805161096051610940516109205160065801610778565b610a60526108606108e0525b6108e0515260206108e051036108e0526101406108e0511015156117d1576117ae565b610a605161086052611810565b600260c052602060c0206106008051825580602001516001830155806040015160028301558060600151600383015550505b6000610a805261020051151561182d576106a051610a8052611882565b61020051610860516103c0518082101561184657600080fd5b80820390509050808202821582848304141761186157600080fd5b809050905090506103c051808061187757600080fd5b820490509050610a80525b6308c379a0610aa0526020610ac0526014610ae0527f536c697070616765207363726577656420796f75000000000000000000000000610b0052610ae050608435610a805110156118d4576084610abcfd5b610b4060006004818352015b610b4051600481106118f157600080fd5b600060c052602060c02001543b61190757600080fd5b610b40516004811061191857600080fd5b600060c052602060c0200154301861192f57600080fd5b6020610c2060646323b872dd610b605233610b805230610ba0526004610b40516004811061195c57600080fd5b6020020135610bc052610b7c6000610b40516004811061197b57600080fd5b600060c052602060c02001545af161199257600080fd5b600050610c20516119a257600080fd5b5b81516001018083528114156118e0575b50506008543b6119c257600080fd5b60085430186119d057600080fd5b6000600060446340c10f19610c405233610c6052610a8051610c8052610c5c60006008545af16119ff57600080fd5b600435610ce052602435610d0052604435610d2052606435610d405261014051610d605261016051610d805261018051610da0526101a051610dc0526106a051610de05261020051610a8051818183011015611a5a57600080fd5b80820190509050610e0052337f3f1915775e0c9a38a57a7bb7f1f9005f486fb904e1f84aa215364d567319a58d610140610ce0a2600062ffffff55005b600015611e9b575b610220526101405261016052610180526101a0526101c0526101e052610200526000610140511215610160516101405114151660006101605112151660046101405112166004610160511216611af457600080fd5b6101405161016051610180516101a0516101c0516101e0516102005161022051610240516305eb8fa6610280526102a06101a0805182528060200151826020015280604001518260400152806060015182606001525050610300516102e0516102c0516102a05160065801610473565b610360526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103605161024052610240516103805260006103a05260035460048082028215828483041417611bbb57600080fd5b809050905090506103c05260006103e05261040060006004818352015b61014051610400511415611bf357610180516103e052611c29565b61016051610400511815611c23576101a06104005160048110611c1557600080fd5b60200201516103e052611c28565b611ca5565b5b6103a080516103e051818183011015611c4157600080fd5b8082019050905081525061038051610240518082028215828483041417611c6757600080fd5b809050905090506103e05160048082028215828483041417611c8857600080fd5b809050905090508080611c9a57600080fd5b820490509050610380525b8151600101808352811415611bd8575b505061038051610240518082028215828483041417611cd357600080fd5b809050905090506103c05160048082028215828483041417611cf457600080fd5b809050905090508080611d0657600080fd5b820490509050610380526103a051610240516103c0518080611d2757600080fd5b820490509050818183011015611d3c57600080fd5b80820190509050610420526000610440526102405161046052610480600060ff818352015b610460516104405261046051610460518082028215828483041417611d8557600080fd5b8090509050905061038051818183011015611d9f57600080fd5b808201905090506002610460518082028215828483041417611dc057600080fd5b8090509050905061042051818183011015611dda57600080fd5b808201905090506102405180821015611df257600080fd5b808203905090508080611e0457600080fd5b8204905090506104605261044051610460511115611e4b576001610460516104405180821015611e3357600080fd5b80820390509050111515611e4657611e87565b611e76565b6001610440516104605180821015611e6257600080fd5b80820390509050111515611e7557611e87565b5b5b8151600101808352811415611d61575b505061046051600052600051610220515650005b635e0d443f6000511415612272573415611eb457600080fd5b60605160043580604051901315611eca57600080fd5b8091901215611ed857600080fd5b5060605160243580604051901315611eef57600080fd5b8091901215611efd57600080fd5b506101406101405161016051610180516101a051600658016100d0565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015611f8e57611f6c565b631db7662b61030052610320610140805182528060200151826020015280604001518260400152806060015182606001525050610380516103605161034051610320516006580161021d565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e05110151561201557611ff2565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506102606004356004811061204f57600080fd5b60200201516044356101406004356004811061206a57600080fd5b6020020151808202821582848304141761208357600080fd5b80905090509050670de0b6b3a7640000808061209e57600080fd5b8204905090508181830110156120b357600080fd5b80820190509050610460526101406104a0525b6104a0515160206104a051016104a0526104a06104a05110156120e8576120c6565b631e8c3fd36104c0526004356104e0526024356105005261046051610520526105406102608051825280602001518260200152806040015182604001528060600151826060015250506105a05161058051610560516105405161052051610500516104e05160065801611a9f565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a05110151561218557612162565b6106005161048052610260602435600481106121a057600080fd5b602002015161048051808210156121b657600080fd5b80820390509050670de0b6b3a764000080820282158284830414176121da57600080fd5b80905090509050610140602435600481106121f457600080fd5b6020020151808061220457600080fd5b8204905090506106205260045461062051808202821582848304141761222957600080fd5b809050905090506402540be400808061224157600080fd5b8204905090506106405261062051610640518082101561226057600080fd5b8082039050905060005260206000f350005b6367df02ca600051141561264157341561228b57600080fd5b606051600435806040519013156122a157600080fd5b80919012156122af57600080fd5b50606051602435806040519013156122c657600080fd5b80919012156122d457600080fd5b506101406101405161016051610180516101a051600658016100d0565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e051101561236557612343565b631db7662b61030052610320610140805182528060200151826020015280604001518260400152806060015182606001525050610380516103605161034051610320516006580161021d565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e0511015156123ec576123c9565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506102606024356004811061242657600080fd5b60200201516044356402540be400808202821582848304141761244857600080fd5b809050905090506402540be4006004548082101561246557600080fd5b80820390509050808061247757600080fd5b8204905090506101406024356004811061249057600080fd5b602002015180820282158284830414176124a957600080fd5b80905090509050670de0b6b3a764000080806124c457600080fd5b820490509050808210156124d757600080fd5b80820390509050610460526101406104a0525b6104a0515160206104a051016104a0526104a06104a051101561250c576124ea565b631e8c3fd36104c0526024356104e0526004356105005261046051610520526105406102608051825280602001518260200152806040015182604001528060600151826060015250506105a05161058051610560516105405161052051610500516104e05160065801611a9f565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a0511015156125a957612586565b610600516104805261048051610260600435600481106125c857600080fd5b6020020151808210156125da57600080fd5b80820390509050670de0b6b3a764000080820282158284830414176125fe57600080fd5b809050905090506101406004356004811061261857600080fd5b6020020151808061262857600080fd5b820490509050610620526106205160005260206000f350005b6307211ef760005114156129f757341561265a57600080fd5b6060516004358060405190131561267057600080fd5b809190121561267e57600080fd5b506060516024358060405190131561269557600080fd5b80919012156126a357600080fd5b506101406101405161016051610180516101a051600658016100d0565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e051101561273457612712565b631db7662b61030052610320610140805182528060200151826020015280604001518260400152806060015182606001525050610380516103605161034051610320516006580161021d565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e0511015156127bb57612798565b6103e080518252806020015182602001528060400151826040015280606001518260600152505061046060018152600181602001526001816040015260018160600152506102606004356004811061281257600080fd5b60200201516044356104606004356004811061282d57600080fd5b6020020151808202821582848304141761284657600080fd5b8090509050905081818301101561285c57600080fd5b808201905090506104e052610140610520525b610520515160206105205101610520526105206105205110156128915761286f565b631e8c3fd36105405260043561056052602435610580526104e0516105a0526105c061026080518252806020015182602001528060400151826040015280606001518260600152505061062051610600516105e0516105c0516105a051610580516105605160065801611a9f565b61068052610500610520525b610520515260206105205103610520526101406105205110151561292e5761290b565b61068051610500526102606024356004811061294957600080fd5b6020020151610500518082101561295f57600080fd5b808203905090506104606024356004811061297957600080fd5b6020020151808061298957600080fd5b8204905090506106a0526004546106a05180820282158284830414176129ae57600080fd5b809050905090506402540be40080806129c657600080fd5b8204905090506106c0526106a0516106c051808210156129e557600080fd5b8082039050905060005260206000f350005b630e71d1b96000511415612da5573415612a1057600080fd5b60605160043580604051901315612a2657600080fd5b8091901215612a3457600080fd5b5060605160243580604051901315612a4b57600080fd5b8091901215612a5957600080fd5b506101406101405161016051610180516101a051600658016100d0565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015612aea57612ac8565b631db7662b61030052610320610140805182528060200151826020015280604001518260400152806060015182606001525050610380516103605161034051610320516006580161021d565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e051101515612b7157612b4e565b6103e0805182528060200151826020015280604001518260400152806060015182606001525050610460600181526001816020015260018160400152600181606001525061026060243560048110612bc857600080fd5b60200201516044356402540be4008082028215828483041417612bea57600080fd5b809050905090506402540be40060045480821015612c0757600080fd5b808203905090508080612c1957600080fd5b82049050905061046060243560048110612c3257600080fd5b60200201518082028215828483041417612c4b57600080fd5b8090509050905080821015612c5f57600080fd5b808203905090506104e052610140610520525b61052051516020610520510161052052610520610520511015612c9457612c72565b631e8c3fd36105405260243561056052600435610580526104e0516105a0526105c061026080518252806020015182602001528060400151826040015280606001518260600152505061062051610600516105e0516105c0516105a051610580516105605160065801611a9f565b61068052610500610520525b6105205152602061052051036105205261014061052051101515612d3157612d0e565b61068051610500526105005161026060043560048110612d5057600080fd5b602002015180821015612d6257600080fd5b8082039050905061046060043560048110612d7c57600080fd5b60200201518080612d8c57600080fd5b8204905090506106a0526106a05160005260206000f350005b60001561324a575b610220526101405261016052610180526101a0526101c0526101e0526102005260115415612dda57600080fd5b6102406101406102c0525b6102c0515160206102c051016102c0526102c06102c0511015612e0757612de5565b631db7662b6102e0526103006101a0805182528060200151826020015280604001518260400152806060015182606001525050610360516103405161032051610300516006580161021d565b6103c0526103e05261040052610420526102a06102c0525b6102c0515260206102c051036102c0526101406102c051101515612e8e57612e6b565b6103c08051825280602001518260200152806040015182604001528060600151826060015250506102406101405160048110612ec957600080fd5b6020020151610180516101a06101405160048110612ee657600080fd5b60200201518082028215828483041417612eff57600080fd5b80905090509050670de0b6b3a76400008080612f1a57600080fd5b820490509050818183011015612f2f57600080fd5b8082019050905061044052610140610480525b61048051516020610480510161048052610480610480511015612f6457612f42565b631e8c3fd36104a052610140516104c052610160516104e052610440516105005261052061024080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c05160065801611a9f565b6105e052610460610480525b610480515260206104805103610480526101406104805110151561300357612fe0565b6105e05161046052610240610160516004811061301f57600080fd5b6020020151610460518082101561303557600080fd5b808203905090506106005261060051600454808202821582848304141761305b57600080fd5b809050905090506402540be400808061307357600080fd5b8204905090506106205261062051600554808202821582848304141761309857600080fd5b809050905090506402540be40080806130b057600080fd5b8204905090506106405261044051670de0b6b3a764000080820282158284830414176130db57600080fd5b809050905090506101a061014051600481106130f657600080fd5b6020020151808061310657600080fd5b820490509050610140516004811061311d57600080fd5b600260c052602060c02001556104605161062051610640518082101561314257600080fd5b8082039050905081818301101561315857600080fd5b80820190509050670de0b6b3a7640000808202821582848304141761317c57600080fd5b809050905090506101a0610160516004811061319757600080fd5b602002015180806131a757600080fd5b82049050905061016051600481106131be57600080fd5b600260c052602060c02001556106005161062051808210156131df57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761320357600080fd5b809050905090506101a0610160516004811061321e57600080fd5b6020020151808061322e57600080fd5b8204905090506106605261066051600052600051610220515650005b633df0212460005114156136045762ffffff541561326757600080fd5b600162ffffff55341561327957600080fd5b6060516004358060405190131561328f57600080fd5b809190121561329d57600080fd5b50606051602435806040519013156132b457600080fd5b80919012156132c257600080fd5b506101406101405161016051610180516101a051600658016100d0565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051632ce785a36102a0526004356102c0526024356102e0526044356103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051610300516102e0516102c05160065801612dad565b6103e052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610260526308c379a061040052602061042052602e610440527f45786368616e676520726573756c74656420696e20666577657220636f696e73610460527f207468616e20657870656374656400000000000000000000000000000000000061048052610440506064356102605110156134665760a461041cfd5b6004356004811061347657600080fd5b600060c052602060c02001543b61348c57600080fd5b6004356004811061349c57600080fd5b600060c052602060c020015430186134b357600080fd5b602061058060646323b872dd6104c052336104e0523061050052604435610520526104dc6000600435600481106134e957600080fd5b600060c052602060c02001545af161350057600080fd5b6000506105805161351057600080fd5b6024356004811061352057600080fd5b600060c052602060c02001543b61353657600080fd5b6024356004811061354657600080fd5b600060c052602060c0200154301861355d57600080fd5b6020610640604463a9059cbb6105a052336105c052610260516105e0526105bc60006024356004811061358f57600080fd5b600060c052602060c02001545af16135a657600080fd5b600050610640516135b657600080fd5b60043561066052604435610680526024356106a052610260516106c052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610660a2600062ffffff55005b63a6417ed66000511415613f055762ffffff541561362157600080fd5b600162ffffff55341561363357600080fd5b6060516004358060405190131561364957600080fd5b809190121561365757600080fd5b506060516024358060405190131561366e57600080fd5b809190121561367c57600080fd5b506101406101405161016051610180516101a051600658016100d0565b6101e0526102005261022052610240526101a0526101805261016052610140526101e080518252806020015182602001528060400151826040015280606001518260600152505061026060018152600181602001526001816040015260018160600152506101406004356004811061371057600080fd5b60200201516102606004356004811061372857600080fd5b6020020151808061373857600080fd5b8204905090506102e0526101406024356004811061375557600080fd5b60200201516102606024356004811061376d57600080fd5b6020020151808061377d57600080fd5b820490509050610300526004356004811061379757600080fd5b600160c052602060c02001543b6137ad57600080fd5b600435600481106137bd57600080fd5b600160c052602060c020015430186137d457600080fd5b60206103e060646323b872dd61032052336103405230610360526044356103805261033c60006004356004811061380a57600080fd5b600160c052602060c02001545af161382157600080fd5b6000506103e05161383157600080fd5b6004356004811061384157600080fd5b600160c052602060c02001543b61385757600080fd5b6004356004811061386757600080fd5b600160c052602060c0200154301861387e57600080fd5b60206104a0604463095ea7b3610400526004356004811061389e57600080fd5b600060c052602060c0200154610420526044356104405261041c6000600435600481106138ca57600080fd5b600160c052602060c02001545af16138e157600080fd5b6000506104a050600435600481106138f857600080fd5b600060c052602060c02001543b61390e57600080fd5b6004356004811061391e57600080fd5b600060c052602060c0200154301861393557600080fd5b602061056060246370a082316104e05230610500526104fc6004356004811061395d57600080fd5b600060c052602060c02001545afa61397457600080fd5b600050610560516104c0526004356004811061398f57600080fd5b600060c052602060c02001543b6139a557600080fd5b600435600481106139b557600080fd5b600060c052602060c020015430186139cc57600080fd5b60006000604463e2bbb158610580526044356105a05260006105c05261059c6000600435600481106139fd57600080fd5b600060c052602060c02001545af1613a1457600080fd5b60043560048110613a2457600080fd5b600060c052602060c02001543b613a3a57600080fd5b60043560048110613a4a57600080fd5b600060c052602060c02001543018613a6157600080fd5b60206106a060246370a0823161062052306106405261063c60043560048110613a8957600080fd5b600060c052602060c02001545afa613aa057600080fd5b6000506106a0516104c05180821015613ab857600080fd5b808203905090506104c0526101406106e0525b6106e0515160206106e051016106e0526106e06106e0511015613aed57613acb565b632ce785a36107005260043561072052602435610740526104c051610760526107806101408051825280602001518260200152806040015182604001528060600151826060015250506107e0516107c0516107a0516107805161076051610740516107205160065801612dad565b610840526106c06106e0525b6106e0515260206106e051036106e0526101406106e051101515613b8a57613b67565b610840516106c0526106c051610300518082028215828483041417613bae57600080fd5b80905090509050670de0b6b3a76400008080613bc957600080fd5b820490509050610860526308c379a06108805260206108a052602e6108c0527f45786368616e676520726573756c74656420696e20666577657220636f696e736108e0527f207468616e206578706563746564000000000000000000000000000000000000610900526108c050606435610860511015613c4a5760a461089cfd5b610940600081526000816020015260008160400152600081606001525060006109c05260243560048110613c7d57600080fd5b600060c052602060c02001543b613c9357600080fd5b60243560048110613ca357600080fd5b600060c052602060c02001543018613cba57600080fd5b60006000604463441a3e706109e0526106c051610a00526000610a20526109fc600060243560048110613cec57600080fd5b600060c052602060c02001545af1613d0357600080fd5b60243560048110613d1357600080fd5b600160c052602060c02001543b613d2957600080fd5b60243560048110613d3957600080fd5b600160c052602060c02001543018613d5057600080fd5b6020610b0060246370a08231610a805230610aa052610a9c60243560048110613d7857600080fd5b600160c052602060c02001545afa613d8f57600080fd5b600050610b0051610860526308c379a0610b20526020610b4052602e610b60527f45786368616e676520726573756c74656420696e20666577657220636f696e73610b80527f207468616e206578706563746564000000000000000000000000000000000000610ba052610b6050606435610860511015613e115760a4610b3cfd5b60243560048110613e2157600080fd5b600160c052602060c02001543b613e3757600080fd5b60243560048110613e4757600080fd5b600160c052602060c02001543018613e5e57600080fd5b6020610c80604463a9059cbb610be05233610c005261086051610c2052610bfc600060243560048110613e9057600080fd5b600160c052602060c02001545af1613ea757600080fd5b600050610c8051613eb757600080fd5b600435610ca052604435610cc052602435610ce05261086051610d0052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b6080610ca0a2600062ffffff55005b637d49d875600051141561428d5762ffffff5415613f2257600080fd5b600162ffffff553415613f3457600080fd5b6008543b613f4157600080fd5b6008543018613f4f57600080fd5b60206101c060046318160ddd6101605261017c6008545afa613f7057600080fd5b6000506101c051610140526101e0600081526000816020015260008160400152600081606001525061026060008152600081602001526000816040015260008160600152506102e060006004818352015b6102e05160048110613fd257600080fd5b600260c052602060c02001546004358082028215828483041417613ff557600080fd5b8090509050905061014051808061400b57600080fd5b820490509050610300526308c379a0610320526020610340526030610360527f5769746864726177616c20726573756c74656420696e20666577657220636f69610380527f6e73207468616e206578706563746564000000000000000000000000000000006103a0526103605060246102e0516004811061408b57600080fd5b60200201356103005110156140a15760a461033cfd5b6102e051600481106140b257600080fd5b600260c052602060c02001805461030051808210156140d057600080fd5b80820390509050815550610300516101e06102e051600481106140f257600080fd5b60200201526102e0516004811061410857600080fd5b600060c052602060c02001543b61411e57600080fd5b6102e0516004811061412f57600080fd5b600060c052602060c0200154301861414657600080fd5b6020610480604463a9059cbb6103e052336104005261030051610420526103fc60006102e0516004811061417957600080fd5b600060c052602060c02001545af161419057600080fd5b600050610480516141a057600080fd5b5b8151600101808352811415613fc1575b50506008543b6141c057600080fd5b60085430186141ce57600080fd5b6000600060446379cc67906104a052336104c0526004356104e0526104bc60006008545af16141fc57600080fd5b6101e0516105405261020051610560526102205161058052610240516105a052610260516105c052610280516105e0526102a051610600526102c05161062052610140516004358082101561425057600080fd5b8082039050905061064052337f9878ca375e106f2a43c3b599fc624568131c4c9a4ba66a14563715763be9d59d610120610540a2600062ffffff55005b6318a7bd766000511415614c545762ffffff54156142aa57600080fd5b600162ffffff5534156142bc57600080fd5b601154156142c957600080fd5b6008543b6142d657600080fd5b60085430186142e457600080fd5b60206101c060046318160ddd6101605261017c6008545afa61430557600080fd5b6000506101c051610140526000610140511161432057600080fd5b6004546004808202821582848304141761433957600080fd5b80905090509050600c808061434d57600080fd5b8204905090506101e052600554610200526102206101406102a0525b6102a0515160206102a051016102a0526102a06102a051101561438b57614369565b600658016100d0565b6102c0526102e05261030052610320526102806102a0525b6102a0515260206102a051036102a0526101406102a0511015156143cf576143ac565b6102c080518252806020015182602001528060400151826040015280606001518260600152505061034060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506103c0610340805182528060200151826020015280604001518260400152806060015182606001525050610140610460525b6104605151602061046051016104605261046061046051101561449357614471565b631f30ab74610480526104a061022080518252806020015182602001528060400151826040015280606001518260600152505061052061034080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c0516104a05160065801610778565b6105e052610440610460525b610460515260206104605103610460526101406104605110151561454857614525565b6105e0516104405261060060006004818352015b6103c0610600516004811061457057600080fd5b6020020180516004610600516004811061458957600080fd5b60200201358082101561459b57600080fd5b808203905090508152505b815160010180835281141561455c575b5050610140610640525b610640515160206106405101610640526106406106405110156145e2576145c0565b631f30ab74610660526106806102208051825280602001518260200152806040015182604001528060600151826060015250506107006103c0805182528060200151826020015280604001518260400152806060015182606001525050610760516107405161072051610700516106e0516106c0516106a0516106805160065801610778565b6107c052610620610640525b610640515260206106405103610640526101406106405110151561469757614674565b6107c051610620526107e0600081526000816020015260008160400152600081606001525061086060006004818352015b6106205161034061086051600481106146e057600080fd5b602002015180820282158284830414176146f957600080fd5b8090509050905061044051808061470f57600080fd5b8204905090506108805260006108a0526103c0610860516004811061473357600080fd5b602002015161088051111561477c57610880516103c0610860516004811061475a57600080fd5b60200201518082101561476c57600080fd5b808203905090506108a0526147b2565b6103c0610860516004811061479057600080fd5b602002015161088051808210156147a657600080fd5b808203905090506108a0525b6101e0516108a05180820282158284830414176147ce57600080fd5b809050905090506402540be40080806147e657600080fd5b8204905090506107e0610860516004811061480057600080fd5b60200201526103c0610860516004811061481957600080fd5b60200201516107e0610860516004811061483257600080fd5b602002015161020051808202821582848304141761484f57600080fd5b809050905090506402540be400808061486757600080fd5b8204905090508082101561487a57600080fd5b80820390509050610860516004811061489257600080fd5b600260c052602060c02001556103c061086051600481106148b257600080fd5b6020020180516107e061086051600481106148cc57600080fd5b6020020151808210156148de57600080fd5b808203905090508152505b81516001018083528114156146c8575b50506101406108e0525b6108e0515160206108e051016108e0526108e06108e051101561492557614903565b631f30ab74610900526109206102208051825280602001518260200152806040015182604001528060600151826060015250506109a06103c0805182528060200151826020015280604001518260400152806060015182606001525050610a00516109e0516109c0516109a0516109805161096051610940516109205160065801610778565b610a60526108c06108e0525b6108e0515260206108e051036108e0526101406108e0511015156149da576149b7565b610a60516108c052610440516108c051808210156149f757600080fd5b80820390509050610140518082028215828483041417614a1657600080fd5b80905090509050610440518080614a2c57600080fd5b820490509050610a80526000610a805111614a4657600080fd5b6308c379a0610aa0526020610ac0526014610ae0527f536c697070616765207363726577656420796f75000000000000000000000000610b0052610ae050608435610a80511115614a98576084610abcfd5b610b4060006004818352015b610b405160048110614ab557600080fd5b600060c052602060c02001543b614acb57600080fd5b610b405160048110614adc57600080fd5b600060c052602060c02001543018614af357600080fd5b6020610c00604463a9059cbb610b605233610b80526004610b405160048110614b1b57600080fd5b6020020135610ba052610b7c6000610b405160048110614b3a57600080fd5b600060c052602060c02001545af1614b5157600080fd5b600050610c0051614b6157600080fd5b5b8151600101808352811415614aa4575b50506008543b614b8157600080fd5b6008543018614b8f57600080fd5b6000600060446379cc6790610c205233610c4052610a8051610c6052610c3c60006008545af1614bbe57600080fd5b600435610cc052602435610ce052604435610d0052606435610d20526107e051610d405261080051610d605261082051610d805261084051610da05261062051610dc05261014051610a805180821015614c1757600080fd5b80820390509050610de052337fb964b72f73f5ef5bf0fdc559b2fab9a7b12a39e47817a547f1f0aee47febd602610140610cc0a2600062ffffff55005b639d6b51c46000511415614d35573415614c6d57600080fd5b6064356020518110614c7e57600080fd5b506006543314614c8d57600080fd5b60095415614c9a57600080fd5b64012a05f2006044351115614cae57600080fd5b426203f480818183011015614cc257600080fd5b808201905090506101405261014051600955600435600b55602435600c55604435600d55606435600f5560043561016052602435610180526044356101a0526064356101c052610140517f1a375ce0ce3f550e291d47bc05f93057ed8e1c975cd780c89692bfc2cebe38cf6080610160a2005b632a7dd7cd6000511415614df8573415614d4e57600080fd5b6006543314614d5c57600080fd5b60006009541142600954111516614d7257600080fd5b6000600955600b5461014052600c5461016052600d5461018052600f546101a0526101405160035561016051600455610180516005556101a051600755610140516101c052610160516101e05261018051610200526101a051610220527f31cd427bd5e7a297fe28319fa83bebe6d4686d8979d3cf4a89a4eec568cde6fb60806101c0a1005b63226840fb6000511415614e26573415614e1157600080fd5b6006543314614e1f57600080fd5b6000600955005b636b441a406000511415614ec7573415614e3f57600080fd5b6004356020518110614e5057600080fd5b506006543314614e5f57600080fd5b600a5415614e6c57600080fd5b426203f480818183011015614e8057600080fd5b808201905090506101405261014051600a55600435600e55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae6000511415614f43573415614ee057600080fd5b6006543314614eee57600080fd5b6000600a5411600a5442101516614f0457600080fd5b6000600a55600e546101405261014051600655610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf1936000511415614f71573415614f5c57600080fd5b6006543314614f6a57600080fd5b6000600a55005b6389ead11160005114156150d6573415614f8a57600080fd5b61014060018152600181602001526001816040015260018160600152506101c060006004818352015b6101c05160048110614fc457600080fd5b600060c052602060c02001546101e0526101e0513b614fe257600080fd5b6101e0513018614ff157600080fd5b60206102a060246370a0823161022052306102405261023c6101e0515afa61501857600080fd5b6000506102a0516101c0516004811061503057600080fd5b600260c052602060c02001548082101561504957600080fd5b808203905090506102005260006102005111156150c1576101e0513b61506e57600080fd5b6101e051301861507d57600080fd5b6020610360604463a9059cbb6102c0526007546102e05261020051610300526102dc60006101e0515af16150b057600080fd5b600050610360516150c057600080fd5b5b5b8151600101808352811415614fb3575b5050005b63e369885360005114156151125734156150ef57600080fd5b60065433146150fd57600080fd5b426010541161510b57600080fd5b6001601155005b633046f972600051141561514057341561512b57600080fd5b600654331461513957600080fd5b6000601155005b6323746eb860005114156151a557341561515957600080fd5b6060516004358060405190131561516f57600080fd5b809190121561517d57600080fd5b506004356004811061518e57600080fd5b600060c052602060c020015460005260206000f350005b63b739953e600051141561520a5734156151be57600080fd5b606051600435806040519013156151d457600080fd5b80919012156151e257600080fd5b50600435600481106151f357600080fd5b600160c052602060c020015460005260206000f350005b63065a80d8600051141561526f57341561522357600080fd5b6060516004358060405190131561523957600080fd5b809190121561524757600080fd5b506004356004811061525857600080fd5b600260c052602060c020015460005260206000f350005b63f446c1d0600051141561529657341561528857600080fd5b60035460005260206000f350005b63ddca3f4360005114156152bd5734156152af57600080fd5b60045460005260206000f350005b63101197c760005114156152e45734156152d657600080fd5b60055460005260206000f350005b638da5cb5b600051141561530b5734156152fd57600080fd5b60065460005260206000f350005b6375a3397a600051141561533257341561532457600080fd5b60075460005260206000f350005b63405e28f8600051141561535957341561534b57600080fd5b60095460005260206000f350005b63e0a0b586600051141561538057341561537257600080fd5b600a5460005260206000f350005b63b4b577ad60005114156153a757341561539957600080fd5b600b5460005260206000f350005b6358680d0b60005114156153ce5734156153c057600080fd5b600c5460005260206000f350005b638981f67c60005114156153f55734156153e757600080fd5b600d5460005260206000f350005b631ec0cdc1600051141561541c57341561540e57600080fd5b600e5460005260206000f350005b634644b1d6600051141561544357341561543557600080fd5b600f5460005260206000f350005b5b60006000fd5b6102fc615746036102fc6000396102fc615746036000f30000000000000000000000009a86fc508a423ae8a243445dba7ed5364118ab1d0000000000000000000000007a59bf07d529a5fdbab67d597d63d7d5a83e61e500000000000000000000000055e1b1e49b969c018f2722445cd2dd9818ddcc250000000000000000000000009171bf7c050ac8b4cf7835e51f7b4841dfb2ccd00000000000000000000000001af3f329e8be154074d8769d1ffa4ee058b1dbc30000000000000000000000008ac76a51cc950d9822d68b83fe1ad97b32cd580d00000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d560000000000000000000000009cb73f20164e399958261c289eb5f9846f4d140400000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000989680000000000000000000000000000000000000000000000000000000012a05f2000000000000000000000000005a63602c6a4c67984ef4acf5a0bcc41197d4b534

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

0000000000000000000000009a86fc508a423ae8a243445dba7ed5364118ab1d0000000000000000000000007a59bf07d529a5fdbab67d597d63d7d5a83e61e500000000000000000000000055e1b1e49b969c018f2722445cd2dd9818ddcc250000000000000000000000009171bf7c050ac8b4cf7835e51f7b4841dfb2ccd00000000000000000000000001af3f329e8be154074d8769d1ffa4ee058b1dbc30000000000000000000000008ac76a51cc950d9822d68b83fe1ad97b32cd580d00000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d560000000000000000000000009cb73f20164e399958261c289eb5f9846f4d140400000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000989680000000000000000000000000000000000000000000000000000000012a05f2000000000000000000000000005a63602c6a4c67984ef4acf5a0bcc41197d4b534

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000009a86fc508a423ae8a243445dba7ed5364118ab1d
Arg [1] : 0000000000000000000000007a59bf07d529a5fdbab67d597d63d7d5a83e61e5
Arg [2] : 00000000000000000000000055e1b1e49b969c018f2722445cd2dd9818ddcc25
Arg [3] : 0000000000000000000000009171bf7c050ac8b4cf7835e51f7b4841dfb2ccd0
Arg [4] : 0000000000000000000000001af3f329e8be154074d8769d1ffa4ee058b1dbc3
Arg [5] : 0000000000000000000000008ac76a51cc950d9822d68b83fe1ad97b32cd580d
Arg [6] : 00000000000000000000000055d398326f99059ff775485246999027b3197955
Arg [7] : 000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d56
Arg [8] : 0000000000000000000000009cb73f20164e399958261c289eb5f9846f4d1404
Arg [9] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [10] : 0000000000000000000000000000000000000000000000000000000000989680
Arg [11] : 000000000000000000000000000000000000000000000000000000012a05f200
Arg [12] : 0000000000000000000000005a63602c6a4c67984ef4acf5a0bcc41197d4b534


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.