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 type | Deposit method | into | Listed vaults | Raw address |
|---|---|---|---|---|
| Aave V3 | earn.aave.deposit(params) | Optional | Yes | No |
| Morpho | earn.morpho.deposit(params) | Required | Yes | Accepted when target passes ERC-4626 validation |
| Fluid | earn.fluid.deposit(params) | Required | Yes | Accepted when target passes ERC-4626 validation |
| Yearn | earn.yearn.deposit(params) | Required | Yes | Accepted when target passes ERC-4626 validation |
| Generic ERC-4626 | earn.erc4626.deposit(params) | Required | Not a discovery protocol | Yes |
| Explicit protocol | earn.depositIntoVault({ ...params, protocol }) | Required | Yes | Yes 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.
destChainIdis required.- Omit
intoto supply the destination-chain reserve corresponding to the funding token. - Pass an Aave
VaultfromlistVaults({ protocol: "aave" })asintoto 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
Vaultobject to derivedestChainIdautomatically. - 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
minTvlis 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
destChainIdexplicitly. - Use the matching ERC-4626 facade:
morpho,fluid,yearn, orerc4626. 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:
| Chain | Chain ID |
|---|---|
| Ethereum | 1 |
| Optimism | 10 |
| BNB Smart Chain | 56 |
| Polygon | 137 |
| Base | 8453 |
| Arbitrum | 42161 |
| HyperEVM | 999 |
| Linea | 59144 |
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.NATIVEis 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
| Constraint | Behavior |
|---|---|
| Owner | One address funds, signs, receives the position, and authorizes recovery |
| Amount | Deposit methods use display units; use a string for precise values |
| Preflight amount | Uses base units |
| Slippage | 1–5000 bps; default 100 bps |
| Quote estimates | Approximately 60 seconds; expiresAt is advisory |
| Same-chain deposit | Still uses an SRA; bridge step is skipped |
| Cross-chain deposit | Route fees and minimum deposit apply |
| Deposit capacity | Quote fails when amount exceeds current maxDeposit |
| Disabled vault | Quote returns VAULT_DEPOSITS_DISABLED when maxDeposit is zero |
| Standalone bridge and swap | earn.bridgeAndSwap is disabled and returns FEATURE_DISABLED |
| Recovery | Funds left in an SRA require an owner-authorized withdrawal |