Deployed Curve pool contracts.
Each subdirectory holds contracts and other files specific to a single Curve pool.
3pool
: Tri-poolaave
: Aave pool, with lending on Aavebbtc
: bBTC metapoolbusd
: BUSD pool, with lending on yearn.financecompound
: Compound pool, with lending on Compounddusd
: DUSD metapooleurs
: EURS poolgusd
: GUSD metapoolhbtc
: hBTC poolhusd
: HUSD metapoollinkusd
: LinkUSD metapoolmusd
: MUSD metapoolobtc
: oBTC metapoolpax
: PAX pool, with lending on yearn.financepbtc
: pBTC metapoolren
: RenBTC poolrsv
: RSV metapoolsbtc
: sBTC poolseth
: sETH poolsteth
: stETH poolsusd
: sUSD pooltbtc
: tBTC metapoolusdk
: USDK metapoolusdn
: USDN metapoolusdt
: USDT pool, with lending on Compoundust
: UST metapooly
: Y pool, with lending on yearn.finance
- Contracts for a new pool should be placed in their own subdirectory using the same name as is given on the website.
- The LP token contract does not need to be included, unless it deviates from the standard contracts within
contracts/testing
- Each subdirectory must contain a
pooldata.json
file using the structure given below. This is required in order to initialize fixtures when running the test suite.
{
"lp_contract": "CurveTokenV1", // LP token contract to use with this pool, from `contracts/tokens`
"wrapped_contract": "yERC20", // mock wrapped coin contract to use, from `contracts/testing`
// optional
"rate_calculator_address": "" // address of exchange rate calculator for with unique pool logic
// constructor settings for the LP token - required for deployment
"lp_constructor": {
"symbol": "",
"name": ""
},
// constructor settings for the pool - required for deployment
"swap_constructor": {
"_A": 200,
"_fee": 4000000,
"_admin_fee": 0
},
// each list item represents 1 swappable coin within the pool
"coins": [
{
// required fields
"decimals": 18, // number of decimal places for the underlying coin - omit if no underlying
"wrapped_decimals": 18, // decimal places for the wrapped coin - omit if no wrapping
"tethered": false, // does the token contract return `None` on a successful transfer/approve?
// optional fields
"name": "", // underlying coin name
"withdrawal_fee": 0, // fee applied when converting wrapped to underlying, expressed in bps
"underlying_address": "0x00", // underlying coin mainnet deployment address, used in forked tests
"wrapped_address": "0x00" // wrapped coin mainnet deployment address
},
],
// optional settings used in unit tests
"testing": {
"initial_amount": 100 // amount of each coin to be added as initial liquidity
}
}
A metapool is a pool where a stablecoin is paired against the LP token from another pool.
The pooldata.json
for a metapool is similar to that of a regular pool:
{
"lp_contract": "CurveContractV2", // LP token contract to use with this pool, from `contracts/tokens`
"base_pool": "3pool", // Name for the related base pool
"coins": [
{
// the first coin in the metapool is an unwrapped stablecoin
"decimals": 18,
"tethered": false,
},
{
// the second coin in the metapool is the LP token from the base pool
"decimals": 18,
"base_pool_token": true
}
]
}