Skip to main content
A multichain transaction combines target-chain calls with the assets needed to execute them. Rhinestone selects a funding route, moves or swaps assets when required, and executes the calls as one intent.

Describe the outcome

Keep funding and execution separate in the request: tokenRequests are not calldata. Add them when a call needs tokens delivered to the target chain. Omit them for a gas-only call that does not need assets delivered. For a token-only swap with no calls, see Make a swap. Do not add dummy calldata or a self-transfer to a request that does not need a call.

Define the calls

This example sends 100 USDC to a recipient on Arbitrum, funded with USDC from the account on Base. Both wallet types use the same calldata:

Send the transaction

Use the initialized oneAuth client and authenticated accountAddress from Accounts. sendIntent() prepares the quote, requests passkey approval, and submits the intent:
Keep result.intentId for status checks.Embedded wallets use numeric chain IDs and tokenRequests[].token. sourceChainId restricts funding to Base; sourceAssets restricts the input token to USDC. To let the wallet choose across available mainnet balances, omit both source constraints and keep tokenRequests. A call with neither tokenRequests nor sourceAssets defaults to target-chain funding unless you set sourceChainId.The default is sponsorshipMode: "required". See Sponsor fees for user-paid quotes and fallback behavior. Set experimental_clear_signing: true for prepared-action review. The end-to-end flow covers closeOn: "completed" and waitForHash: true without repeating them in every request.Embedded wallets have no separate recipient field for this flow. Encode the payment recipient in the transfer call, as shown above.

Batch calls

Pass multiple calls to sendIntent() for an atomic destination batch. They target one chain, execute in order, and all revert when any call fails. Use this for dependent actions such as approve then deposit.sendBatchIntent() instead authorizes several separate intents with one passkey ceremony. Each intent has its own submission and outcome, so they can succeed or fail independently. Do not use it when the operations must be atomic.

Try a non-atomic queue

Add several small mUSD mint transactions on Base Sepolia, then authorize them with one passkey ceremony. This embedded-wallet demo shows separate intents, not an atomic batch or a crosschain funding route. For dependent calls that must revert together, try the atomic relay demo.Review each result independently. A submitted intent is not necessarily completed; retain its ID and check its status before retrying. Clear the queue deliberately after reviewing partial results rather than resubmitting successful entries.
Continue to the end-to-end transaction flow for the route lifecycle and failure recovery.