Contract 0x445fe580ef8d70ff569ab36e80c647af338db351 9

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x304fafc68f3ffa6c9827641b30a4b6fb91fbcd17b6bedf6603b7368300f7190dAdd_metapool37358582021-12-10 20:00:36240 days 20 hrs ago0x7eeac6cddbd1d0b8af061742d41877d7f707289a IN  0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH0.006142598856 ETH
0xe242e1d8d9b4fd97b17a1202d1f5813b8857d15def2c087a22304d4a9c9c9493Add_pool_without...13623522021-09-20 20:02:42321 days 20 hrs ago0x7eeac6cddbd1d0b8af061742d41877d7f707289a IN  0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH0.005553489453 ETH
0x4c19887bae4feca6d6b906b5d0cd22fafbe11c7100dc7bc4d7c17e76a69bedffAdd_pool_without...13622892021-09-20 20:01:11321 days 20 hrs ago0x7eeac6cddbd1d0b8af061742d41877d7f707289a IN  0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH0.004276837864 ETH
0x377c6346417caf97642bb783e49b7909932aa8a2faef0c3dadc463c12966d332Add_pool_without...13622142021-09-20 19:59:29321 days 20 hrs ago0x7eeac6cddbd1d0b8af061742d41877d7f707289a IN  0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH0.004364666475 ETH
0x7bfe082fabbed296c387469f19144639226a865eacaffa4c04ed3d5e8df895f60x6f7fffff13620562021-09-20 19:54:18321 days 20 hrs ago0x7eeac6cddbd1d0b8af061742d41877d7f707289a IN  Create: Vyper_contract0 ETH0.12268958897 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xb38aec267a59a41b46544825520fee33dc7e597df8d639e819cd207a5844ca9d197340402022-08-08 16:14:056 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0xb38aec267a59a41b46544825520fee33dc7e597df8d639e819cd207a5844ca9d197340402022-08-08 16:14:056 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0xb38aec267a59a41b46544825520fee33dc7e597df8d639e819cd207a5844ca9d197340402022-08-08 16:14:056 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0xb38aec267a59a41b46544825520fee33dc7e597df8d639e819cd207a5844ca9d197340402022-08-08 16:14:056 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x4c175e27e24f62cb2fa40418bee8d9ae2f726467a37d08d10b3b73bfcd7a5945197340082022-08-08 16:14:056 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x4c175e27e24f62cb2fa40418bee8d9ae2f726467a37d08d10b3b73bfcd7a5945197340082022-08-08 16:14:056 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x4c175e27e24f62cb2fa40418bee8d9ae2f726467a37d08d10b3b73bfcd7a5945197340082022-08-08 16:14:056 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x4c175e27e24f62cb2fa40418bee8d9ae2f726467a37d08d10b3b73bfcd7a5945197340082022-08-08 16:14:056 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x3fba457ffeb94500f20680b96c2f01c0e794afd0d2071f9789c2bb71ce21d0cb197338862022-08-08 16:12:167 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x3fba457ffeb94500f20680b96c2f01c0e794afd0d2071f9789c2bb71ce21d0cb197338862022-08-08 16:12:167 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x3fba457ffeb94500f20680b96c2f01c0e794afd0d2071f9789c2bb71ce21d0cb197338862022-08-08 16:12:167 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x3fba457ffeb94500f20680b96c2f01c0e794afd0d2071f9789c2bb71ce21d0cb197338862022-08-08 16:12:167 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x99832ef2be5db9d62c1529c7d43da10adac50ce2143e8c378055cd1525e001d7197338302022-08-08 16:11:318 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x99832ef2be5db9d62c1529c7d43da10adac50ce2143e8c378055cd1525e001d7197338302022-08-08 16:11:318 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x99832ef2be5db9d62c1529c7d43da10adac50ce2143e8c378055cd1525e001d7197338302022-08-08 16:11:318 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x99832ef2be5db9d62c1529c7d43da10adac50ce2143e8c378055cd1525e001d7197338302022-08-08 16:11:318 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0xad95f5ba187aff41a235a0e8068b533b3759e950481bfcdcbace14e21bce9c05197326882022-08-08 15:58:1322 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0xad95f5ba187aff41a235a0e8068b533b3759e950481bfcdcbace14e21bce9c05197326882022-08-08 15:58:1322 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0xad95f5ba187aff41a235a0e8068b533b3759e950481bfcdcbace14e21bce9c05197326882022-08-08 15:58:1322 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0xad95f5ba187aff41a235a0e8068b533b3759e950481bfcdcbace14e21bce9c05197326882022-08-08 15:58:1322 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x8d0f2216907fe1510c6b67dff2d2ef663981a6b4d1143581f587f31e9d431a73197297152022-08-08 15:23:3156 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x8d0f2216907fe1510c6b67dff2d2ef663981a6b4d1143581f587f31e9d431a73197297152022-08-08 15:23:3156 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x8d0f2216907fe1510c6b67dff2d2ef663981a6b4d1143581f587f31e9d431a73197297152022-08-08 15:23:3156 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x8d0f2216907fe1510c6b67dff2d2ef663981a6b4d1143581f587f31e9d431a73197297152022-08-08 15:23:3156 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
0x4614673563c1b5e2791909290e784319132a6a93b62767b0719e0069ff38d388197291412022-08-08 15:17:181 hr 2 mins ago 0x316d06dd6644ad630c73cd3a6a2c7ae0d22f939e 0x445fe580ef8d70ff569ab36e80c647af338db3510 ETH
[ Download CSV Export 
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 Curve Registry
@license MIT
@author Curve.Fi
"""

MAX_COINS: constant(int128) = 8
CALC_INPUT_SIZE: constant(int128) = 100


struct CoinInfo:
    index: uint256
    register_count: uint256
    swap_count: uint256
    swap_for: address[MAX_INT128]

struct PoolArray:
    location: uint256
    decimals: uint256
    underlying_decimals: uint256
    rate_info: bytes32
    base_pool: address
    coins: address[MAX_COINS]
    ul_coins: address[MAX_COINS]
    n_coins: uint256  # [coins, underlying coins] tightly packed as uint128[2]
    has_initial_A: bool
    is_v1: bool
    name: String[64]
    asset_type: uint256

struct PoolParams:
    A: uint256
    future_A: uint256
    fee: uint256
    admin_fee: uint256
    future_fee: uint256
    future_admin_fee: uint256
    future_owner: address
    initial_A: uint256
    initial_A_time: uint256
    future_A_time: uint256


interface AddressProvider:
    def admin() -> address: view
    def get_address(_id: uint256) -> address: view

interface ERC20:
    def balanceOf(_addr: address) -> uint256: view
    def decimals() -> uint256: view
    def totalSupply() -> uint256: view

interface CurvePool:
    def A() -> uint256: view
    def future_A() -> uint256: view
    def fee() -> uint256: view
    def admin_fee() -> uint256: view
    def future_fee() -> uint256: view
    def future_admin_fee() -> uint256: view
    def future_owner() -> address: view
    def initial_A() -> uint256: view
    def initial_A_time() -> uint256: view
    def future_A_time() -> uint256: view
    def coins(i: uint256) -> address: view
    def underlying_coins(i: uint256) -> address: view
    def balances(i: uint256) -> uint256: view
    def get_virtual_price() -> uint256: view

interface CurvePoolV1:
    def coins(i: int128) -> address: view
    def underlying_coins(i: int128) -> address: view
    def balances(i: int128) -> uint256: view

interface CurveMetapool:
    def base_pool() -> address: view

interface GasEstimator:
    def estimate_gas_used(_pool: address, _from: address, _to: address) -> uint256: view

interface LiquidityGauge:
    def lp_token() -> address: view

interface GaugeController:
    def gauge_types(gauge: address) -> int128: view

interface RateCalc:
    def get_rate(_coin: address) -> uint256: view


event PoolAdded:
    pool: indexed(address)
    rate_method_id: Bytes[4]

event PoolRemoved:
    pool: indexed(address)


address_provider: public(AddressProvider)
gauge_controller: public(address)
pool_list: public(address[65536])   # master list of pools
pool_count: public(uint256)         # actual length of pool_list

pool_data: HashMap[address, PoolArray]

coin_count: public(uint256)  # total unique coins registered
coins: HashMap[address, CoinInfo]
get_coin: public(address[65536])  # unique list of registered coins
# bitwise_xor(coina, coinb) -> (coina_pos, coinb_pos) sorted
# stored as uint128[2]
coin_swap_indexes: HashMap[uint256, uint256]

# lp token -> pool
get_pool_from_lp_token: public(HashMap[address, address])

# pool -> lp token
get_lp_token: public(HashMap[address, address])

# mapping of estimated gas costs for pools and coins
# for a pool the values are [wrapped exchange, underlying exchange]
# for a coin the values are [transfer cost, 0]
gas_estimate_values: HashMap[address, uint256[2]]

# pool -> gas estimation contract
# used when gas costs for a pool are too complex to be handled by summing
# values in `gas_estimate_values`
gas_estimate_contracts: HashMap[address, address]

# mapping of coins -> pools for trading
# a mapping key is generated for each pair of addresses via
# `bitwise_xor(convert(a, uint256), convert(b, uint256))`
markets: HashMap[uint256, address[65536]]
market_counts: HashMap[uint256, uint256]

liquidity_gauges: HashMap[address, address[10]]

last_updated: public(uint256)


@external
def __init__(_address_provider: address, _gauge_controller: address):
    """
    @notice Constructor function
    """
    self.address_provider = AddressProvider(_address_provider)
    self.gauge_controller = _gauge_controller


# internal functionality for getters

@view
@internal
def _unpack_decimals(_packed: uint256, _n_coins: uint256) -> uint256[MAX_COINS]:
    # decimals are tightly packed as a series of uint8 within a little-endian bytes32
    # the packed value is stored as uint256 to simplify unpacking via shift and modulo
    decimals: uint256[MAX_COINS] = empty(uint256[MAX_COINS])
    n_coins: int128 = convert(_n_coins, int128)
    for i in range(MAX_COINS):
        if i == n_coins:
            break
        decimals[i] = shift(_packed, -8 * i) % 256

    return decimals


@view
@internal
def _get_rates(_pool: address) -> uint256[MAX_COINS]:
    rates: uint256[MAX_COINS] = empty(uint256[MAX_COINS])
    base_pool: address = self.pool_data[_pool].base_pool
    if base_pool == ZERO_ADDRESS:
        rate_info: bytes32 = self.pool_data[_pool].rate_info
        rate_calc_addr: uint256 = convert(slice(rate_info, 8, 20), uint256)
        rate_method_id: Bytes[4] = slice(rate_info, 28, 4)

        for i in range(MAX_COINS):
            coin: address = self.pool_data[_pool].coins[i]
            if coin == ZERO_ADDRESS:
                break
            if rate_info == EMPTY_BYTES32 or coin == self.pool_data[_pool].ul_coins[i]:
                rates[i] = 10 ** 18
            elif rate_calc_addr != 0:
                rates[i] = RateCalc(convert(rate_calc_addr, address)).get_rate(coin)
            else:
                rates[i] = convert(
                    raw_call(coin, rate_method_id, max_outsize=32, is_static_call=True),  # dev: bad response
                    uint256
                )
    else:
        base_coin_idx: uint256 = shift(self.pool_data[_pool].n_coins, -128) - 1
        rates[base_coin_idx] = CurvePool(base_pool).get_virtual_price()
        for i in range(MAX_COINS):
            if i == base_coin_idx:
                break
            rates[i] = 10 ** 18

    return rates

@view
@internal
def _get_balances(_pool: address) -> uint256[MAX_COINS]:
    is_v1: bool = self.pool_data[_pool].is_v1

    balances: uint256[MAX_COINS] = empty(uint256[MAX_COINS])
    for i in range(MAX_COINS):
        if self.pool_data[_pool].coins[i] == ZERO_ADDRESS:
            assert i != 0
            break

        if is_v1:
            balances[i] = CurvePoolV1(_pool).balances(i)
        else:
            balances[i] = CurvePool(_pool).balances(convert(i, uint256))

    return balances


@view
@internal
def _get_underlying_balances(_pool: address) -> uint256[MAX_COINS]:
    balances: uint256[MAX_COINS] = self._get_balances(_pool)
    rates: uint256[MAX_COINS] = self._get_rates(_pool)
    decimals: uint256 = self.pool_data[_pool].underlying_decimals
    underlying_balances: uint256[MAX_COINS] = balances
    for i in range(MAX_COINS):
        coin: address = self.pool_data[_pool].coins[i]
        if coin == ZERO_ADDRESS:
            break
        ucoin: address = self.pool_data[_pool].ul_coins[i]
        if ucoin == ZERO_ADDRESS:
            continue
        if ucoin != coin:
            underlying_balances[i] = balances[i] * rates[i] / 10**(shift(decimals, -8 * i) % 256)

    return underlying_balances


@view
@internal
def _get_meta_underlying_balances(_pool: address, _base_pool: address) -> uint256[MAX_COINS]:
    base_coin_idx: uint256 = shift(self.pool_data[_pool].n_coins, -128) - 1
    is_v1: bool = self.pool_data[_base_pool].is_v1
    base_total_supply: uint256 = ERC20(self.get_lp_token[_base_pool]).totalSupply()

    underlying_balances: uint256[MAX_COINS] = empty(uint256[MAX_COINS])
    ul_balance: uint256 = 0
    underlying_pct: uint256 = 0
    if base_total_supply > 0:
        underlying_pct = CurvePool(_pool).balances(base_coin_idx) * 10**36 / base_total_supply

    for i in range(MAX_COINS):
        if self.pool_data[_pool].ul_coins[i] == ZERO_ADDRESS:
            break
        if i < base_coin_idx:
            ul_balance = CurvePool(_pool).balances(i)
        else:
            if is_v1:
                ul_balance = CurvePoolV1(_base_pool).balances(convert(i - base_coin_idx, int128))
            else:
                ul_balance = CurvePool(_base_pool).balances(i-base_coin_idx)
            ul_balance = ul_balance * underlying_pct / 10**36
        underlying_balances[i] = ul_balance

    return underlying_balances


@view
@internal
def _get_coin_indices(
    _pool: address,
    _from: address,
    _to: address
) -> uint256[3]:
    """
    Convert coin addresses to indices for use with pool methods.
    """
    # the return value is stored as `uint256[3]` to reduce gas costs
    # from index, to index, is the market underlying?
    result: uint256[3] = empty(uint256[3])

    found_market: bool = False

    # check coin markets
    for x in range(MAX_COINS):
        coin: address = self.pool_data[_pool].coins[x]
        if coin == ZERO_ADDRESS:
            # if we reach the end of the coins, reset `found_market` and try again
            # with the underlying coins
            found_market = False
            break
        if coin == _from:
            result[0] = x
        elif coin == _to:
            result[1] = x
        else:
            continue

        if found_market:
            # the second time we find a match, break out of the loop
            break
        # the first time we find a match, set `found_market` to True
        found_market = True

    if not found_market:
        # check underlying coin markets
        for x in range(MAX_COINS):
            coin: address = self.pool_data[_pool].ul_coins[x]
            if coin == ZERO_ADDRESS:
                raise "No available market"
            if coin == _from:
                result[0] = x
            elif coin == _to:
                result[1] = x
            else:
                continue

            if found_market:
                result[2] = 1
                break
            found_market = True

    return result


# targetted external getters, optimized for on-chain calls

@view
@external
def find_pool_for_coins(_from: address, _to: address, i: uint256 = 0) -> address:
    """
    @notice Find an available pool for exchanging two coins
    @param _from Address of coin to be sent
    @param _to Address of coin to be received
    @param i Index value. When multiple pools are available
            this value is used to return the n'th address.
    @return Pool address
    """
    key: uint256 = bitwise_xor(convert(_from, uint256), convert(_to, uint256))
    return self.markets[key][i]


@view
@external
def get_n_coins(_pool: address) -> uint256[2]:
    """
    @notice Get the number of coins in a pool
    @dev For non-metapools, both returned values are identical
         even when the pool does not use wrapping/lending
    @param _pool Pool address
    @return Number of wrapped coins, number of underlying coins
    """
    n_coins: uint256 = self.pool_data[_pool].n_coins
    return [shift(n_coins, -128), n_coins % 2**128]


@view
@external
def get_coins(_pool: address) -> address[MAX_COINS]:
    """
    @notice Get the coins within a pool
    @dev For pools using lending, these are the wrapped coin addresses
    @param _pool Pool address
    @return List of coin addresses
    """
    coins: address[MAX_COINS] = empty(address[MAX_COINS])
    n_coins: uint256 = shift(self.pool_data[_pool].n_coins, -128)
    for i in range(MAX_COINS):
        if i == n_coins:
            break
        coins[i] = self.pool_data[_pool].coins[i]

    return coins


@view
@external
def get_underlying_coins(_pool: address) -> address[MAX_COINS]:
    """
    @notice Get the underlying coins within a pool
    @dev For pools that do not lend, returns the same value as `get_coins`
    @param _pool Pool address
    @return List of coin addresses
    """
    coins: address[MAX_COINS] = empty(address[MAX_COINS])
    n_coins: uint256 = self.pool_data[_pool].n_coins % 2**128
    for i in range(MAX_COINS):
        if i == n_coins:
            break
        coins[i] = self.pool_data[_pool].ul_coins[i]

    return coins


@view
@external
def get_decimals(_pool: address) -> uint256[MAX_COINS]:
    """
    @notice Get decimal places for each coin within a pool
    @dev For pools using lending, these are the wrapped coin decimal places
    @param _pool Pool address
    @return uint256 list of decimals
    """
    n_coins: uint256 = shift(self.pool_data[_pool].n_coins, -128)
    return self._unpack_decimals(self.pool_data[_pool].decimals, n_coins)


@view
@external
def get_underlying_decimals(_pool: address) -> uint256[MAX_COINS]:
    """
    @notice Get decimal places for each underlying coin within a pool
    @dev For pools that do not lend, returns the same value as `get_decimals`
    @param _pool Pool address
    @return uint256 list of decimals
    """
    n_coins: uint256 = self.pool_data[_pool].n_coins % 2**128
    return self._unpack_decimals(self.pool_data[_pool].underlying_decimals, n_coins)


@view
@external
def get_rates(_pool: address) -> uint256[MAX_COINS]:
    """
    @notice Get rates between coins and underlying coins
    @dev For coins where there is no underlying coin, or where
         the underlying coin cannot be swapped, the rate is
         given as 1e18
    @param _pool Pool address
    @return Rates between coins and underlying coins
    """
    return self._get_rates(_pool)


@view
@external
def get_gauges(_pool: address) -> (address[10], int128[10]):
    """
    @notice Get a list of LiquidityGauge contracts associated with a pool
    @param _pool Pool address
    @return address[10] of gauge addresses, int128[10] of gauge types
    """
    liquidity_gauges: address[10] = empty(address[10])
    gauge_types: int128[10] = empty(int128[10])
    gauge_controller: address = self.gauge_controller
    for i in range(10):
        gauge: address = self.liquidity_gauges[_pool][i]
        if gauge == ZERO_ADDRESS:
            break
        liquidity_gauges[i] = gauge
        gauge_types[i] = GaugeController(gauge_controller).gauge_types(gauge)

    return liquidity_gauges, gauge_types


@view
@external
def get_balances(_pool: address) -> uint256[MAX_COINS]:
    """
    @notice Get balances for each coin within a pool
    @dev For pools using lending, these are the wrapped coin balances
    @param _pool Pool address
    @return uint256 list of balances
    """
    return self._get_balances(_pool)


@view
@external
def get_underlying_balances(_pool: address) -> uint256[MAX_COINS]:
    """
    @notice Get balances for each underlying coin within a pool
    @dev  For pools that do not lend, returns the same value as `get_balances`
    @param _pool Pool address
    @return uint256 list of underlyingbalances
    """
    base_pool: address = self.pool_data[_pool].base_pool
    if base_pool == ZERO_ADDRESS:
        return self._get_underlying_balances(_pool)
    return self._get_meta_underlying_balances(_pool, base_pool)


@view
@external
def get_virtual_price_from_lp_token(_token: address) -> uint256:
    """
    @notice Get the virtual price of a pool LP token
    @param _token LP token address
    @return uint256 Virtual price
    """
    return CurvePool(self.get_pool_from_lp_token[_token]).get_virtual_price()


@view
@external
def get_A(_pool: address) -> uint256:
    return CurvePool(_pool).A()


@view
@external
def get_parameters(_pool: address) -> PoolParams:
    """
    @notice Get parameters for a pool
    @dev For older pools where `initial_A` is not public, this value is set to 0
    @param _pool Pool address
    @return Pool amp, future amp, fee, admin fee, future fee, future admin fee,
            future owner, initial amp, initial amp time, future amp time
    """
    pool_params: PoolParams = empty(PoolParams)
    pool_params.A = CurvePool(_pool).A()
    pool_params.future_A = CurvePool(_pool).future_A()
    pool_params.fee = CurvePool(_pool).fee()
    pool_params.future_fee = CurvePool(_pool).future_fee()
    pool_params.admin_fee = CurvePool(_pool).admin_fee()
    pool_params.future_admin_fee = CurvePool(_pool).future_admin_fee()
    pool_params.future_owner = CurvePool(_pool).future_owner()

    if self.pool_data[_pool].has_initial_A:
        pool_params.initial_A = CurvePool(_pool).initial_A()
        pool_params.initial_A_time = CurvePool(_pool).initial_A_time()
        pool_params.future_A_time = CurvePool(_pool).future_A_time()

    return pool_params


@view
@external
def get_fees(_pool: address) -> uint256[2]:
    """
    @notice Get the fees for a pool
    @dev Fees are expressed as integers
    @return Pool fee as uint256 with 1e10 precision
            Admin fee as 1e10 percentage of pool fee
    """
    return [CurvePool(_pool).fee(), CurvePool(_pool).admin_fee()]


@view
@external
def get_admin_balances(_pool: address) -> uint256[MAX_COINS]:
    """
    @notice Get the current admin balances (uncollected fees) for a pool
    @param _pool Pool address
    @return List of uint256 admin balances
    """
    balances: uint256[MAX_COINS] = self._get_balances(_pool)
    n_coins: uint256 = shift(self.pool_data[_pool].n_coins, -128)
    for i in range(MAX_COINS):
        coin: address = self.pool_data[_pool].coins[i]
        if i == n_coins:
            break
        if coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE:
            balances[i] = _pool.balance - balances[i]
        else:
            balances[i] = ERC20(coin).balanceOf(_pool) - balances[i]

    return balances


@view
@external
def get_coin_indices(
    _pool: address,
    _from: address,
    _to: address
) -> (int128, int128, bool):
    """
    @notice Convert coin addresses to indices for use with pool methods
    @param _from Coin address to be used as `i` within a pool
    @param _to Coin address to be used as `j` within a pool
    @return int128 `i`, int128 `j`, boolean indicating if `i` and `j` are underlying coins
    """
    result: uint256[3] = self._get_coin_indices(_pool, _from, _to)
    return convert(result[0], int128), convert(result[1], int128), result[2] > 0


@view
@external
def estimate_gas_used(_pool: address, _from: address, _to: address) -> uint256:
    """
    @notice Estimate the gas used in an exchange.
    @param _pool Pool address
    @param _from Address of coin to be sent
    @param _to Address of coin to be received
    @return Upper-bound gas estimate, in wei
    """
    estimator: address = self.gas_estimate_contracts[_pool]
    if estimator != ZERO_ADDRESS:
        return GasEstimator(estimator).estimate_gas_used(_pool, _from, _to)

    # here we call `_get_coin_indices` to find out if the exchange involves wrapped
    # or underlying coins, and use the result as an index in `gas_estimate_values`
    # 0 == wrapped   1 == underlying
    idx_underlying: uint256 = self._get_coin_indices(_pool, _from, _to)[2]

    total: uint256 = self.gas_estimate_values[_pool][idx_underlying]
    assert total != 0  # dev: pool value not set

    for addr in [_from, _to]:
        _gas: uint256 = self.gas_estimate_values[addr][0]
        assert _gas != 0  # dev: coin value not set
        total += _gas

    return total

@view
@external
def is_meta(_pool: address) -> bool:
    """
    @notice Verify `_pool` is a metapool
    @param _pool Pool address
    @return True if `_pool` is a metapool
    """
    return self.pool_data[_pool].base_pool != ZERO_ADDRESS


@view
@external
def get_pool_name(_pool: address) -> String[64]:
    """
    @notice Get the given name for a pool
    @param _pool Pool address
    @return The name of a pool
    """
    return self.pool_data[_pool].name


@view
@external
def get_coin_swap_count(_coin: address) -> uint256:
    """
    @notice Get the number of unique coins available to swap `_coin` against
    @param _coin Coin address
    @return The number of unique coins available to swap for
    """
    return self.coins[_coin].swap_count


@view
@external
def get_coin_swap_complement(_coin: address, _index: uint256) -> address:
    """
    @notice Get the coin available to swap against `_coin` at `_index`
    @param _coin Coin address
    @param _index An index in the `_coin`'s set of available counter
        coin's
    @return Address of a coin available to swap against `_coin`
    """
    return self.coins[_coin].swap_for[_index]


@view
@external
def get_pool_asset_type(_pool: address) -> uint256:
    """
    @notice Query the asset type of `_pool`
    @param _pool Pool Address
    @return The asset type as an unstripped string
    """
    return self.pool_data[_pool].asset_type


# internal functionality used in admin setters

@internal
def _add_pool(
    _sender: address,
    _pool: address,
    _n_coins: uint256,
    _lp_token: address,
    _rate_info: bytes32,
    _has_initial_A: bool,
    _is_v1: bool,
    _name: String[64],
):
    assert _sender == self.address_provider.admin()  # dev: admin-only function
    assert _lp_token != ZERO_ADDRESS
    assert self.pool_data[_pool].coins[0] == ZERO_ADDRESS  # dev: pool exists
    assert self.get_pool_from_lp_token[_lp_token] == ZERO_ADDRESS

    # add pool to pool_list
    length: uint256 = self.pool_count
    self.pool_list[length] = _pool
    self.pool_count = length + 1
    self.pool_data[_pool].location = length
    self.pool_data[_pool].rate_info = _rate_info
    self.pool_data[_pool].has_initial_A = _has_initial_A
    self.pool_data[_pool].is_v1 = _is_v1
    self.pool_data[_pool].n_coins = _n_coins
    self.pool_data[_pool].name = _name

    # update public mappings
    self.get_pool_from_lp_token[_lp_token] = _pool
    self.get_lp_token[_pool] = _lp_token
    self.last_updated = block.timestamp

    log PoolAdded(_pool, slice(_rate_info, 28, 4))


@internal
def _register_coin(_coin: address):
    if self.coins[_coin].register_count == 0:
        coin_count: uint256 = self.coin_count
        self.coins[_coin].index = coin_count
        self.get_coin[coin_count] = _coin
        self.coin_count += 1
    self.coins[_coin].register_count += 1


@internal
def _register_coin_pair(_coina: address, _coinb: address, _key: uint256):
    # register _coinb in _coina's array of coins
    coin_b_pos: uint256 = self.coins[_coina].swap_count
    self.coins[_coina].swap_for[coin_b_pos] = _coinb
    self.coins[_coina].swap_count += 1
    # register _coina in _coinb's array of coins
    coin_a_pos: uint256 = self.coins[_coinb].swap_count
    self.coins[_coinb].swap_for[coin_a_pos] = _coina
    self.coins[_coinb].swap_count += 1
    # register indexes (coina pos in coinb array, coinb pos in coina array)
    if convert(_coina, uint256) < convert(_coinb, uint256):
        self.coin_swap_indexes[_key] = shift(coin_a_pos, 128) + coin_b_pos
    else:
        self.coin_swap_indexes[_key] = shift(coin_b_pos, 128) + coin_a_pos


@internal
def _unregister_coin(_coin: address):
    self.coins[_coin].register_count -= 1

    if self.coins[_coin].register_count == 0:
        self.coin_count -= 1
        coin_count: uint256 = self.coin_count
        location: uint256 = self.coins[_coin].index

        if location < coin_count:
            coin_b: address = self.get_coin[coin_count]
            self.get_coin[location] = coin_b
            self.coins[coin_b].index = location

        self.coins[_coin].index = 0
        self.get_coin[coin_count] = ZERO_ADDRESS


@internal
def _unregister_coin_pair(_coina: address, _coinb: address, _coinb_idx: uint256):
    """
    @param _coinb_idx the index of _coinb in _coina's array of unique coin's
    """
    # decrement swap counts for both coins
    self.coins[_coina].swap_count -= 1

    # retrieve the last currently occupied index in coina's array
    coina_arr_last_idx: uint256 = self.coins[_coina].swap_count

    # if coinb's index in coina's array is less than the last
    # overwrite it's position with the last coin
    if _coinb_idx < coina_arr_last_idx:
        # here's our last coin in coina's array
        coin_c: address = self.coins[_coina].swap_for[coina_arr_last_idx]
        # get the bitwise_xor of the pair to retrieve their indexes
        key: uint256 = bitwise_xor(convert(_coina, uint256), convert(coin_c, uint256))
        indexes: uint256 = self.coin_swap_indexes[key]

        # update the pairing's indexes
        if convert(_coina, uint256) < convert(coin_c, uint256):
            # least complicated most readable way of shifting twice to remove the lower order bits
            self.coin_swap_indexes[key] = shift(shift(indexes, -128), 128) + _coinb_idx
        else:
            self.coin_swap_indexes[key] = shift(_coinb_idx, 128) + indexes % 2 ** 128
        # set _coinb_idx in coina's array to coin_c
        self.coins[_coina].swap_for[_coinb_idx] = coin_c

    self.coins[_coina].swap_for[coina_arr_last_idx] = ZERO_ADDRESS


@internal
def _get_new_pool_coins(
    _pool: address,
    _n_coins: uint256,
    _is_underlying: bool,
    _is_v1: bool
) -> address[MAX_COINS]:
    coin_list: address[MAX_COINS] = empty(address[MAX_COINS])
    coin: address = ZERO_ADDRESS
    for i in range(MAX_COINS):
        if i == _n_coins:
            break
        if _is_underlying:
            if _is_v1:
                coin = CurvePoolV1(_pool).underlying_coins(convert(i, int128))
            else:
                coin = CurvePool(_pool).underlying_coins(i)
            self.pool_data[_pool].ul_coins[i] = coin
        else:
            if _is_v1:
                coin = CurvePoolV1(_pool).coins(convert(i, int128))
            else:
                coin = CurvePool(_pool).coins(i)
            self.pool_data[_pool].coins[i] = coin
        coin_list[i] = coin

    for i in range(MAX_COINS):
        if i == _n_coins:
            break

        self._register_coin(coin_list[i])
        # add pool to markets
        i2: uint256 = i + 1
        for x in range(i2, i2 + MAX_COINS):
            if x == _n_coins:
                break

            key: uint256 = bitwise_xor(convert(coin_list[i], uint256), convert(coin_list[x], uint256))
            length: uint256 = self.market_counts[key]
            self.markets[key][length] = _pool
            self.market_counts[key] = length + 1

            # register the coin pair
            if length == 0:
                self._register_coin_pair(coin_list[x], coin_list[i], key)

    return coin_list


@view
@internal
def _get_new_pool_decimals(_coins: address[MAX_COINS], _n_coins: uint256) -> uint256:
    packed: uint256 = 0
    value: uint256 = 0

    n_coins: int128 = convert(_n_coins, int128)
    for i in range(MAX_COINS):
        if i == n_coins:
            break
        coin: address = _coins[i]
        if coin == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE:
            value = 18
        else:
            value = ERC20(coin).decimals()
            assert value < 256  # dev: decimal overflow

        packed += shift(value, i * 8)

    return packed


@internal
def _remove_market(_pool: address, _coina: address, _coinb: address):
    key: uint256 = bitwise_xor(convert(_coina, uint256), convert(_coinb, uint256))
    length: uint256 = self.market_counts[key] - 1
    if length == 0:
        indexes: uint256 = self.coin_swap_indexes[key]
        if convert(_coina, uint256) < convert(_coinb, uint256):
            self._unregister_coin_pair(_coina, _coinb, indexes % 2 ** 128)
            self._unregister_coin_pair(_coinb, _coina, shift(indexes, -128))
        else:
            self._unregister_coin_pair(_coina, _coinb, shift(indexes, -128))
            self._unregister_coin_pair(_coinb, _coina, indexes % 2 ** 128)
        self.coin_swap_indexes[key] = 0
    for i in range(65536):
        if i > length:
            break
        if self.markets[key][i] == _pool:
            if i < length:
                self.markets[key][i] = self.markets[key][length]
            self.markets[key][length] = ZERO_ADDRESS
            self.market_counts[key] = length
            break


# admin functions

@external
def add_pool(
    _pool: address,
    _n_coins: uint256,
    _lp_token: address,
    _rate_info: bytes32,
    _decimals: uint256,
    _underlying_decimals: uint256,
    _has_initial_A: bool,
    _is_v1: bool,
    _name: String[64],
):
    """
    @notice Add a pool to the registry
    @dev Only callable by admin
    @param _pool Pool address to add
    @param _n_coins Number of coins in the pool
    @param _lp_token Pool deposit token address
    @param _rate_info Encoded twenty-byte rate calculator address and/or four-byte
        function signature to query coin rates
    @param _decimals Coin decimal values, tightly packed as uint8 in a little-endian bytes32
    @param _underlying_decimals Underlying coin decimal values, tightly packed
                                as uint8 in a little-endian bytes32
    @param _name The name of the pool
    """
    self._add_pool(
        msg.sender,
        _pool,
        _n_coins + shift(_n_coins, 128),
        _lp_token,
        _rate_info,
        _has_initial_A,
        _is_v1,
        _name,
    )

    coins: address[MAX_COINS] = self._get_new_pool_coins(_pool, _n_coins, False, _is_v1)
    decimals: uint256 = _decimals
    if decimals == 0:
        decimals = self._get_new_pool_decimals(coins, _n_coins)
    self.pool_data[_pool].decimals = decimals

    coins = self._get_new_pool_coins(_pool, _n_coins, True, _is_v1)
    decimals = _underlying_decimals
    if decimals == 0:
        decimals = self._get_new_pool_decimals(coins, _n_coins)
    self.pool_data[_pool].underlying_decimals = decimals


@external
def add_pool_without_underlying(
    _pool: address,
    _n_coins: uint256,
    _lp_token: address,
    _rate_info: bytes32,
    _decimals: uint256,
    _use_rates: uint256,
    _has_initial_A: bool,
    _is_v1: bool,
    _name: String[64],
):
    """
    @notice Add a pool to the registry
    @dev Only callable by admin
    @param _pool Pool address to add
    @param _n_coins Number of coins in the pool
    @param _lp_token Pool deposit token address
    @param _rate_info Encoded twenty-byte rate calculator address and/or four-byte
        function signature to query coin rates
    @param _decimals Coin decimal values, tightly packed as uint8 in a little-endian bytes32
    @param _use_rates Boolean array indicating which coins use lending rates,
                      tightly packed in a little-endian bytes32
    @param _name The name of the pool
    """
    self._add_pool(
        msg.sender,
        _pool,
        _n_coins + shift(_n_coins, 128),
        _lp_token,
        _rate_info,
        _has_initial_A,
        _is_v1,
        _name,
    )

    coins: address[MAX_COINS] = self._get_new_pool_coins(_pool, _n_coins, False, _is_v1)

    decimals: uint256 = _decimals
    if decimals == 0:
        decimals = self._get_new_pool_decimals(coins, _n_coins)
    self.pool_data[_pool].decimals = decimals

    udecimals: uint256 = 0
    for i in range(MAX_COINS):
        if i == _n_coins:
            break
        offset: int128 = -8 * convert(i, int128)
        if shift(_use_rates, offset) % 256 == 0:
            self.pool_data[_pool].ul_coins[i] = coins[i]
            udecimals += shift(shift(decimals, offset) % 256, -offset)

    self.pool_data[_pool].underlying_decimals = udecimals


@external
def add_metapool(
    _pool: address,
    _n_coins: uint256,
    _lp_token: address,
    _decimals: uint256,
    _name: String[64],
    _base_pool: address = ZERO_ADDRESS
):
    """
    @notice Add a pool to the registry
    @dev Only callable by admin
    @param _pool Pool address to add
    @param _n_coins Number of coins in the pool
    @param _lp_token Pool deposit token address
    @param _decimals Coin decimal values, tightly packed as uint8 in a little-endian bytes32
    @param _name The name of the pool
    @param _base_pool Address of the base_pool useful for adding factory pools
    """
    base_coin_offset: uint256 = _n_coins - 1

    base_pool: address = _base_pool
    if base_pool == ZERO_ADDRESS:
        base_pool = CurveMetapool(_pool).base_pool()
    base_n_coins: uint256 = shift(self.pool_data[base_pool].n_coins, -128)
    assert base_n_coins > 0  # dev: base pool unknown

    self._add_pool(
        msg.sender,
        _pool,
        base_n_coins + base_coin_offset + shift(_n_coins, 128),
        _lp_token,
        EMPTY_BYTES32,
        True,
        False,
        _name,
    )

    coins: address[MAX_COINS] = self._get_new_pool_coins(_pool, _n_coins, False, False)

    decimals: uint256 = _decimals
    if decimals == 0:
        decimals = self._get_new_pool_decimals(coins, _n_coins)

    self.pool_data[_pool].decimals = decimals
    self.pool_data[_pool].base_pool = base_pool

    base_coins: address[MAX_COINS] = empty(address[MAX_COINS])
    coin: address = ZERO_ADDRESS
    for i in range(MAX_COINS):
        if i == base_n_coins + base_coin_offset:
            break
        if i < base_coin_offset:
            coin = coins[i]
        else:
            x: uint256 = i - base_coin_offset
            coin = self.pool_data[base_pool].coins[x]
            base_coins[x] = coin
            self._register_coin(base_coins[x])
        self.pool_data[_pool].ul_coins[i] = coin

    underlying_decimals: uint256 = shift(
        self.pool_data[base_pool].decimals, 8 * convert(base_coin_offset, int128)
    )
    underlying_decimals += decimals % 256 ** base_coin_offset

    self.pool_data[_pool].underlying_decimals = underlying_decimals

    for i in range(MAX_COINS):
        if i == base_coin_offset:
            break
        for x in range(MAX_COINS):
            if x == base_n_coins:
                break
            key: uint256 = bitwise_xor(convert(coins[i], uint256), convert(base_coins[x], uint256))
            length: uint256 = self.market_counts[key]
            self.markets[key][length] = _pool
            self.market_counts[key] = length + 1

            # register the coin pair
            if length == 0:
                self._register_coin_pair(coins[i], base_coins[x], key)


@external
def remove_pool(_pool: address):
    """
    @notice Remove a pool to the registry
    @dev Only callable by admin
    @param _pool Pool address to remove
    """
    assert msg.sender == self.address_provider.admin()  # dev: admin-only function
    assert self.pool_data[_pool].coins[0] != ZERO_ADDRESS  # dev: pool does not exist


    self.get_pool_from_lp_token[self.get_lp_token[_pool]] = ZERO_ADDRESS
    self.get_lp_token[_pool] = ZERO_ADDRESS

    # remove _pool from pool_list
    location: uint256 = self.pool_data[_pool].location
    length: uint256 = self.pool_count - 1

    if location < length:
        # replace _pool with final value in pool_list
        addr: address = self.pool_list[length]
        self.pool_list[location] = addr
        self.pool_data[addr].location = location

    # delete final pool_list value
    self.pool_list[length] = ZERO_ADDRESS
    self.pool_count = length

    self.pool_data[_pool].underlying_decimals = 0
    self.pool_data[_pool].decimals = 0
    self.pool_data[_pool].n_coins = 0
    self.pool_data[_pool].name = ""
    self.pool_data[_pool].asset_type = 0

    coins: address[MAX_COINS] = empty(address[MAX_COINS])
    ucoins: address[MAX_COINS] = empty(address[MAX_COINS])

    for i in range(MAX_COINS):
        coins[i] = self.pool_data[_pool].coins[i]
        ucoins[i] = self.pool_data[_pool].ul_coins[i]
        if ucoins[i] == ZERO_ADDRESS and coins[i] == ZERO_ADDRESS:
            break
        if coins[i] != ZERO_ADDRESS:
            # delete coin address from pool_data
            self.pool_data[_pool].coins[i] = ZERO_ADDRESS
            self._unregister_coin(coins[i])
        if ucoins[i] != ZERO_ADDRESS:
            # delete underlying_coin from pool_data
            self.pool_data[_pool].ul_coins[i] = ZERO_ADDRESS
            if self.coins[ucoins[i]].register_count != 0:
                self._unregister_coin(ucoins[i])

    is_meta: bool = self.pool_data[_pool].base_pool != ZERO_ADDRESS
    for i in range(MAX_COINS):
        coin: address = coins[i]
        ucoin: address = ucoins[i]
        if coin == ZERO_ADDRESS:
            break

        # remove pool from markets
        i2: uint256 = i + 1
        for x in range(i2, i2 + MAX_COINS):
            ucoinx: address = ucoins[x]
            if ucoinx == ZERO_ADDRESS:
                break

            coinx: address = coins[x]
            if coinx != ZERO_ADDRESS:
                self._remove_market(_pool, coin, coinx)

            if coin != ucoin or coinx != ucoinx:
                self._remove_market(_pool, ucoin, ucoinx)

            if is_meta and not ucoin in coins:
                key: uint256 = bitwise_xor(convert(ucoin, uint256), convert(ucoinx, uint256))
                self._register_coin_pair(ucoin, ucoinx, key)

    self.pool_data[_pool].base_pool = ZERO_ADDRESS
    self.last_updated = block.timestamp
    log PoolRemoved(_pool)


@external
def set_pool_gas_estimates(_addr: address[5], _amount: uint256[2][5]):
    """
    @notice Set gas estimate amounts
    @param _addr Array of pool addresses
    @param _amount Array of gas estimate amounts as `[(wrapped, underlying), ..]`
    """
    assert msg.sender == self.address_provider.admin()  # dev: admin-only function

    for i in range(5):
        _pool: address = _addr[i]
        if _pool == ZERO_ADDRESS:
            break
        self.gas_estimate_values[_pool] = _amount[i]
    self.last_updated = block.timestamp


@external
def set_coin_gas_estimates(_addr: address[10], _amount: uint256[10]):
    """
    @notice Set gas estimate amounts
    @param _addr Array of coin addresses
    @param _amount Array of gas estimate amounts
    """
    assert msg.sender == self.address_provider.admin()  # dev: admin-only function

    for i in range(10):
        _coin: address = _addr[i]
        if _coin == ZERO_ADDRESS:
            break
        self.gas_estimate_values[_coin][0] = _amount[i]
    self.last_updated = block.timestamp


@external
def set_gas_estimate_contract(_pool: address, _estimator: address):
    """
    @notice Set gas estimate contract
    @param _pool Pool address
    @param _estimator GasEstimator address
    """
    assert msg.sender == self.address_provider.admin()  # dev: admin-only function

    self.gas_estimate_contracts[_pool] = _estimator
    self.last_updated = block.timestamp


@external
def set_liquidity_gauges(_pool: address, _liquidity_gauges: address[10]):
    """
    @notice Set liquidity gauge contracts``
    @param _pool Pool address
    @param _liquidity_gauges Liquidity gauge address
    """
    assert msg.sender == self.address_provider.admin()  # dev: admin-only function

    _lp_token: address = self.get_lp_token[_pool]
    _gauge_controller: address = self.gauge_controller
    for i in range(10):
        _gauge: address = _liquidity_gauges[i]
        if _gauge != ZERO_ADDRESS:
            assert LiquidityGauge(_gauge).lp_token() == _lp_token  # dev: wrong token
            GaugeController(_gauge_controller).gauge_types(_gauge)
            self.liquidity_gauges[_pool][i] = _gauge
        elif self.liquidity_gauges[_pool][i] != ZERO_ADDRESS:
            self.liquidity_gauges[_pool][i] = ZERO_ADDRESS
        else:
            break
    self.last_updated = block.timestamp


@external
def set_pool_asset_type(_pool: address, _asset_type: uint256):
    """
    @notice Set the asset type name for a curve pool
    @dev This is a simple way to setting the cache of categories instead of
        performing some computation for no reason. Pool's don't necessarily
        change once they are deployed.
    @param _pool Pool address
    @param _asset_type String of asset type
    """
    assert msg.sender == self.address_provider.admin()  # dev: admin-only function

    self.pool_data[_pool].asset_type = _asset_type
    self.last_updated = block.timestamp


@external
def batch_set_pool_asset_type(_pools: address[32], _asset_types: uint256[32]):
    """
    @notice Batch set the asset type name for curve pools
    @dev This is a simple way of setting the cache of categories instead of
        performing some computation for no reason. Pool's don't necessarily
        change once they are deployed.
    """
    assert msg.sender == self.address_provider.admin()  # dev: admin-only function

    for i in range(32):
        if _pools[i] == ZERO_ADDRESS:
            break
        self.pool_data[_pools[i]].asset_type = _asset_types[i]
    self.last_updated = block.timestamp

Contract ABI

[{"name":"PoolAdded","inputs":[{"name":"pool","type":"address","indexed":true},{"name":"rate_method_id","type":"bytes","indexed":false}],"anonymous":false,"type":"event"},{"name":"PoolRemoved","inputs":[{"name":"pool","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_address_provider","type":"address"},{"name":"_gauge_controller","type":"address"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"find_pool_for_coins","inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"find_pool_for_coins","inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"get_n_coins","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[2]"}],"gas":2764},{"stateMutability":"view","type":"function","name":"get_coins","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"address[8]"}],"gas":22642},{"stateMutability":"view","type":"function","name":"get_underlying_coins","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"address[8]"}],"gas":22734},{"stateMutability":"view","type":"function","name":"get_decimals","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[8]"}],"gas":10154},{"stateMutability":"view","type":"function","name":"get_underlying_decimals","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[8]"}],"gas":10246},{"stateMutability":"view","type":"function","name":"get_rates","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[8]"}],"gas":89988},{"stateMutability":"view","type":"function","name":"get_gauges","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"address[10]"},{"name":"","type":"int128[10]"}],"gas":52730},{"stateMutability":"view","type":"function","name":"get_balances","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[8]"}],"gas":43603},{"stateMutability":"view","type":"function","name":"get_underlying_balances","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[8]"}],"gas":377350},{"stateMutability":"view","type":"function","name":"get_virtual_price_from_lp_token","inputs":[{"name":"_token","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":5287},{"stateMutability":"view","type":"function","name":"get_A","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":3105},{"stateMutability":"view","type":"function","name":"get_parameters","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"A","type":"uint256"},{"name":"future_A","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"admin_fee","type":"uint256"},{"name":"future_fee","type":"uint256"},{"name":"future_admin_fee","type":"uint256"},{"name":"future_owner","type":"address"},{"name":"initial_A","type":"uint256"},{"name":"initial_A_time","type":"uint256"},{"name":"future_A_time","type":"uint256"}],"gas":28133},{"stateMutability":"view","type":"function","name":"get_fees","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[2]"}],"gas":5601},{"stateMutability":"view","type":"function","name":"get_admin_balances","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256[8]"}],"gas":87486},{"stateMutability":"view","type":"function","name":"get_coin_indices","inputs":[{"name":"_pool","type":"address"},{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"outputs":[{"name":"","type":"int128"},{"name":"","type":"int128"},{"name":"","type":"bool"}],"gas":45755},{"stateMutability":"view","type":"function","name":"estimate_gas_used","inputs":[{"name":"_pool","type":"address"},{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":57665},{"stateMutability":"view","type":"function","name":"is_meta","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"bool"}],"gas":3128},{"stateMutability":"view","type":"function","name":"get_pool_name","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"string"}],"gas":13379},{"stateMutability":"view","type":"function","name":"get_coin_swap_count","inputs":[{"name":"_coin","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":3179},{"stateMutability":"view","type":"function","name":"get_coin_swap_complement","inputs":[{"name":"_coin","type":"address"},{"name":"_index","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":3254},{"stateMutability":"view","type":"function","name":"get_pool_asset_type","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":3239},{"stateMutability":"nonpayable","type":"function","name":"add_pool","inputs":[{"name":"_pool","type":"address"},{"name":"_n_coins","type":"uint256"},{"name":"_lp_token","type":"address"},{"name":"_rate_info","type":"bytes32"},{"name":"_decimals","type":"uint256"},{"name":"_underlying_decimals","type":"uint256"},{"name":"_has_initial_A","type":"bool"},{"name":"_is_v1","type":"bool"},{"name":"_name","type":"string"}],"outputs":[],"gas":63063473},{"stateMutability":"nonpayable","type":"function","name":"add_pool_without_underlying","inputs":[{"name":"_pool","type":"address"},{"name":"_n_coins","type":"uint256"},{"name":"_lp_token","type":"address"},{"name":"_rate_info","type":"bytes32"},{"name":"_decimals","type":"uint256"},{"name":"_use_rates","type":"uint256"},{"name":"_has_initial_A","type":"bool"},{"name":"_is_v1","type":"bool"},{"name":"_name","type":"string"}],"outputs":[],"gas":32098992},{"stateMutability":"nonpayable","type":"function","name":"add_metapool","inputs":[{"name":"_pool","type":"address"},{"name":"_n_coins","type":"uint256"},{"name":"_lp_token","type":"address"},{"name":"_decimals","type":"uint256"},{"name":"_name","type":"string"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"add_metapool","inputs":[{"name":"_pool","type":"address"},{"name":"_n_coins","type":"uint256"},{"name":"_lp_token","type":"address"},{"name":"_decimals","type":"uint256"},{"name":"_name","type":"string"},{"name":"_base_pool","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"remove_pool","inputs":[{"name":"_pool","type":"address"}],"outputs":[],"gas":799397478975},{"stateMutability":"nonpayable","type":"function","name":"set_pool_gas_estimates","inputs":[{"name":"_addr","type":"address[5]"},{"name":"_amount","type":"uint256[2][5]"}],"outputs":[],"gas":393460},{"stateMutability":"nonpayable","type":"function","name":"set_coin_gas_estimates","inputs":[{"name":"_addr","type":"address[10]"},{"name":"_amount","type":"uint256[10]"}],"outputs":[],"gas":394687},{"stateMutability":"nonpayable","type":"function","name":"set_gas_estimate_contract","inputs":[{"name":"_pool","type":"address"},{"name":"_estimator","type":"address"}],"outputs":[],"gas":75989},{"stateMutability":"nonpayable","type":"function","name":"set_liquidity_gauges","inputs":[{"name":"_pool","type":"address"},{"name":"_liquidity_gauges","type":"address[10]"}],"outputs":[],"gas":447195},{"stateMutability":"nonpayable","type":"function","name":"set_pool_asset_type","inputs":[{"name":"_pool","type":"address"},{"name":"_asset_type","type":"uint256"}],"outputs":[],"gas":75955},{"stateMutability":"nonpayable","type":"function","name":"batch_set_pool_asset_type","inputs":[{"name":"_pools","type":"address[32]"},{"name":"_asset_types","type":"uint256[32]"}],"outputs":[],"gas":1174503},{"stateMutability":"view","type":"function","name":"address_provider","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3348},{"stateMutability":"view","type":"function","name":"gauge_controller","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3378},{"stateMutability":"view","type":"function","name":"pool_list","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":3453},{"stateMutability":"view","type":"function","name":"pool_count","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3438},{"stateMutability":"view","type":"function","name":"coin_count","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3468},{"stateMutability":"view","type":"function","name":"get_coin","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":3543},{"stateMutability":"view","type":"function","name":"get_pool_from_lp_token","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"address"}],"gas":3743},{"stateMutability":"view","type":"function","name":"get_lp_token","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"address"}],"gas":3773},{"stateMutability":"view","type":"function","name":"last_updated","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3588}]

6f7fffffffffffffffffffffffffffffff604052604061557761014039602061557760c03960c05160a01c61557257602060206155770160c03960c05160a01c61557257610140516000556101605160015561555a56600436101561000d576133e7565b600035601c526f7fffffffffffffffffffffffffffffff604052600051346154ff5763a87df06c81141561004657600061014052610067565b636982eb0b811415610062576020604461014037600050610067565b6100b6565b60043560a01c6154ff5760243560a01c6154ff576024356004351861016052600161014051620100008110156154ff57026202000b6101605160e05260c052604060c020015460005260206000f35b63940494f18114156101215760043560a01c6154ff5760156201000360043560e05260c052604060c0200154610140526101405160801c61016052610160516101a05261014051700100000000000000000000000000000000808206905090506101c05260406101a0f35b639ac90d3d8114156101d25760043560a01c6154ff57610100366101403760156201000360043560e05260c052604060c020015460801c6102405261026060006008818352015b6102405161026051141561017b576101c8565b60016102605160088110156154ff570260056201000360043560e05260c052604060c0200101546101406102605160088110156154ff5760200201525b8151600101808352811415610168575b5050610100610140f35b63a77576ef8114156102995760043560a01c6154ff57610100366101403760156201000360043560e05260c052604060c0200154700100000000000000000000000000000000808206905090506102405261026060006008818352015b610240516102605114156102425761028f565b60016102605160088110156154ff5702600d6201000360043560e05260c052604060c0200101546101406102605160088110156154ff5760200201525b815160010180835281141561022f575b5050610100610140f35b6352b5155581141561032f5760043560a01c6154ff5760156201000360043560e05260c052604060c020015460801c610140526101006101405160016201000360043560e05260c052604060c02001546101605261014051610180526101805161016051600658016133ed565b6101e05261020052610220526102405261026052610280526102a0526102c052610140526101e0f35b634cb088f18114156103db5760043560a01c6154ff5760156201000360043560e05260c052604060c020015470010000000000000000000000000000000080820690509050610140526101006101405160026201000360043560e05260c052604060c02001546101605261014051610180526101805161016051600658016133ed565b6101e05261020052610220526102405261026052610280526102a0526102c052610140526101e0f35b63ce99e45a81141561042d5760043560a01c6154ff576101006004356101405261014051600658016134fa565b6101a0526101c0526101e05261020052610220526102405261026052610280526101a0f35b6356059ffb8114156105d05760043560a01c6154ff5761028036610140376001546103c0526103e06000600a818352015b60016103e051600a8110156154ff57026202000d60043560e05260c052604060c0200154610400526104005161049357610508565b610400516101406103e051600a8110156154ff57602002015260206104a06024633f9095b761042052610400516104405261043c6103c0515afa156154ff57601f3d11156154ff576000506104a0516102806103e051600a8110156154ff5760200201525b815160010180835281141561045e575b5050610660806101405181526101605181602001526101805181604001526101a05181606001526101c05181608001526101e0518160a00152610200518160c00152610220518160e0015261024051816101000152610260518161012001525080610140016102805181526102a05181602001526102c05181604001526102e0518160600152610300518160800152610320518160a00152610340518160c00152610360518160e00152610380518161010001526103a0518161012001525050610280610660f35b6392e3cc2d8114156106225760043560a01c6154ff576101006004356101405261014051600658016138a9565b6101a0526101c0526101e05261020052610220526102405261026052610280526101a0f35b6359f4f3518114156106ee5760043560a01c6154ff5760046201000360043560e05260c052604060c0200154610140526101405161069e5761010061014051600435610160526101605160065801613a17565b6101c0526101e05261020052610220526102405261026052610280526102a052610140526101c0f35b61010061014051600435610160526101405161018052610180516101605160065801613e6a565b6101e05261020052610220526102405261026052610280526102a0526102c052610140526101e0f35b63c5b7074a81141561074a5760043560a01c6154ff5760206101a0600463bb7b8b806101405261015c6202000760043560e05260c052604060c020545afa156154ff57601f3d11156154ff576000506101a05160005260206000f35b6355b30b198114156107965760043560a01c6154ff5760206101a0600463f446c1d06101405261015c6004355afa156154ff57601f3d11156154ff576000506101a05160005260206000f35b631f80a957811415610a765760043560a01c6154ff57610140366101403760206102e0600463f446c1d06102805261029c6004355afa156154ff57601f3d11156154ff576000506102e0516101405260206102e0600463b4b577ad6102805261029c6004355afa156154ff57601f3d11156154ff576000506102e0516101605260206102e0600463ddca3f436102805261029c6004355afa156154ff57601f3d11156154ff576000506102e0516101805260206102e060046358680d0b6102805261029c6004355afa156154ff57601f3d11156154ff576000506102e0516101c05260206102e0600463fee3f7f96102805261029c6004355afa156154ff57601f3d11156154ff576000506102e0516101a05260206102e0600463e38244626102805261029c6004355afa156154ff57601f3d11156154ff576000506102e0516101e05260206102e06004631ec0cdc16102805261029c6004355afa156154ff57601f3d11156154ff576000506102e0516102005260166201000360043560e05260c052604060c0200154156109ba5760206102e06004635409491a6102805261029c6004355afa156154ff57601f3d11156154ff576000506102e0516102205260206102e06004632081066c6102805261029c6004355afa156154ff57601f3d11156154ff576000506102e0516102405260206102e0600463140522886102805261029c6004355afa156154ff57601f3d11156154ff576000506102e051610260525b610140610280808080845181525050602081019050808084602001518152505060208101905080808460400151815250506020810190508080846060015181525050602081019050808084608001518152505060208101905080808460a001518152505060208101905080808460c001518152505060208101905080808460e00151815250506020810190508080846101000151815250506020810190508080846101200151815250506101409050905060c05260c051610280f35b637cdb72b0811415610b055760043560a01c6154ff5760206101a0600463ddca3f436101405261015c6004355afa156154ff57601f3d11156154ff576000506101a0516101c0526020610240600463fee3f7f96101e0526101fc6004355afa156154ff57601f3d11156154ff5760005061024051610260526101c0516102a052610260516102c05260406102a0f35b63c11e45b8811415610d285760043560a01c6154ff576101405161016051610180516101a0516101c0516101e05161020051610220516004356102405261024051600658016138a9565b6102a0526102c0526102e052610300526103205261034052610360526103805261022052610200526101e0526101c0526101a0526101805261016052610140526102a080516101405280602001516101605280604001516101805280606001516101a05280608001516101c0528060a001516101e0528060c00151610200528060e00151610220525060156201000360043560e05260c052604060c020015460801c6102405261026060006008818352015b60016102605160088110156154ff570260056201000360043560e05260c052604060c0200101546102805261024051610260511415610c3f57610d1e565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610280511415610c9f57600435316101406102605160088110156154ff5760200201518082106154ff57808203905090506101406102605160088110156154ff576020020152610d0d565b602061032060246370a082316102a0526004356102c0526102bc610280515afa156154ff57601f3d11156154ff57600050610320516101406102605160088110156154ff5760200201518082106154ff57808203905090506101406102605160088110156154ff5760200201525b5b8151600101808352811415610c01575b5050610100610140f35b63eb85226d811415610e205760043560a01c6154ff5760243560a01c6154ff5760443560a01c6154ff576101405161016051610180516004356101a0526024356101c0526044356101e0526101e0516101c0516101a05160065801614163565b610240526102605261028052610180526101605261014052610240805161014052806020015161016052806040015161018052506101405160405181116154ff576101a0526101605160405181116154ff576101c0526101e08080806101a0518152505060208101905080806101c051815250506020810190508080600061018051118152505060609050905060c05260c0516101e0f35b63b0bb365b811415610fbb5760043560a01c6154ff5760243560a01c6154ff5760443560a01c6154ff576202000a60043560e05260c052604060c02054610140526000610140511815610eac576020610220606463b0bb365b61016052606060046101803761017c610140515afa156154ff57601f3d11156154ff576000506102205160005260206000f35b6101405161016051600435610180526024356101a0526044356101c0526101c0516101a0516101805160065801614163565b6102205261024052610260526101605261014052610220604001516101605260016101605160028110156154ff57026202000960043560e05260c052604060c02001546101805260006101805118156154ff576024356101e052604435610200526101c060006002818352015b60206101c051026101e001516101a052620200096101a05160e05260c052604060c020546102205260006102205118156154ff5761018080516102205181818301106154ff57808201905090508152505b8151600101808352811415610f4b575b50506101805160005260206000f35b63e4d332a9811415610ff45760043560a01c6154ff57600060046201000360043560e05260c052604060c0200154141560005260206000f35b635c9117418114156110ae5760043560a01c6154ff5760186201000360043560e05260c052604060c0200180610180602082540161012060006003818352015b8261012051602002111561104757611069565b61012051850154610120516020028501525b8151600101808352811415611034575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f35b6398aede168114156110e35760043560a01c6154ff5760026201000560043560e05260c052604060c020015460005260206000f35b635d2119828114156111375760043560a01c6154ff5760016024356f7fffffffffffffffffffffffffffffff8110156154ff570260036201000560043560e05260c052604060c02001015460005260206000f35b6366d3966c81141561116c5760043560a01c6154ff57601c6201000360043560e05260c052604060c020015460005260206000f35b6399209aa18114156116d65760043560a01c6154ff5760443560a01c6154ff5760c43560011c6154ff5760e43560011c6154ff576060610104356004016101403760406101043560040135116154ff576101405161016051610180516101a051610100336101c0526004356101e05260243560243560801b81818301106154ff578082019050905061020052604060446102203760c4356102605260e43561028052806102a05261014080805160200180846101c0018284600060045af1156154ff57505050506102a051806101c00180518060206001820306601f82010390508201610360525050505b6102c06103605110156112695761127e565b61036051516020610360510361036052611257565b6102a05161028051610260516102405161022051610200516101e0516101c05160065801614358565b6101a0526101805261016052610140526000506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051604060046102c03760006103005260e4356103205261032051610300516102e0516102c05160065801614b83565b610380526103a0526103c0526103e052610400526104205261044052610460526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261038080516101c05280602001516101e0528060400151610200528060600151610220528060800151610240528060a00151610260528060c00151610280528060e001516102a052506084356102c0526102c0516114a9576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516101c0516102e0526101e051610300526102005161032052610220516103405261024051610360526102605161038052610280516103a0526102a0516103c0526024356103e0526103e0516103c0516103a05161038051610360516103405161032051610300516102e0516006580161500e565b610440526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610440516102c0525b6102c05160016201000360043560e05260c052604060c02001556101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c051604060046102e03760016103205260e435610340526103405161032051610300516102e05160065801614b83565b6103a0526103c0526103e05261040052610420526104405261046052610480526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a080516101c05280602001516101e0528060400151610200528060600151610220528060800151610240528060a00151610260528060c00151610280528060e001516102a0525060a4356102c0526102c0516116ba576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516101c0516102e0526101e051610300526102005161032052610220516103405261024051610360526102605161038052610280516103a0526102a0516103c0526024356103e0526103e0516103c0516103a05161038051610360516103405161032051610300516102e0516006580161500e565b610440526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610440516102c0525b6102c05160026201000360043560e05260c052604060c0200155005b63dcee86a3811415611bf25760043560a01c6154ff5760443560a01c6154ff5760c43560011c6154ff5760e43560011c6154ff576060610104356004016101403760406101043560040135116154ff576101405161016051610180516101a051610100336101c0526004356101e05260243560243560801b81818301106154ff578082019050905061020052604060446102203760c4356102605260e43561028052806102a05261014080805160200180846101c0018284600060045af1156154ff57505050506102a051806101c00180518060206001820306601f82010390508201610360525050505b6102c06103605110156117d3576117e8565b610360515160206103605103610360526117c1565b6102a05161028051610260516102405161022051610200516101e0516101c05160065801614358565b6101a0526101805261016052610140526000506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051604060046102c03760006103005260e4356103205261032051610300516102e0516102c05160065801614b83565b610380526103a0526103c0526103e052610400526104205261044052610460526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261038080516101c05280602001516101e0528060400151610200528060600151610220528060800151610240528060a00151610260528060c00151610280528060e001516102a052506084356102c0526102c051611a13576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516101c0516102e0526101e051610300526102005161032052610220516103405261024051610360526102605161038052610280516103a0526102a0516103c0526024356103e0526103e0516103c0516103a05161038051610360516103405161032051610300516102e0516006580161500e565b610440526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610440516102c0525b6102c05160016201000360043560e05260c052604060c020015560006102e05261030060006008818352015b602435610300511415611a5157611bd4565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86103005160405181116154ff5780820280607f1d8160801d14156154ff578090509050905061032052610320516000811215611ab55760a435816000031c611abb565b60a435811b5b905061010080820690509050611bc3576101c06103005160088110156154ff57602002015160016103005160088110156154ff5702600d6201000360043560e05260c052604060c0200101556102e08051610320517fffffffffffffffffffffffffffffffff800000000000000000000000000000008113156154ff576000036000811215611b7c57610320516000811215611b5f576102c051816000031c611b66565b6102c051811b5b905061010080820690509050816000031c611bad565b610320516000811215611b97576102c051816000031c611b9e565b6102c051811b5b905061010080820690509050811b5b905081818301106154ff57808201905090508152505b5b8151600101808352811415611a3f575b50506102e05160026201000360043560e05260c052604060c0200155005b63ce6f94e1811415611c095760006101c052611c34565b63d2a06baf811415611c2f5760a43560a01c6154ff57602060a46101c037600050611c34565b612475565b60043560a01c6154ff5760443560a01c6154ff57606060843560040161014037604060843560040135116154ff5760243560018082106154ff57808203905090506101e0526101c0516102005261020051611cbb5760206102806004635d6362bb6102205261023c6004355afa156154ff57601f3d11156154ff5760005061028051610200525b6015620100036102005160e05260c052604060c020015460801c6102205260006102205111156154ff576101405161016051610180516101a0516101c0516101e0516102005161022051610100336102405260043561026052610220516101e05181818301106154ff578082019050905060243560801b81818301106154ff5780820190509050610280526044356102a05260006102c05260016102e05260006103005280610320526101408080516020018084610240018284600060045af1156154ff575050505061032051806102400180518060206001820306601f820103905082016103e0525050505b6103406103e0511015611dba57611dcf565b6103e0515160206103e051036103e052611da8565b61032051610300516102e0516102c0516102a05161028051610260516102405160065801614358565b61022052610200526101e0526101c0526101a0526101805261016052610140526000506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051604060046103403760006103805260006103a0526103a05161038051610360516103405160065801614b83565b61040052610420526104405261046052610480526104a0526104c0526104e05261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261040080516102405280602001516102605280604001516102805280606001516102a05280608001516102c0528060a001516102e0528060c00151610300528060e0015161032052506064356103405261034051612049576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161024051610360526102605161038052610280516103a0526102a0516103c0526102c0516103e0526102e051610400526103005161042052610320516104405260243561046052610460516104405161042051610400516103e0516103c0516103a05161038051610360516006580161500e565b6104c0526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104c051610340525b6103405160016201000360043560e05260c052604060c02001556102005160046201000360043560e05260c052604060c0200155610120366103603761048060006008818352015b610220516101e05181818301106154ff57808201905090506104805114156120b8576121fc565b6101e0516104805110156120e4576102406104805160088110156154ff576020020151610460526121c0565b610480516101e0518082106154ff57808203905090506104a05260016104a05160088110156154ff57026005620100036102005160e05260c052604060c02001015461046052610460516103606104a05160088110156154ff5760200201526101406104c0525b6104c0515160206104c051016104c0526104c06104c051101561216d5761214b565b6103606104a05160088110156154ff5760200201516104e0526104e0516006580161465b565b6104a06104c0525b6104c0515260206104c051036104c0526101406104c051106121bc5761219b565b6000505b6104605160016104805160088110156154ff5702600d6201000360043560e05260c052604060c0200101555b8151600101808352811415612091575b505060086101e05160405181116154ff5780820280607f1d8160801d14156154ff5780905090509050600081121561224f576001620100036102005160e05260c052604060c0200154816000031c612269565b6001620100036102005160e05260c052604060c0200154811b5b90506104805261048080516103405160206101e05110156154ff576101e0516101000a8080156154ff5782069050905081818301106154ff57808201905090508152506104805160026201000360043560e05260c052604060c02001556104a060006008818352015b6101e0516104a05114156122e557612471565b6104c060006008818352015b610220516104c05114156123045761245e565b6103606104c05160088110156154ff5760200201516102406104a05160088110156154ff576020020151186104e0526202000c6104e05160e05260c052604060c0205461050052600435600161050051620100008110156154ff57026202000b6104e05160e05260c052604060c020015561050051600181818301106154ff57808201905090506202000c6104e05160e05260c052604060c020556105005161244d57610140610520525b610520515160206105205101610520526105206105205110156123d1576123af565b6102406104a05160088110156154ff576020020151610540526103606104c05160088110156154ff576020020151610560526104e051610580526105805161056051610540516006580161470a565b610500610520525b61052051526020610520510361052052610140610520511061244957612428565b6000505b5b81516001018083528114156122f1575b50505b81516001018083528114156122d2575b5050005b63474932b0811415612d235760043560a01c6154ff5760206101a0600463f851a4406101405261015c6000545afa156154ff57601f3d11156154ff576000506101a0513314156154ff57600060056201000360043560e05260c052604060c020015418156154ff576000620200076202000860043560e05260c052604060c0205460e05260c052604060c0205560006202000860043560e05260c052604060c020556201000360043560e05260c052604060c0205461014052620100025460018082106154ff578082039050905061016052610160516101405110156125a257600161016051620100008110156154ff5702600201546101805261018051600161014051620100008110156154ff57026002015561014051620100036101805160e05260c052604060c020555b6000600161016051620100008110156154ff570260020155610160516201000255600060026201000360043560e05260c052604060c0200155600060016201000360043560e05260c052604060c0200155600060156201000360043560e05260c052604060c02001556000610180526101808060186201000360043560e05260c052604060c02001602082510161012060006001818352015b8261012051602002111561264e57612670565b61012051602002850151610120518501555b815160010180835281141561263b575b5050505050506000601c6201000360043560e05260c052604060c0200155610200366101803761038060006008818352015b60016103805160088110156154ff570260056201000360043560e05260c052604060c0200101546101806103805160088110156154ff57602002015260016103805160088110156154ff5702600d6201000360043560e05260c052604060c0200101546102806103805160088110156154ff5760200201526102806103805160088110156154ff57602002015161274e576101806103805160088110156154ff57602002015115612751565b60005b1561275b576129ad565b60006101806103805160088110156154ff576020020151181561286357600060016103805160088110156154ff570260056201000360043560e05260c052604060c0200101556101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516101806103805160088110156154ff5760200201516103a0526103a05160065801614898565b61038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526000505b60006102806103805160088110156154ff576020020151181561299c57600060016103805160088110156154ff5702600d6201000360043560e05260c052604060c02001015560006001620100056102806103805160088110156154ff57602002015160e05260c052604060c0200154181561299b576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516102806103805160088110156154ff5760200201516103a0526103a05160065801614898565b61038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526000505b5b5b81516001018083528114156126a2575b5050600060046201000360043560e05260c052604060c02001541415610380526103a060006008818352015b6101806103a05160088110156154ff5760200201516103c0526102806103a05160088110156154ff5760200201516103e0526103c051612a1857612ccf565b6103a051600181818301106154ff578082019050905061040052610420610400516008818352015b6102806104205160088110156154ff5760200201516104405261044051612a6657612cbc565b6101806104205160088110156154ff576020020151610460526000610460511815612b0e57610140610480525b61048051516020610480510161048052610480610480511015612ab557612a93565b6004356104a0526103c0516104c052610460516104e0526104e0516104c0516104a05160065801615169565b610460610480525b610480515260206104805103610480526101406104805110612b0a57612ae9565b6000505b6103e0516103c0511815612b23576001612b2e565b610440516104605114155b5b15612bb757610140610480525b61048051516020610480510161048052610480610480511015612b5e57612b3c565b6004356104a0526103e0516104c052610440516104e0526104e0516104c0516104a05160065801615169565b610460610480525b610480515260206104805103610480526101406104805110612bb357612b92565b6000505b6103805115612c125760006104a0526104a061012060006008818352015b6101205160200261018001516103e0511415612bf45760018352612c05565b5b8151600101808352811415612bd5575b5050506104a05115612c15565b60005b15612cab57610440516103e051186104c0526101406104e0525b6104e0515160206104e051016104e0526104e06104e0511015612c5157612c2f565b6103e0516105005261044051610520526104c051610540526105405161052051610500516006580161470a565b6104c06104e0525b6104e0515260206104e051036104e0526101406104e05110612ca757612c86565b6000505b5b8151600101808352811415612a40575b50505b81516001018083528114156129d9575b5050600060046201000360043560e05260c052604060c0200155426202000e556004357f4106dfdaa577573db51c0ca93f766dbedfa0758faa2e7f5bcdb7c142be803c3f6103a0806000905090506103a0a2005b630733b67a811415612e175760043560a01c6154ff5760243560a01c6154ff5760443560a01c6154ff5760643560a01c6154ff5760843560a01c6154ff5760206101a0600463f851a4406101405261015c6000545afa156154ff57601f3d11156154ff576000506101a0513314156154ff5761014060006005818352015b60046101405160058110156154ff5760200201356101605261016051612dc657612e0d565b620200096101605160e05260c052604060c02060a46101405160058110156154ff5760400201803582558060200135600183015550505b8151600101808352811415612da1575b5050426202000e55005b63237f89f2811415612eff576000610120525b610120516004013560a01c6154ff576020610120510161012052610140610120511015612e5657612e2a565b60206101a0600463f851a4406101405261015c6000545afa156154ff57601f3d11156154ff576000506101a0513314156154ff576101406000600a818352015b600461014051600a8110156154ff5760200201356101605261016051612ebb57612ef5565b61014461014051600a8110156154ff576020020135620200096101605160e05260c052604060c020555b8151600101808352811415612e96575b5050426202000e55005b63ca991b14811415612f715760043560a01c6154ff5760243560a01c6154ff5760206101a0600463f851a4406101405261015c6000545afa156154ff57601f3d11156154ff576000506101a0513314156154ff576024356202000a60043560e05260c052604060c02055426202000e55005b63ef6b978881141561314f5760043560a01c6154ff576000610120525b610120516024013560a01c6154ff576020610120510161012052610140610120511015612fba57612f8e565b60206101a0600463f851a4406101405261015c6000545afa156154ff57601f3d11156154ff576000506101a0513314156154ff576202000860043560e05260c052604060c0205461014052600154610160526101806000600a818352015b602461018051600a8110156154ff5760200201356101a05260006101a05118156130d75761014051602061022060046382c630666101c0526101dc6101a0515afa156154ff57601f3d11156154ff576000506102205114156154ff5760206102406024633f9095b76101c0526101a0516101e0526101dc610160515afa156154ff57601f3d11156154ff57600050610240506101a051600161018051600a8110156154ff57026202000d60043560e05260c052604060c0200155613134565b6000600161018051600a8110156154ff57026202000d60043560e05260c052604060c0200154181561312e576000600161018051600a8110156154ff57026202000d60043560e05260c052604060c0200155613133565b613145565b5b5b8151600101808352811415613018575b5050426202000e55005b6309e767748114156131ba5760043560a01c6154ff5760206101a0600463f851a4406101405261015c6000545afa156154ff57601f3d11156154ff576000506101a0513314156154ff57602435601c6201000360043560e05260c052604060c0200155426202000e55005b637542f0788114156132ad576000610120525b610120516004013560a01c6154ff5760206101205101610120526104006101205110156131f9576131cd565b60206101a0600463f851a4406101405261015c6000545afa156154ff57601f3d11156154ff576000506101a0513314156154ff5761014060006020818352015b60046101405160208110156154ff576020020135613256576132a3565b6104046101405160208110156154ff576020020135601c6201000360046101405160208110156154ff57602002013560e05260c052604060c02001555b8151600101808352811415613239575b5050426202000e55005b63ce50c2e78114156132c55760005460005260206000f35b63d8b9a0188114156132dd5760015460005260206000f35b633a1d5d8e811415613307576001600435620100008110156154ff57026002015460005260206000f35b63956aae3a81141561332157620100025460005260206000f35b635075770f81141561333b57620100045460005260206000f35b6345f0db24811415613367576001600435620100008110156154ff570262010006015460005260206000f35b63bdf475c38114156133995760043560a01c6154ff576202000760043560e05260c052604060c0205460005260206000f35b63379510498114156133cb5760043560a01c6154ff576202000860043560e05260c052604060c0205460005260206000f35b63689009618114156133e5576202000e5460005260206000f35b505b60006000fd5b610180526101405261016052610100366101a0376101605160405181116154ff576102a0526102c060006008818352015b6102a0516102c0511415613431576134be565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86102c05180820280607f1d8160801d14156154ff578090509050905060008112156134855761014051816000031c61348c565b61014051811b5b9050610100808206905090506101a06102c05160088110156154ff5760200201525b815160010180835281141561341e575b50506101006102c0525b60006102c051116134d8576134f4565b60206102c051036101a0015160206102c051036102c0526134c8565b61018051565b610160526101405261010036610180376004620100036101405160e05260c052604060c020015461028052610280516137ad576003620100036101405160e05260c052604060c02001546102a0526008601460208206610360016020828401116154ff57602080610380826102a0600060045af150508181528090509050905080602001516000825180602090136154ff57809190126154ff57806020036101000a82049050905090506102c052601c600460208206610340016020828401116154ff57602080610360826102a0600060045af15050818152809050905090508051602001806102e08284600060045af1156154ff57505061034060006008818352015b60016103405160088110156154ff57026005620100036101405160e05260c052604060c0200101546103605261036051613637576137a6565b6102a051613646576001613674565b60016103405160088110156154ff5702600d620100036101405160e05260c052604060c02001015461036051145b5b1561369d57670de0b6b3a76400006101806103405160088110156154ff576020020152613795565b60006102c05118156137045760206104006024638f32207861038052610360516103a05261039c6102c0518060a01c6154ff578090505afa156154ff57601f3d11156154ff57600050610400516101806103405160088110156154ff576020020152613794565b6102e08051602001806104408284600060045af1156154ff57505060206104c061044051610460610360515afa156154ff5760203d808211156137475780613749565b815b905090506104a0526104a080602001516000825180602090136154ff57809190126154ff57806020036101000a82049050905090506101806103405160088110156154ff5760200201525b5b5b81516001018083528114156135fe575b505061386f565b6015620100036101405160e05260c052604060c020015460801c60018082106154ff57808203905090506102a0526020610320600463bb7b8b806102c0526102dc610280515afa156154ff57601f3d11156154ff57600050610320516101806102a05160088110156154ff5760200201526102c060006008818352015b6102a0516102c051141561383d5761386c565b670de0b6b3a76400006101806102c05160088110156154ff5760200201525b815160010180835281141561382a575b50505b6101006102a0525b60006102a05111613887576138a3565b60206102a05103610180015160206102a051036102a052613877565b61016051565b61016052610140526017620100036101405160e05260c052604060c020015461018052610100366101a0376102a060006008818352015b60016102a05160088110156154ff57026005620100036101405160e05260c052604060c02001015461391d5760006102a05118156154ff576139db565b6101805115613976576020610340602463065a80d86102c0526102a0516102e0526102dc610140515afa156154ff57601f3d11156154ff57600050610340516101a06102a05160088110156154ff5760200201526139ca565b60206103406024634903b0d16102c0526102a051600081126154ff576102e0526102dc610140515afa156154ff57601f3d11156154ff57600050610340516101a06102a05160088110156154ff5760200201525b5b81516001018083528114156138e0575b50506101006102a0525b60006102a051116139f557613a11565b60206102a051036101a0015160206102a051036102a0526139e5565b61016051565b61016052610140526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610140516102805261028051600658016138a9565b6102e05261030052610320526103405261036052610380526103a0526103c052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526102e080516101805280602001516101a05280604001516101c05280606001516101e0528060800151610200528060a00151610220528060c00151610240528060e0015161026052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610140516103805261038051600658016134fa565b6103e05261040052610420526104405261046052610480526104a0526104c052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e080516102805280602001516102a05280604001516102c05280606001516102e0528060800151610300528060a00151610320528060c00151610340528060e0015161036052506002620100036101405160e05260c052604060c020015461038052610180516103a0526101a0516103c0526101c0516103e0526101e0516104005261020051610420526102205161044052610240516104605261026051610480526104a060006008818352015b60016104a05160088110156154ff57026005620100036101405160e05260c052604060c0200101546104c0526104c051613c9b57613e2e565b60016104a05160088110156154ff5702600d620100036101405160e05260c052604060c0200101546104e0526104e051613cd457613e1e565b6104c0516104e0511815613e1d576101806104a05160088110156154ff5760200201516102806104a05160088110156154ff5760200201518082028215828483041417156154ff5780905090509050604e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86104a0518082028215828483051417156154ff57809050905090506000811215613d785761038051816000031c613d7f565b61038051811b5b90506101008082069050905010156154ff577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff86104a0518082028215828483051417156154ff57809050905090506000811215613de45761038051816000031c613deb565b61038051811b5b905061010080820690509050600a0a8080156154ff578204905090506103a06104a05160088110156154ff5760200201525b5b8151600101808352811415613c62575b50506101006104a0525b60006104a05111613e4857613e64565b60206104a051036103a0015160206104a051036104a052613e38565b61016051565b6101805261014052610160526015620100036101405160e05260c052604060c020015460801c60018082106154ff57808203905090506101a0526017620100036101605160e05260c052604060c02001546101c052602061026060046318160ddd6102005261021c620200086101605160e05260c052604060c020545afa156154ff57601f3d11156154ff57600050610260516101e052610140366102003760006101e0511115613f885760206103c06024634903b0d1610340526101a0516103605261035c610140515afa156154ff57601f3d11156154ff576000506103c0516ec097ce7bc90715b34b9f10000000008082028215828483041417156154ff57809050905090506101e0518080156154ff57820490509050610320525b61034060006008818352015b60016103405160088110156154ff5702600d620100036101405160e05260c052604060c020010154613fc557614127565b6101a0516103405110156140125760206103e06024634903b0d161036052610340516103805261037c610140515afa156154ff57601f3d11156154ff576000506103e051610300526140fd565b6101c051156140755760206103e0602463065a80d861036052610340516101a0518082106154ff578082039050905060405181116154ff576103805261037c610160515afa156154ff57601f3d11156154ff576000506103e051610300526140c2565b60206103e06024634903b0d161036052610340516101a0518082106154ff57808203905090506103805261037c610160515afa156154ff57601f3d11156154ff576000506103e051610300525b61030051610320518082028215828483041417156154ff57809050905090506ec097ce7bc90715b34b9f100000000080820490509050610300525b610300516102006103405160088110156154ff5760200201525b8151600101808352811415613f94575b5050610100610340525b600061034051116141415761415d565b6020610340510361020001516020610340510361034052614131565b61018051565b6101a0526101405261016052610180526080366101c03761024060006008818352015b60016102405160088110156154ff57026005620100036101405160e05260c052604060c02001015461026052610260516141c557600061022052614226565b610160516102605114156141e057610240516101c052614201565b610180516102605114156141fb57610240516101e052614200565b614216565b5b610220511561420f57614226565b6001610220525b8151600101808352811415614186575b50506102205161431f5761024060006008818352015b60016102405160088110156154ff5702600d620100036101405160e05260c052604060c02001015461026052610260516142b5576308c379a06102805260206102a05260136102c0527f4e6f20617661696c61626c65206d61726b6574000000000000000000000000006102e0526102c050606461029cfd5b610160516102605114156142d057610240516101c0526142f1565b610180516102605114156142eb57610240516101e0526142f0565b61430c565b5b61022051156143055760016102005261431c565b6001610220525b815160010180835281141561423c575b50505b6060610240525b6000610240511161433657614352565b602061024051036101c001516020610240510361024052614326565b6101a051565b610240526101405261016052610180526101a0526101c0526101e05261020052610220526102605260006102e0525b6102605160206001820306601f82010390506102e051106143a7576143c0565b6102e05161028001526102e0516020016102e052614387565b6000506020610360600463f851a4406103005261031c6000545afa156154ff57601f3d11156154ff57600050610360516101405114156154ff5760006101a05118156154ff576005620100036101605160e05260c052604060c02001546154ff57620200076101a05160e05260c052604060c020546154ff5762010002546103005261016051600161030051620100008110156154ff57026002015561030051600181818301106154ff5780820190509050620100025561030051620100036101605160e05260c052604060c020556101c0516003620100036101605160e05260c052604060c02001556101e0516016620100036101605160e05260c052604060c0200155610200516017620100036101605160e05260c052604060c0200155610180516015620100036101605160e05260c052604060c0200155610260806018620100036101605160e05260c052604060c02001602082510161012060006003818352015b826101205160200211156145395761455b565b61012051602002850151610120518501555b8151600101808352811415614526575b50505050505061016051620200076101a05160e05260c052604060c020556101a051620200086101605160e05260c052604060c02055426202000e55610160517fe485c16479ab7092c0b3fc4649843c06be7f072194675261590c84473ab0aea961032080602080825280830180601c600460208206610380016020828401116154ff576020806103a0826101c0600060045af1505081815280905090509050805160200180838284600060045af1156154ff5750508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905080905090509050610320a261024051565b61016052610140526001620100056101405160e05260c052604060c02001546146d75762010004546101805261018051620100056101405160e05260c052604060c0205561014051600161018051620100008110156154ff5702620100060155620100048054600181818301106154ff57808201905090508155505b6001620100056101405160e05260c052604060c020018054600181818301106154ff578082019050905081555061016051565b6101a0526101405261016052610180526002620100056101405160e05260c052604060c02001546101c0526101605160016101c0516f7fffffffffffffffffffffffffffffff8110156154ff57026003620100056101405160e05260c052604060c0200101556002620100056101405160e05260c052604060c020018054600181818301106154ff57808201905090508155506002620100056101605160e05260c052604060c02001546101e0526101405160016101e0516f7fffffffffffffffffffffffffffffff8110156154ff57026003620100056101605160e05260c052604060c0200101556002620100056101605160e05260c052604060c020018054600181818301106154ff578082019050905081555061016051610140511015614862576101e05160801b6101c05181818301106154ff5780820190509050620200066101805160e05260c052604060c02055614892565b6101c05160801b6101e05181818301106154ff5780820190509050620200066101805160e05260c052604060c020555b6101a051565b61016052610140526001620100056101405160e05260c052604060c02001805460018082106154ff57808203905090508155506001620100056101405160e05260c052604060c02001546149b05762010004805460018082106154ff5780820390509050815550620100045461018052620100056101405160e05260c052604060c020546101a052610180516101a051101561497f57600161018051620100008110156154ff57026201000601546101c0526101c05160016101a051620100008110156154ff57026201000601556101a051620100056101c05160e05260c052604060c020555b6000620100056101405160e05260c052604060c020556000600161018051620100008110156154ff57026201000601555b61016051565b6101a0526101405261016052610180526002620100056101405160e05260c052604060c02001805460018082106154ff57808203905090508155506002620100056101405160e05260c052604060c02001546101c0526101c051610180511015614b445760016101c0516f7fffffffffffffffffffffffffffffff8110156154ff57026003620100056101405160e05260c052604060c0200101546101e0526101e051610140511861020052620200066102005160e05260c052604060c02054610220526101e051610140511015614abf576102205160801c60801b6101805181818301106154ff5780820190509050620200066102005160e05260c052604060c02055614b08565b6101805160801b610220517001000000000000000000000000000000008082069050905081818301106154ff5780820190509050620200066102005160e05260c052604060c020555b6101e0516001610180516f7fffffffffffffffffffffffffffffff8110156154ff57026003620100056101405160e05260c052604060c0200101555b600060016101c0516f7fffffffffffffffffffffffffffffff8110156154ff57026003620100056101405160e05260c052604060c0200101556101a051565b6101c0526101405261016052610180526101a052610120366101e03761030060006008818352015b61016051610300511415614bbe57614d67565b6101805115614c84576101a05115614c185760206103a0602463b739953e610320526103005160405181116154ff576103405261033c610140515afa156154ff57601f3d11156154ff576000506103a0516102e052614c53565b60206103a0602463b9947eb061032052610300516103405261033c610140515afa156154ff57601f3d11156154ff576000506103a0516102e0525b6102e05160016103005160088110156154ff5702600d620100036101405160e05260c052604060c020010155614d3d565b6101a05115614cd55760206103a060246323746eb8610320526103005160405181116154ff576103405261033c610140515afa156154ff57601f3d11156154ff576000506103a0516102e052614d10565b60206103a0602463c661065761032052610300516103405261033c610140515afa156154ff57601f3d11156154ff576000506103a0516102e0525b6102e05160016103005160088110156154ff57026005620100036101405160e05260c052604060c0200101555b6102e0516101e06103005160088110156154ff5760200201525b8151600101808352811415614bab575b505061030060006008818352015b61016051610300511415614d8857614fd2565b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516101e06103005160088110156154ff57602002015161032052610320516006580161465b565b610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005061030051600181818301106154ff578082019050905061032052610340610320516008818352015b61016051610340511415614e6457614fbf565b6101e06103405160088110156154ff5760200201516101e06103005160088110156154ff57602002015118610360526202000c6103605160e05260c052604060c020546103805261014051600161038051620100008110156154ff57026202000b6103605160e05260c052604060c020015561038051600181818301106154ff57808201905090506202000c6103605160e05260c052604060c0205561038051614fae576101406103a0525b6103a0515160206103a051016103a0526103a06103a0511015614f3257614f10565b6101e06103405160088110156154ff5760200201516103c0526101e06103005160088110156154ff5760200201516103e0526103605161040052610400516103e0516103c0516006580161470a565b6103806103a0525b6103a0515260206103a051036103a0526101406103a05110614faa57614f89565b6000505b5b8151600101808352811415614e51575b50505b8151600101808352811415614d75575b5050610100610300525b60006103005111614fec57615008565b602061030051036101e001516020610300510361030052614fdc565b6101c051565b610260526101405261016052610180526101a0526101c0526101e052610200526102205261024052604036610280376102405160405181116154ff576102c0526102e060006008818352015b6102c0516102e051141561506d57615157565b6101406102e05160088110156154ff5760200201516103005273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6103005114156150b05760126102a0526150f0565b6020610380600463313ce5676103205261033c610300515afa156154ff57601f3d11156154ff57600050610380516102a0526101006102a05110156154ff575b61028080516102e051600880820280607f1d8160801d14156154ff5780905090509050600081121561512a576102a051816000031c615131565b6102a051811b5b905081818301106154ff57808201905090508152505b815160010180835281141561505a575b50506102805160005260005161026051565b6101a0526101405261016052610180526101805161016051186101c0526202000c6101c05160e05260c052604060c0205460018082106154ff57808203905090506101e0526101e0516153f157620200066101c05160e05260c052604060c0205461020052610180516101605110156152dd576101405161016051610180516101a0516101c0516101e0516102005161016051610220526101805161024052610200517001000000000000000000000000000000008082069050905061026052610260516102405161022051600658016149b6565b610200526101e0526101c0526101a0526101805261016052610140526000506102005160801c610220526101405161016051610180516101a0516101c0516101e0516102005161022051610180516102405261016051610260526102205161028052610280516102605161024051600658016149b6565b61022052610200526101e0526101c0526101a0526101805261016052610140526000506153da565b6102005160801c610220526101405161016051610180516101a0516101c0516101e0516102005161022051610160516102405261018051610260526102205161028052610280516102605161024051600658016149b6565b61022052610200526101e0526101c0526101a0526101805261016052610140526000506101405161016051610180516101a0516101c0516101e0516102005161018051610220526101605161024052610200517001000000000000000000000000000000008082069050905061026052610260516102405161022051600658016149b6565b610200526101e0526101c0526101a0526101805261016052610140526000505b6000620200066101c05160e05260c052604060c020555b610200600062010000818352015b6101e051610200511115615412576154f7565b61014051600161020051620100008110156154ff57026202000b6101c05160e05260c052604060c020015414156154e6576101e0516102005110156154a05760016101e051620100008110156154ff57026202000b6101c05160e05260c052604060c0200154600161020051620100008110156154ff57026202000b6101c05160e05260c052604060c02001555b600060016101e051620100008110156154ff57026202000b6101c05160e05260c052604060c02001556101e0516202000c6101c05160e05260c052604060c020556154f7565b5b81516001018083528114156153ff575b50506101a051565b600080fd5b61005661555a0361005660003961005661555a036000f35b600080fd0000000000000000000000000000000022d53366457f9d5e68ec105046fc43830000000000000000000000000000000000000000000000000000000000000000

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

0000000000000000000000000000000022d53366457f9d5e68ec105046fc43830000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _address_provider (address): 0x0000000022d53366457f9d5e68ec105046fc4383
Arg [1] : _gauge_controller (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000022d53366457f9d5e68ec105046fc4383
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


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