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() - None

  • redeem() - 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() - None

  • redeem() - None

ChaiAdapter

Integrates with Chai token.

Docs: https://github.com/dapphub/chai

Mainnet contracts:

  • Chai: 0x06AF07097C9Eeb7fD685c692751D5C66dB49c215

Functions and considerations:

  • lend() - None

  • redeem() - 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 receives cToken , which triggers the VaultProxy to start accumulating COMP 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 universe

  • claimRewards() - none

  • claimRewardsAndReinvest() - 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 vault

  • claimRewardsAndSwap() - 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 vault

  • lend() - none

  • redeem() - 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

  • stake() - fund starts accruing $CRV and pool rewards (currently none) after action

  • unstake() - none

  • lendAndStake() - fund starts accruing $CRV and pool rewards (currently none) after action

  • unstakeAndRedeem() - 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 the VaultProxy . 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() - none

  • lend() - none

  • redeem() - 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

  • stake() - fund starts accruing $CRV and pool rewards (currently none) after action

  • unstake() - none

  • lendAndStake() - fund starts accruing $CRV and pool rewards (currently none) after action

  • unstakeAndRedeem() - 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 the VaultProxy . 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 universe

  • claimRewards() - none

  • claimRewardsAndReinvest() - 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 vault

  • claimRewardsAndSwap() - 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 vault

  • lend() - none

  • redeem() - 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

  • stake() - fund starts accruing $CRV and pool rewards (currently none) after action

  • unstake() - none

  • lendAndStake() - fund starts accruing $CRV and pool rewards (currently none) after action

  • unstakeAndRedeem() - 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 the VaultProxy . 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 universe

  • claimRewards() - none

  • claimRewardsAndReinvest() - 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 vault

  • claimRewardsAndSwap() - 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 vault

  • lend() - none

  • redeem() - 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

  • stake() - fund starts accruing $CRV and $LDO rewards after action

  • unstake() - none

  • lendAndStake() - fund starts accruing $CRV and $LDO rewards after action

  • unstakeAndRedeem() - 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 the VaultProxy . 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 universe

  • claimRewards() - claimed rewards tokens are sent to the Vault, but are not reported as incomingAssets, and thus are not emitted in an event, not run through policy management, and are not added as tracked assets

  • claimRewardsAndReinvest() - trades all reward tokens via UniswapV2 into the IdleToken 's underlying asset , which is then lent for more idleToken balance. Can either use only the newly claimed rewards token balances, or the full balances of reward tokens in the vault

  • claimRewardsAndSwap() - 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 vault

  • lend() - none

  • redeem() - any call to redeem() will also claim all rewards tokens; these rewards tokens are sent to the vault, but are not reported as incomingAssets, 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() - None

  • removeTrackedAssets() - Only allows removal if the VaultProxy 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() - None

  • lend() - None

  • redeem() - 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() - none

  • redeem() - 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