# Vaults

Let your users earn dollar yield in USDC, with one confirmation and no custody.

The LandedFX Dollar vault is an ERC-4626 vault on Base, with the id `dollar`. Your users deposit USDC, get vault shares, and earn what the vault's strategies earn, which today is dollar lending through Spark. Naira carry isn't part of this vault. You build the transactions with LandedFX, and your user's wallet or your custodian signs them. LandedFX never holds keys or funds.

No API key is needed. If you send one, deposits you build are attributed to you.

## Deposit in one confirmation

```bash
curl -X POST https://api.landedfx.com/api/v1/vaults/dollar/transactions \
  -H "content-type: application/json" \
  -d '{ "action": "deposit", "account": "0xUserWallet", "amount": "1000" }'
```

You get back `calls`, already simulated against the chain:

| Wallet | How to send it | User confirms |
|---|---|---|
| Smart wallets (Privy, Coinbase Smart Wallet, Safe) and EIP-5792 wallets | Send `calls` as one batch (`wallet_sendCalls`) | Once |
| Plain wallets (MetaMask and others) | Sign `permit.typedData`, then send `permit.thenCall` with the signature | Once |
| Custodians (Fireblocks, Copper, Anchorage) | Submit each call as a contract call from the vault account | Per your policy |

If a call would fail, you get a `422` that says why ("the vault can take 40,000 USDC more right now") instead of a failed transaction.

## Deposit from any token, on any chain

Your user holds USDT on Tron, USDC on Solana, or ETH on Ethereum? One origin-chain transaction swaps, bridges and deposits it.

```bash
curl -X POST https://api.landedfx.com/api/v1/vaults/dollar/deposit-routes \
  -H "content-type: application/json" \
  -d '{ "from": "USDT:tron", "account": "TUserTronAddress", "receiver": "0xUserBaseWallet", "amount": "250" }'
```

`amount` is the USDC that lands in the vault; `pay` tells the user what that costs in their token. Sign the returned `steps` in order on the origin chain. Relay runs the swap, the bridge and the deposit on Base, and pays the gas there.

Live quotes for a 250 USDC deposit (November 2026):

| Paying with | Pays | Fees | Signatures |
|---|---|---|---|
| USDC on Arbitrum | 250.06 USDC | $0.06 | approve + deposit |
| USDC on Solana | 250.09 USDC | $0.09 | 1 |
| USDT on Ethereum | 250.36 USDT | $0.12 | approve + deposit |
| ETH on Ethereum | 0.112 ETH | $0.33 | 1 |
| USDT on BNB Chain | 251.34 USDT | $1.06 | approve + deposit |
| USDT on Tron | 250.46 USDT | $2.01 | approve + deposit |

The approval is only needed the first time a wallet uses that token. Bitcoin isn't routable straight into the vault yet: swap it to USDC on Base with `POST /swap/quotes` first.

## Withdraw everything

```json
{ "action": "redeem", "account": "0xUserWallet", "amount": "max" }
```

The vault pulls from its strategies as needed. Withdrawals are never paused.

## Read the vault and a position

| Endpoint | Returns |
|---|---|
| `GET /vaults` | Every vault with TVL, share price, liquidity, fees and allocations |
| `GET /vaults/{id}` | One vault, live from the chain |
| `GET /vaults/{id}/accounts/{wallet}` | Shares, their value, what the wallet can withdraw now, and its USDC balance |
| `GET /vaults/{id}/history?days=30` | Share price and TVL over time, with realised APY |

## What the vault guarantees

The rules live in the contract, not in our servers:

- Depositors can always withdraw. Pausing stops new deposits only.
- Funds move only between the vault and approved strategies, and strategies can only return funds to the vault.
- New strategies, higher caps and higher fees wait out a timelock before they apply.
- Fees are capped in code at 2% a year and 20% of gains above the high-water mark.

Naira carry is in testing as a separate, opt-in vault and isn't open to deposits. To see how it's priced, see [Naira carry](/guides/carry).
