Contract 0x5ab5c56b9db92ba45a0b46a207286cd83c15c939 4

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xc416bcfbb58ebf217857e020bcabefb737c7c04c0ae95481af447a960cc4a5bbExchange_underly...390782062023-02-09 1:24:494 hrs 22 mins ago0x9f70ecf8cae680f0bde6c0b7bdaec348ef9be554 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.130350187213 172.724979048
0x773aff810ee5c3937f85b2e66e4f26988484fa3983337a177382abc1a14ec03eExchange_underly...390600082023-02-08 14:26:4015 hrs 20 mins ago0x9f70ecf8cae680f0bde6c0b7bdaec348ef9be554 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.163713660009 216.934391117
0xd32d392c01724776f814e65958f887eee281ec4661ecc1000cb2b0b6e48d5706Add_liquidity390574012023-02-08 12:52:4116 hrs 54 mins ago0xc31249ba48763df46388ba5c4e7565d62ed4801c IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.163219395495 227.584662025
0x6d87a694869913a57b3a44600c2e2a08174573d2520925e1417c04d3e9213be3Exchange_underly...390492112023-02-08 7:56:2521 hrs 50 mins ago0xa07d83334758af046dbcee6991e341c0e061d121 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.15681446294 206.494037429
0x4bbc9f2d816a4ddfc7335ee9ac742e93610bada967fcac0821191f7c1c8d2968Remove_liquidity...390470942023-02-08 6:39:5123 hrs 7 mins ago0xa95e9c54e9260e74e45836e1a2e5ff42ebb7ad1f IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.13121478298 178.758941
0x7e2d75c4104f51dd951dac64365c53cd4a3f923486c0b17301f61c788a999e05Exchange_underly...390466232023-02-08 6:22:5823 hrs 24 mins ago0x9c9a3328b789ec3581faaa230054072dc4d27c57 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.123726832793 157.310201069
0xfd9706eaf8e291d024f183ef70ec556d89f491b950d259a3cb7370087341e26cRemove_liquidity...390419112023-02-08 3:22:511 day 2 hrs ago0xe19c6d7ecf6e429030b27fec336190358aa01492 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.121215296533 166.807669065
0x90e6643fdcb6d96b24c155434f6402afdbc140721899a3437579e6f0add6399aExchange_underly...390311362023-02-07 20:44:541 day 9 hrs ago0xdb80f0a92dcee6c1c8be070711484127a1975cf7 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.00510077723 107.925547587
0xfdbaa78c6831c3fb2e74b84dfe1d327d41a3af1e172ca1a673cc8bea7875d2c6Exchange_underly...390311362023-02-07 20:44:541 day 9 hrs ago0xdb80f0a92dcee6c1c8be070711484127a1975cf7 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.080978804791 107.925547587
0x0f9c66722db9cb2e91edaaef08f98526c3d8c56f3b03bd707ff532bd16129bc5Add_liquidity390307322023-02-07 20:30:021 day 9 hrs ago0xa95e9c54e9260e74e45836e1a2e5ff42ebb7ad1f IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.083555474847 119.407439
0x6b975d30785a953b6711eb1a5beeb5564e0251f5bff3438924124226880bc415Exchange_underly...390296332023-02-07 19:49:571 day 9 hrs ago0xdb80f0a92dcee6c1c8be070711484127a1975cf7 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.090906767988 107.925547587
0x1ddf55e0454213fc3514048c339ebb714176831128755f0998e8f755262d156fExchange_underly...390281272023-02-07 18:55:311 day 10 hrs ago0x632572cfaa39330c8f0211b5b33bc86135e48b5f IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.102012156503 135.176850547
0x02daf18f5f1d3d0788ad38b7403dc681151ce8dd09f4d7f5108cf2b9387125a0Exchange_underly...390248562023-02-07 16:59:321 day 12 hrs ago0x9c9a3328b789ec3581faaa230054072dc4d27c57 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.129283780806164.372972328
0x30ba87f00421044de4cd1620ff41c218727a4671f619cdfdeb5b91948743e1cbExchange_underly...390248502023-02-07 16:59:201 day 12 hrs ago0x9f70ecf8cae680f0bde6c0b7bdaec348ef9be554 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.147376937344 195.286857344
0x78fe1abbf2d950e2021eb773d5f1370cc4f8c10219bcd6f5eaf6e09b035da278Exchange_underly...390246942023-02-07 16:53:481 day 12 hrs ago0x9f70ecf8cae680f0bde6c0b7bdaec348ef9be554 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.131681374819 174.488914768
0xcc5b19f0dc5ffa66f74e423c7e585c1cde57b660ca5e9f9d1baa409fe2635d2fExchange_underly...390245182023-02-07 16:47:341 day 12 hrs ago0x9f70ecf8cae680f0bde6c0b7bdaec348ef9be554 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.146925315629 194.688420525
0xc7371562b2bc90f768188ca8e6ae9a18d5408f0edc8961598ecefc8c4d5fb3f8Exchange_underly...390218072023-02-07 15:11:321 day 14 hrs ago0x9f70ecf8cae680f0bde6c0b7bdaec348ef9be554 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.165632385379 219.476863869
0x151f237f3fa2d34f95e14e0dfbb8defa84a3668a124ac60506bc358024b93d55Exchange_underly...390215982023-02-07 15:04:081 day 14 hrs ago0x9f70ecf8cae680f0bde6c0b7bdaec348ef9be554 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.140139454787 185.696583254
0x2306746ffb89c41b5165364be510c54de2597f32305d381c9f3ab4a774c8f340Exchange_underly...390215002023-02-07 15:00:401 day 14 hrs ago0x9f70ecf8cae680f0bde6c0b7bdaec348ef9be554 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.152074291103 201.511246789
0xd59b650358cd727244b4d4c10e95492ddd05116ecf23ef47337490d0866d57e1Exchange_underly...390174332023-02-07 12:33:561 day 17 hrs ago0x632572cfaa39330c8f0211b5b33bc86135e48b5f IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.127624662327 169.11342897
0xee1b8d9ee4687ad13c41d9d4e4d1b0e6b2cb71179e7d1430cc7178212e2c9021Exchange_underly...390163052023-02-07 11:53:281 day 17 hrs ago0x381a17eb78501498fa183c81648b4165826e1af7 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.111890108684 135.596597405
0x505eb2a341e432e8c4b258a3f9090d8b8e272023aa53e63fc7300bcefd92d75bExchange_underly...390005572023-02-07 2:17:412 days 3 hrs ago0x68977a1f7ea1724974e27b97cb2545074f9004de IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.102997644562 133.862789534
0x27fe5615e038ebd1cc03bd44a12785a5277416044fc434d5f3c35ff1a90023a1Exchange_underly...390005382023-02-07 2:17:012 days 3 hrs ago0x68977a1f7ea1724974e27b97cb2545074f9004de IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.105372370449 133.862789534
0x4b55c286bac7f10da78c552fb6092f7b16e53d56baa04660be3451ed2e703718Exchange_underly...389935572023-02-06 21:59:582 days 7 hrs ago0x9f70ecf8cae680f0bde6c0b7bdaec348ef9be554 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.085520137162 113.321386148
0x57bebd5273bee637184abfbf6e2b52cf20868520e25938692c6387492e998c0dExchange_underly...389934042023-02-06 21:54:002 days 7 hrs ago0xad45f74009c9750598d663cda52459258fec5062 IN  0x5ab5c56b9db92ba45a0b46a207286cd83c15c9390 MATIC0.098713324368 130.752013161
[ 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.16

Optimization Enabled:
N/A

Other Settings:
, MIT license

Contract Source Code (Vyper language format)

# @version 0.2.16
"""
@title "Zap" Depositer for permissionless factory metapools
@author Curve.Fi
@license Copyright (c) Curve.Fi, 2021 - all rights reserved
"""

interface ERC20:
    def approve(_spender: address, _amount: uint256): nonpayable
    def balanceOf(_owner: address) -> uint256: view

interface CurveMeta:
    def add_liquidity(amounts: uint256[N_COINS], min_mint_amount: uint256, _receiver: address) -> uint256: nonpayable
    def remove_liquidity(_amount: uint256, min_amounts: uint256[N_COINS]): nonpayable
    def remove_liquidity_one_coin(_token_amount: uint256, i: int128, min_amount: uint256, _receiver: address) -> uint256: nonpayable
    def remove_liquidity_imbalance(amounts: uint256[N_COINS], max_burn_amount: uint256) -> uint256: nonpayable
    def exchange_underlying(i: int128, j: int128, dx: uint256, min_dy: uint256, receiver: address) -> uint256: nonpayable
    def calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> uint256: view
    def calc_token_amount(amounts: uint256[N_COINS], deposit: bool) -> uint256: view
    def coins(i: uint256) -> address: view

interface CurveBase:
    def add_liquidity(amounts: uint256[BASE_N_COINS], min_mint_amount: uint256, use_underlying: bool): nonpayable
    def remove_liquidity(_amount: uint256, min_amounts: uint256[BASE_N_COINS], use_underlying: bool): nonpayable
    def remove_liquidity_one_coin(_token_amount: uint256, i: int128, min_amount: uint256, use_underlying: bool): nonpayable
    def remove_liquidity_imbalance(amounts: uint256[BASE_N_COINS], max_burn_amount: uint256, use_underlying: bool): nonpayable
    def calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> uint256: view
    def calc_token_amount(amounts: uint256[BASE_N_COINS], deposit: bool) -> uint256: view
    def coins(i: uint256) -> address: view
    def fee() -> uint256: view

interface LendingPool:
    def withdraw(_underlying_asset: address, _amount: uint256, _receiver: address): nonpayable


BASE_N_COINS: constant(int128) = 3
BASE_POOL: constant(address) = 0x445FE580eF8d70FF569aB36e80c647af338db351
BASE_LP_TOKEN: constant(address) = 0xE7a24EF0C5e95Ffb0f6684b813A78F2a3AD7D171
BASE_COINS: constant(address[BASE_N_COINS]) = [0x27F8D03b3a2196956ED754baDc28D73be8830A6e, 0x1a13F4Ca1d028320A707D99520AbFefca3998b7F, 0x60D55F02A771d515e077c9C2403a1ef324885CeC]
UNDERLYING_COINS: constant(address[BASE_N_COINS]) = [0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063, 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174, 0xc2132D05D31c914a87C6611C10748AEb04B58e8F]

LENDING_POOL: constant(address) = 0x8dFf5E27EA6b7AC08EbFdf9eB090F32ee9a30fcf

N_COINS: constant(int128) = 2
MAX_COIN: constant(int128) = N_COINS-1
N_ALL_COINS: constant(int128) = N_COINS + BASE_N_COINS - 1

FEE_DENOMINATOR: constant(uint256) = 10 ** 10
FEE_IMPRECISION: constant(uint256) = 100 * 10 ** 8  # % of the fee


# coin -> pool -> is approved to transfer?
is_approved: HashMap[address, HashMap[address, bool]]


@external
def __init__():
    """
    @notice Contract constructor
    """
    for coin in BASE_COINS:
        ERC20(coin).approve(BASE_POOL, MAX_UINT256)
    for coin in UNDERLYING_COINS:
        ERC20(coin).approve(BASE_POOL, MAX_UINT256)


@external
def add_liquidity(
    _pool: address,
    _deposit_amounts: uint256[N_ALL_COINS],
    _min_mint_amount: uint256,
    _receiver: address = msg.sender,
    _use_underlying: bool = True
) -> uint256:
    """
    @notice Wrap underlying coins and deposit them into `_pool`
    @param _pool Address of the pool to deposit into
    @param _deposit_amounts List of amounts of underlying coins to deposit
    @param _min_mint_amount Minimum amount of LP tokens to mint from the deposit
    @param _receiver Address that receives the LP tokens
    @param _use_underlying Flag determining the usage of underlying coins for deposit
    @return Amount of LP tokens received by depositing
    """
    meta_amounts: uint256[N_COINS] = empty(uint256[N_COINS])
    base_amounts: uint256[BASE_N_COINS] = empty(uint256[BASE_N_COINS])
    deposit_base: bool = False
    base_coins: address[BASE_N_COINS] = empty(address[BASE_N_COINS])
    if _use_underlying:
        base_coins = UNDERLYING_COINS
    else:
        base_coins = BASE_COINS

    if _deposit_amounts[0] != 0:
        coin: address = CurveMeta(_pool).coins(0)
        if not self.is_approved[coin][_pool]:
            ERC20(coin).approve(_pool, MAX_UINT256)
            self.is_approved[coin][_pool] = True
        response: Bytes[32] = raw_call(
            coin,
            _abi_encode(
                msg.sender,
                self,
                _deposit_amounts[0],
                method_id=method_id("transferFrom(address,address,uint256)"),
            ),
            max_outsize=32
        )
        if len(response) != 0:
            assert convert(response, bool)
        # handle fee on transfer
        meta_amounts[0] = ERC20(coin).balanceOf(self)

    for i in range(1, N_ALL_COINS):
        amount: uint256 = _deposit_amounts[i]
        if amount == 0:
            continue
        deposit_base = True
        base_idx: uint256 = i - 1
        coin: address = base_coins[base_idx]

        response: Bytes[32] = raw_call(
            coin,
            _abi_encode(
                msg.sender,
                self,
                amount,
                method_id=method_id("transferFrom(address,address,uint256)"),
            ),
            max_outsize=32
        )
        if len(response) != 0:
            assert convert(response, bool)

        # Handle potential transfer fees (i.e. Tether/renBTC)
        base_amounts[base_idx] = ERC20(coin).balanceOf(self)

    # Deposit to the base pool
    if deposit_base:
        coin: address = BASE_LP_TOKEN
        CurveBase(BASE_POOL).add_liquidity(base_amounts, 0, _use_underlying)
        meta_amounts[MAX_COIN] = ERC20(coin).balanceOf(self)
        if not self.is_approved[coin][_pool]:
            ERC20(coin).approve(_pool, MAX_UINT256)
            self.is_approved[coin][_pool] = True

    # Deposit to the meta pool
    return CurveMeta(_pool).add_liquidity(meta_amounts, _min_mint_amount, _receiver)


@external
def remove_liquidity(
    _pool: address,
    _burn_amount: uint256,
    _min_amounts: uint256[N_ALL_COINS],
    _receiver: address = msg.sender,
    _use_underlying: bool = True
) -> uint256[N_ALL_COINS]:
    """
    @notice Withdraw and unwrap coins from the pool
    @dev Withdrawal amounts are based on current deposit ratios
    @param _pool Address of the pool to deposit into
    @param _burn_amount Quantity of LP tokens to burn in the withdrawal
    @param _min_amounts Minimum amounts of underlying coins to receive
    @param _receiver Address that receives the LP tokens
    @return List of amounts of underlying coins that were withdrawn
    """
    response: Bytes[32] = raw_call(
        _pool,
        _abi_encode(
            msg.sender,
            self,
            _burn_amount,
            method_id=method_id("transferFrom(address,address,uint256)"),
        ),
        max_outsize=32
    )
    if len(response) != 0:
        assert convert(response, bool)

    min_amounts_base: uint256[BASE_N_COINS] = empty(uint256[BASE_N_COINS])
    amounts: uint256[N_ALL_COINS] = empty(uint256[N_ALL_COINS])

    # Withdraw from meta
    meta_received: uint256[N_COINS] = empty(uint256[N_COINS])
    CurveMeta(_pool).remove_liquidity(_burn_amount, [_min_amounts[0], convert(0, uint256)])

    coins: address[N_COINS] = empty(address[N_COINS])
    for i in range(N_COINS):
        coin: address = CurveMeta(_pool).coins(i)
        coins[i] = coin
        # Handle fee on transfer for the first coin
        meta_received[i] = ERC20(coin).balanceOf(self)

    # Withdraw from base
    for i in range(BASE_N_COINS):
        min_amounts_base[i] = _min_amounts[MAX_COIN+i]
    CurveBase(BASE_POOL).remove_liquidity(meta_received[MAX_COIN], min_amounts_base, _use_underlying)

    # Transfer all coins out
    response = raw_call(
        coins[0],  # metapool coin 0
        _abi_encode(
            _receiver,
            meta_received[0],
            method_id=method_id("transfer(address,uint256)"),
        ),
        max_outsize=32
    )
    if len(response) != 0:
        assert convert(response, bool)

    amounts[0] = meta_received[0]

    base_coins: address[BASE_N_COINS] = empty(address[BASE_N_COINS])
    if _use_underlying:
        base_coins = UNDERLYING_COINS
    else:
        base_coins = BASE_COINS
    for i in range(1, N_ALL_COINS):
        coin: address = base_coins[i-1]
        # handle potential fee on transfer
        amounts[i] = ERC20(coin).balanceOf(self)
        response = raw_call(
            coin,
            _abi_encode(
                _receiver,
                amounts[i],
                method_id=method_id("transfer(address,uint256)"),
            ),
            max_outsize=32
        )
        if len(response) != 0:
            assert convert(response, bool)


    return amounts


@external
def remove_liquidity_one_coin(
    _pool: address,
    _burn_amount: uint256,
    i: int128,
    _min_amount: uint256,
    _receiver: address = msg.sender,
    _use_underlying: bool = True,
) -> uint256:
    """
    @notice Withdraw and unwrap a single coin from the pool
    @param _pool Address of the pool to deposit into
    @param _burn_amount Amount of LP tokens to burn in the withdrawal
    @param i Index value of the coin to withdraw
    @param _min_amount Minimum amount of underlying coin to receive
    @param _receiver Address that receives the LP tokens
    @return Amount of underlying coin received
    """
    response: Bytes[32] = raw_call(
        _pool,
        _abi_encode(
            msg.sender,
            self,
            _burn_amount,
            method_id=method_id("transferFrom(address,address,uint256)"),
        ),
        max_outsize=32
    )
    if len(response) != 0:
        assert convert(response, bool)


    coin_amount: uint256 = 0
    if i == 0:
        coin_amount = CurveMeta(_pool).remove_liquidity_one_coin(_burn_amount, i, _min_amount, _receiver)
    else:
        base_coins: address[BASE_N_COINS] = empty(address[BASE_N_COINS])
        if _use_underlying:
            base_coins = UNDERLYING_COINS
        else:
            base_coins = BASE_COINS
        coin: address = base_coins[i - MAX_COIN]
        # Withdraw a base pool coin
        coin_amount = CurveMeta(_pool).remove_liquidity_one_coin(_burn_amount, MAX_COIN, 0, self)
        CurveBase(BASE_POOL).remove_liquidity_one_coin(coin_amount, i-MAX_COIN, _min_amount, _use_underlying)
        coin_amount = ERC20(coin).balanceOf(self)
        response = raw_call(
            coin,
            _abi_encode(
                _receiver,
                coin_amount,
                method_id=method_id("transfer(address,uint256)"),
            ),
            max_outsize=32
        )
        if len(response) != 0:
            assert convert(response, bool)


    return coin_amount


@external
def remove_liquidity_imbalance(
    _pool: address,
    _amounts: uint256[N_ALL_COINS],
    _max_burn_amount: uint256,
    _receiver: address = msg.sender,
    _use_underlying: bool = True
) -> uint256:
    """
    @notice Withdraw coins from the pool in an imbalanced amount
    @param _pool Address of the pool to deposit into
    @param _amounts List of amounts of underlying coins to withdraw
    @param _max_burn_amount Maximum amount of LP token to burn in the withdrawal
    @param _receiver Address that receives the LP tokens
    @return Actual amount of the LP token burned in the withdrawal
    """
    fee: uint256 = CurveBase(BASE_POOL).fee() * BASE_N_COINS / (4 * (BASE_N_COINS - 1))
    fee += fee * FEE_IMPRECISION / FEE_DENOMINATOR  # Overcharge to account for imprecision

    # Transfer the LP token in
    response: Bytes[32] = raw_call(
        _pool,
        _abi_encode(
            msg.sender,
            self,
            _max_burn_amount,
            method_id=method_id("transferFrom(address,address,uint256)"),
        ),
        max_outsize=32
    )
    if len(response) != 0:
        assert convert(response, bool)

    withdraw_base: bool = False
    amounts_base: uint256[BASE_N_COINS] = empty(uint256[BASE_N_COINS])
    amounts_meta: uint256[N_COINS] = empty(uint256[N_COINS])

    # determine amounts to withdraw from base pool
    for i in range(BASE_N_COINS):
        amount: uint256 = _amounts[MAX_COIN + i]
        if amount != 0:
            amounts_base[i] = amount
            withdraw_base = True

    # determine amounts to withdraw from metapool
    amounts_meta[0] = _amounts[0]
    if withdraw_base:
        amounts_meta[MAX_COIN] = CurveBase(BASE_POOL).calc_token_amount(amounts_base, False)
        amounts_meta[MAX_COIN] += amounts_meta[MAX_COIN] * fee / FEE_DENOMINATOR + 1

    # withdraw from metapool and return the remaining LP tokens
    burn_amount: uint256 = CurveMeta(_pool).remove_liquidity_imbalance(amounts_meta, _max_burn_amount)
    response = raw_call(
        _pool,
        _abi_encode(
            msg.sender,
            _max_burn_amount - burn_amount,
            method_id=method_id("transfer(address,uint256)"),
        ),
        max_outsize=32
    )
    if len(response) != 0:
        assert convert(response, bool)


    # withdraw from base pool
    if withdraw_base:
        CurveBase(BASE_POOL).remove_liquidity_imbalance(amounts_base, amounts_meta[MAX_COIN], _use_underlying)
        coin: address = BASE_LP_TOKEN
        leftover: uint256 = ERC20(coin).balanceOf(self)

        if leftover > 0:
            # if some base pool LP tokens remain, re-deposit them for the caller
            if not self.is_approved[coin][_pool]:
                ERC20(coin).approve(_pool, MAX_UINT256)
                self.is_approved[coin][_pool] = True
            burn_amount -= CurveMeta(_pool).add_liquidity([convert(0, uint256), leftover], 0, msg.sender)

        # transfer withdrawn base pool tokens to caller
        base_coins: address[BASE_N_COINS] = empty(address[BASE_N_COINS])
        if _use_underlying:
            base_coins = UNDERLYING_COINS
        else:
            base_coins = BASE_COINS

        for i in range(BASE_N_COINS):
            response = raw_call(
                base_coins[i],
                _abi_encode(
                    _receiver,
                    ERC20(base_coins[i]).balanceOf(self),  # handle potential transfer fees
                    method_id=method_id("transfer(address,uint256)"),
                ),
                max_outsize=32
            )
            if len(response) != 0:
                assert convert(response, bool)


    # transfer withdrawn metapool tokens to caller
    if _amounts[0] > 0:
        coin: address = CurveMeta(_pool).coins(0)
        response = raw_call(
            coin,
            _abi_encode(
                _receiver,
                ERC20(coin).balanceOf(self),  # handle potential fees
                method_id=method_id("transfer(address,uint256)"),
            ),
            max_outsize=32
        )
        if len(response) != 0:
            assert convert(response, bool)


    return burn_amount


@view
@external
def calc_withdraw_one_coin(_pool: address, _token_amount: uint256, i: int128) -> uint256:
    """
    @notice Calculate the amount received when withdrawing and unwrapping a single coin
    @param _pool Address of the pool to deposit into
    @param _token_amount Amount of LP tokens to burn in the withdrawal
    @param i Index value of the underlying coin to withdraw
    @return Amount of coin received
    """
    if i < MAX_COIN:
        return CurveMeta(_pool).calc_withdraw_one_coin(_token_amount, i)
    else:
        _base_tokens: uint256 = CurveMeta(_pool).calc_withdraw_one_coin(_token_amount, MAX_COIN)
        return CurveBase(BASE_POOL).calc_withdraw_one_coin(_base_tokens, i-MAX_COIN)


@view
@external
def calc_token_amount(_pool: address, _amounts: uint256[N_ALL_COINS], _is_deposit: bool) -> uint256:
    """
    @notice Calculate addition or reduction in token supply from a deposit or withdrawal
    @dev This calculation accounts for slippage, but not fees.
         Needed to prevent front-running, not for precise calculations!
    @param _pool Address of the pool to deposit into
    @param _amounts Amount of each underlying coin being deposited
    @param _is_deposit set True for deposits, False for withdrawals
    @return Expected amount of LP tokens received
    """
    meta_amounts: uint256[N_COINS] = empty(uint256[N_COINS])
    base_amounts: uint256[BASE_N_COINS] = empty(uint256[BASE_N_COINS])

    meta_amounts[0] = _amounts[0]
    for i in range(BASE_N_COINS):
        base_amounts[i] = _amounts[i + MAX_COIN]

    base_tokens: uint256 = CurveBase(BASE_POOL).calc_token_amount(base_amounts, _is_deposit)
    meta_amounts[MAX_COIN] = base_tokens

    return CurveMeta(_pool).calc_token_amount(meta_amounts, _is_deposit)


@external
def exchange_underlying(
    _pool: address,
    _i: int128,
    _j: int128,
    _dx: uint256,
    _min_dy: uint256,
    _receiver: address = msg.sender,
    _use_underlying: bool = True
) -> uint256:

    base_coins: address[BASE_N_COINS] = BASE_COINS
    underlying_coins: address[BASE_N_COINS] = UNDERLYING_COINS

    input_coin: address = ZERO_ADDRESS
    should_wrap: bool = False

    if _i == 0:
        input_coin = CurveMeta(_pool).coins(0)
        # approve the input coin for exchange
        if not self.is_approved[input_coin][_pool]:
            ERC20(input_coin).approve(_pool, MAX_UINT256)
            self.is_approved[input_coin][_pool] = True
    else:
        base_i: int128 = _i - MAX_COIN
        base_coin: address = base_coins[base_i]
        if _use_underlying:
            underlying_coin: address = underlying_coins[base_i]
            # if the base and underlying coin are equal we can't wrap
            should_wrap = base_coin != underlying_coin
            input_coin = underlying_coin
        else:
            input_coin = base_coin

        # approve the base coin to be exchanged irregardless of underlying/base status
        if not self.is_approved[base_coin][_pool]:
            ERC20(base_coin).approve(_pool, MAX_UINT256)
            self.is_approved[base_coin][_pool] = True

    response: Bytes[32] = raw_call(
        input_coin,
        _abi_encode(
            msg.sender,
            self,
            _dx,
            method_id=method_id("transferFrom(address,address,uint256)"),
        ),
        max_outsize=32
    )
    if len(response) != 0:
        assert convert(response, bool)

    # we are using base coins so this will work simply
    if not _use_underlying:
        return CurveMeta(_pool).exchange_underlying(_i, _j, _dx, _min_dy, _receiver)
    
    # we are using underlying so we potentially have to wrap
    if should_wrap:
        # approve for wrapping
        if not self.is_approved[input_coin][LENDING_POOL]:
            ERC20(input_coin).approve(LENDING_POOL, MAX_UINT256)
            self.is_approved[input_coin][LENDING_POOL] = True
        raw_call(
            LENDING_POOL,
            # deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)
            _abi_encode(input_coin, _dx, self, convert(0, uint256), method_id=method_id("deposit(address,uint256,address,uint16)"))
        )
    dy: uint256 = CurveMeta(_pool).exchange_underlying(_i, _j, _dx, _min_dy, self)

    # need to potentially unwrap now
    output_coin: address = ZERO_ADDRESS

    if _j == 0:
        # we don't wrap the 0th token
        output_coin = CurveMeta(_pool).coins(0)
        should_wrap = False
    else:
        # we for sure are operating on underlying coins
        base_j: int128 = _j - MAX_COIN
        base_coin: address = base_coins[base_j]
        underlying_coin: address = underlying_coins[base_j]
        # if the base and underlying coin are equal we can't wrap
        should_wrap = base_coin != underlying_coin
        output_coin = underlying_coin
    
    if should_wrap:
        LendingPool(LENDING_POOL).withdraw(output_coin, dy, _receiver)
    else:
        response = raw_call(
            output_coin,
            _abi_encode(_receiver, dy, method_id=method_id("transfer(address,uint256)")),
            max_outsize=32
        )
        if len(response) != 0:
            assert convert(response, bool)
    return dy

Contract Security Audit

Contract ABI

[{"stateMutability":"nonpayable","type":"constructor","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_deposit_amounts","type":"uint256[4]"},{"name":"_min_mint_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_deposit_amounts","type":"uint256[4]"},{"name":"_min_mint_amount","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_deposit_amounts","type":"uint256[4]"},{"name":"_min_mint_amount","type":"uint256"},{"name":"_receiver","type":"address"},{"name":"_use_underlying","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[4]"}],"outputs":[{"name":"","type":"uint256[4]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[4]"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256[4]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"_min_amounts","type":"uint256[4]"},{"name":"_receiver","type":"address"},{"name":"_use_underlying","type":"bool"}],"outputs":[{"name":"","type":"uint256[4]"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"_min_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"_min_amount","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"_pool","type":"address"},{"name":"_burn_amount","type":"uint256"},{"name":"i","type":"int128"},{"name":"_min_amount","type":"uint256"},{"name":"_receiver","type":"address"},{"name":"_use_underlying","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_pool","type":"address"},{"name":"_amounts","type":"uint256[4]"},{"name":"_max_burn_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_pool","type":"address"},{"name":"_amounts","type":"uint256[4]"},{"name":"_max_burn_amount","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_imbalance","inputs":[{"name":"_pool","type":"address"},{"name":"_amounts","type":"uint256[4]"},{"name":"_max_burn_amount","type":"uint256"},{"name":"_receiver","type":"address"},{"name":"_use_underlying","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"_pool","type":"address"},{"name":"_token_amount","type":"uint256"},{"name":"i","type":"int128"}],"outputs":[{"name":"","type":"uint256"}],"gas":5753},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"_pool","type":"address"},{"name":"_amounts","type":"uint256[4]"},{"name":"_is_deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}],"gas":6666},{"stateMutability":"nonpayable","type":"function","name":"exchange_underlying","inputs":[{"name":"_pool","type":"address"},{"name":"_i","type":"int128"},{"name":"_j","type":"int128"},{"name":"_dx","type":"uint256"},{"name":"_min_dy","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"exchange_underlying","inputs":[{"name":"_pool","type":"address"},{"name":"_i","type":"int128"},{"name":"_j","type":"int128"},{"name":"_dx","type":"uint256"},{"name":"_min_dy","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"exchange_underlying","inputs":[{"name":"_pool","type":"address"},{"name":"_i","type":"int128"},{"name":"_j","type":"int128"},{"name":"_dx","type":"uint256"},{"name":"_min_dy","type":"uint256"},{"name":"_receiver","type":"address"},{"name":"_use_underlying","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]}]

7327f8d03b3a2196956ed754badc28d73be8830a6e61018052731a13f4ca1d028320a707d99520abfefca3998b7f6101a0527360d55f02a771d515e077c9c2403a1ef324885cec6101c05261016060006003818352015b60206101605102610180015161014052610140513b1561282f5760006000604463095ea7b36101e05273445fe580ef8d70ff569ab36e80c647af338db351610200527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610220526101fc6000610140515af11561282f575b8151600101808352811415610056575b5050738f3cf7ad23cd3cadbd9735aff958023239c6a06361018052732791bca1f2de4661ed88a30c99a7a9449aa841746101a05273c2132d05d31c914a87c6611c10748aeb04b58e8f6101c05261016060006003818352015b60206101605102610180015161014052610140513b1561282f5760006000604463095ea7b36101e05273445fe580ef8d70ff569ab36e80c647af338db351610200527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610220526101fc6000610140515af11561282f575b8151600101808352811415610137575b505061281756600436101561000d57612646565b600035601c526000513461264c5763384e03db8114156100375733610140526001610160526100a0565b63d0b951e88114156100635760016101605260c43560a01c61264c57602060c4610140376000506100a0565b631f5013bf81141561009b5760c43560a01c61264c57602060c46101403760e43560011c61264c57602060e4610160376000506100a0565b6106bb565b60043560a01c61264c576101203661018037610160511561010b57738f3cf7ad23cd3cadbd9735aff958023239c6a06361024052732791bca1f2de4661ed88a30c99a7a9449aa841746102605273c2132d05d31c914a87c6611c10748aeb04b58e8f61028052610157565b7327f8d03b3a2196956ed754badc28d73be8830a6e61024052731a13f4ca1d028320a707d99520abfefca3998b7f610260527360d55f02a771d515e077c9c2403a1ef324885cec610280525b60006024351815610353576020610340602463c66106576102c05260006102e0526102dc6004355afa1561264c57601f3d111561264c57600050610340516102a05260006102a05160e05260c052604060c02060043560e05260c052604060c02054610235576102a0513b1561264c5760006000604463095ea7b36102c0526004356102e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610300526102dc60006102a0515af11561264c57600160006102a05160e05260c052604060c02060043560e05260c052604060c020555b6323b872dd61032452600461034480808033815250506020810190508080308152505060208101905080806024358152505060609050905001610320526103208051602001806103c08284600060045af11561264c57505060206104806103c0516103e060006102a0515af11561264c5760203d808211156102b757806102b9565b815b90509050610460526104608051602001806102c08284600060045af11561264c57505060006102c051181561031b576102c0806020015160008251806020901361264c578091901261264c57806020036101000a82049050905090501561264c575b60206103a060246370a0823161032052306103405261033c6102a0515afa1561264c57601f3d111561264c576000506103a051610180525b6102a060016003818352015b60246102a051600481101561264c5760200201356102c0526102c051610384576104eb565b6001610220526102a051600180821061264c57808203905090506102e0526102406102e051600381101561264c576020020151610300526323b872dd6103845260046103a480808033815250506020810190508080308152505060208101905080806102c0518152505060609050905001610380526103808051602001806104208284600060045af11561264c57505060206104e0610420516104406000610300515af11561264c5760203d8082111561043e5780610440565b815b905090506104c0526104c08051602001806103208284600060045af11561264c57505060006103205118156104a257610320806020015160008251806020901361264c578091901261264c57806020036101000a82049050905090501561264c575b602061040060246370a0823161038052306103a05261039c610300515afa1561264c57601f3d111561264c57600050610400516101c06102e051600381101561264c5760200201525b815160010180835281141561035f575b505061022051156106645773e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d1716102a05273445fe580ef8d70ff569ab36e80c647af338db3513b1561264c576000600060a4632b6e993a6102c0526101c0516102e0526101e05161030052610200516103205260006103405261016051610360526102dc600073445fe580ef8d70ff569ab36e80c647af338db3515af11561264c57602061034060246370a082316102c052306102e0526102dc6102a0515afa1561264c57601f3d111561264c57600050610340516101a05260006102a05160e05260c052604060c02060043560e05260c052604060c02054610663576102a0513b1561264c5760006000604463095ea7b36102c0526004356102e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610300526102dc60006102a0515af11561264c57600160006102a05160e05260c052604060c02060043560e05260c052604060c020555b5b60206103806084630c3e4b546102a052610180516102c0526101a0516102e05260a4356103005261014051610320526102bc60006004355af11561264c57601f3d111561264c576000506103805160005260206000f35b63ad5cc9188114156106d7573361014052600161016052610740565b63cbc399e58114156107035760016101605260c43560a01c61264c57602060c461014037600050610740565b6341f5055981141561073b5760c43560a01c61264c57602060c46101403760e43560011c61264c57602060e461016037600050610740565b610d1d565b60043560a01c61264c576323b872dd6101e4526004610204808080338152505060208101905080803081525050602081019050808060243581525050606090509050016101e0526101e08051602001806102808284600060045af11561264c5750506020610340610280516102a060006004355af11561264c5760203d808211156107cb57806107cd565b815b90509050610320526103208051602001806101808284600060045af11561264c575050600061018051181561082f57610180806020015160008251806020901361264c578091901261264c57806020036101000a82049050905090501561264c575b610120366101e0376004353b1561264c57600060006064635b36389c610320526024356103405260006103005260443561036052610300516103805261033c60006004355af11561264c576040366103003761034060006002818352015b6020610400602463c661065761038052610340516103a05261039c6004355afa1561264c57601f3d111561264c5760005061040051610360526103605161030061034051600281101561264c576020020152602061040060246370a0823161038052306103a05261039c610360515afa1561264c57601f3d111561264c57600050610400516102c061034051600281101561264c5760200201525b815160010180835281141561088d575b505061034060006003818352015b6044600161034051818183011061264c5780820190509050600481101561264c5760200201356101e061034051600381101561264c5760200201525b8151600101808352811415610946575b505073445fe580ef8d70ff569ab36e80c647af338db3513b1561264c576000600060a463fce64736610340526102e051610360526101e05161038052610200516103a052610220516103c052610160516103e05261035c600073445fe580ef8d70ff569ab36e80c647af338db3515af11561264c5763a9059cbb610344526004610364808080610140518152505060208101905080806102c0518152505060409050905001610340526103408051602001806103c08284600060045af11561264c57505060206104606103c0516103e06000610300515af11561264c5760203d80821115610a805780610a82565b815b90509050610440526104408051602001806101808284600060045af11561264c5750506000610180511815610ae457610180806020015160008251806020901361264c578091901261264c57806020036101000a82049050905090501561264c575b6102c05161024052606036610340376101605115610b4c57738f3cf7ad23cd3cadbd9735aff958023239c6a06361034052732791bca1f2de4661ed88a30c99a7a9449aa841746103605273c2132d05d31c914a87c6611c10748aeb04b58e8f61038052610b98565b7327f8d03b3a2196956ed754badc28d73be8830a6e61034052731a13f4ca1d028320a707d99520abfefca3998b7f610360527360d55f02a771d515e077c9c2403a1ef324885cec610380525b6103a060016003818352015b6103406103a051600180821061264c5780820390509050600381101561264c5760200201516103c052602061046060246370a082316103e05230610400526103fc6103c0515afa1561264c57601f3d111561264c57600050610460516102406103a051600481101561264c57602002015263a9059cbb6103e4526004610404808080610140518152505060208101905080806102406103a051600481101561264c57602002015181525050604090509050016103e0526103e08051602001806104608284600060045af11561264c57505060206105006104605161048060006103c0515af11561264c5760203d80821115610c9f5780610ca1565b815b905090506104e0526104e08051602001806101808284600060045af11561264c5750506000610180511815610d0357610180806020015160008251806020901361264c578091901261264c57806020036101000a82049050905090501561264c575b5b8151600101808352811415610ba4575b50506080610240f35b6329ed2862811415610d39573361014052600161016052610da2565b631e700cbb811415610d655760016101605260843560a01c61264c576020608461014037600050610da2565b633ff1bd66811415610d9d5760843560a01c61264c57602060846101403760a43560011c61264c57602060a461016037600050610da2565b6111c9565b60043560a01c61264c5760443580607f1d8160801d141561264c57809050506323b872dd6101e4526004610204808080338152505060208101905080803081525050602081019050808060243581525050606090509050016101e0526101e08051602001806102808284600060045af11561264c5750506020610340610280516102a060006004355af11561264c5760203d80821115610e425780610e44565b815b90509050610320526103208051602001806101808284600060045af11561264c5750506000610180511815610ea657610180806020015160008251806020901361264c578091901261264c57806020036101000a82049050905090501561264c575b60006101e052604435610efb5760206102e0608463081579a5610200526060602461022037610140516102805261021c60006004355af11561264c57601f3d111561264c576000506102e0516101e0526111bc565b606036610200376101605115610f5b57738f3cf7ad23cd3cadbd9735aff958023239c6a06361020052732791bca1f2de4661ed88a30c99a7a9449aa841746102205273c2132d05d31c914a87c6611c10748aeb04b58e8f61024052610fa7565b7327f8d03b3a2196956ed754badc28d73be8830a6e61020052731a13f4ca1d028320a707d99520abfefca3998b7f610220527360d55f02a771d515e077c9c2403a1ef324885cec610240525b610200604435600180820380607f1d8160801d141561264c5780905090509050600381101561264c576020020151610260526020610360608463081579a5610280526024356102a05260016102c05260006102e052306103005261029c60006004355af11561264c57601f3d111561264c57600050610360516101e05273445fe580ef8d70ff569ab36e80c647af338db3513b1561264c5760006000608463517a55a3610280526101e0516102a052604435600180820380607f1d8160801d141561264c57809050905090506102c0526064356102e052610160516103005261029c600073445fe580ef8d70ff569ab36e80c647af338db3515af11561264c57602061030060246370a0823161028052306102a05261029c610260515afa1561264c57601f3d111561264c57600050610300516101e05263a9059cbb6102845260046102a4808080610140518152505060208101905080806101e0518152505060409050905001610280526102808051602001806103008284600060045af11561264c57505060206103a0610300516103206000610260515af11561264c5760203d808211156111575780611159565b815b90509050610380526103808051602001806101808284600060045af11561264c57505060006101805118156111bb57610180806020015160008251806020901361264c578091901261264c57806020036101000a82049050905090501561264c575b5b6101e05160005260206000f35b63ac24f7718114156111e557336101405260016101605261124e565b634329c8cc8114156112115760016101605260c43560a01c61264c57602060c46101403760005061124e565b63a7b43c398114156112495760c43560a01c61264c57602060c46101403760e43560011c61264c57602060e46101603760005061124e565b611b91565b60043560a01c61264c576020610200600463ddca3f436101a0526101bc73445fe580ef8d70ff569ab36e80c647af338db3515afa1561264c57601f3d111561264c5760005061020051600380820282158284830414171561264c5780905090509050600880820490509050610180526101808051610180516402540be40080820282158284830414171561264c57809050905090506402540be40080820490509050818183011061264c57808201905090508152506323b872dd610204526004610224808080338152505060208101905080803081525050602081019050808060a4358152505060609050905001610200526102008051602001806102a08284600060045af11561264c57505060206103606102a0516102c060006004355af11561264c5760203d808211156113845780611386565b815b90509050610340526103408051602001806101a08284600060045af11561264c57505060006101a05118156113e8576101a0806020015160008251806020901361264c578091901261264c57806020036101000a82049050905090501561264c575b60c036610200376102c060006003818352015b602460016102c051818183011061264c5780820190509050600481101561264c5760200201356102e05260006102e0511815611451576102e0516102206102c051600381101561264c5760200201526001610200525b5b81516001018083528114156113fb575b505060243561028052610200511561152c5760206103a06084633883e1196102c052610220516102e052610240516103005261026051610320526000610340526102dc73445fe580ef8d70ff569ab36e80c647af338db3515afa1561264c57601f3d111561264c576000506103a0516102a0526102a080516102a0516101805180820282158284830414171561264c57809050905090506402540be400808204905090506001818183011061264c5780820190509050818183011061264c57808201905090508152505b60206103a0606463e31032736102e05261028051610300526102a0516103205260a435610340526102fc60006004355af11561264c57601f3d111561264c576000506103a0516102c05263a9059cbb6102e45260046103048080803381525050602081019050808060a4356102c05180821061264c578082039050905081525050604090509050016102e0526102e08051602001806103608284600060045af11561264c57505060206104006103605161038060006004355af11561264c5760203d808211156115fc57806115fe565b815b905090506103e0526103e08051602001806101a08284600060045af11561264c57505060006101a0511815611660576101a0806020015160008251806020901361264c578091901261264c57806020036101000a82049050905090501561264c575b6102005115611a355773445fe580ef8d70ff569ab36e80c647af338db3513b1561264c576000600060a4635b8369f56102e0526102205161030052610240516103205261026051610340526102a0516103605261016051610380526102fc600073445fe580ef8d70ff569ab36e80c647af338db3515af11561264c5773e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d1716102e05260206103a060246370a0823161032052306103405261033c6102e0515afa1561264c57601f3d111561264c576000506103a05161030052600061030051111561183b5760006102e05160e05260c052604060c02060043560e05260c052604060c020546117d4576102e0513b1561264c5760006000604463095ea7b361032052600435610340527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6103605261033c60006102e0515af11561264c57600160006102e05160e05260c052604060c02060043560e05260c052604060c020555b6102c0805160206104206084630c3e4b54610340526000610320526103205161036052610300516103805260006103a052336103c05261035c60006004355af11561264c57601f3d111561264c576000506104205180821061264c57808203905090508152505b60603661032037610160511561189b57738f3cf7ad23cd3cadbd9735aff958023239c6a06361032052732791bca1f2de4661ed88a30c99a7a9449aa841746103405273c2132d05d31c914a87c6611c10748aeb04b58e8f610360526118e7565b7327f8d03b3a2196956ed754badc28d73be8830a6e61032052731a13f4ca1d028320a707d99520abfefca3998b7f610340527360d55f02a771d515e077c9c2403a1ef324885cec610360525b61038060006003818352015b63a9059cbb61044452600461046480808061014051815250506020810190508080602061042060246370a082316103a052306103c0526103bc61032061038051600381101561264c5760200201515afa1561264c57601f3d111561264c57600050610420518152505060409050905001610440526104408051602001806104c08284600060045af11561264c57505060206105606104c0516104e0600061032061038051600381101561264c5760200201515af11561264c5760203d808211156119bd57806119bf565b815b90509050610540526105408051602001806101a08284600060045af11561264c57505060006101a0511815611a21576101a0806020015160008251806020901361264c578091901261264c57806020036101000a82049050905090501561264c575b5b81516001018083528114156118f3575b50505b60006024351115611b84576020610380602463c66106576103005260006103205261031c6004355afa1561264c57601f3d111561264c57600050610380516102e05263a9059cbb6103a45260046103c480808061014051815250506020810190508080602061038060246370a0823161030052306103205261031c6102e0515afa1561264c57601f3d111561264c576000506103805181525050604090509050016103a0526103a08051602001806104208284600060045af11561264c57505060206104c06104205161044060006102e0515af11561264c5760203d80821115611b1f5780611b21565b815b905090506104a0526104a08051602001806101a08284600060045af11561264c57505060006101a0511815611b83576101a0806020015160008251806020901361264c578091901261264c57806020036101000a82049050905090501561264c575b5b6102c05160005260206000f35b6341b028f3811415611cba5760043560a01c61264c5760443580607f1d8160801d141561264c578090505060016044351215611c095760206101e0604463cc2b27d761014052604060246101603761015c6004355afa1561264c57601f3d111561264c576000506101e05160005260206000f3611cb8565b6020610200604463cc2b27d7610160526024356101805260016101a05261017c6004355afa1561264c57601f3d111561264c5760005061020051610140526020610200604463cc2b27d7610160526101405161018052604435600180820380607f1d8160801d141561264c57809050905090506101a05261017c73445fe580ef8d70ff569ab36e80c647af338db3515afa1561264c57601f3d111561264c576000506102005160005260206000f35b005b63861cdef0811415611df95760043560a01c61264c5760a43560011c61264c5760a03661014037602435610140526101e060006003818352015b60246101e0516001818183011061264c5780820190509050600481101561264c5760200201356101806101e051600381101561264c5760200201525b8151600101808352811415611cf4575b505060206102e06084633883e1196102005261018051610220526101a051610240526101c0516102605260a4356102805261021c73445fe580ef8d70ff569ab36e80c647af338db3515afa1561264c57601f3d111561264c576000506102e0516101e0526101e0516101605260206102c0606463ed8e84f3610200526101405161022052610160516102405260a4356102605261021c6004355afa1561264c57601f3d111561264c576000506102c05160005260206000f35b637981c43e811415611e15573361014052600161016052611e7e565b63a3220db8811415611e415760016101605260a43560a01c61264c57602060a461014037600050611e7e565b63e0286ab2811415611e795760a43560a01c61264c57602060a46101403760c43560011c61264c57602060c461016037600050611e7e565b612644565b60043560a01c61264c5760243580607f1d8160801d141561264c578090505060443580607f1d8160801d141561264c57809050507327f8d03b3a2196956ed754badc28d73be8830a6e61018052731a13f4ca1d028320a707d99520abfefca3998b7f6101a0527360d55f02a771d515e077c9c2403a1ef324885cec6101c052738f3cf7ad23cd3cadbd9735aff958023239c6a0636101e052732791bca1f2de4661ed88a30c99a7a9449aa841746102005273c2132d05d31c914a87c6611c10748aeb04b58e8f610220526040366102403760243561202e576020610300602463c66106576102805260006102a05261029c6004355afa1561264c57601f3d111561264c57600050610300516102405260006102405160e05260c052604060c02060043560e05260c052604060c0205461202957610240513b1561264c5760006000604463095ea7b3610280526004356102a0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6102c05261029c6000610240515af11561264c57600160006102405160e05260c052604060c02060043560e05260c052604060c020555b61214b565b602435600180820380607f1d8160801d141561264c57809050905090506102805261018061028051600381101561264c5760200201516102a05261016051156120a5576101e061028051600381101561264c5760200201516102c0526102c0516102a0511415610260526102c051610240526120ae565b6102a051610240525b60006102a05160e05260c052604060c02060043560e05260c052604060c0205461214a576102a0513b1561264c5760006000604463095ea7b36102c0526004356102e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610300526102dc60006102a0515af11561264c57600160006102a05160e05260c052604060c02060043560e05260c052604060c020555b5b6323b872dd6102e4526004610304808080338152505060208101905080803081525050602081019050808060643581525050606090509050016102e0526102e08051602001806103808284600060045af11561264c5750506020610440610380516103a06000610240515af11561264c5760203d808211156121cd57806121cf565b815b90509050610420526104208051602001806102808284600060045af11561264c575050600061028051181561223157610280806020015160008251806020901361264c578091901261264c57806020036101000a82049050905090501561264c575b610160516122815760206103e060a46344ee19866102e052608060246103003761014051610380526102fc60006004355af11561264c57601f3d111561264c576000506103e05160005260206000f35b61026051156123ef5760006102405160e05260c052604060c020738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf60e05260c052604060c0205461235c57610240513b1561264c5760006000604463095ea7b36102e052738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf610300527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610320526102fc6000610240515af11561264c57600160006102405160e05260c052604060c020738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf60e05260c052604060c020555b63e8eda9df6102e45260046103048080806102405181525050602081019050808060643581525050602081019050808030815250506020810190508080600081525050608090509050016102e0526102e08051602001806103a08284600060045af11561264c575050600060006103a0516103c06000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af11561264c575b602061040060a46344ee1986610300526080602461032037306103a05261031c60006004355af11561264c57601f3d111561264c57600050610400516102e05260006103005260443561247e5760206103a0602463c66106576103205260006103405261033c6004355afa1561264c57601f3d111561264c576000506103a051610300526000610260526124e8565b604435600180820380607f1d8160801d141561264c57809050905090506103205261018061032051600381101561264c576020020151610340526101e061032051600381101561264c57602002015161036052610360516103405114156102605261036051610300525b610260511561255957738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf3b1561264c576000600060646369328dec6103205261030051610340526102e05161036052610140516103805261033c6000738dff5e27ea6b7ac08ebfdf9eb090f32ee9a30fcf5af11561264c57612637565b63a9059cbb610324526004610344808080610140518152505060208101905080806102e0518152505060409050905001610320526103208051602001806103a08284600060045af11561264c57505060206104406103a0516103c06000610300515af11561264c5760203d808211156125d257806125d4565b815b90509050610420526104208051602001806102808284600060045af11561264c575050600061028051181561263657610280806020015160008251806020901361264c578091901261264c57806020036101000a82049050905090501561264c575b5b6102e05160005260206000f35b505b60006000fd5b600080fd5b6101c6612817036101c66000396101c6612817036000f35b600080fd

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.