Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x0c0e5f2fF0ff18a3be9b835635039256dC4B4963
Balance 0 ETH
Nonce 127
Code Size 5314 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

5314 bytes
0x6003361161000c57611436565b5f3560e01c346114b15763f851a440811861002c575f5460405260206040f35b6317f7182a81186100435760015460405260206040f35b63cab4d3db811861005a5760025460405260206040f35b633273ff47811861008557602436106114b15760036004356020525f5260405f205460405260206040f35b638df24207811861009c5760045460405260206040f35b63e31593d881186100b35760055460405260206040f35b63a13c8f8181186100ca5760065460405260206040f35b63956aae3a81186100e15760095460405260206040f35b633a1d5d8e811861010f57602436106114b15760043563ffffffff81116114b157600b015460405260206040f35b63aa38b38581186109445761026436106114b15760043560040160408135116114b157803560208201818161010037508060e052505060243560040160208135116114b15780356020820180356101605250806101405250506044358060a01c6114b157610180526064358060a01c6114b1576101a0526084358060a01c6114b1576101c05260a4358060a01c6114b1576101e052600360c4356020525f5260405f2054610200526102005161022457601b610220527f506f6f6c20696d706c656d656e746174696f6e206e6f742073657400000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b610a8c60e435106114b157631017df8060e435116114b1576402540be40061010435106114b15766b1a2bc2ec5000061010435116114b1576402540be3fe61012435116114b1576101243561014435106114b1576402540be3fe61014435116114b157670de0b6b3a764000061016435116114b15761016435156114b157670de0b6b3a764000061018435116114b157670de0b6b3a76400006101a435116114b1576101a435156114b157620d505d6101c435116114b15760576101c435106114b157620f42416101e4356102043580828118828410021890509050106114b1576c0c9f2c9cd04674edea3fffffff6101e4356102043580828118828411021890509050116114b1576101a051610180511461035c576101c0516101a05114610356576101c05161018051141561035e565b5f61035e565b5f5b6103c757600f610220527f4475706c696361746520636f696e7300000000000000000000000000000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b60c036610220375f6003905b806102e0526102e051600281116114b15760051b610180015163313ce567610320526020610320600461033c845afa61040e573d5f5f3e3d5ffd5b60203d106114b157610320905051610300526012610300511115610491576019610320527f4d617820313820646563696d616c7320666f7220636f696e73000000000000006103405261032050610320518061034001601f825f031636823750506308c379a06102e052602061030052601f19601f6103205101166044016102fcfd5b610300516102e051600281116114b15760051b61022001526103005180601203601281116114b1579050604d81116114b15780600a0a90506102e051600281116114b15760051b61028001526001018181186103d3575050610280516040526102a0516060526102c05160805261050961030061143a565b610300516102e052606061012460403761052461032061143a565b6103205161030052606061018460403761053f61034061143a565b610340516103205260e43560801b61034052610104356103405117610340525f610360525f6002905b80610380526103605160801b610360526103805180600103600181116114b1579050600181116114b15760051b6101e401356103a0526ffffffffffffffffffffffffffffffffe6103a051116114b157610360516103a05117610360526001018181186105685750506001430340610380526006546103a052610200516101a0806104e052806104e00160e0516020820181818361010060045afa5050808252508051806020830101601f825f03163682375050601f19601f825160200101169050810190508061050052806104e001610140516020820161016051815250808252508051806020830101601f825f03163682375050601f19601f8251602001011690508101905061018051610520526101a051610540526101c051610560526103a0516103e0526103e051610580526101e05161040052610400516105a0526103805161042052610420516105c0526102e05161044052610440516105e0526103405161046052610460516106005261030051610480526104805161062052610320516104a0526104a05161064052610360516104c0526104c051610660526003823b0359600182126114b15781600382863c8181018381856104e060045afa5050828201815ff080156114b15790509050905090506103c0526009546103e0526103c0516103e05163ffffffff81116114b157600b01556103e051600181018181106114b1579050600955600a6103c0516020525f5260405f2060048101905061022051815561024051600182015561026051600282015550600a6103c0516020525f5260405f206001810190506101805181556101a05160018201556101c051600282015550610180516040526101a0516060526103c0516080526107ee611450565b610180516040526101c0516060526103c05160805261080b611450565b6101a0516040526101c0516060526103c051608052610828611450565b7fa307f5d0802489baddec443058a63ce115756de9020e2b07d3e2cd2f21269e2a6101e06103c051610400528061042052806104000160e0516020820181818361010060045afa5050808252508051806020830101601f825f03163682375050601f19601f8251602001011690508101905080610440528061040001610140516020820161016051815250808252508051806020830101601f825f03163682375050601f19601f825160200101169050810190506101e0516104605261018051610480526101a0516104a0526101c0516104c0526103a0516104e05261038051610500526102e05161052052610340516105405261030051610560526103205161058052610360516105a052336105c052610400a160206103c0f35b6396bebb348118610b3c57602436106114b1576004358060a01c6114b157604052600a6040516020525f5260405f20600181019050546109da57600c6060527f556e6b6e6f776e20706f6f6c000000000000000000000000000000000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600a6040516020525f5260405f205415610a4a5760166060527f476175676520616c7265616479206465706c6f7965640000000000000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600454610aad57601c6060527f476175676520696d706c656d656e746174696f6e206e6f74207365740000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60045460405160805260805160a05260206003823b0359600182126114b15781600382863c81810160a051815250828201815ff080156114b1579050905090509050606052606051600a6040516020525f5260405f20557f656bb34c20491970a8c163f3bd62ead82022b379c3924960ec60f6dbfc5aab3b60405160805260605160a05260406080a160206060f35b63e41ab7718118610bfc57602436106114b1576004358060a01c6114b1576040525f54331815610bc257600f6060527f6465763a2061646d696e206f6e6c79000000000000000000000000000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b7f2861448678f0be67f11bfb5481b3e3b4cfeb3acc6126ad60a05f95bfc653066660025460605260405160805260406060a1604051600255005b636f385ff68118610cda57604436106114b1576004358060a01c6114b1576040525f54331815610c8257600f6060527f6465763a2061646d696e206f6e6c79000000000000000000000000000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b7f6a42ef9605e135afaf6ae4f3683b161a3b7369d07c9d52c701ab69553e04c3b660243560605260036024356020525f5260405f205460805260405160a05260606060a160405160036024356020525f5260405f2055005b638f03182c8118610d9a57602436106114b1576004358060a01c6114b1576040525f54331815610d6057600f6060527f6465763a2061646d696e206f6e6c79000000000000000000000000000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b7f1fd705f9c77053962a503f2f2f57f0862b4c3af687c25615c13817a86946c35960045460605260405160805260406060a1604051600455005b63f6fa937f8118610e5a57602436106114b1576004358060a01c6114b1576040525f54331815610e2057600f6060527f6465763a2061646d696e206f6e6c79000000000000000000000000000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b7fd84eb1ea70cda40a6bfaa11f4f69efa10cbc5eb82760b3058f440512ec1d6d1f60055460605260405160805260406060a1604051600555005b63b07426f48118610f1a57602436106114b1576004358060a01c6114b1576040525f54331815610ee057600f6060527f6465763a2061646d696e206f6e6c79000000000000000000000000000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b7f68fe8fc3ac76ec17e21117df5e854c8c25b7b5f776aad2adc927fdd156bcd6de60065460605260405160805260406060a1604051600655005b636b441a408118610fa857602436106114b1576004358060a01c6114b1576040525f54331815610fa057600f6060527f6465763a2061646d696e206f6e6c79000000000000000000000000000000000060805260605060605180608001601f825f031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051600155005b63e5ea47b8811861104c576001543318156110185760166040527f6465763a206675747572652061646d696e206f6e6c790000000000000000000060605260405060405180606001601f825f031636823750506308c379a05f526020602052601f19601f6040510116604401601cfd5b7f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c5f546040523360605260406040a1335f55005b63a87df06c811861106857604436106114b1575f608052611082565b636982eb0b81186110d257606436106114b1576044356080525b6004358060a01c6114b1576040526024358060a01c6114b1576060526060516040511860a052600760a0516020525f5260405f2060805163ffffffff81116114b157810190505460c052602060c0f35b639ac90d3d811861112357602436106114b1576004358060a01c6114b157604052600a6040516020525f5260405f2060018101905080546060526001810154608052600281015460a0525060606060f35b6352b51555811861117457602436106114b1576004358060a01c6114b157604052600a6040516020525f5260405f2060048101905080546060526001810154608052600281015460a0525060606060f35b6392e3cc2d811861124457602436106114b1576004358060a01c6114b157604052604051634903b0d16060525f608052602060606024607c845afa6111bb573d5f5f3e3d5ffd5b60203d106114b157606090505161012052604051634903b0d160a052600160c052602060a0602460bc845afa6111f3573d5f5f3e3d5ffd5b60203d106114b15760a090505161014052604051634903b0d160e052600261010052602060e0602460fc845afa61122c573d5f5f3e3d5ffd5b60203d106114b15760e0905051610160526060610120f35b63eb85226d81186113aa57606436106114b1576004358060a01c6114b1576040526024358060a01c6114b1576060526044358060a01c6114b157608052600a6040516020525f5260405f20600181019050805460a052600181015460c052600281015460e052505f6003905b80610100525f6003905b80610120526101205161010051186112d15761132e565b60605161010051600281116114b15760051b60a00151186113095760805161012051600281116114b15760051b60a00151181561130b565b5f5b1561132e57505050506101005161014052610120516101605260406101406113a8565b6001018181186112ba5750506001018181186112b0575050600f610100527f436f696e73206e6f7420666f756e6400000000000000000000000000000000006101205261010050610100518061012001601f825f031636823750506308c379a060c052602060e052601f19601f61010051011660440160dcfd5bf35b63daf297b981186113e357602436106114b1576004358060a01c6114b157604052600a6040516020525f5260405f205460605260206060f35b63c1856b52811861143457604436106114b1576004358060a01c6114b1576040526024358060a01c6114b1576060526060516040511860805260086080516020525f5260405f205460a052602060a0f35b505b5f5ffd5b60805160605160401b60405160801b1717815250565b6060516040511860a052600860a0516020525f5260405f205460c052608051600760a0516020525f5260405f2060c05163ffffffff81116114b157810190505560c051600181018181106114b1579050600860a0516020525f5260405f2055565b5f80fda165767970657283000309000b

