Contract 0x883feb1b9862e0c8559d26f53bf19264c5e0839f

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x01437d0a02c4d5fd04a80af3f42004f0aa84994b2c74386d208504d253a8a8f90x9db4f7aa196262442023-06-03 13:37:453 hrs 42 mins ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.0044001
0xc35aa32e6ddc31768d1d4692bdecbcaf17881a018bdc58732e61a6ad3c661a9a0x9db4f7aa196239902023-06-03 10:29:556 hrs 50 mins ago0x2ab3c9a333cc098f158f30d59e5152b5517e47d8 IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.001021218
0x48e5cd8043520f1d344e264be003e17e720bc5f8eb39c9b1f9f3a01ea11708a20x9db4f7aa196239712023-06-03 10:28:206 hrs 52 mins ago0x2ab3c9a333cc098f158f30d59e5152b5517e47d8 IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.001608048
0xd0cd43c0aef6a4718a64e7ec4ad0c1d649f1e5989da3eb07c815ec6d2aafe98a0x9db4f7aa196217962023-06-03 7:27:059 hrs 53 mins ago0xf13d87279e272639d32d1b4edee9a71aad15868f IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.001131918
0xa97047fd00c9df87a4b077ee1420dbe4c71e51c89a8f63ecaae23fa7322b483c0x9db4f7aa196161352023-06-02 23:35:2017 hrs 45 mins ago0xca3045f588694732380340df94b181fa66874519 IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.00113163
0x5a1ac46845eaf85522fc7d863eac28480b0ec196bfe91205a120633d8ba8cc790x9db4f7aa196153952023-06-02 22:33:4018 hrs 46 mins ago0xdfe287ae810fc500a5a795bf83361b37c7b4172f IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.00113163
0x712e7aaec415c0ee3940374c10d3cf806234c8e48cd28fb799332ac567f7449e0x9db4f7aa196118392023-06-02 17:37:2023 hrs 43 mins ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.0044001
0x0917dc28fd68155a69b0e11b2e13af80343feaf0fad1839c6b062cfbfd1fe55f0x9db4f7aa196033072023-06-02 5:46:201 day 11 hrs ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.002895370783
0xa61049e811f13a9ef6432ed3a492c128e4d6814f0ad3331c917396032a4fd71d0x9db4f7aa195992612023-06-02 0:09:101 day 17 hrs ago0x57e15754dfd25fa5b59e41d7a2d16176bf8b06f0 IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.001147362
0x8b4469be35a40d80017a88e5116ca5d433f85d0324b1fa25b60c29662c02e86d0x9db4f7aa195956762023-06-01 19:10:251 day 22 hrs ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.002746870125
0x3f8c18fa5a6f4af957c3f6e9057e0aa74b4ad803451734686825c62330d9110b0x9db4f7aa195955632023-06-01 19:01:001 day 22 hrs ago0x751d833e461a1a4d7c3431d512ac4245df7f0a03 IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.001582248
0x7472d5288dee0d84653a09583dcd300c85a4d8112e658214f79ab7929135f52a0x9db4f7aa195954132023-06-01 18:48:301 day 22 hrs ago0x751d833e461a1a4d7c3431d512ac4245df7f0a03 IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.001147416
0x61d8dc883b72d4fe7b086c9563d22ffd85e733207f2c0e7750a6f86469442be70x9db4f7aa195943992023-06-01 17:24:001 day 23 hrs ago0xce10ec502aa66ddb187ad9190654a3b4fc29908c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.00092184
0x40f14a5a5a04507df2730b2bf6b644d49e09dfa9ab9a51d3350ed23980c1829f0x9db4f7aa195927832023-06-01 15:09:202 days 2 hrs ago0xce10ec502aa66ddb187ad9190654a3b4fc29908c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.00093471
0x7067603e0dde3f8010b36ca47a3598ade09182665cad603dc20191c8490709d00x9db4f7aa195912592023-06-01 13:02:202 days 4 hrs ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.002735173102
0x2c692e4e7ed9cefe3dc8684d278c1a185792fbbb2a6bf4bb626de2f583ef742a0x9db4f7aa195912542023-06-01 13:01:552 days 4 hrs ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.001063289929
0x53cfff2f70c19258c72a8578e9ddb83be4a845caaa4cc885dca7e39a85fe4d6e0x9db4f7aa195912442023-06-01 13:01:052 days 4 hrs ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.001063593972
0xeef987ba5d8f6e3371ece2af2791383233bfa54220c08d6b60b209e62cfb46b10x9db4f7aa195912352023-06-01 13:00:202 days 4 hrs ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.00106370276
0x20a5c9e6e3a56da2af8045921ceb486713b7931f53549e6c2b4830599443c4160x9db4f7aa195907942023-06-01 12:23:352 days 4 hrs ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.002564011476
0x17240808a89ac12c4b777e786efc30386ac4a2b4c124c3027fb0c50eda8a3d4f0x9db4f7aa195904952023-06-01 11:58:402 days 5 hrs ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.002570249042
0x7c9979a44248ab77e7deca8905051d8fcdd4a253673350f09988741f35f8fdf10x9db4f7aa195902292023-06-01 11:36:302 days 5 hrs ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.002566428235
0xbd5397a9d45d49075acc1b86c578150e80182798b7d071d5e5fe4f3f0d7f92750x9db4f7aa195896292023-06-01 10:46:302 days 6 hrs ago0x08abb2e7b586d80543b61daa91a9d134234d26d5 IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.001553346
0xf351906115915c6249126fe9a82637e0fbd25efea79da569f5b0df5a8fd606240x9db4f7aa195889692023-06-01 9:51:302 days 7 hrs ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.002558896765
0x1335c0ad2853432725ec865de5ef2a391972ee96b58bfd56ff0e4dd8a8b310ad0x9db4f7aa195889332023-06-01 9:48:302 days 7 hrs ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.002719187051
0x3e63214ec793c0086d6a45ef750325b02a8fbe44c83a731094c103e525907c190x9db4f7aa195889272023-06-01 9:48:002 days 7 hrs ago0xb969a8250dd80857347c880dba14d7e3d9b2fd3c IN  0x883feb1b9862e0c8559d26f53bf19264c5e0839f0 CELO0.001057169998
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.3.3

Optimization Enabled:
N/A

Other Settings:
, None license

Contract Source Code (Vyper language format)

# @version 0.3.3
"""
@title Curve Registry Exchange Contract
@license MIT
@author Curve.Fi
@notice Find pools, query exchange rates and perform swaps
"""

from vyper.interfaces import ERC20


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

interface Registry:
    def address_provider() -> address: view
    def get_A(_pool: address) -> uint256: view
    def get_fees(_pool: address) -> uint256[2]: view
    def get_coin_indices(_pool: address, _from: address, _to: address) -> (int128, int128, bool): view
    def get_n_coins(_pool: address) -> uint256[2]: view
    def get_balances(_pool: address) -> uint256[MAX_COINS]: view
    def get_underlying_balances(_pool: address) -> uint256[MAX_COINS]: view
    def get_rates(_pool: address) -> uint256[MAX_COINS]: view
    def get_decimals(_pool: address) -> uint256[MAX_COINS]: view
    def get_underlying_decimals(_pool: address) -> uint256[MAX_COINS]: view
    def find_pool_for_coins(_from: address, _to: address, i: uint256) -> address: view
    def get_lp_token(_pool: address) -> address: view
    def is_meta(_pool: address) -> bool: view

interface CryptoRegistry:
    def get_coin_indices(_pool: address, _from: address, _to: address) -> (uint256, uint256): view

interface CurvePool:
    def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256): payable
    def exchange_underlying(i: int128, j: int128, dx: uint256, min_dy: uint256): payable
    def get_dy(i: int128, j: int128, amount: uint256) -> uint256: view
    def get_dy_underlying(i: int128, j: int128, amount: uint256) -> uint256: view
    def coins(i: uint256) -> address: view

interface CryptoPool:
    def exchange(i: uint256, j: uint256, dx: uint256, min_dy: uint256): payable
    def exchange_underlying(i: uint256, j: uint256, dx: uint256, min_dy: uint256): payable
    def get_dy(i: uint256, j: uint256, amount: uint256) -> uint256: view
    def get_dy_underlying(i: uint256, j: uint256, amount: uint256) -> uint256: view

interface CryptoPoolETH:
    def exchange(i: uint256, j: uint256, dx: uint256, min_dy: uint256, use_eth: bool): payable

interface LendingBasePoolMetaZap:
    def exchange_underlying(pool: address, i: int128, j: int128, dx: uint256, min_dy: uint256): nonpayable

interface CryptoMetaZap:
    def get_dy(pool: address, i: uint256, j: uint256, dx: uint256) -> uint256: view
    def exchange(pool: address, i: uint256, j: uint256, dx: uint256, min_dy: uint256, use_eth: bool): payable

interface BasePool2Coins:
    def add_liquidity(amounts: uint256[2], min_mint_amount: uint256): nonpayable
    def calc_token_amount(amounts: uint256[2], is_deposit: bool) -> uint256: view
    def remove_liquidity_one_coin(token_amount: uint256, i: int128, min_amount: uint256): nonpayable
    def calc_withdraw_one_coin(token_amount: uint256, i: int128) -> uint256: view

interface BasePool3Coins:
    def add_liquidity(amounts: uint256[3], min_mint_amount: uint256): nonpayable
    def calc_token_amount(amounts: uint256[3], is_deposit: bool) -> uint256: view
    def remove_liquidity_one_coin(token_amount: uint256, i: int128, min_amount: uint256): nonpayable
    def calc_withdraw_one_coin(token_amount: uint256, i: int128) -> uint256: view

interface LendingBasePool3Coins:
    def add_liquidity(amounts: uint256[3], min_mint_amount: uint256, use_underlying: bool): nonpayable
    def calc_token_amount(amounts: uint256[3], is_deposit: bool) -> uint256: view
    def remove_liquidity_one_coin(token_amount: uint256, i: int128, min_amount: uint256, use_underlying: bool) -> uint256: nonpayable
    def calc_withdraw_one_coin(token_amount: uint256, i: int128) -> uint256: view

interface CryptoBasePool3Coins:
    def add_liquidity(amounts: uint256[3], min_mint_amount: uint256, use_underlying: bool): nonpayable
    def calc_token_amount(amounts: uint256[3], is_deposit: bool) -> uint256: view
    def remove_liquidity_one_coin(token_amount: uint256, i: uint256, min_amount: uint256): nonpayable
    def calc_withdraw_one_coin(token_amount: uint256, i: uint256) -> uint256: view

interface BasePool4Coins:
    def add_liquidity(amounts: uint256[4], min_mint_amount: uint256): nonpayable
    def calc_token_amount(amounts: uint256[4], is_deposit: bool) -> uint256: view
    def remove_liquidity_one_coin(token_amount: uint256, i: int128, min_amount: uint256): nonpayable
    def calc_withdraw_one_coin(token_amount: uint256, i: int128) -> uint256: view

