Skip to main content
Relay EVM contract calls or supported Solana instructions on a single chain. Use Send a transaction instead when the transaction must source funds from another chain or deliver tokens to the target chain.

Define the calls

For EVM, this example transfers 0.1 USDC from the account on Base Sepolia. Both wallet types use the same calldata. Calls run in order and revert together if one fails.

Send the transaction

Use wallet from Accounts after the user signs in; sends always use the authenticated account.sendIntent() prepares the route, requests passkey approval, and submits the transaction. Set source.chain and destination.chain to the same chain to keep funding and execution on Base Sepolia:For the Solana memo, use a managed wallet with experimental_solana, ready on Devnet after fresh passkey sign-in. data is base64. This no-delivery example has no source or dummy token: full sponsorship is required, and refusal fails without a user-paid fallback. Retain the entire result before handling failure, including any intent ID and submission metadata.The wallet shows Rhinestone’s prepared-action review before passkey approval. See Clear signing for what the review shows.closeOn: "completed" waits for completion rather than an earlier execution milestone. waitForHash: true also requests the onchain transaction hash. If a request times out, keep any returned intentId and check it with wallet.getIntentStatus(intentId); do not blindly resubmit. Inspect status: a pending status is not a failed transaction, even when that status response has success: false.

Choose who pays

This example uses sponsorshipMode: "required": sponsorship must succeed or the request fails. Set it to "disabled" for a user-paid quote, with enough USDC on Base Sepolia to cover fees as well as the transfer.Solana instructions can instead pay fees from one explicit same-cluster source token with sponsorshipMode: "disabled". They accept no source.maxAmount or positive app fee; appFees: { feeBps: 0 } disables any configured fee. Sponsorship covers fees, not assets consumed by instructions: fund those beforehand, then submit execution separately. No cross-VM calls, cross-cluster instructions, mixed Solana batches, or Solana SmartSessions are supported.Instruction labels are unverified; review does not decode or simulate effects. Instructions may move existing wallet assets. See availability and recovery and authority limits.Embedded wallets do not expose ranked quotes or per-category sponsorship controls through sendIntent(). See Sponsor fees for funding modes and fallback behavior.

Try atomic calls

This sponsored testnet demo uses the embedded wallet provider’s wallet_sendCalls to relay two 0.1 mUSD transfers on Base Sepolia. Sign in, mint mock tokens if needed, then approve both calls together. Unlike a queue of intents, these calls execute in one transaction and revert together.A calls ID identifies the submission, not its outcome. wallet_getCallsStatus returns an EIP-5792 numeric status: 100 pending, 200 confirmed, or 400 failed or expired. Passkey intents return no receipts; the calls ID is the intent ID, so read the transaction hash with wallet.getIntentStatus(callsId).