Verified Source Code Partial Match

Compiler: v0.3.9+commit.66b96705 EVM: cancun
CurveTricryptoFactory.vy 502 lines
# @version 0.3.9

"""
@title CurveTricryptoFactory
@author Curve.Fi
@license Copyright (c) Curve.Fi, 2020-2023 - all rights reserved
@notice Permissionless 3-coin cryptoswap pool deployer and registry
"""

interface TricryptoPool:
    def balances(i: uint256) -> uint256: view

interface ERC20:
    def decimals() -> uint256: view


event TricryptoPoolDeployed:
    pool: address
    name: String[64]
    symbol: String[32]
    weth: address
    coins: address[N_COINS]
    math: address
    salt: bytes32
    packed_precisions: uint256
    packed_A_gamma: uint256
    packed_fee_params: uint256
    packed_rebalancing_params: uint256
    packed_prices: uint256
    deployer: address


event LiquidityGaugeDeployed:
    pool: address
    gauge: address

event UpdateFeeReceiver:
    _old_fee_receiver: address
    _new_fee_receiver: address

event UpdatePoolImplementation:
    _implemention_id: uint256
    _old_pool_implementation: address
    _new_pool_implementation: address

event UpdateGaugeImplementation:
    _old_gauge_implementation: address
    _new_gauge_implementation: address