interface BasePool5Coins:
    def add_liquidity(amounts: uint256[5], min_mint_amount: uint256): nonpayable
    def calc_token_amount(amounts: uint256[5], is_deposit: bool) -> uint256: view
    def remove_liquidity_one_coin(token_amount: uint256, i: int128, min_amount: uint256): nonpayable
    def calc_withdraw_one_coin(token_amount: uint256, i: int128) -> uint256: view

interface wETH:
    def deposit(): payable
    def withdraw(_amount: uint256): nonpayable

interface Calculator:
    def get_dx(n_coins: uint256, balances: uint256[MAX_COINS], amp: uint256, fee: uint256,
               rates: uint256[MAX_COINS], precisions: uint256[MAX_COINS],
               i: int128, j: int128, dx: uint256) -> uint256: view
    def get_dy(n_coins: uint256, balances: uint256[MAX_COINS], amp: uint256, fee: uint256,
               rates: uint256[MAX_COINS], precisions: uint256[MAX_COINS],
               i: int128, j: int128, dx: uint256[CALC_INPUT_SIZE]) -> uint256[CALC_INPUT_SIZE]: view


event TokenExchange:
    buyer: indexed(address)
    receiver: indexed(address)
    pool: indexed(address)
    token_sold: address
    token_bought: address
    amount_sold: uint256
    amount_bought: uint256

event ExchangeMultiple:
    buyer: indexed(address)
    receiver: indexed(address)
    route: address[9]
    swap_params: uint256[3][4]
    pools: address[4]
    amount_sold: uint256
    amount_bought: uint256

ETH_ADDRESS: constant(address) = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
WETH_ADDRESS: immutable(address)
MAX_COINS: constant(uint256) = 8
CALC_INPUT_SIZE: constant(uint256) = 100
EMPTY_POOL_LIST: constant(address[8]) = [
    ZERO_ADDRESS,
    ZERO_ADDRESS,
    ZERO_ADDRESS,
    ZERO_ADDRESS,
    ZERO_ADDRESS,
    ZERO_ADDRESS,
    ZERO_ADDRESS,
    ZERO_ADDRESS,
]


address_provider: AddressProvider
registry: public(address)
factory_registry: public(address)
crypto_registry: public(address)

default_calculator: public(address)
is_killed: public(bool)
pool_calculator: HashMap[address, address]

is_approved: HashMap[address, HashMap[address, bool]]
base_coins: HashMap[address, address[2]]


@external
def __init__(_address_provider: address, _calculator: address, _weth: address):
    """
    @notice Constructor function
    """
    self.address_provider = AddressProvider(_address_provider)
    self.registry = AddressProvider(_address_provider).get_registry()
    self.factory_registry = AddressProvider(_address_provider).get_address(3)
    self.crypto_registry = AddressProvider(_address_provider).get_address(5)
    self.default_calculator = _calculator

    WETH_ADDRESS = _weth


@external
@payable
def __default__():
    pass


@view
@internal
def _get_exchange_amount(
    _registry: address,
    _pool: address,
    _from: address,
    _to: address,
    _amount: uint256
) -> uint256:
    """
    @notice Get the current number of coins received in an exchange
    @param _registry Registry address
    @param _pool Pool address
    @param _from Address of coin to be sent
    @param _to Address of coin to be received
    @param _amount Quantity of `_from` to be sent
    @return Quantity of `_to` to be received
    """
    i: int128 = 0
    j: int128 = 0
    is_underlying: bool = False
    i, j, is_underlying = Registry(_registry).get_coin_indices(_pool, _from, _to) # dev: no market

    if is_underlying and (_registry == self.registry or Registry(_registry).is_meta(_pool)):
        return CurvePool(_pool).get_dy_underlying(i, j, _amount)

    return CurvePool(_pool).get_dy(i, j, _amount)


@view
@internal
def _get_crypto_exchange_amount(
    _registry: address,
    _pool: address,
    _from: address,
    _to: address,
    _amount: uint256
) -> uint256:
    """
    @notice Get the current number of coins received in an exchange
    @param _registry Registry address
    @param _pool Pool address
    @param _from Address of coin to be sent
    @param _to Address of coin to be received
    @param _amount Quantity of `_from` to be sent
    @return Quantity of `_to` to be received
    """
    i: uint256 = 0
    j: uint256 = 0
    i, j = CryptoRegistry(_registry).get_coin_indices(_pool, _from, _to) # dev: no market

    return CryptoPool(_pool).get_dy(i, j, _amount)


@internal
def _exchange(
    _registry: address,
    _pool: address,
    _from: address,
    _to: address,
    _amount: uint256,
    _expected: uint256,
    _sender: address,
    _receiver: address,
) -> uint256:

    assert not self.is_killed

    eth_amount: uint256 = 0
    received_amount: uint256 = 0

    i: int128 = 0
    j: int128 = 0
    is_underlying: bool = False
    i, j, is_underlying = Registry(_registry).get_coin_indices(_pool, _from, _to)  # dev: no market
    if is_underlying and _registry == self.factory_registry:
        if Registry(_registry).is_meta(_pool):
            base_coins: address[2] = self.base_coins[_pool]
            if base_coins[0] == empty(address) and base_coins[1] == empty(address):
                base_coins = [CurvePool(_pool).coins(0), CurvePool(_pool).coins(1)]
                self.base_coins[_pool] = base_coins

            # we only need to use exchange underlying if the input or output is not in the base coins
            is_underlying = _from not in base_coins or _to not in base_coins
        else:
            # not a metapool so no underlying exchange method
            is_underlying = False

    # perform / verify input transfer
    if _from == ETH_ADDRESS:
        eth_amount = _amount
    else:
        response: Bytes[32] = raw_call(
            _from,
            _abi_encode(
                _sender,
                self,
                _amount,
                method_id=method_id("transferFrom(address,address,uint256)"),
            ),
            max_outsize=32,
        )
        if len(response) != 0:
            assert convert(response, bool)

    # approve input token
    if _from != ETH_ADDRESS and not self.is_approved[_from][_pool]:
        response: Bytes[32] = raw_call(
            _from,
            _abi_encode(
                _pool,
                MAX_UINT256,
                method_id=method_id("approve(address,uint256)"),
            ),
            max_outsize=32,
        )
        if len(response) != 0:
            assert convert(response, bool)
        self.is_approved[_from][_pool] = True

    # perform coin exchange
    if is_underlying:
        CurvePool(_pool).exchange_underlying(i, j, _amount, _expected, value=eth_amount)
    else:
        CurvePool(_pool).exchange(i, j, _amount, _expected, value=eth_amount)

    # perform output transfer
    if _to == ETH_ADDRESS:
        received_amount = self.balance
        raw_call(_receiver, b"", value=self.balance)
    else:
        received_amount = ERC20(_to).balanceOf(self)
        response: Bytes[32] = raw_call(
            _to,
            _abi_encode(
                _receiver,
                received_amount,
                method_id=method_id("transfer(address,uint256)"),
            ),
            max_outsize=32,
        )
        if len(response) != 0:
            assert convert(response, bool)

    log TokenExchange(_sender, _receiver, _pool, _from, _to, _amount, received_amount)

    return received_amount


@internal
def _crypto_exchange(
    _pool: address,
    _from: address,
    _to: address,
    _amount: uint256,
    _expected: uint256,
    _sender: address,
    _receiver: address,
) -> uint256:

    assert not self.is_killed

    initial: address = _from
    target: address = _to

    if _from == ETH_ADDRESS:
        initial = WETH_ADDRESS
    if _to == ETH_ADDRESS:
        target = WETH_ADDRESS

    eth_amount: uint256 = 0
    received_amount: uint256 = 0

    i: uint256 = 0
    j: uint256 = 0
    i, j = CryptoRegistry(self.crypto_registry).get_coin_indices(_pool, initial, target)  # dev: no market

    # perform / verify input transfer
    if _from == ETH_ADDRESS:
        eth_amount = _amount
    else:
        response: Bytes[32] = raw_call(
            _from,
            _abi_encode(
                _sender,
                self,
                _amount,
                method_id=method_id("transferFrom(address,address,uint256)"),
            ),
            max_outsize=32,
        )
        if len(response) != 0:
            assert convert(response, bool)

    # approve input token
    if not self.is_approved[_from][_pool]:
        response: Bytes[32] = raw_call(
            _from,
            _abi_encode(
                _pool,
                MAX_UINT256,
                method_id=method_id("approve(address,uint256)"),
            ),
            max_outsize=32,
        )
        if len(response) != 0:
            assert convert(response, bool)
        self.is_approved[_from][_pool] = True

    # perform coin exchange
    if ETH_ADDRESS in [_from, _to]:
        CryptoPoolETH(_pool).exchange(i, j, _amount, _expected, True, value=eth_amount)
    else:
        CryptoPool(_pool).exchange(i, j, _amount, _expected)

    # perform output transfer
    if _to == ETH_ADDRESS:
        received_amount = self.balance
        raw_call(_receiver, b"", value=self.balance)
    else:
        received_amount = ERC20(_to).balanceOf(self)
        response: Bytes[32] = raw_call(
            _to,
            _abi_encode(
                _receiver,
                received_amount,
                method_id=method_id("transfer(address,uint256)"),
            ),
            max_outsize=32,
        )
        if len(response) != 0:
            assert convert(response, bool)

    log TokenExchange(_sender, _receiver, _pool, _from, _to, _amount, received_amount)

    return received_amount



@payable
@external
@nonreentrant("lock")
def exchange_with_best_rate(
    _from: address,
    _to: address,
    _amount: uint256,
    _expected: uint256,
    _receiver: address = msg.sender,
) -> uint256:
    """
    @notice Perform an exchange using the pool that offers the best rate
    @dev Prior to calling this function, the caller must approve
         this contract to transfer `_amount` coins from `_from`
         Does NOT check rates in factory-deployed pools
    @param _from Address of coin being sent
    @param _to Address of coin being received
    @param _amount Quantity of `_from` being sent
    @param _expected Minimum quantity of `_from` received
           in order for the transaction to succeed
    @param _receiver Address to transfer the received tokens to
    @return uint256 Amount received
    """
    if _from == ETH_ADDRESS:
        assert _amount == msg.value, "Incorrect ETH amount"
    else:
        assert msg.value == 0, "Incorrect ETH amount"

    registry: address = self.registry
    best_pool: address = ZERO_ADDRESS
    max_dy: uint256 = 0
    for i in range(65536):
        pool: address = Registry(registry).find_pool_for_coins(_from, _to, i)
        if pool == ZERO_ADDRESS:
            break
        dy: uint256 = self._get_exchange_amount(registry, pool, _from, _to, _amount)
        if dy > max_dy:
            best_pool = pool
            max_dy = dy

    return self._exchange(registry, best_pool, _from, _to, _amount, _expected, msg.sender, _receiver)


