# Deposits and withdrawals

Funds move between the user's Sui account and 36 other chains through [NEAR Intents](https://near-intents.org) (1Click). Users never touch a bridge.

## The funds panel

```ts
await accounts.openFunds({ tab: 'deposit', receive: 'USDC' }); // or receive: 'SUI'
await accounts.openFunds({ tab: 'withdraw' });
```

It resolves when the user closes the panel. The panel renders in a closed shadow root, so your styles can't break it, and it looks the same in every app.

**Deposit tab**

- A token selector with search, chain filters and the user's balances first, with token and chain logos.
- A live quote: what arrives on Sui, the rate, the fee, and the expected time.
- Deposits from wallets the user connects are one confirmation. **Add wallet** connects a second wallet just for funding, for example Rabby on Base while signed in with Phantom. Funding wallets never control the account.
- Anything else (another wallet, an exchange, Bitcoin) gets a deposit address and the exact amount to send. The transfer is detected on-chain automatically.
- A status timeline until the funds arrive.

**Withdraw tab**: USDC or SUI to any supported chain and token. The recipient defaults to the user's own wallet on that chain.

## Supported chains

| | Chains |
|---|---|
| Sent directly from the user's wallet | Ethereum, Base, Arbitrum, Optimism, Polygon, BNB Chain, Avalanche, Gnosis, Berachain, Scroll, Monad, X Layer, Plasma, Abstract, Robinhood Chain, ADI Chain, and Solana |
| Deposit address, any wallet or exchange | Bitcoin, NEAR, TON, Tron, XRP, Dogecoin, Litecoin, Bitcoin Cash, Zcash, Dash, Stellar, Cardano, Aptos, Starknet, Aleo, Movement, Hyperliquid, Fogo |

If a user's wallet doesn't know an EVM chain yet, it is asked to add it before switching.

## Fees

| | Fee |
|---|---|
| Deposits | 0.6% of the amount, inside the quote |
| Withdrawals | 0.6% of the amount, inside the quote |
| Gas on Sui | none for the user |

Every quote returns `feeBps`, and the panel shows the fee in dollars before the user confirms. Route costs from NEAR Intents are included in the quoted output.

## Programmatic API

For your own UI:

```ts
// What would arrive, without creating an order
const quote = await accounts.estimateDeposit({ asset, amount, receiveAsset });
// { amountIn, amountOut, amountInUsd, amountOutUsd, feeBps, timeEstimateSeconds }

// Create the order, send it from the user's wallet, follow it
const deposit = await accounts.deposit({ asset, amount });
await deposit.send();
await deposit.wait({ onUpdate: (order) => setStatus(order.status) });

// Withdraw (the user approves the Sui transaction in their wallet)
const { order, wait } = await accounts.withdraw({ asset, amount, recipient });
await wait();
```

`asset` is a 1Click asset id. List them with `accounts.tokens()`, the chains with `accounts.chains()`, and the user's bridgeable balances across connected wallets with `accounts.fundingOptions()`.

Order statuses: `PENDING_DEPOSIT` → `KNOWN_DEPOSIT_TX` → `PROCESSING` → `SUCCESS`, or `REFUNDED`, `FAILED`, `INCOMPLETE_DEPOSIT`. Refunds go back to the address the deposit came from.

> Very small amounts can fall below a route's minimum. The quote fails with a clear error before anything is sent.
