For the complete documentation index, see llms.txt. This page is also available as markdown.

Supported Protocols and Vaults

Supported protocols, vault types, chains, funding tokens, methods, and deposit constraints.

Beta

ZeroDev Earn is an experimental product offered in beta. It supports your integration with third-party protocols. ZeroDev does not provide these protocols or the services they offer, does not custody assets, and does not execute or control transactions; any transactions are solely between you (or your end users) and the applicable third-party protocol. Any APY, rewards, or other amounts are provided by such protocols, not ZeroDev, and all data is supplied by third parties for informational purposes only. Use involves significant risk, including smart contract failures, market volatility, illiquidity, lockup, and loss of principal. ZeroDev is not liable for any losses arising from use of the product or the third-party protocols it surfaces. You are responsible for ensuring your end users understand these risks and for any disclosures required by applicable law. Do your own independent research and proceed at your own risk.

ZeroDev Earn supports Aave V3 and ERC-4626-style vault deposits. Protocol adapters validate each target on-chain before a quote is returned.

Protocols and methods

Protocol or vault typeDeposit methodintoListed vaultsRaw address
Aave V3earn.aave.deposit(params)OptionalYesNo
Morphoearn.morpho.deposit(params)RequiredYesAccepted when target passes ERC-4626 validation
Fluidearn.fluid.deposit(params)RequiredYesAccepted when target passes ERC-4626 validation
Yearnearn.yearn.deposit(params)RequiredYesAccepted when target passes ERC-4626 validation
Generic ERC-4626earn.erc4626.deposit(params)RequiredNot a discovery protocolYes
Explicit protocolearn.depositIntoVault({ ...params, protocol })RequiredYesYes for ERC-4626 adapters; Aave raw targets are not supported

Registered protocol values are aave, morpho, fluid, yearn, and erc4626. Any other value returns UNKNOWN_PROTOCOL.

Aave

Aave has one V3 pool per supported destination chain.

  • destChainId is required.
  • Omit into to supply the destination-chain reserve corresponding to the funding token.
  • Pass an Aave Vault from listVaults({ protocol: "aave" }) as into to select another listed reserve.
  • The owner receives the aToken position.

Morpho, Fluid, and Yearn

These methods use the ERC-4626 adapter and require into.

  • Pass a Vault object to derive destChainId automatically.
  • Pass a vault ID or address with an explicit destChainId.
  • The target must expose the expected ERC-4626 interface and its asset() must match the resolved deposit asset.

Generic ERC-4626

Use earn.erc4626.deposit for an ERC-4626 contract that does not need a named protocol facade. earn.depositIntoVault provides the same engine with an explicit protocol value.

await earn.erc4626.deposit({
  owner,
  amount: "100",
  token: TOKENS.USDC,
  srcChainId: 8453,
  destChainId: 42161,
  into: "0xVAULT",
});

The server reads asset() and maxDeposit(owner) before creating the quote.

Listed and custom vaults

Listed vaults

earn.listVaults returns vaults from vaults.fyi after applying these gates:

  • Protocol is Aave, Morpho, Fluid, or Yearn.
  • Destination chain is enabled by the Earn service.
  • Vault asset can be funded through an SRA route.
  • Vault is marked transactional by the upstream listing.
  • TVL is at least $100,000 unless minTvl is set explicitly.

Vault data freshness

Vault data, including TVL and APY, can be up to 12 hours old.

Listed Vault objects can be passed directly to deposit methods. They are also supported by preflight and withdrawFromVault.

Custom vaults

A raw ERC-4626 address can be used even when it is not returned by listVaults.

  • Pass destChainId explicitly.
  • Use the matching ERC-4626 facade: morpho, fluid, yearn, or erc4626. All four share the same adapter and support raw addresses.
  • Funding token must resolve to the vault asset on the destination chain.
  • Target must pass the on-chain ERC-4626 checks.

preflight and withdrawFromVault do not apply the listVaults discovery filters. Given an address and chain, they query that vault directly. The vault must be indexed by vaults.fyi and use an allowlisted protocol; a vault that vaults.fyi has never indexed cannot be preflighted or withdrawn through these methods.

Destination chains

The hosted service currently enables these destination chains:

ChainChain ID
Ethereum1
Optimism10
BNB Smart Chain56
Polygon137
Base8453
Arbitrum42161
HyperEVM999
Linea59144

A deployment can enable a smaller subset. A chain must also have an SRA route and a depositable vault. Unsupported destinations return CHAIN_NOT_SUPPORTED.

Use earn.getChains() and earn.getTokens({ chainId }) to inspect the SRA chain and token registry at runtime. Use listVaults({ chains: [...] }) to determine whether matching listed vaults are available.

Funding tokens

The SDK exports symbols for USDC, USDT, DAI, WETH, WBTC, EURC, and NATIVE.

For vault deposits:

  • Funding token must be an ERC-20 supported by the SRA route on the source chain.
  • Native-token funding is not supported, even though TOKENS.NATIVE is exported by the shared token vocabulary.
  • A raw token address can be passed instead of a symbol, but it must match a token in the SRA route registry.
  • An address outside the route registry returns UNSUPPORTED_TOKEN.
  • When funding token differs from vault asset, the SRA must support that cross-token route.

Deposit constraints

ConstraintBehavior
OwnerOne address funds, signs, receives the position, and authorizes recovery
AmountDeposit methods use display units; use a string for precise values
Preflight amountUses base units
Slippage1–5000 bps; default 100 bps
Quote estimatesApproximately 60 seconds; expiresAt is advisory
Same-chain depositStill uses an SRA; bridge step is skipped
Cross-chain depositRoute fees and minimum deposit apply
Deposit capacityQuote fails when amount exceeds current maxDeposit
Disabled vaultQuote returns VAULT_DEPOSITS_DISABLED when maxDeposit is zero
Standalone bridge and swapearn.bridgeAndSwap is disabled and returns FEATURE_DISABLED
RecoveryFunds left in an SRA require an owner-authorized withdrawal

On this page