@payable
@external
@nonreentrant("lock")
def exchange(
    _pool: address,
    _from: address,
    _to: address,
    _amount: uint256,
    _expected: uint256,
    _receiver: address = msg.sender,
) -> uint256:
    """
    @notice Perform an exchange using a specific pool
    @dev Prior to calling this function, the caller must approve
         this contract to transfer `_amount` coins from `_from`
         Works for both regular and factory-deployed pools
    @param _pool Address of the pool to use for the swap
    @param _from Address of coin being sent
    @param _to Address of coin being received
    @param _amount Quantity of `_from` being sent
    @param _expected Minimum quantity of `_from` received
           in order for the transaction to succeed
    @param _receiver Address to transfer the received tokens to
    @return uint256 Amount received
    """
    if _from == ETH_ADDRESS:
        assert _amount == msg.value, "Incorrect ETH amount"
    else:
        assert msg.value == 0, "Incorrect ETH amount"

    if Registry(self.crypto_registry).get_lp_token(_pool) != ZERO_ADDRESS:
        return self._crypto_exchange(_pool, _from, _to, _amount, _expected, msg.sender, _receiver)

    registry: address = self.registry
    if Registry(registry).get_lp_token(_pool) == ZERO_ADDRESS:
        registry = self.factory_registry
    return self._exchange(registry, _pool, _from, _to, _amount, _expected, msg.sender, _receiver)


@external
@payable
def exchange_multiple(
    _route: address[9],
    _swap_params: uint256[3][4],
    _amount: uint256,
    _expected: uint256,
    _pools: address[4]=[ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS],
    _receiver: address=msg.sender
) -> uint256:
    """
    @notice Perform up to four swaps in a single transaction
    @dev Routing and swap params must be determined off-chain. This
         functionality is designed for gas efficiency over ease-of-use.
    @param _route Array of [initial token, pool, token, pool, token, ...]
                  The array is iterated until a pool address of 0x00, then the last
                  given token is transferred to `_receiver`
    @param _swap_params Multidimensional array of [i, j, swap type] where i and j are the correct
                        values for the n'th pool in `_route`. The swap type should be
                        1 for a stableswap `exchange`,
                        2 for stableswap `exchange_underlying`,
                        3 for a cryptoswap `exchange`,
                        4 for a cryptoswap `exchange_underlying`,
                        5 for factory metapools with lending base pool `exchange_underlying`,
                        6 for factory crypto-meta pools underlying exchange (`exchange` method in zap),
                        7-11 for wrapped coin (underlying for lending or fake pool) -> LP token "exchange" (actually `add_liquidity`),
                        12-14 for LP token -> wrapped coin (underlying for lending pool) "exchange" (actually `remove_liquidity_one_coin`)
                        15 for WETH -> ETH "exchange" (actually deposit/withdraw)
    @param _amount The amount of `_route[0]` token being sent.
    @param _expected The minimum amount received after the final swap.
    @param _pools Array of pools for swaps via zap contracts. This parameter is only needed for
                  Polygon meta-factories underlying swaps.
    @param _receiver Address to transfer the final output token to.
    @return Received amount of the final output token
    """
    input_token: address = _route[0]
    amount: uint256 = _amount
    output_token: address = ZERO_ADDRESS

    # validate / transfer initial token
    if input_token == ETH_ADDRESS:
        assert msg.value == amount
    else:
        assert msg.value == 0
        response: Bytes[32] = raw_call(
            input_token,
            _abi_encode(
                msg.sender,
                self,
                amount,
                method_id=method_id("transferFrom(address,address,uint256)"),
            ),
            max_outsize=32,
        )
        if len(response) != 0:
            assert convert(response, bool)

    for i in range(1,5):
        # 4 rounds of iteration to perform up to 4 swaps
        swap: address = _route[i*2-1]
        pool: address = _pools[i-1] # Only for Polygon meta-factories underlying swap (swap_type == 4)
        output_token = _route[i*2]
        params: uint256[3] = _swap_params[i-1]  # i, j, swap type

        if not self.is_approved[input_token][swap]:
            # approve the pool to transfer the input token
            response: Bytes[32] = raw_call(
                input_token,
                _abi_encode(
                    swap,
                    MAX_UINT256,
                    method_id=method_id("approve(address,uint256)"),
                ),
                max_outsize=32,
            )
            if len(response) != 0:
                assert convert(response, bool)
            self.is_approved[input_token][swap] = True

        eth_amount: uint256 = 0
        if input_token == ETH_ADDRESS:
            eth_amount = amount
        # perform the swap according to the swap type
        if params[2] == 1:
            CurvePool(swap).exchange(convert(params[0], int128), convert(params[1], int128), amount, 0, value=eth_amount)
        elif params[2] == 2:
            CurvePool(swap).exchange_underlying(convert(params[0], int128), convert(params[1], int128), amount, 0, value=eth_amount)
        elif params[2] == 3:
            if input_token == ETH_ADDRESS or output_token == ETH_ADDRESS:
                CryptoPoolETH(swap).exchange(params[0], params[1], amount, 0, True, value=eth_amount)
            else:
                CryptoPool(swap).exchange(params[0], params[1], amount, 0)
        elif params[2] == 4:
            CryptoPool(swap).exchange_underlying(params[0], params[1], amount, 0, value=eth_amount)
        elif params[2] == 5:
            LendingBasePoolMetaZap(swap).exchange_underlying(pool, convert(params[0], int128), convert(params[1], int128), amount, 0)
        elif params[2] == 6:
            use_eth: bool = input_token == ETH_ADDRESS or output_token == ETH_ADDRESS
            CryptoMetaZap(swap).exchange(pool, params[0], params[1], amount, 0, use_eth)
        elif params[2] == 7:
            _amounts: uint256[2] = [0, 0]
            _amounts[params[0]] = amount
            BasePool2Coins(swap).add_liquidity(_amounts, 0)
        elif params[2] == 8:
            _amounts: uint256[3] = [0, 0, 0]
            _amounts[params[0]] = amount
            BasePool3Coins(swap).add_liquidity(_amounts, 0)
        elif params[2] == 9:
            _amounts: uint256[3] = [0, 0, 0]
            _amounts[params[0]] = amount
            LendingBasePool3Coins(swap).add_liquidity(_amounts, 0, True) # example: aave on Polygon
        elif params[2] == 10:
            _amounts: uint256[4] = [0, 0, 0, 0]
            _amounts[params[0]] = amount
            BasePool4Coins(swap).add_liquidity(_amounts, 0)
        elif params[2] == 11:
            _amounts: uint256[5] = [0, 0, 0, 0, 0]
            _amounts[params[0]] = amount
            BasePool5Coins(swap).add_liquidity(_amounts, 0)
        elif params[2] == 12:
            # The number of coins doesn't matter here
            BasePool3Coins(swap).remove_liquidity_one_coin(amount, convert(params[1], int128), 0)
        elif params[2] == 13:
            # The number of coins doesn't matter here
            LendingBasePool3Coins(swap).remove_liquidity_one_coin(amount, convert(params[1], int128), 0, True) # example: aave on Polygon
        elif params[2] == 14:
            # The number of coins doesn't matter here
            CryptoBasePool3Coins(swap).remove_liquidity_one_coin(amount, params[1], 0) # example: atricrypto3 on Polygon
        elif params[2] == 15:
            if input_token == ETH_ADDRESS:
                wETH(swap).deposit(value=amount)
            elif output_token == ETH_ADDRESS:
                wETH(swap).withdraw(amount)
            else:
                raise "One of the coins must be ETH for swap type 15"
        else:
            raise "Bad swap type"

        # update the amount received
        if output_token == ETH_ADDRESS:
            amount = self.balance
        else:
            amount = ERC20(output_token).balanceOf(self)

        # sanity check, if the routing data is incorrect we will have a 0 balance and that is bad
        assert amount != 0, "Received nothing"

        # check if this was the last swap
        if i == 4 or _route[i*2+1] == ZERO_ADDRESS:
            break
        # if there is another swap, the output token becomes the input for the next round
        input_token = output_token

    # validate the final amount received
    assert amount >= _expected

    # transfer the final token to the receiver
    if output_token == ETH_ADDRESS:
        raw_call(_receiver, b"", value=amount)
    else:
        response: Bytes[32] = raw_call(
            output_token,
            _abi_encode(
                _receiver,
                amount,
                method_id=method_id("transfer(address,uint256)"),
            ),
            max_outsize=32,
        )
        if len(response) != 0:
            assert convert(response, bool)

    log ExchangeMultiple(msg.sender, _receiver, _route, _swap_params, _pools, _amount, amount)

    return amount


@view
@external
def get_best_rate(
    _from: address, _to: address, _amount: uint256, _exclude_pools: address[8] = EMPTY_POOL_LIST
) -> (address, uint256):
    """
    @notice Find the pool offering the best rate for a given swap.
    @dev Checks rates for regular and factory pools
    @param _from Address of coin being sent
    @param _to Address of coin being received
    @param _amount Quantity of `_from` being sent
    @param _exclude_pools A list of up to 8 addresses which shouldn't be returned
    @return Pool address, amount received
    """
    best_pool: address = ZERO_ADDRESS
    max_dy: uint256 = 0

    initial: address = _from
    target: address = _to
    if _from == ETH_ADDRESS:
        initial = WETH_ADDRESS
    if _to == ETH_ADDRESS:
        target = WETH_ADDRESS

    registry: address = self.crypto_registry
    for i in range(65536):
        pool: address = Registry(registry).find_pool_for_coins(initial, target, i)
        if pool == ZERO_ADDRESS:
            if i == 0:
                # we only check for stableswap pools if we did not find any crypto pools
                break
            return best_pool, max_dy
        elif pool in _exclude_pools:
            continue
        dy: uint256 = self._get_crypto_exchange_amount(registry, pool, initial, target, _amount)
        if dy > max_dy:
            best_pool = pool
            max_dy = dy

    registry = self.registry
    for i in range(65536):
        pool: address = Registry(registry).find_pool_for_coins(_from, _to, i)
        if pool == ZERO_ADDRESS:
            break
        elif pool in _exclude_pools:
            continue
        dy: uint256 = self._get_exchange_amount(registry, pool, _from, _to, _amount)
        if dy > max_dy:
            best_pool = pool
            max_dy = dy

    registry = self.factory_registry
    for i in range(65536):
        pool: address = Registry(registry).find_pool_for_coins(_from, _to, i)
        if pool == ZERO_ADDRESS:
            break
        elif pool in _exclude_pools:
            continue
        if ERC20(pool).totalSupply() == 0:
            # ignore pools without TVL as the call to `get_dy` will revert
            continue
        dy: uint256 = self._get_exchange_amount(registry, pool, _from, _to, _amount)
        if dy > max_dy:
            best_pool = pool
            max_dy = dy

    return best_pool, max_dy


