> ## Documentation Index
> Fetch the complete documentation index at: https://docs.arc.io/llms.txt
> Use this file to discover all available pages before exploring further.

# How-to: Deposit crosschain into an Earn vault

> Deposit USDC from a wallet on one blockchain into an Earn vault on another blockchain in a single call

Deposit USDC into an Earn vault from a wallet on a different blockchain. Your
wallet on the source blockchain signs once. The deposit completes on the
destination blockchain without further action from you, no signing or gas
required.

## Supported routes

| Network | Source blockchains                               | Destination |
| ------- | ------------------------------------------------ | ----------- |
| Mainnet | Ethereum, Arbitrum, Base                         | Arc Mainnet |
| Testnet | Ethereum Sepolia, Arbitrum Sepolia, Base Sepolia | Arc Testnet |

The adapter you use must support EIP-712 typed data signing through
`signTypedData`. The Viem and Ethers adapters support this by default.

## Prerequisites

Before you begin, ensure that you've:

* [Installed the App Kit SDK](/app-kit/tutorials/installation)
* [Configured an adapter](/app-kit/tutorials/adapter-setups)

These are required so any example below runs with a valid `kit` and `adapter`.

## Submit a crosschain deposit

This example deposits 100.00 USDC from Ethereum Sepolia into a vault on Arc
Testnet:

```typescript TypeScript theme={null}
const result = await kit.earn.deposit({
  from: { adapter, chain: "Ethereum_Sepolia" },
  to: {
    chain: "Arc_Testnet",
    recipientAddress: process.env.RECIPIENT_ADDRESS as `0x${string}`,
  },
  vaultAddress: process.env.VAULT_ADDRESS as string,
  amount: "100.00",
  transferSpeed: "FAST",
});
```

`transferSpeed` is optional and accepts `"FAST"` or `"SLOW"`. FAST uses CCTP's
pre-finality lane and adds a `PRE_FINALITY` fee. SLOW uses standard finality
with only the `FORWARD` fee. Omit `transferSpeed` to use the service default.
See [How Earn fees work](/app-kit/concepts/earn-fees#deposit-fees) for how these
fees appear on the deposit quote.

<Tip>
  Preview the expected outcome and fees of a crosschain deposit before submitting
  with
  [`getDepositQuote`](/app-kit/tutorials/earn/preview-operations#preview-a-crosschain-deposit).
  Pass the same `from`, `to`, `vaultAddress`, `amount`, and `transferSpeed` to the
  quote.
</Tip>

The result's `kind` field is either `'same-chain'` or `'cross-chain'`:

```typescript TypeScript theme={null}
if (result.kind === "cross-chain") {
  console.log(`Bridge submitted: ${result.execId}`);
}
```

You will see an output similar to:

```bash Shell theme={null}
{
  kind: "cross-chain",
  execId: "550e8400-e29b-41d4-a716-446655440000",
  status: "PENDING",
  vaultAddress: "0x...",
  amount: "100.00",
  sourceChain: "Ethereum_Sepolia",
  destinationChain: "Arc_Testnet",
  expiresAt: "2026-05-19T00:00:00Z",
}
```

The call returns once the bridge submit succeeds, not when the deposit lands on
the destination. The `status` value reflects the submit response. Treat any
non-terminal value (such as `PENDING`, `SOURCE_PENDING`, or `ATTESTING`) as in
progress.

`expiresAt` is the deadline by which the bundle must settle. If it doesn't
settle by then, the funds return to the source wallet.

## Track the deposit status

Pass the returned `execId` to `getCrossChainDepositStatus` for a one-shot status
check, or to `waitForCrossChainDeposit` to poll until the deposit reaches a
terminal state:

```typescript TypeScript theme={null}
// One-shot status check
const status = await kit.earn.getCrossChainDepositStatus({
  execId: result.execId,
});

// Or poll until terminal (defaults: 5s interval, 20 min max)
const waitResult = await kit.earn.waitForCrossChainDeposit({
  execId: result.execId,
  pollIntervalMs: 5_000,
  maxWaitMs: 1_200_000,
});

if (waitResult.outcome === "complete") {
  console.log("Deposit settled on destination");
} else {
  console.log(`Wait stopped: ${waitResult.outcome}`);
}
```

The status payload includes per-hop detail (`source`, `cctp`, `destination`) so
you can see where in the bridge the deposit currently is. Both methods accept an
optional `signal` for cancellation.

## Confirm the deposit on the destination blockchain

To verify the position landed on the destination, use
[Check your Earn position](/app-kit/tutorials/earn/check-position) with the
recipient address you passed in `to.recipientAddress`.