event UpdateMathImplementation:
    _old_math_implementation: address
    _new_math_implementation: address

event UpdateViewsImplementation:
    _old_views_implementation: address
    _new_views_implementation: address

event TransferOwnership:
    _old_owner: address
    _new_owner: address


struct PoolArray:
    liquidity_gauge: address
    coins: address[N_COINS]
    decimals: uint256[N_COINS]


N_COINS: constant(uint256) = 3
A_MULTIPLIER: constant(uint256) = 10000

# Limits
MAX_FEE: constant(uint256) = 10 * 10 ** 9

MIN_GAMMA: constant(uint256) = 10 ** 10
MAX_GAMMA: constant(uint256) = 5 * 10**16

MIN_A: constant(uint256) = N_COINS ** N_COINS * A_MULTIPLIER / 100
MAX_A: constant(uint256) = 1000 * A_MULTIPLIER * N_COINS**N_COINS

PRICE_SIZE: constant(uint128) = 256 / (N_COINS - 1)
PRICE_MASK: constant(uint256) = 2**PRICE_SIZE - 1

admin: public(address)
future_admin: public(address)

# fee receiver for all pools:
fee_receiver: public(address)

pool_implementations: public(HashMap[uint256, address])
gauge_implementation: public(address)
views_implementation: public(address)
math_implementation: public(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[4294967296]]
market_counts: HashMap[uint256, uint256]