@view
@external
def get_exchange_amount(_pool: address, _from: address, _to: address, _amount: uint256) -> uint256:
    """
    @notice Get the current number of coins received in an exchange
    @dev Works for both regular and factory-deployed pools
    @param _pool Pool address
    @param _from Address of coin to be sent
    @param _to Address of coin to be received
    @param _amount Quantity of `_from` to be sent
    @return Quantity of `_to` to be received
    """

    registry: address = self.crypto_registry
    if Registry(registry).get_lp_token(_pool) != ZERO_ADDRESS:
        initial: address = _from
        target: address = _to
        if _from == ETH_ADDRESS:
            initial = WETH_ADDRESS
        if _to == ETH_ADDRESS:
            target = WETH_ADDRESS
        return self._get_crypto_exchange_amount(registry, _pool, initial, target, _amount)

    registry = self.registry
    if Registry(registry).get_lp_token(_pool) == ZERO_ADDRESS:
        registry = self.factory_registry
    return self._get_exchange_amount(registry, _pool, _from, _to, _amount)


@view
@external
def get_input_amount(_pool: address, _from: address, _to: address, _amount: uint256) -> uint256:
    """
    @notice Get the current number of coins required to receive the given amount in an exchange
    @param _pool Pool address
    @param _from Address of coin to be sent
    @param _to Address of coin to be received
    @param _amount Quantity of `_to` to be received
    @return Quantity of `_from` to be sent
    """
    registry: address = self.registry

    i: int128 = 0
    j: int128 = 0
    is_underlying: bool = False
    i, j, is_underlying = Registry(registry).get_coin_indices(_pool, _from, _to)
    amp: uint256 = Registry(registry).get_A(_pool)
    fee: uint256 = Registry(registry).get_fees(_pool)[0]

    balances: uint256[MAX_COINS] = empty(uint256[MAX_COINS])
    rates: uint256[MAX_COINS] = empty(uint256[MAX_COINS])
    decimals: uint256[MAX_COINS] = empty(uint256[MAX_COINS])
    n_coins: uint256 = Registry(registry).get_n_coins(_pool)[convert(is_underlying, uint256)]
    if is_underlying:
        balances = Registry(registry).get_underlying_balances(_pool)
        decimals = Registry(registry).get_underlying_decimals(_pool)
        for x in range(MAX_COINS):
            if x == n_coins:
                break
            rates[x] = 10**18
    else:
        balances = Registry(registry).get_balances(_pool)
        decimals = Registry(registry).get_decimals(_pool)
        rates = Registry(registry).get_rates(_pool)

    for x in range(MAX_COINS):
        if x == n_coins:
            break
        decimals[x] = 10 ** (18 - decimals[x])

    calculator: address = self.pool_calculator[_pool]
    if calculator == ZERO_ADDRESS:
        calculator = self.default_calculator
    return Calculator(calculator).get_dx(n_coins, balances, amp, fee, rates, decimals, i, j, _amount)


@view
@external
def get_exchange_amounts(
    _pool: address,
    _from: address,
    _to: address,
    _amounts: uint256[CALC_INPUT_SIZE]
) -> uint256[CALC_INPUT_SIZE]:
    """
    @notice Get the current number of coins required to receive the given amount in an exchange
    @param _pool Pool address
    @param _from Address of coin to be sent
    @param _to Address of coin to be received
    @param _amounts Quantity of `_to` to be received
    @return Quantity of `_from` to be sent
    """
    registry: address = self.registry

    i: int128 = 0
    j: int128 = 0
    is_underlying: bool = False
    balances: uint256[MAX_COINS] = empty(uint256[MAX_COINS])
    rates: uint256[MAX_COINS] = empty(uint256[MAX_COINS])
    decimals: uint256[MAX_COINS] = empty(uint256[MAX_COINS])

    amp: uint256 = Registry(registry).get_A(_pool)
    fee: uint256 = Registry(registry).get_fees(_pool)[0]
    i, j, is_underlying = Registry(registry).get_coin_indices(_pool, _from, _to)
    n_coins: uint256 = Registry(registry).get_n_coins(_pool)[convert(is_underlying, uint256)]

    if is_underlying:
        balances = Registry(registry).get_underlying_balances(_pool)
        decimals = Registry(registry).get_underlying_decimals(_pool)
        for x in range(MAX_COINS):
            if x == n_coins:
                break
            rates[x] = 10**18
    else:
        balances = Registry(registry).get_balances(_pool)
        decimals = Registry(registry).get_decimals(_pool)
        rates = Registry(registry).get_rates(_pool)

    for x in range(MAX_COINS):
        if x == n_coins:
            break
        decimals[x] = 10 ** (18 - decimals[x])

    calculator: address = self.pool_calculator[_pool]
    if calculator == ZERO_ADDRESS:
        calculator = self.default_calculator
    return Calculator(calculator).get_dy(n_coins, balances, amp, fee, rates, decimals, i, j, _amounts)


@view
@external
def get_exchange_multiple_amount(
    _route: address[9],
    _swap_params: uint256[3][4],
    _amount: uint256,
    _pools: address[4]=[ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS, ZERO_ADDRESS]
) -> uint256:
    """
    @notice Get the current number the final output tokens received in an exchange
    @dev Routing and swap params must be determined off-chain. This
         functionality is designed for gas efficiency over ease-of-use.
    @param _route Array of [initial token, pool, token, pool, token, ...]
                  The array is iterated until a pool address of 0x00, then the last
                  given token is transferred to `_receiver`
    @param _swap_params Multidimensional array of [i, j, swap type] where i and j are the correct
                        values for the n'th pool in `_route`. The swap type should be
                        1 for a stableswap `exchange`,
                        2 for stableswap `exchange_underlying`,
                        3 for a cryptoswap `exchange`,
                        4 for a cryptoswap `exchange_underlying`,
                        5 for factory metapools with lending base pool `exchange_underlying`,
                        6 for factory crypto-meta pools underlying exchange (`exchange` method in zap),
                        7-11 for wrapped coin (underlying for lending pool) -> LP token "exchange" (actually `add_liquidity`),
                        12-14 for LP token -> wrapped coin (underlying for lending or fake pool) "exchange" (actually `remove_liquidity_one_coin`)
                        15 for WETH -> ETH "exchange" (actually deposit/withdraw)
    @param _amount The amount of `_route[0]` token to be sent.
    @param _pools Array of pools for swaps via zap contracts. This parameter is only needed for
                  Polygon meta-factories underlying swaps.
    @return Expected amount of the final output token
    """
    amount: uint256 = _amount

    for i in range(1,5):
        # 4 rounds of iteration to perform up to 4 swaps
        swap: address = _route[i*2-1]
        pool: address = _pools[i-1] # Only for Polygon meta-factories underlying swap (swap_type == 4)
        params: uint256[3] = _swap_params[i-1]  # i, j, swap type

        # Calc output amount according to the swap type
        if params[2] == 1:
            amount = CurvePool(swap).get_dy(convert(params[0], int128), convert(params[1], int128), amount)
        elif params[2] == 2:
            amount = CurvePool(swap).get_dy_underlying(convert(params[0], int128), convert(params[1], int128), amount)
        elif params[2] == 3:
            amount = CryptoPool(swap).get_dy(params[0], params[1], amount)
        elif params[2] == 4:
            amount = CryptoPool(swap).get_dy_underlying(params[0], params[1], amount)
        elif params[2] == 5:
            amount = CurvePool(pool).get_dy_underlying(convert(params[0], int128), convert(params[1], int128), amount)
        elif params[2] == 6:
            amount = CryptoMetaZap(swap).get_dy(pool, params[0], params[1], amount)
        elif params[2] == 7:
            _amounts: uint256[2] = [0, 0]
            _amounts[params[0]] = amount
            amount = BasePool2Coins(swap).calc_token_amount(_amounts, True)
        elif params[2] in [8, 9]:
            _amounts: uint256[3] = [0, 0, 0]
            _amounts[params[0]] = amount
            amount = BasePool3Coins(swap).calc_token_amount(_amounts, True)
        elif params[2] == 10:
            _amounts: uint256[4] = [0, 0, 0, 0]
            _amounts[params[0]] = amount
            amount = BasePool4Coins(swap).calc_token_amount(_amounts, True)
        elif params[2] == 11:
            _amounts: uint256[5] = [0, 0, 0, 0, 0]
            _amounts[params[0]] = amount
            amount = BasePool5Coins(swap).calc_token_amount(_amounts, True)
        elif params[2] in [12, 13]:
            # The number of coins doesn't matter here
            amount = BasePool3Coins(swap).calc_withdraw_one_coin(amount, convert(params[1], int128))
        elif params[2] == 14:
            # The number of coins doesn't matter here
            amount = CryptoBasePool3Coins(swap).calc_withdraw_one_coin(amount, params[1])
        elif params[2] == 15:
            # ETH <--> WETH rate is 1:1
            pass
        else:
            raise "Bad swap type"

        # check if this was the last swap
        if i == 4 or _route[i*2+1] == ZERO_ADDRESS:
            break

    return amount


@view
@external
def get_calculator(_pool: address) -> address:
    """
    @notice Set calculator contract
    @dev Used to calculate `get_dy` for a pool
    @param _pool Pool address
    @return `CurveCalc` address
    """
    calculator: address = self.pool_calculator[_pool]
    if calculator == ZERO_ADDRESS:
        return self.default_calculator
    else:
        return calculator


@external
def update_registry_address() -> bool:
    """
    @notice Update registry address
    @dev The registry address is kept in storage to reduce gas costs.
         If a new registry is deployed this function should be called
         to update the local address from the address provider.
    @return bool success
    """
    address_provider: address = self.address_provider.address
    self.registry = AddressProvider(address_provider).get_registry()
    self.factory_registry = AddressProvider(address_provider).get_address(3)
    self.crypto_registry = AddressProvider(address_provider).get_address(5)

    return True


@external
def set_calculator(_pool: address, _calculator: address) -> bool:
    """
    @notice Set calculator contract
    @dev Used to calculate `get_dy` for a pool
    @param _pool Pool address
    @param _calculator `CurveCalc` address
    @return bool success
    """
    assert msg.sender == self.address_provider.admin()  # dev: admin-only function

    self.pool_calculator[_pool] = _calculator

    return True


@external
def set_default_calculator(_calculator: address) -> bool:
    """
    @notice Set default calculator contract
    @dev Used to calculate `get_dy` for a pool
    @param _calculator `CurveCalc` address
    @return bool success
    """
    assert msg.sender == self.address_provider.admin()  # dev: admin-only function

    self.default_calculator = _calculator

    return True


@external
def claim_balance(_token: address) -> bool:
    """
    @notice Transfer an ERC20 or ETH balance held by this contract
    @dev The entire balance is transferred to the owner
    @param _token Token address
    @return bool success
    """
    assert msg.sender == self.address_provider.admin()  # dev: admin-only function

    if _token == ETH_ADDRESS:
        raw_call(msg.sender, b"", value=self.balance)
    else:
        amount: uint256 = ERC20(_token).balanceOf(self)
        response: Bytes[32] = raw_call(
            _token,
            concat(
                method_id("transfer(address,uint256)"),
                convert(msg.sender, bytes32),
                convert(amount, bytes32),
            ),
            max_outsize=32,
        )
        if len(response) != 0:
            assert convert(response, bool)

    return True


