Skip to main content
DepositModal handles funding method selection, source chain and token selection, amount input, and cross-chain routing. Complete the widget quickstart and backend setup before configuring optional behavior.

Destination

recipient is the address that receives funds on the target chain. The service-managed deposit account is derived from (recipient, targetChain, targetToken), so it does not depend on the payment wallet. Changing the target changes the deposit address. For a checkout, pass an order-specific account salt instead. Each order then has its own deposit address. For supported destinations and assets, see supported chains and tokens.

Checkout payments

Register a managed account for each order on your server with a unique 32-byte salt. Store the returned evmDepositAddress with the order, then pass the same salt and the required destination amount to the modal:
payment.amount is an integer string in destination token base units. It is not a USD amount. The salt replaces the modal’s normal (recipient, targetChain, targetToken) account derivation, so it must match the salt used in managed account registration. The modal displays a fixed order amount and withholds the recipient’s deposit history from the payer. On the EVM wallet path, the modal asks POST /quotes/preview for an exactOut quote and uses its input.amount as the source amount to send. The proxy must forward that route to a processor that supports exactOut; an older processor cannot price the checkout. The quote is indicative, and a QR, exchange, or card payer can send a different amount. Reconcile deposits against the order’s account using processor webhooks or GET /deposits?account=<orderAccount>. Compare the delivered destination amount with the order amount before marking it paid. The modal’s complete lifecycle event also carries destinationAmount in destination token base units when available.

Account setup

The widget uses service-managed accounts. Rhinestone owns the deposit account and settles to your recipient, so there is no session key to configure and the user is not asked to sign during setup.

Restrict accepted sources

Your project’s deposit whitelist controls the chains and tokens the processor accepts. Configure it through project setup rather than filtering the widget’s source picker.
A client-side filter can drift from the processor configuration and offer a source the processor rejects. The project whitelist is the enforced source of truth.

Funding methods

Each enabled method appears on the widget home screen. When exactly one is enabled, the widget skips the chooser and opens that flow directly. Fiat onramps and exchange connect require Swapped routes and credentials on your backend proxy.

Output token routing

Pass outputTokenRules to choose the final token based on the source deposit. Rules can match chain, token address, or symbol. Unmatched deposits use targetToken unless rejectUnmapped is true.
When several rules match, the most specific wins: chain + token, then chain + symbol, token, symbol, and chain. See token routing for full semantics and examples.

Non-EVM destinations

Solana

Use targetChain="solana", a base58 mint as targetToken, and a base58 recipient. rpcUrls accepts a literal solana key when you need to override the default connection.

HyperCore destinations

Use targetChain="hypercore:spot", exported as HYPERCORE_SPOT_CAIP2. HyperCore accepts USDC only. recipient can be an EOA or smart account: delivery calls the MulticallHandler’s depositFor(recipient), which funds either address type without executing on the recipient. A HyperCore destination names the venue it credits. Spot and perp margin are separate balances; deposits support spot only because the deposit account cannot produce the signature required to move funds back out of perp margin.
targetChain: 1337, exported as HYPERCORE_CHAIN_ID, is the older spelling and still resolves to the same venue and deposit address. Migrating to HYPERCORE_SPOT_CAIP2 does not move user accounts.
Earlier versions pre-screened recipient bytecode and could emit HYPERCORE_RECIPIENT_NOT_EOA. That check did not match orchestrator behavior and was removed in v0.9.0.
HyperCore is also available as a transfer source. The address and QR flow uses the account’s EVM address as the deposit address; a native Hyperliquid L1 spot transfer lands there.

Display modes

The widget renders as a centered overlay by default. Set inline={true} to place it in your page layout without a backdrop.
Backdrop closing is opt-in with closeOnOverlayClick={true}. Configure visual appearance in theming and customization.

Package entry points

Everything is exported from the root. Subpaths let you bundle only what you use.

Props reference

Required

Wallet

See deposit from a wallet for widget-managed, app-supplied, and loading-state behavior.

Transfer

Funding

Account

Backend

Display

Recovery

Callbacks

Analytics

Content security policy

The widget loads chain, token, and exchange logos from Rhinestone’s asset CDN. Apps with an explicit img-src must allow it:
A blocked image fails silently and renders blank. Apps without an explicit img-src, or with img-src *, need no change. Fiat onramps and Connect exchange embed Swapped in an iframe, so those flows also need:
Deposit and withdraw sessions send analytics from the browser. An explicit connect-src must include Rhinestone, your proxy, and every RPC override:
That directive controls every widget request, not only analytics. A blocked ingest origin does not interrupt deposits, but it drops analytics and reports an analytics_ingest_failure event with reason: "network"; see analytics.