pool_count: public(uint256)              # actual length of pool_list
pool_data: HashMap[address, PoolArray]
pool_list: public(address[4294967296])   # master list of pools


@external
def __init__(_fee_receiver: address, _admin: address):

    self.fee_receiver = _fee_receiver
    self.admin = _admin

    log UpdateFeeReceiver(empty(address), _fee_receiver)
    log TransferOwnership(empty(address), _admin)


@internal
@view
def _pack(x: uint256[3]) -> uint256:
    """
    @notice Packs 3 integers with values <= 10**18 into a uint256
    @param x The uint256[3] to pack
    @return The packed uint256
    """
    return (x[0] << 128) | (x[1] << 64) | x[2]



# <--- Pool Deployers --->

@external
def deploy_pool(
    _name: String[64],
    _symbol: String[32],
    _coins: address[N_COINS],
    _weth: address,
    implementation_id: uint256,
    A: uint256,
    gamma: uint256,
    mid_fee: uint256,
    out_fee: uint256,
    fee_gamma: uint256,
    allowed_extra_profit: uint256,
    adjustment_step: uint256,
    ma_exp_time: uint256,
    initial_prices: uint256[N_COINS-1],
) -> address:
    """
    @notice Deploy a new pool
    @param _name Name of the new plain pool
    @param _symbol Symbol for the new plain pool - will be concatenated with factory symbol

    @return Address of the deployed pool
    """
    pool_implementation: address = self.pool_implementations[implementation_id]
    assert pool_implementation != empty(address), "Pool implementation not set"

    # Validate parameters
    assert A > MIN_A-1
    assert A < MAX_A+1

    assert gamma > MIN_GAMMA-1
    assert gamma < MAX_GAMMA+1

    assert mid_fee < MAX_FEE-1  # mid_fee can be zero
    assert out_fee >= mid_fee
    assert out_fee < MAX_FEE-1
    assert fee_gamma < 10**18+1
    assert fee_gamma > 0

    assert allowed_extra_profit < 10**18+1

    assert adjustment_step < 10**18+1
    assert adjustment_step > 0

    assert ma_exp_time < 872542  # 7 * 24 * 60 * 60 / ln(2)
    assert ma_exp_time > 86  # 60 / ln(2)

    assert min(initial_prices[0], initial_prices[1]) > 10**6
    assert max(initial_prices[0], initial_prices[1]) < 10**30

    assert _coins[0] != _coins[1] and _coins[1] != _coins[2] and _coins[0] != _coins[2], "Duplicate coins"

    decimals: uint256[N_COINS] = empty(uint256[N_COINS])
    precisions: uint256[N_COINS] = empty(uint256[N_COINS])
    for i in range(N_COINS):
        d: uint256 = ERC20(_coins[i]).decimals()
        assert d < 19, "Max 18 decimals for coins"
        decimals[i] = d
        precisions[i] = 10** (18 - d)

    # pack precisions
    packed_precisions: uint256 = self._pack(precisions)

    # pack fees
    packed_fee_params: uint256 = self._pack(
        [mid_fee, out_fee, fee_gamma]
    )

    # pack liquidity rebalancing params
    packed_rebalancing_params: uint256 = self._pack(
        [allowed_extra_profit, adjustment_step, ma_exp_time]
    )

    # pack A_gamma
    packed_A_gamma: uint256 = A << 128
    packed_A_gamma = packed_A_gamma | gamma

    # pack initial prices
    packed_prices: uint256 = 0
    for k in range(N_COINS - 1):
        packed_prices = packed_prices << PRICE_SIZE
        p: uint256 = initial_prices[N_COINS - 2 - k]
        assert p < PRICE_MASK
        packed_prices = p | packed_prices

    # pool is an ERC20 implementation
    _salt: bytes32 = block.prevhash
    _math_implementation: address = self.math_implementation
    pool: address = create_from_blueprint(
        pool_implementation,
        _name,
        _symbol,
        _coins,
        _math_implementation,
        _weth,
        _salt,
        packed_precisions,
        packed_A_gamma,
        packed_fee_params,
        packed_rebalancing_params,
        packed_prices,
        code_offset=3
    )

    # populate pool data
    length: uint256 = self.pool_count
    self.pool_list[length] = pool
    self.pool_count = length + 1
    self.pool_data[pool].decimals = decimals
    self.pool_data[pool].coins = _coins

    # add coins to market:
    self._add_coins_to_market(_coins[0], _coins[1], pool)
    self._add_coins_to_market(_coins[0], _coins[2], pool)
    self._add_coins_to_market(_coins[1], _coins[2], pool)

    log TricryptoPoolDeployed(
        pool,
        _name,
        _symbol,
        _weth,
        _coins,
        _math_implementation,
        _salt,
        packed_precisions,
        packed_A_gamma,
        packed_fee_params,
        packed_rebalancing_params,
        packed_prices,
        msg.sender,
    )

    return pool


