Skip to main content
An EVM multichain transaction combines target-chain calls with the assets needed to execute them. Select one funding chain and token. The clients quote any required swap or bridge and execute the destination calls as one intent.

Describe the outcome

Keep funding and execution separate in the request: Calls and calldata in this section are EVM-specific. Solana delivery uses mint and wallet addresses, not calldata; both wallet tabs below include delivery examples. Requested tokens are not calldata. Both clients request one token with destination.token and its amount with destination.amount. 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 wallet client from Accounts after the user signs in; sends always use the authenticated account. sendIntent() prepares the quote, requests passkey approval, and submits the intent:The Solana example delivers 0.001 USDC from Base Sepolia to a Devnet wallet. Supply an owned, case-sensitive base58 recipient address. If receiving into the user’s managed wallet, set it up and confirm Devnet readiness before funding. EVM-funded delivery does not require experimental_solana; it cannot include Solana instructions. See availability before enabling a route.Keep the whole result, including intentId, status, submitted, shouldResubmit, destination-native transactionHash, and chain-qualified refund, before handling errors. A timeout or success: false is not permission to resend.Embedded wallets use numeric EVM chain IDs and exported Solana cluster IDs. source names exactly one funding token, here USDC on Base; omitting source.chain funds from the destination chain rather than searching other chains. destination.token and the bigint destination.amount request the token the calls need. Delivery and user-paid execution require a source; only fully sponsored no-delivery execution with sponsorshipMode: "required" can omit it. Gas sponsorship does not supply assets consumed by calls or instructions.The default is sponsorshipMode: "required". See Sponsor fees for user-paid quotes and fallback behavior. Passkey-signed intents always show Rhinestone’s prepared-action review. The end-to-end flow covers closeOn: "completed" and waitForHash: true without repeating them in every request.destination.recipient is delivery-only: it requires destination.token and cannot be combined with calls. To pay someone from a call, encode the recipient in the transfer call, as shown above.

Fund a managed Solana wallet

Complete Solana setup and re-read cluster readiness before either funding journey:
  • From an external wallet: show the ready address and receive a supported token on the same cluster. Confirm receipt before sending a transfer or executing instructions. External transfers cannot be blocked by the SDK’s readiness checks.
  • From the EVM account: use the EVM → Solana delivery example above, naming the ready Solana address as recipient. Retain the funding intent ID and wait for its confirmed destination outcome before submitting same-cluster instructions separately.
Funding can succeed while the later instruction fails. Show both outcomes and retain both intent IDs; do not repeat delivery to retry execution. The delivered funds remain on Solana unless another operation spends them. On uncertainty, look up status instead of blindly resubmitting.

Send from a managed Solana wallet

After setup and fresh passkey sign-in with experimental_solana, send an SPL token on the same cluster with matching source and destination mints. This is token delivery, not a native SOL transfer or a swap:
Supply another wallet you control on Devnet, not the sending wallet itself. Omit destination.amount for max output; retain a positive source.maxAmount to cap the observed balance available to the quote, not unconditional total spend. Omitting source.chain is same-chain shorthand, never chain discovery. Do not rely on Solana → EVM delivery yet. See Networks for current limitations.

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. Solana-signed intents must be sent alone: no mixed Solana batches or Solana SmartSessions. Cross-VM calls and cross-cluster Solana execution are unsupported.

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.