Adapter Integratees
In order to exchange some of a fund's assets for other assets, an adapter generally integrates with one or more "integratees," i.e., endpoints at which to interact with a defi protocol such as Kyber, Uniswap, Compound, etc.
AaveAdapter
Integrates with Aave lending via aTokens.
Docs: https://docs.aave.com/developers/the-core-protocol/atokens
Mainnet contracts:
LendingPoolAddressesProvider
:0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5
Functions and considerations:
lend()
- Noneredeem()
- None
AlphaHomoraV1Adapter
Integrates with Alpha Homora v1 lending via ibETH.
Docs: https://github.com/AlphaFinanceLab/alphahomora/blob/master/contracts/5/Bank.sol
Mainnet contracts:
Bank
(ibETH
):0x67B66C99D3Eb37Fa76Aa3Ed1ff33E8e39F0b9c7A
Functions and considerations:
lend()
- Noneredeem()
- None
ChaiAdapter
Integrates with Chai token.
Docs: https://github.com/dapphub/chai
Mainnet contracts:
Chai
:0x06AF07097C9Eeb7fD685c692751D5C66dB49c215
Functions and considerations:
lend()
- Noneredeem()
- None
CompoundAdapter
Integrates with Compound Finance's cTokens. Each cToken is its own integratee.
Docs: https://compound.finance/docs
Mainnet contracts:
cBAT
:0x6c8c6b02e7b2be14d4fa6022dfd6d75921d90e4e
cCOMP
:0x70e36f6bf80a52b3b46b3af8e106cc0ed743e8e4
cDAI
:0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643
cETH
:0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5
cREP
:0x158079ee67fce2f58472a96584a73c7ab9ac95c1
cUNI
:0x35A18000230DA775CAc24873d00Ff85BccdeD550
cUSDC
:0x39aa39c021dfbae8fac545936693ac917d5e7563
cZRX
:0xb3319f5d18bc0d84dd1b4825dcde5d5f7266d407
Functions and considerations:
lend()
- fund receivescToken
, which triggers theVaultProxy
to start accumulatingCOMP
based on the amount lent.COMP
is claimable natively on Compound on behalf of the fund (by any user)redeem()
- None
CurveExchangeAdapter
Integrates with Curve's universal interface for swapping between any assets in a given pool.
Docs: https://curve.readthedocs.io/registry-exchanges.html
Mainnet contracts:
AddressProvider
:0x0000000022D53366457F9d5E68Ec105046FC4383
Functions and considerations:
takeOrder()
: none
CurveLiquidityAaveAdapter
Integrates with the Curve aave
pool (aDAI, aUSDC, and aUSDT).
Note that lending/redemption can both be done from/to the underlying assets of the aTokens (DAI, USDC, USDT).
Docs: https://curve.readthedocs.io/addresses-overview.html (links to all relevant contracts)
Mainnet contracts:
StableSwapAave
:0xDeBF20617708857ebe4F679508E7b7863a8A8EeE
LP token:
0xFd2a8fA60Abd58Efe3EeE34dd494cD491dC14900
LiquidityGaugeV2
(for aave pool):0xd662908ADA2Ea1916B3318327A97eB18aD588b5d
Minter
:0xd061D61a4d941c39E5453435B6345Dc261C2fcE0
Router2
(Uniswap):0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Functions and considerations:
approveAssets()
- can only be used for rewards tokens that are assets in the Enzyme asset universeclaimRewards()
- noneclaimRewardsAndReinvest()
- trades all reward tokens into a user-specified "intermediary asset" (one of the pool's aTokens underlyings, i.e., DAI, USDC, or USDT) via UniswapV2, then uses that balance to lend and stake more of the LP token. Can either use only the newly claimed rewards token balances, or the full balances of reward tokens in the vaultclaimRewardsAndSwap()
- trades all reward tokens into a specified target asset. Can either use only the newly claimed rewards token balances, or the full balances of reward tokens in the vaultlend()
- noneredeem()
- redemption can be made for either an equal balance of underlying pool tokens (relative to pool proportions), or for either single asset in the poolstake()
- fund starts accruing $CRV and pool rewards (currently none) after actionunstake()
- nonelendAndStake()
- fund starts accruing $CRV and pool rewards (currently none) after actionunstakeAndRedeem()
- redemption can be made for either an equal balance of underlying pool tokens (relative to pool proportions), or for either single asset in the pool
Claiming accrued rewards can also be accomplished outside of the adapter through two mechanisms:
$CRV - must be claimed either through a call from the
VaultProxy
or by an account nominated via a call from theVaultProxy
. We register all of these as approved vault calls.pool rewards (if any are added) - can be claimed by any party at any time on behalf of the
VaultProxy
CurveLiquidityEursAdapter
Integrates with the Curve eurs
pool (EURS and Synthetix sEUR)
Docs: https://curve.readthedocs.io/ref-addresses.html (links to all relevant contracts)
Mainnet contracts:
StableSwapEURS
:0x0Ce6a5fF5217e38315f87032CF90686C96627CAA
LP token:
0x194eBd173F6cDacE046C53eACcE9B953F28411d1
LiquidityGaugeV2
(for eurs pool):0x90Bb609649E0451E5aD952683D64BD2d1f245840
Minter
:0xd061D61a4d941c39E5453435B6345Dc261C2fcE0
Functions and considerations:
claimRewards()
- nonelend()
- noneredeem()
- redemption can be made for either an equal balance of underlying pool tokens (relative to pool proportions), or for either single asset in the poolstake()
- fund starts accruing $CRV and pool rewards (currently none) after actionunstake()
- nonelendAndStake()
- fund starts accruing $CRV and pool rewards (currently none) after actionunstakeAndRedeem()
- redemption can be made for either an equal balance of underlying pool tokens (relative to pool proportions), or for either single asset in the pool
Claiming accrued rewards can also be accomplished outside of the adapter through two mechanisms:
$CRV - must be claimed either through a call from the
VaultProxy
or by an account nominated via a call from theVaultProxy
. We register all of these as approved vault calls.pool rewards (if any are added) - can be claimed by any party at any time on behalf of the
VaultProxy
CurveLiquiditySethAdapter
Integrates with the Curve seth
pool (ETH and Synthetix sETH)
Docs: https://curve.readthedocs.io/addresses-overview.html (links to all relevant contracts)
Mainnet contracts:
StableSwapSETH
:0xc5424B857f758E906013F3555Dad202e4bdB4567
LP token:
0xA3D87FffcE63B53E0d54fAa1cc983B7eB0b74A9c
LiquidityGaugeV2
(for sETH pool):0x3C0FFFF15EA30C35d7A85B85c0782D6c94e1d238
Minter
:0xd061D61a4d941c39E5453435B6345Dc261C2fcE0
Router2
(Uniswap):0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Functions and considerations:
approveAssets()
- can only be used for rewards tokens that are assets in the Enzyme asset universeclaimRewards()
- noneclaimRewardsAndReinvest()
- trades all reward tokens into WETH via UniswapV2, then uses that balance to lend and stake more of the LP token. Can either use only the newly claimed rewards token balances, or the full balances of reward tokens in the vaultclaimRewardsAndSwap()
- trades all reward tokens into a specified target asset. Can either use only the newly claimed rewards token balances, or the full balances of reward tokens in the vaultlend()
- noneredeem()
- redemption can be made for either an equal balance of underlying pool tokens (relative to pool proportions), or for either single asset in the poolstake()
- fund starts accruing $CRV and pool rewards (currently none) after actionunstake()
- nonelendAndStake()
- fund starts accruing $CRV and pool rewards (currently none) after actionunstakeAndRedeem()
- redemption can be made for either an equal balance of underlying pool tokens (relative to pool proportions), or for either single asset in the pool
Claiming accrued rewards can also be accomplished outside of the adapter through two mechanisms:
$CRV - must be claimed either through a call from the
VaultProxy
or by an account nominated via a call from theVaultProxy
. We register all of these as approved vault calls.pool rewards (if any are added) - can be claimed by any party at any time on behalf of the
VaultProxy
CurveLiquidityStethAdapter
Integrates with the Curve steth
pool (ETH and Lido stETH)
Docs: https://curve.readthedocs.io/addresses-overview.html (links to all relevant contracts)
Mainnet contracts:
StableSwapSTETH
:0xDC24316b9AE028F1497c275EB9192a3Ea0f67022
LP token:
0x06325440D014e39736583c165C2963BA99fAf14E
LiquidityGaugeV2
(for stETH pool):0x182B723a58739a9c974cFDB385ceaDb237453c28
Minter
:0xd061D61a4d941c39E5453435B6345Dc261C2fcE0
Router2
(Uniswap):0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Functions and considerations:
approveAssets()
- can only be used for rewards tokens that are assets in the Enzyme asset universeclaimRewards()
- noneclaimRewardsAndReinvest()
- trades all reward tokens into WETH via UniswapV2, then uses that balance to lend and stake more of the LP token. Can either use only the newly claimed rewards token balances, or the full balances of reward tokens in the vaultclaimRewardsAndSwap()
- trades all reward tokens into a specified target asset. Can either use only the newly claimed rewards token balances, or the full balances of reward tokens in the vaultlend()
- noneredeem()
- redemption can be made for either an equal balance of underlying pool tokens (relative to pool proportions), or for either single asset in the poolstake()
- fund starts accruing $CRV and $LDO rewards after actionunstake()
- nonelendAndStake()
- fund starts accruing $CRV and $LDO rewards after actionunstakeAndRedeem()
- redemption can be made for either an equal balance of underlying pool tokens (relative to pool proportions), or for either single asset in the pool
Claiming accrued rewards can also be accomplished outside of the adapter through two mechanisms:
$CRV - must be claimed either through a call from the
VaultProxy
or by an account nominated via a call from theVaultProxy
. We register all of these as approved vault calls.$LDO - can be claimed by any party at any time on behalf of the
VaultProxy
IdleAdapter
Integrates with the Idle Finance's IdleToken
contracts using the functions available in V4 of its protocol.
Docs: https://developers.idle.finance/
Mainnet contracts: each IdleToken
Functions and considerations:
approveAssets()
- can only be used for rewards tokens that are assets in the Enzyme asset universeclaimRewards()
- claimed rewards tokens are sent to the Vault, but are not reported asincomingAssets
, and thus are not emitted in an event, not run through policy management, and are not added as tracked assetsclaimRewardsAndReinvest()
- trades all reward tokens via UniswapV2 into theIdleToken
's underlying asset , which is then lent for moreidleToken
balance. Can either use only the newly claimed rewards token balances, or the full balances of reward tokens in the vaultclaimRewardsAndSwap()
- trades all reward tokens into a specified target asset. Can either use only the newly claimed rewards token balances, or the full balances of reward tokens in the vaultlend()
- noneredeem()
- any call to redeem() will also claim all rewards tokens; these rewards tokens are sent to the vault, but are not reported asincomingAssets
, and thus are not emitted in an event, not run through policy management, and are not added as tracked assets
Unclaimed rewards transfer to the recipient during ERC20 transfer calls, rather than auto-checkpointing as other protocols do.
KyberAdapter
Integrates with Kyber Network via the KyberNetworkProxy
.
Docs: https://developer.kyber.network/docs/Start/
Mainnet contracts:
KyberNetworkProxy
:0x9AAb3f75489902f3a48495025729a0AF77d4b11e
Functions and considerations:
takeOrder()
- None
ParaSwapV4Adapter
Integrates with ParaSwap (v4) via the AugustusSwapper
. Incorporates asset approvals via the TokenTransferProxy
.
Docs: https://etherscan.io/address/0x1bd435f3c054b6e901b7b108a0ab7617c808677b#code
Mainnet contracts:
AugustusSwapper
:0x1bD435F3C054b6e901B7b108a0ab7617C808677b
TokenTransferProxy
:0xb70Bc06D2c9Bf03b3373799606dc7d39346c06B3
Functions and considerations:
takeOrder()
- None
SynthetixAdapter
Integrates with Synthetix via SNX
.
Docs: https://docs.synthetix.io/
Mainnet contracts:
SNX
:0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F
Functions and considerations:
takeOrder()
- Synthetix gives the incoming asset of the trade a provisional "best guess" balance until it reaches finality, which is after the Synthetix-defined "waiting period" (currently 3 minutes) has expired. The final balance can be +/- the provisional balance.
TrackedAssetsAdapter
Does not integrate with any external integrations.
It only serves to add/remove tracked assets to/from a fund in a manner that subjects it to additional policy management.
Functions and considerations:
addTrackedAssets()
- NoneremoveTrackedAssets()
- Only allows removal if theVaultProxy
asset balance is less than a "dust threshold"
UniswapV2Adapter
Integrates with UniswapV2 for trading and for liquidity provision and redemption.
Docs: https://uniswap.org/docs/v2/
Mainnet contracts:
UniswapV2Factory
:0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
UniswapV2Router2
:0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Functions and considerations:
takeOrder()
- Nonelend()
- Noneredeem()
- None
UniswapV3Adapter
Integrates with UniswapV3 for trading (not LP)
Docs: https://docs.uniswap.org/
Mainnet contracts:
SwapRouter
:0xE592427A0AEce92De3Edee1F18E0157C05861564
Functions and considerations:
takeOrder()
- None
YearnVaultV2Adapter
Integrates with Yearn vault v2 instances
Docs: https://docs.yearn.finance/
Mainnet contracts:
all Yearn vault v2 instances
Functions and considerations:
lend()
- noneredeem()
- none
Note that while all Yearn vault v2 instances adhere to the same interface, each individual instance uses one of many particular versioned implementations (see v2.registry.ychad.eth
). Only the adapter interactions with expected behaviors of interface functions can be realistically audited.
ZeroExV2Adapter
Integrates with the 0x Protocol.
Docs: https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md
Mainnet contracts:
Exchange
:0x080bf510fcbf18b91105470639e9561022937712
ERC20Proxy
:0x95e6f48254609a6ee006f7d493c8e5fb97094cef
Functions and considerations:
takeOrder()
- Left unchecked, the 0x Protocol allows filling any trade created by any user, irrespective of whether the resulting value is beneficial for the fund. This adapter method is limited to makers approved by the Enzyme Council to mitigate this issue.
Last updated