@internal
def _add_coins_to_market(coin_a: address, coin_b: address, pool: address):

    key: uint256 = (
        convert(coin_a, uint256) ^ convert(coin_b, uint256)
    )

    length: uint256 = self.market_counts[key]
    self.markets[key][length] = pool
    self.market_counts[key] = length + 1


@external
def deploy_gauge(_pool: address) -> address:
    """
    @notice Deploy a liquidity gauge for a factory pool
    @param _pool Factory pool address to deploy a gauge for
    @return Address of the deployed gauge
    """
    assert self.pool_data[_pool].coins[0] != empty(address), "Unknown pool"
    assert self.pool_data[_pool].liquidity_gauge == empty(address), "Gauge already deployed"
    assert self.gauge_implementation != empty(address), "Gauge implementation not set"

    gauge: address = create_from_blueprint(self.gauge_implementation, _pool, code_offset=3)
    self.pool_data[_pool].liquidity_gauge = gauge

    log LiquidityGaugeDeployed(_pool, gauge)
    return gauge


# <--- Admin / Guarded Functionality --->


@external
def set_fee_receiver(_fee_receiver: address):
    """
    @notice Set fee receiver
    @param _fee_receiver Address that fees are sent to
    """
    assert msg.sender == self.admin, "dev: admin only"

    log UpdateFeeReceiver(self.fee_receiver, _fee_receiver)
    self.fee_receiver = _fee_receiver


@external
def set_pool_implementation(
    _pool_implementation: address, _implementation_index: uint256
):
    """
    @notice Set pool implementation
    @dev Set to empty(address) to prevent deployment of new pools
    @param _pool_implementation Address of the new pool implementation
    @param _implementation_index Index of the pool implementation
    """
    assert msg.sender == self.admin, "dev: admin only"

    log UpdatePoolImplementation(
        _implementation_index,
        self.pool_implementations[_implementation_index],
        _pool_implementation
    )

    self.pool_implementations[_implementation_index] = _pool_implementation


@external
def set_gauge_implementation(_gauge_implementation: address):
    """
    @notice Set gauge implementation
    @dev Set to empty(address) to prevent deployment of new gauges
    @param _gauge_implementation Address of the new token implementation
    """
    assert msg.sender == self.admin, "dev: admin only"

    log UpdateGaugeImplementation(self.gauge_implementation, _gauge_implementation)
    self.gauge_implementation = _gauge_implementation


@external
def set_views_implementation(_views_implementation: address):
    """
    @notice Set views contract implementation
    @param _views_implementation Address of the new views contract
    """
    assert msg.sender == self.admin,  "dev: admin only"

    log UpdateViewsImplementation(self.views_implementation, _views_implementation)
    self.views_implementation = _views_implementation


@external
def set_math_implementation(_math_implementation: address):
    """
    @notice Set math implementation
    @param _math_implementation Address of the new math contract
    """
    assert msg.sender == self.admin, "dev: admin only"

    log UpdateMathImplementation(self.math_implementation, _math_implementation)
    self.math_implementation = _math_implementation


@external
def commit_transfer_ownership(_addr: address):
    """
    @notice Transfer ownership of this contract to `addr`
    @param _addr Address of the new owner
    """
    assert msg.sender == self.admin, "dev: admin only"

    self.future_admin = _addr


