Skip to main content
Every multichain transaction follows the same lifecycle, but each client exposes different boundaries. Embedded wallets manage preparation, authorization, and submission through sendIntent(). The custom signer SDK exposes each step. REST integrations call the endpoints directly.

Transaction lifecycle

  1. Define the target chain, required tokens, destination calls, and source constraints.
  2. Prepare a route and review its inputs, outputs, fees, and expiry.
  3. Complete any token requirements for the account type.
  4. Authorize the exact prepared route.
  5. Submit the signed intent.
  6. Track the intent until it completes or fails.
An accepted submission is not an onchain success. Keep the intent ID so you can resume status checks without creating another transaction.

Follow the flow

Reuse the chains, token addresses, amount, and calls from Send a transaction.
Use the initialized oneAuth client and authenticated accountAddress from Accounts.
1

Review, authorize, and submit

Embedded wallets prepare the route, handle their smart-account token requirements, request passkey approval, and submit the intent. They do not expose the custom signer SDK’s ranked quotes or separate signing and submission methods.Sponsorship is required by default. closeOn: "completed" waits for completion; waitForHash: true separately requests the onchain transaction hash. Add clear signing when your application needs prepared-action review.Save any non-empty result.intentId before handling errors. STATUS_TIMEOUT, HASH_TIMEOUT, or a dialog cancellation with an intent ID can occur after submission. They are not reasons to send a replacement intent. If the submission outcome is uncertain and no ID was returned, reconcile intent history before starting another.
2

Check or resume execution

Use getIntentStatus() when you have an intent ID. Check for a lookup error before interpreting the status:
The helper stops after 60 status requests. undefined means the outcome is still unknown, not failed; retain the ID for a later check. Stopping your poll does not cancel the intent.In @rhinestone/1auth@0.10.1, getIntentStatus() returns success: false for valid non-terminal statuses. It also returns a synthetic status: "failed" with STATUS_FAILED or NETWORK_ERROR when the lookup fails. An error-free failed or expired status, by contrast, is an execution outcome.

Recover from errors

Local statuses such as submitted, claimed, preconfirmed, filled, and completed are not the custom signer SDK’s uppercase statuses. Record error.details?.traceId when present; do not show raw diagnostics or simulation URLs to users.

Send a transaction

Build token requests, calls, and source constraints.

Unified balance

Read spendable balances across supported chains.