@external
def set_killed(_is_killed: bool) -> bool:
    """
    @notice Kill or unkill the contract
    @param _is_killed Killed status of the contract
    @return bool success
    """
    assert msg.sender == self.address_provider.admin()  # dev: admin-only function
    self.is_killed = _is_killed

    return True

Contract ABI

[{"name":"TokenExchange","inputs":[{"name":"buyer","type":"address","indexed":true},{"name":"receiver","type":"address","indexed":true},{"name":"pool","type":"address","indexed":true},{"name":"token_sold","type":"address","indexed":false},{"name":"token_bought","type":"address","indexed":false},{"name":"amount_sold","type":"uint256","indexed":false},{"name":"amount_bought","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"ExchangeMultiple","inputs":[{"name":"buyer","type":"address","indexed":true},{"name":"receiver","type":"address","indexed":true},{"name":"route","type":"address[9]","indexed":false},{"name":"swap_params","type":"uint256[3][4]","indexed":false},{"name":"pools","type":"address[4]","indexed":false},{"name":"amount_sold","type":"uint256","indexed":false},{"name":"amount_bought","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_address_provider","type":"address"},{"name":"_calculator","type":"address"},{"name":"_weth","type":"address"}],"outputs":[]},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"function","name":"exchange_with_best_rate","inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_expected","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange_with_best_rate","inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_expected","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"_pool","type":"address"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_expected","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"_pool","type":"address"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_expected","type":"uint256"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange_multiple","inputs":[{"name":"_route","type":"address[9]"},{"name":"_swap_params","type":"uint256[3][4]"},{"name":"_amount","type":"uint256"},{"name":"_expected","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange_multiple","inputs":[{"name":"_route","type":"address[9]"},{"name":"_swap_params","type":"uint256[3][4]"},{"name":"_amount","type":"uint256"},{"name":"_expected","type":"uint256"},{"name":"_pools","type":"address[4]"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"payable","type":"function","name":"exchange_multiple","inputs":[{"name":"_route","type":"address[9]"},{"name":"_swap_params","type":"uint256[3][4]"},{"name":"_amount","type":"uint256"},{"name":"_expected","type":"uint256"},{"name":"_pools","type":"address[4]"},{"name":"_receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_best_rate","inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_best_rate","inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_exclude_pools","type":"address[8]"}],"outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_exchange_amount","inputs":[{"name":"_pool","type":"address"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_input_amount","inputs":[{"name":"_pool","type":"address"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_exchange_amounts","inputs":[{"name":"_pool","type":"address"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amounts","type":"uint256[100]"}],"outputs":[{"name":"","type":"uint256[100]"}]},{"stateMutability":"view","type":"function","name":"get_exchange_multiple_amount","inputs":[{"name":"_route","type":"address[9]"},{"name":"_swap_params","type":"uint256[3][4]"},{"name":"_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_exchange_multiple_amount","inputs":[{"name":"_route","type":"address[9]"},{"name":"_swap_params","type":"uint256[3][4]"},{"name":"_amount","type":"uint256"},{"name":"_pools","type":"address[4]"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"get_calculator","inputs":[{"name":"_pool","type":"address"}],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"nonpayable","type":"function","name":"update_registry_address","inputs":[],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"set_calculator","inputs":[{"name":"_pool","type":"address"},{"name":"_calculator","type":"address"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"set_default_calculator","inputs":[{"name":"_calculator","type":"address"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"claim_balance","inputs":[{"name":"_token","type":"address"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"set_killed","inputs":[{"name":"_is_killed","type":"bool"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"registry","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"factory_registry","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"crypto_registry","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"default_calculator","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"is_killed","inputs":[],"outputs":[{"name":"","type":"bool"}]}]

6020614a006000396000518060a01c6149fb576040526020614a206000396000518060a01c6149fb576060526020614a406000396000518060a01c6149fb5760805260405160015563a262904b60a052602060a0600460bc6040515afa61006b573d600060003e3d6000fd5b60203d106149fb5760a0518060a01c6149fb5760e05260e05160025563493f4f7460a052600360c052602060a0602460bc6040515afa6100b0573d600060003e3d6000fd5b60203d106149fb5760a0518060a01c6149fb5760e05260e05160035563493f4f7460a052600560c052602060a0602460bc6040515afa6100f5573d600060003e3d6000fd5b60203d106149fb5760a0518060a01c6149fb5760e05260e05160045560605160055560805163000048c1526148c16101396300000000396148c16020016300000000f3600436101561000d57613aaa565b60003560e01c6310e5e3038118610028573361038052610043565b639f69a6a6811861029a576084358060a01c6148bc57610380525b6004358060a01c6148bc57610340526024358060a01c6148bc57610360526000546148bc57600160005573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61034051186100fe57346044351461016a5760146103a0527f496e636f72726563742045544820616d6f756e740000000000000000000000006103c0526103a0506103a051806103c00181600003601f1636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd61016a565b341561016a5760146103a0527f496e636f72726563742045544820616d6f756e740000000000000000000000006103c0526103a0506103a051806103c00181600003601f1636823750506308c379a061036052602061038052601f19601f6103a051011660440161037cfd5b6002546103a0526040366103c037600062010000905b8061040052636982eb0b6104405261034051610460526103605161048052610400516104a0526020610440606461045c6103a0515afa6101c5573d600060003e3d6000fd5b60203d106148bc57610440518060a01c6148bc576104c0526104c05161042052610420516101f257610251565b6103a05160405261042051606052610340516080526103605160a05260443560c05261021f610460613aac565b61046051610440526103e05161044051111561024657610420516103c052610440516103e0525b600101818118610180575b505060206103a0516040526103c051606052610340516080526103605160a0526040604460c03733610100526103805161012052610290610400613d00565b6104006000600055f35b634798ce5b81186102af57336103a0526102ca565b631a4c1ca381186105365760a4358060a01c6148bc576103a0525b6004358060a01c6148bc57610340526024358060a01c6148bc57610360526044358060a01c6148bc57610380526000546148bc57600160005573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61036051186103945734606435146104005760146103c0527f496e636f72726563742045544820616d6f756e740000000000000000000000006103e0526103c0506103c051806103e00181600003601f1636823750506308c379a06103805260206103a052601f19601f6103c051011660440161039cfd610400565b34156104005760146103c0527f496e636f72726563742045544820616d6f756e740000000000000000000000006103e0526103c0506103c051806103e00181600003601f1636823750506308c379a06103805260206103a052601f19601f6103c051011660440161039cfd5b600063379510496103c052610340516103e05260206103c060246103dc6004545afa610431573d600060003e3d6000fd5b60203d106148bc576103c0518060a01c6148bc5761040052610400511461048f5760206103405160405261036051606052610380516080526040606460a0373360e0526103a051610100526104876104206143aa565b61042061052f565b6002546103c05263379510496103e052610340516104005260206103e060246103fc6103c0515afa6104c6573d600060003e3d6000fd5b60203d106148bc576103e0518060a01c6148bc5761042052610420516104ee576003546103c0525b60206103c05160405261034051606052610360516080526103805160a0526040606460c03733610100526103a0516101205261052b6103e0613d00565b6103e05b6000600055f35b63353ca42481186105635760006101605260006101805260006101a05260006101c052336101e052610614565b639db4f7aa81186105b8576102e4358060a01c6148bc5761016052610304358060a01c6148bc5761018052610324358060a01c6148bc576101a052610344358060a01c6148bc576101c052336101e052610614565b630651cb3581186115eb576102e4358060a01c6148bc5761016052610304358060a01c6148bc5761018052610324358060a01c6148bc576101a052610344358060a01c6148bc576101c052610364358060a01c6148bc576101e0525b6004358060a01c6148bc576040526024358060a01c6148bc576060526044358060a01c6148bc576080526064358060a01c6148bc5760a0526084358060a01c6148bc5760c05260a4358060a01c6148bc5760e05260c4358060a01c6148bc576101005260e4358060a01c6148bc5761012052610104358060a01c6148bc5761014052604051610200526102a4356102205260006102405273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61020051186106d8576102205134186148bc57610777565b346148bc576323b872dd6102a4526004336102c452306102e45261022051610304526060016102a0526102a05060206103606102a0516102c06000610200515af1610728573d600060003e3d6000fd5b61034060203d80821161073b578161073d565b805b9050905081528051806102605260208201805161028052505050600061026051146107775761028051610260516020036008021c156148bc575b600160048101905b806102605260206102605160028082028215828483041417156148bc579050905060018082106148bc578082039050905060098110156148bc5702604001516102805260206102605160018082106148bc578082039050905060048110156148bc570261016001516102a05260206102605160028082028215828483041417156148bc579050905060098110156148bc5702604001516102405260606102605160018082106148bc578082039050905060048110156148bc57026101240180356102c05260208101356102e0526040810135610300525060086102005160205260005260406000208061028051602052600052604060002090505461095a5763095ea7b361036452600461028051610384527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6103a45260400161036052610360506020610400610360516103806000610200515af16108e4573d600060003e3d6000fd5b6103e060203d8082116108f757816108f9565b805b9050905081528051806103205260208201805161034052505050600061032051146109335761034051610320516020036008021c156148bc575b60016008610200516020526000526040600020806102805160205260005260406000209050555b60006103205273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61020051186109875761022051610320525b600161030051186109f957633df02124610340526102c05180607f1c6148bc57610360526102e05180607f1c6148bc5761038052610220516103a05260006103c052610280513b156148bc5760006000608461035c61032051610280515af16112a9573d600060003e3d6000fd6112a9565b60026103005118610a6b5763a6417ed6610340526102c05180607f1c6148bc57610360526102e05180607f1c6148bc5761038052610220516103a05260006103c052610280513b156148bc5760006000608461035c61032051610280515af16112a9573d600060003e3d6000fd6112a9565b60036103005118610b6c5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102005118610a9b576001610ab6565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61024051145b610b0f57635b41b908610340526102c051610360526102e05161038052610220516103a05260006103c052610280513b156148bc5760006000608461035c6000610280515af16112a9573d600060003e3d6000fd6112a9565b63394747c5610340526102c051610360526102e05161038052610220516103a05260006103c05260016103e052610280513b156148bc576000600060a461035c61032051610280515af16112a9573d600060003e3d6000fd6112a9565b60046103005118610bce576365b2489b610340526102c051610360526102e05161038052610220516103a05260006103c052610280513b156148bc5760006000608461035c61032051610280515af16112a9573d600060003e3d6000fd6112a9565b60056103005118610c4657637981c43e610340526102a051610360526102c05180607f1c6148bc57610380526102e05180607f1c6148bc576103a052610220516103c05260006103e052610280513b156148bc576000600060a461035c6000610280515af16112a9573d600060003e3d6000fd6112a9565b60066103005118610cfa5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102005118610c76576001610c91565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61024051145b61034052632bf78c61610360526102a051610380526102c0516103a0526102e0516103c052610220516103e0526000610400526103405161042052610280513b156148bc576000600060c461037c6000610280515af16112a9573d600060003e3d6000fd6112a9565b60076103005118610d77576000610340526000610360526102205160206102c05160028110156148bc57026103400152630b4c7e4d61038052610340516103a052610360516103c05260006103e052610280513b156148bc5760006000606461039c6000610280515af16112a9573d600060003e3d6000fd6112a9565b60086103005118610e02576000610340526000610360526000610380526102205160206102c05160038110156148bc57026103400152634515cef36103a052610340516103c052610360516103e0526103805161040052600061042052610280513b156148bc576000600060846103bc6000610280515af16112a9573d600060003e3d6000fd6112a9565b60096103005118610e93576000610340526000610360526000610380526102205160206102c05160038110156148bc57026103400152632b6e993a6103a052610340516103c052610360516103e0526103805161040052600061042052600161044052610280513b156148bc576000600060a46103bc6000610280515af16112a9573d600060003e3d6000fd6112a9565b600a6103005118610f2c5760006103405260006103605260006103805260006103a0526102205160206102c05160048110156148bc5702610340015263029b2f346103c052610340516103e052610360516104005261038051610420526103a05161044052600061046052610280513b156148bc576000600060a46103dc6000610280515af16112a9573d600060003e3d6000fd6112a9565b600b6103005118610fd35760006103405260006103605260006103805260006103a05260006103c0526102205160206102c05160058110156148bc5702610340015263847384996103e0526103405161040052610360516104205261038051610440526103a051610460526103c0516104805260006104a052610280513b156148bc576000600060c46103fc6000610280515af16112a9573d600060003e3d6000fd6112a9565b600c610300511861103357631a4d01d26103405261022051610360526102e05180607f1c6148bc576103805260006103a052610280513b156148bc5760006000606461035c6000610280515af16112a9573d600060003e3d6000fd6112a9565b600d610300511861109d5763517a55a36103405261022051610360526102e05180607f1c6148bc576103805260006103a05260016103c0526020610340608461035c6000610280515af161108c573d600060003e3d6000fd5b60203d106148bc57610340506112a9565b600e61030051186110f55763f1dc3cc96103405261022051610360526102e0516103805260006103a052610280513b156148bc5760006000606461035c6000610280515af16112a9573d600060003e3d6000fd6112a9565b600f61030051186112435773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61020051186111575763d0e30db061034052610280513b156148bc5760006000600461035c61022051610280515af16112a9573d600060003e3d6000fd6112a9565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61024051186111b457632e1a7d4d610340526102205161036052610280513b156148bc5760006000602461035c6000610280515af16112a9573d600060003e3d6000fd6112a9565b602d610340527f4f6e65206f662074686520636f696e73206d7573742062652045544820666f72610360527f2073776170207479706520313500000000000000000000000000000000000000610380526103405061034051806103600181600003601f1636823750506308c379a061030052602061032052601f19601f61034051011660440161031cfd6112a9565b600d610340527f4261642073776170207479706500000000000000000000000000000000000000610360526103405061034051806103600181600003601f1636823750506308c379a061030052602061032052601f19601f61034051011660440161031cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61024051186112d157476102205261130f565b6370a082316103405230610360526020610340602461035c610240515afa6112fe573d600060003e3d6000fd5b60203d106148bc5761034051610220525b6000610220511415611381576010610340527f5265636569766564206e6f7468696e6700000000000000000000000000000000610360526103405061034051806103600181600003601f1636823750506308c379a061030052602061032052601f19601f61034051011660440161031cfd5b600461026051186113935760016113d1565b60206102605160028082028215828483041417156148bc5790509050600181818301106148bc578082019050905060098110156148bc570260400151155b156113db576113ee565b610240516102005260010181811861077f575b50506102c43561022051106148bc5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610240511861144d57600061026052610260506000600061026051610280610220516101e0515af16114e5573d600060003e3d6000fd6114e5565b63a9059cbb6102a45260046101e0516102c452610220516102e4526040016102a0526102a05060206103406102a0516102c06000610240515af1611496573d600060003e3d6000fd5b61032060203d8082116114a957816114ab565b805b9050905081528051806102605260208201805161028052505050600061026051146114e55761028051610260516020036008021c156148bc575b6101e051337f14b561178ae0f368f40fafd0485c4f7129ea71cdc00b4ce1e5940f9bc659c8b260405161026052606051610280526080516102a05260a0516102c05260c0516102e05260e051610300526101005161032052610120516103405261014051610360526101243561038052610144356103a052610164356103c052610184356103e0526101a435610400526101c435610420526101e4356104405261020435610460526102243561048052610244356104a052610264356104c052610284356104e052610160516105005261018051610520526101a051610540526101c051610560526102a43561058052610220516105a052610360610260a36020610220f35b634e21df75811861162b5760006103805260006103a05260006103c05260006103e0526000610400526000610420526000610440526000610460526116b2565b63488de9af8118611b49576064358060a01c6148bc57610380526084358060a01c6148bc576103a05260a4358060a01c6148bc576103c05260c4358060a01c6148bc576103e05260e4358060a01c6148bc5761040052610104358060a01c6148bc5761042052610124358060a01c6148bc5761044052610144358060a01c6148bc57610460525b6004358060a01c6148bc57610340526024358060a01c6148bc5761036052346148bc5760403661048037610340516104c052610360516104e05273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610340511861171a5760206148c16000396000516104c0525b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61036051186117485760206148c16000396000516104e0525b60045461050052600062010000905b8061052052636982eb0b610560526104c051610580526104e0516105a052610520516105c0526020610560606461057c610500515afa61179c573d600060003e3d6000fd5b60203d106148bc57610560518060a01c6148bc576105e0526105e051610540526105405115611810576105405160006105605260006008905b60208102610380015183186117ef576001610560526117fa565b6001018181186117d5575b5050610560519050156118395761188d56611839565b6105205161181d57611898565b505061048051610560526104a051610580526040610560611b47565b61050051604052610540516060526104c0516080526104e05160a05260443560c052611866610580613c56565b61058051610560526104a05161056051111561188d576105405161048052610560516104a0525b600101818118611757575b505060025461050052600062010000905b8061052052636982eb0b610560526103405161058052610360516105a052610520516105c0526020610560606461057c610500515afa6118ee573d600060003e3d6000fd5b60203d106148bc57610560518060a01c6148bc576105e0526105e0516105405261054051156119c5576105405160006105605260006008905b60208102610380015183186119415760016105605261194c565b600101818118611927575b505061056051905015611966576119ba56611966566119c5565b6105005160405261054051606052610340516080526103605160a05260443560c052611993610580613aac565b61058051610560526104a0516105605111156119ba576105405161048052610560516104a0525b6001018181186118a9575b505060035461050052600062010000905b8061052052636982eb0b610560526103405161058052610360516105a052610520516105c0526020610560606461057c610500515afa611a1b573d600060003e3d6000fd5b60203d106148bc57610560518060a01c6148bc576105e0526105e051610540526105405115611b2f576105405160006105605260006008905b6020810261038001518318611a6e57600161056052611a79565b600101818118611a54575b505061056051905015611a9357611b2456611a9356611b2f565b6318160ddd610560526020610560600461057c610540515afa611abb573d600060003e3d6000fd5b60203d106148bc5761056051611ad057611b24565b6105005160405261054051606052610340516080526103605160a05260443560c052611afd610580613aac565b61058051610560526104a051610560511115611b24576105405161048052610560516104a0525b6001018181186119d6575b505061048051610520526104a0516105405260406105205bf35b633973e8348118611d17576004358060a01c6148bc57610340526024358060a01c6148bc57610360526044358060a01c6148bc5761038052346148bc576004546103a052600063379510496103c052610340516103e05260206103c060246103dc6103a0515afa611bbf573d600060003e3d6000fd5b60203d106148bc576103c0518060a01c6148bc57610400526104005114611c83576103605161042052610380516104405273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6103605118611c1e5760206148c1600039600051610420525b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6103805118611c4c5760206148c1600039600051610440525b60206103a05160405261034051606052610420516080526104405160a05260643560c052611c7b610460613c56565b610460611d15565b6002546103a05263379510496103c052610340516103e05260206103c060246103dc6103a0515afa611cba573d600060003e3d6000fd5b60203d106148bc576103c0518060a01c6148bc576104005261040051611ce2576003546103a0525b60206103a05160405261034051606052610360516080526103805160a05260643560c052611d116103c0613aac565b6103c05bf35b637fa5a654811861237e576004358060a01c6148bc576040526024358060a01c6148bc576060526044358060a01c6148bc57608052346148bc5760025460a05260603660c03763eb85226d610120526040516101405260605161016052608051610180526060610120606461013c60a0515afa611d99573d600060003e3d6000fd5b60603d106148bc576101205180600f0b81186148bc576101a0526101405180600f0b81186148bc576101c052610160518060011c6148bc576101e0526101a0805160c052602081015160e052604081015161010052506355b30b1961014052604051610160526020610140602461015c60a0515afa611e1d573d600060003e3d6000fd5b60203d106148bc576101405161012052637cdb72b061016052604051610180526040610160602461017c60a0515afa611e5b573d600060003e3d6000fd5b60403d106148bc576101605161014052610300366101603763940494f1610480526040516104a0526040610480602461049c60a0515afa611ea1573d600060003e3d6000fd5b60403d106148bc5761048060206101005160028110156148bc570281019050516104605261010051612055576392e3cc2d610480526040516104a052610100610480602461049c60a0515afa611efc573d600060003e3d6000fd5b6101003d106148bc5761048080516101605260208101516101805260408101516101a05260608101516101c05260808101516101e05260a08101516102005260c08101516102205260e081015161024052506352b51555610480526040516104a052610100610480602461049c60a0515afa611f7d573d600060003e3d6000fd5b6101003d106148bc5761048080516103605260208101516103805260408101516103a05260608101516103c05260808101516103e05260a08101516104005260c08101516104205260e0810151610440525063ce99e45a610480526040516104a052610100610480602461049c60a0515afa611ffe573d600060003e3d6000fd5b6101003d106148bc5761048080516102605260208101516102805260408101516102a05260608101516102c05260808101516102e05260a08101516103005260c08101516103205260e081015161034052506121a0565b6359f4f351610480526040516104a052610100610480602461049c60a0515afa612084573d600060003e3d6000fd5b6101003d106148bc5761048080516101605260208101516101805260408101516101a05260608101516101c05260808101516101e05260a08101516102005260c08101516102205260e08101516102405250634cb088f1610480526040516104a052610100610480602461049c60a0515afa612105573d600060003e3d6000fd5b6101003d106148bc5761048080516103605260208101516103805260408101516103a05260608101516103c05260808101516103e05260a08101516104005260c08101516104205260e0810151610440525060006008905b80610480526104605161048051186121745761219d565b670de0b6b3a764000060206104805160088110156148bc5702610260015260010181811861215d575b50505b60006008905b80610480526104605161048051186121bd57612232565b604e601260206104805160088110156148bc570261036001518082106148bc578082039050905010156148bc57601260206104805160088110156148bc570261036001518082106148bc5780820390509050600a0a60206104805160088110156148bc570261036001526001018181186121a6575b50506007604051602052600052604060002054610480526104805161225957600554610480525b602063ca3878906104a052610460516104c052610160516104e05261018051610500526101a051610520526101c051610540526101e051610560526102005161058052610220516105a052610240516105c052610120516105e0526101405161060052610260516106205261028051610640526102a051610660526102c051610680526102e0516106a052610300516106c052610320516106e0526103405161070052610360516107205261038051610740526103a051610760526103c051610780526103e0516107a052610400516107c052610420516107e052610440516108005260c0516108205260e051610840526064356108605260206104a06103c46104bc610480515afa612371573d600060003e3d6000fd5b60203d106148bc576104a0f35b634be9ae428118612cf5576004358060a01c6148bc576040526024358060a01c6148bc576060526044358060a01c6148bc57608052346148bc5760025460a0526103603660c0376355b30b1961044052604051610460526020610440602461045c60a0515afa6123f3573d600060003e3d6000fd5b60203d106148bc576104405161042052637cdb72b061046052604051610480526040610460602461047c60a0515afa612431573d600060003e3d6000fd5b60403d106148bc57610460516104405263eb85226d61046052604051610480526060516104a0526080516104c0526060610460606461047c60a0515afa61247d573d600060003e3d6000fd5b60603d106148bc576104605180600f0b81186148bc576104e0526104805180600f0b81186148bc57610500526104a0518060011c6148bc57610520526104e0805160c052602081015160e0526040810151610100525063940494f1610480526040516104a0526040610480602461049c60a0515afa612501573d600060003e3d6000fd5b60403d106148bc5761048060206101005160028110156148bc5702810190505161046052610100516126b5576392e3cc2d610480526040516104a052610100610480602461049c60a0515afa61255c573d600060003e3d6000fd5b6101003d106148bc5761048080516101205260208101516101405260408101516101605260608101516101805260808101516101a05260a08101516101c05260c08101516101e05260e081015161020052506352b51555610480526040516104a052610100610480602461049c60a0515afa6125dd573d600060003e3d6000fd5b6101003d106148bc5761048080516103205260208101516103405260408101516103605260608101516103805260808101516103a05260a08101516103c05260c08101516103e05260e0810151610400525063ce99e45a610480526040516104a052610100610480602461049c60a0515afa61265e573d600060003e3d6000fd5b6101003d106148bc5761048080516102205260208101516102405260408101516102605260608101516102805260808101516102a05260a08101516102c05260c08101516102e05260e08101516103005250612800565b6359f4f351610480526040516104a052610100610480602461049c60a0515afa6126e4573d600060003e3d6000fd5b6101003d106148bc5761048080516101205260208101516101405260408101516101605260608101516101805260808101516101a05260a08101516101c05260c08101516101e05260e08101516102005250634cb088f1610480526040516104a052610100610480602461049c60a0515afa612765573d600060003e3d6000fd5b6101003d106148bc5761048080516103205260208101516103405260408101516103605260608101516103805260808101516103a05260a08101516103c05260c08101516103e05260e0810151610400525060006008905b80610480526104605161048051186127d4576127fd565b670de0b6b3a764000060206104805160088110156148bc570261022001526001018181186127bd575b50505b60006008905b806104805261046051610480511861281d57612892565b604e601260206104805160088110156148bc570261032001518082106148bc578082039050905010156148bc57601260206104805160088110156148bc570261032001518082106148bc5780820390509050600a0a60206104805160088110156148bc57026103200152600101818118612806575b5050600760405160205260005260406000205461048052610480516128b957600554610480525b610c8063138f41f16104a052610460516104c052610120516104e0526101405161050052610160516105205261018051610540526101a051610560526101c051610580526101e0516105a052610200516105c052610420516105e052610440516106005261022051610620526102405161064052610260516106605261028051610680526102a0516106a0526102c0516106c0526102e0516106e052610300516107005261032051610720526103405161074052610360516107605261038051610780526103a0516107a0526103c0516107c0526103e0516107e052610400516108005260c0516108205260e05161084052606435610860526084356108805260a4356108a05260c4356108c05260e4356108e052610104356109005261012435610920526101443561094052610164356109605261018435610980526101a4356109a0526101c4356109c0526101e4356109e05261020435610a005261022435610a205261024435610a405261026435610a605261028435610a80526102a435610aa0526102c435610ac0526102e435610ae05261030435610b005261032435610b205261034435610b405261036435610b605261038435610b80526103a435610ba0526103c435610bc0526103e435610be05261040435610c005261042435610c205261044435610c405261046435610c605261048435610c80526104a435610ca0526104c435610cc0526104e435610ce05261050435610d005261052435610d205261054435610d405261056435610d605261058435610d80526105a435610da0526105c435610dc0526105e435610de05261060435610e005261062435610e205261064435610e405261066435610e605261068435610e80526106a435610ea0526106c435610ec0526106e435610ee05261070435610f005261072435610f205261074435610f405261076435610f605261078435610f80526107a435610fa0526107c435610fc0526107e435610fe052610804356110005261082435611020526108443561104052610864356110605261088435611080526108a4356110a0526108c4356110c0526108e4356110e052610904356111005261092435611120526109443561114052610964356111605261098435611180526109a4356111a0526109c4356111c0526109e4356111e052610a043561120052610a243561122052610a443561124052610a643561126052610a843561128052610aa4356112a052610ac4356112c052610ae4356112e052610b043561130052610b243561132052610b443561134052610b643561136052610b843561138052610ba4356113a052610bc4356113c052610be4356113e052610c043561140052610c243561142052610c443561144052610c643561146052610c843561148052610ca4356114a052610cc4356114c052610c806104a06110246104bc610480515afa612ce7573d600060003e3d6000fd5b610c803d106148bc576104a0f35b637b3d22cf8118612d1d5760006101605260006101805260006101a05260006101c052612d69565b63e6eabf2381186135a1576102c4358060a01c6148bc57610160526102e4358060a01c6148bc5761018052610304358060a01c6148bc576101a052610324358060a01c6148bc576101c0525b6004358060a01c6148bc576040526024358060a01c6148bc576060526044358060a01c6148bc576080526064358060a01c6148bc5760a0526084358060a01c6148bc5760c05260a4358060a01c6148bc5760e05260c4358060a01c6148bc576101005260e4358060a01c6148bc5761012052610104358060a01c6148bc5761014052346148bc576102a4356101e052600160048101905b806102005260206102005160028082028215828483041417156148bc579050905060018082106148bc578082039050905060098110156148bc5702604001516102205260206102005160018082106148bc578082039050905060048110156148bc570261016001516102405260606102005160018082106148bc578082039050905060048110156148bc57026101240180356102605260208101356102805260408101356102a0525060016102a05118612f1957635e0d443f6102c0526102605180607f1c6148bc576102e0526102805180607f1c6148bc57610300526101e0516103205260206102c060646102dc610220515afa612f04573d600060003e3d6000fd5b60203d106148bc576102c0516101e052613533565b60026102a05118612f89576307211ef76102c0526102605180607f1c6148bc576102e0526102805180607f1c6148bc57610300526101e0516103205260206102c060646102dc610220515afa612f74573d600060003e3d6000fd5b60203d106148bc576102c0516101e052613533565b60036102a05118612fe95763556d6e9f6102c052610260516102e05261028051610300526101e0516103205260206102c060646102dc610220515afa612fd4573d600060003e3d6000fd5b60203d106148bc576102c0516101e052613533565b60046102a05118613049576385f11d1e6102c052610260516102e05261028051610300526101e0516103205260206102c060646102dc610220515afa613034573d600060003e3d6000fd5b60203d106148bc576102c0516101e052613533565b60056102a051186130b9576307211ef76102c0526102605180607f1c6148bc576102e0526102805180607f1c6148bc57610300526101e0516103205260206102c060646102dc610240515afa6130a4573d600060003e3d6000fd5b60203d106148bc576102c0516101e052613533565b60066102a051186131215763e9737ee26102c052610240516102e052610260516103005261028051610320526101e0516103405260206102c060846102dc610220515afa61310c573d600060003e3d6000fd5b60203d106148bc576102c0516101e052613533565b60076102a051186131a45760006102c05260006102e0526101e05160206102605160028110156148bc57026102c0015263ed8e84f3610300526102c051610320526102e051610340526001610360526020610300606461031c610220515afa61318f573d600060003e3d6000fd5b60203d106148bc57610300516101e052613533565b6102a05160086102e05260096103005260006102c05260006002905b602081026102e0015183186131da5760016102c0526131e5565b6001018181186131c0575b50506102c05190506134b157600a6102a051186132905760006102c05260006102e0526000610300526000610320526101e05160206102605160048110156148bc57026102c0015263cf701ff7610340526102c051610360526102e05161038052610300516103a052610320516103c05260016103e052602061034060a461035c610220515afa61327b573d600060003e3d6000fd5b60203d106148bc57610340516101e052613533565b600b6102a0511861333d5760006102c05260006102e0526000610300526000610320526000610340526101e05160206102605160058110156148bc57026102c00152637ede89c5610360526102c051610380526102e0516103a052610300516103c052610320516103e0526103405161040052600161042052602061036060c461037c610220515afa613328573d600060003e3d6000fd5b60203d106148bc57610360516101e052613533565b6102a051600c6102e052600d6103005260006102c05260006002905b602081026102e0015183186133735760016102c05261337e565b600101818118613359575b50506102c051905061345c57600e6102a051186133e257634fb08c5e6102c0526101e0516102e052610280516103005260206102c060446102dc610220515afa6133cd573d600060003e3d6000fd5b60203d106148bc576102c0516101e052613533565b600f6102a051186133f257613533565b600d6102c0527f42616420737761702074797065000000000000000000000000000000000000006102e0526102c0506102c051806102e00181600003601f1636823750506308c379a06102805260206102a052601f19601f6102c051011660440161029cfd613533565b63cc2b27d7610320526101e051610340526102805180607f1c6148bc57610360526020610320604461033c610220515afa61349c573d600060003e3d6000fd5b60203d106148bc57610320516101e052613533565b6000610320526000610340526000610360526101e05160206102605160038110156148bc57026103200152633883e11961038052610320516103a052610340516103c052610360516103e0526001610400526020610380608461039c610220515afa613522573d600060003e3d6000fd5b60203d106148bc57610380516101e0525b60046102005118613545576001613583565b60206102005160028082028215828483041417156148bc5790509050600181818301106148bc578082019050905060098110156148bc570260400151155b1561358d57613598565b600101818118612e00575b505060206101e0f35b635d7dc82581186135f9576004358060a01c6148bc57604052346148bc576007604051602052600052604060002054606052606051156135e857602060606135f7566135f7565b600554608052602060806135f7565bf35b634bbc5b1f81186136e457346148bc5760015460405263a262904b606052602060606004607c6040515afa613633573d600060003e3d6000fd5b60203d106148bc576060518060a01c6148bc5760a05260a05160025563493f4f746060526003608052602060606024607c6040515afa613678573d600060003e3d6000fd5b60203d106148bc576060518060a01c6148bc5760a05260a05160035563493f4f746060526005608052602060606024607c6040515afa6136bd573d600060003e3d6000fd5b60203d106148bc576060518060a01c6148bc5760a05260a051600455600160605260206060f35b63188c7ee58118613772576004358060a01c6148bc576040526024358060a01c6148bc57606052346148bc5763f851a440608052602060806004609c6001545afa613734573d600060003e3d6000fd5b60203d106148bc576080518060a01c6148bc5760c05260c05133186148bc576060516007604051602052600052604060002055600160805260206080f35b63da3fb2ab81186137e4576004358060a01c6148bc57604052346148bc5763f851a440606052602060606004607c6001545afa6137b4573d600060003e3d6000fd5b60203d106148bc576060518060a01c6148bc5760a05260a05133186148bc57604051600555600160605260206060f35b63752d53c681186139a2576004358060a01c6148bc57604052346148bc5763f851a440606052602060606004607c6001545afa613826573d600060003e3d6000fd5b60203d106148bc576060518060a01c6148bc5760a05260a05133186148bc5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6040511861388a57600060605260605060006000606051608047335af1613997573d600060003e3d6000fd613997565b6370a082316080523060a052602060806024609c6040515afa6138b2573d600060003e3d6000fd5b60203d106148bc576080516060526000600460c0527fa9059cbb0000000000000000000000000000000000000000000000000000000060e05260c0805160208201836101200181518152505080830192505050338161012001526020810190506060518161012001526020810190508061010052610100505060206101a06101005161012060006040515af161394d573d600060003e3d6000fd5b61018060203d8082116139605781613962565b805b90509050815280518060805260208201805160a0525050506000608051146139975760a0516080516020036008021c156148bc575b600160605260206060f35b6390b229978118613a14576004358060011c6148bc57604052346148bc5763f851a440606052602060606004607c6001545afa6139e4573d600060003e3d6000fd5b60203d106148bc576060518060a01c6148bc5760a05260a05133186148bc57604051600655600160605260206060f35b637b1039998118613a3057346148bc5760025460405260206040f35b63f7cbf4c68118613a4c57346148bc5760035460405260206040f35b63f3b8f8298118613a6857346148bc5760045460405260206040f35b633b359fc88118613a8457346148bc5760055460405260206040f35b639c868ac08118613aa057346148bc5760065460405260206040f35b50613aaa56613aaa565b005b60603660e03763eb85226d61014052606051610160526080516101805260a0516101a0526060610140606461015c6040515afa613aee573d600060003e3d6000fd5b60603d106148bc576101405180600f0b81186148bc576101c0526101605180600f0b81186148bc576101e052610180518060011c6148bc57610200526101c0805160e0526020810151610100526040810151610120525061012051613b54576000613bb1565b60025460405118613b66576001613bb1565b63e4d332a961026052606051610280526020610260602461027c6040515afa613b94573d600060003e3d6000fd5b60203d106148bc57610260518060011c6148bc576102a0526102a0515b15613c07576307211ef76102c05260e0516102e052610100516103005260c0516103205260206102c060646102dc6060515afa613bf3573d600060003e3d6000fd5b60203d106148bc576102c051815250613c54565b635e0d443f6101405260e05161016052610100516101805260c0516101a0526020610140606461015c6060515afa613c44573d600060003e3d6000fd5b60203d106148bc57610140518152505b565b60403660e03763eb85226d61012052606051610140526080516101605260a051610180526040610120606461013c6040515afa613c98573d600060003e3d6000fd5b60403d106148bc57610120805160e0526020810151610100525063556d6e9f6101205260e05161014052610100516101605260c051610180526020610120606461013c6060515afa613cef573d600060003e3d6000fd5b60203d106148bc5761012051815250565b6006546148bc5760a0366101403763eb85226d6101e052606051610200526080516102205260a0516102405260606101e060646101fc6040515afa613d4a573d600060003e3d6000fd5b60603d106148bc576101e05180600f0b81186148bc57610260526102005180600f0b81186148bc5761028052610220518060011c6148bc576102a05261026080516101805260208101516101a05260408101516101c052506101c051613db1576000613db9565b600354604051145b15613f965763e4d332a96101e0526060516102005260206101e060246101fc6040515afa613dec573d600060003e3d6000fd5b60203d106148bc576101e0518060011c6148bc576102205261022051613e175760006101c052613f96565b60096060516020526000526040600020805461024052600181015461026052506102405115613e47576000613e4d565b61026051155b15613f0d5763c66106576102805260006102a0526020610280602461029c6060515afa613e7f573d600060003e3d6000fd5b60203d106148bc57610280518060a01c6148bc576102c0526102c0516102405263c66106576102e05260016103005260206102e060246102fc6060515afa613ecc573d600060003e3d6000fd5b60203d106148bc576102e0518060a01c6148bc5761032052610320516102605260096060516020526000526040600020610240518155610260516001820155505b60805160016102c05260006002905b6020810261024001518318613f365760006102c052613f41565b600101818118613f1c575b50506102c0519050613f8e5760a05160016102e05260006002905b6020810261024001518318613f765760006102e052613f81565b600101818118613f5c575b50506102e0519050613f91565b60015b6101c0525b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60805118613fbf5760c0516101405261405a565b6323b872dd6102245260046101005161024452306102645260c05161028452606001610220526102205060206102e06102205161024060006080515af161400b573d600060003e3d6000fd5b6102c060203d80821161401e5781614020565b805b9050905081528051806101e0526020820180516102005250505060006101e0511461405a57610200516101e0516020036008021c156148bc575b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee608051141561407f5760006140a3565b60086080516020526000526040600020806060516020526000526040600020905054155b156141805763095ea7b3610224526004606051610244527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61026452604001610220526102205060206102c06102205161024060006080515af161410c573d600060003e3d6000fd5b6102a060203d80821161411f5781614121565b805b9050905081528051806101e0526020820180516102005250505060006101e0511461415b57610200516101e0516020036008021c156148bc575b6001600860805160205260005260406000208060605160205260005260406000209050555b6101c0516141dd57633df021246101e05261018051610200526101a0516102205260c0516102405260e051610260526060513b156148bc576000600060846101fc610140516060515af161422e573d600060003e3d6000fd61422e565b63a6417ed66101e05261018051610200526101a0516102205260c0516102405260e051610260526060513b156148bc576000600060846101fc610140516060515af161422e573d600060003e3d6000fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60a0511861427f57476101605260006101e0526101e050600060006101e05161020047610120515af1614352573d600060003e3d6000fd614352565b6370a082316101e052306102005260206101e060246101fc60a0515afa6142ab573d600060003e3d6000fd5b60203d106148bc576101e0516101605263a9059cbb61022452600461012051610244526101605161026452604001610220526102205060206102c061022051610240600060a0515af1614303573d600060003e3d6000fd5b6102a060203d8082116143165781614318565b805b9050905081528051806101e0526020820180516102005250505060006101e0511461435257610200516101e0516020036008021c156148bc575b60605161012051610100517fbd3eb7bcfdd1721a4eb4f00d0df3ed91bd6f17222f82b2d7bce519d8cab3fe466080516101e05260a0516102005260c05161022052610160516102405260806101e0a461016051815250565b6006546148bc57606051610120526080516101405273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee606051186143ec5760206148c1600039600051610120525b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee608051186144195760206148c1600039600051610140525b6080366101603763eb85226d6101e052604051610200526101205161022052610140516102405260406101e060646101fc6004545afa61445e573d600060003e3d6000fd5b60403d106148bc576101e080516101a05260208101516101c0525073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee606051186144a25760a0516101605261453c565b6323b872dd61022452600460e05161024452306102645260a05161028452606001610220526102205060206102e06102205161024060006060515af16144ed573d600060003e3d6000fd5b6102c060203d8082116145005781614502565b805b9050905081528051806101e0526020820180516102005250505060006101e0511461453c57610200516101e0516020036008021c156148bc575b6008606051602052600052604060002080604051602052600052604060002090505461463a5763095ea7b3610224526004604051610244527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61026452604001610220526102205060206102c06102205161024060006060515af16145c6573d600060003e3d6000fd5b6102a060203d8082116145d957816145db565b805b9050905081528051806101e0526020820180516102005250505060006101e0511461461557610200516101e0516020036008021c156148bc575b6001600860605160205260005260406000208060405160205260005260406000209050555b606051610200526080516102205260006101e05260006002905b60208102610200015173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee186146825760016101e05261468d565b600101818118614654575b50506101e0516146ea57635b41b9086101e0526101a051610200526101c0516102205260a0516102405260c051610260526040513b156148bc576000600060846101fc60006040515af1614741573d600060003e3d6000fd614741565b63394747c5610240526101a051610260526101c0516102805260a0516102a05260c0516102c05260016102e0526040513b156148bc576000600060a461025c610160516040515af1614741573d600060003e3d6000fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6080511861479257476101805260006101e0526101e050600060006101e05161020047610100515af1614865573d600060003e3d6000fd614865565b6370a082316101e052306102005260206101e060246101fc6080515afa6147be573d600060003e3d6000fd5b60203d106148bc576101e0516101805263a9059cbb61022452600461010051610244526101805161026452604001610220526102205060206102c06102205161024060006080515af1614816573d600060003e3d6000fd5b6102a060203d808211614829578161482b565b805b9050905081528051806101e0526020820180516102005250505060006101e0511461486557610200516101e0516020036008021c156148bc575b6040516101005160e0517fbd3eb7bcfdd1721a4eb4f00d0df3ed91bd6f17222f82b2d7bce519d8cab3fe466060516101e0526080516102005260a05161022052610180516102405260806101e0a461018051815250565b600080fd005b600080fd0000000000000000000000000000000022d53366457f9d5e68ec105046fc438300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

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

0000000000000000000000000000000022d53366457f9d5e68ec105046fc438300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _address_provider (address): 0x0000000022d53366457f9d5e68ec105046fc4383
Arg [1] : _calculator (address): 0x0000000000000000000000000000000000000000
Arg [2] : _weth (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000022d53366457f9d5e68ec105046fc4383
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 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.