@external
def accept_transfer_ownership():
    """
    @notice Accept a pending ownership transfer
    @dev Only callable by the new owner
    """
    assert msg.sender == self.future_admin, "dev: future admin only"

    log TransferOwnership(self.admin, msg.sender)
    self.admin = msg.sender


# <--- Factory Getters --->


@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 = convert(_from, uint256) ^ convert(_to, uint256)
    return self.markets[key][i]


# <--- Pool Getters --->


@view
@external
def get_coins(_pool: address) -> address[N_COINS]:
    """
    @notice Get the coins within a pool
    @param _pool Pool address
    @return List of coin addresses
    """
    return self.pool_data[_pool].coins


@view
@external
def get_decimals(_pool: address) -> uint256[N_COINS]:
    """
    @notice Get decimal places for each coin within a pool
    @param _pool Pool address
    @return uint256 list of decimals
    """
    return self.pool_data[_pool].decimals


@view
@external
def get_balances(_pool: address) -> uint256[N_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 [
        TricryptoPool(_pool).balances(0),
        TricryptoPool(_pool).balances(1),
        TricryptoPool(_pool).balances(2),
    ]


@view
@external
def get_coin_indices(
    _pool: address,
    _from: address,
    _to: address
) -> (uint256, uint256):
    """
    @notice Convert coin addresses to indices for use with pool methods
    @param _pool Pool address
    @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 uint256 `i`, uint256 `j`
    """
    coins: address[N_COINS] = self.pool_data[_pool].coins

    for i in range(N_COINS):
        for j in range(N_COINS):
            if i == j:
                continue

            if coins[i] == _from and coins[j] == _to:
                return i, j

    raise "Coins not found"


@view
@external
def get_gauge(_pool: address) -> address:
    """
    @notice Get the address of the liquidity gauge contract for a factory pool
    @dev Returns `empty(address)` if a gauge has not been deployed
    @param _pool Pool address
    @return Implementation contract address
    """
    return self.pool_data[_pool].liquidity_gauge


@view
@external
def get_market_counts(coin_a: address, coin_b: address) -> uint256:
    """
    @notice Gets the number of markets with the specified coins.
    @return Number of pools with the input coins
    """

    key: uint256 = (
        convert(coin_a, uint256) ^ convert(coin_b, uint256)
    )

    return self.market_counts[key]

Read Contract

admin 0xf851a440 → address
fee_receiver 0xcab4d3db → address
find_pool_for_coins 0xa87df06c → address
find_pool_for_coins 0x6982eb0b → address
future_admin 0x17f7182a → address
gauge_implementation 0x8df24207 → address
get_balances 0x92e3cc2d → uint256[3]
get_coin_indices 0xeb85226d → uint256, uint256
get_coins 0x9ac90d3d → address[3]
get_decimals 0x52b51555 → uint256[3]
get_gauge 0xdaf297b9 → address
get_market_counts 0xc1856b52 → uint256
math_implementation 0xa13c8f81 → address
pool_count 0x956aae3a → uint256
pool_implementations 0x3273ff47 → address
pool_list 0x3a1d5d8e → address
views_implementation 0xe31593d8 → address

Write Contract 9 functions

These functions modify contract state and require a wallet transaction to execute.

accept_transfer_ownership 0xe5ea47b8
No parameters
commit_transfer_ownership 0x6b441a40
address _addr
deploy_gauge 0x96bebb34
address _pool
returns: address
deploy_pool 0xaa38b385
string _name
string _symbol
address[3] _coins
address _weth
uint256 implementation_id
uint256 A
uint256 gamma
uint256 mid_fee
uint256 out_fee
uint256 fee_gamma
uint256 allowed_extra_profit
uint256 adjustment_step
uint256 ma_exp_time
uint256[2] initial_prices
returns: address
set_fee_receiver 0xe41ab771
address _fee_receiver
set_gauge_implementation 0x8f03182c
address _gauge_implementation
set_math_implementation 0xb07426f4
address _math_implementation
set_pool_implementation 0x6f385ff6
address _pool_implementation
uint256 _implementation_index
set_views_implementation 0xf6fa937f
address _views_implementation

Recent Transactions

No transactions found for this address