# Supported Protocols and Vaults (/onramp/earn/supported-vaults)

> For the complete documentation index, see [llms.txt](/llms.txt)



<Callout type="warn" title="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.
</Callout>

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 [#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]

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 [#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 [#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.

```ts
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-and-custom-vaults]

### Listed 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.

<Callout type="info" title="Vault data freshness">
  Vault data, including TVL and APY, can be up to 12 hours old.
</Callout>

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

### Custom vaults [#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 [#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 [#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 [#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              |
