Skip to main content

Deposits

This guide covers depositing tokens from your wallet into your private balance.

Basic Deposit

Deposit Parameters

Progress Tracking

Track shield progress with a callback:

Deposit Steps

Deposit Result

Depositing ETH

To deposit native ETH, use the zero address:
The SDK automatically:
  1. Wraps ETH to WETH
  2. Approves WETH spending
  3. Deposits WETH to shield

Deposit to Another User

You can deposit directly to another user’s private balance:

Token Approval

The SDK handles token approval automatically. For large amounts, you may want to approve unlimited spending:

Parsing Amounts

Use the standalone parseAmount / formatAmount helpers exported from the SDK package:

Error Handling

UI Example

Best Practices

1. Always Validate Amounts

2. Check Token Support

3. Handle Large Deposits

For large deposits, consider splitting into multiple transactions:

Relayed Deposits (build calldata, relay yourself)

If your users don’t submit transactions directly — they hold funds at addresses you relay for (a gasless relayer, an EIP-7702 session key, a custom pipeline) — build the deposit calldata without submitting it, relay it through your own infrastructure, then finalize from the mined receipt.
Each call is { to, value, data }, so the array drops directly into an EIP-5792 / Porto wallet_prepareCalls bundle.

Server-side (no session)

A backend that holds only a recipient’s privacy address can build a deposit on their behalf with the stateless buildShieldPayload — no signed-in session and no private keys:
The note’s owner is bound cryptographically to the recipient’s privacy address, so only they can spend it; the ephemeral sender used to encrypt the deposit is generated and discarded internally.

Next Steps