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
- Embedded wallet
- Custom signer
- REST API
Use the initialized Supply another wallet you control on Devnet, not the sending wallet itself. Omit
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.
Send from a managed Solana wallet
After setup and fresh passkey sign-in withexperimental_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: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 tosendIntent() 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.