Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.rhinestone.dev/llms.txt

Use this file to discover all available pages before exploring further.

Single-chain intents let you make transactions on a chain of your choice. These intents are similar to ERC-4337 User Operations. See our concepts section on intents vs userops to better understand the difference. Relayers execute single-chain intents through the intent executor module. For a breakdown of the high-level flow, please take a look at the Rhinestone Intents concepts section.

Example

Here’s how you can make a token transfer:
const prepared = await rhinestoneAccount.prepareTransaction({
  chain: base,
  calls: [
    {
      to: 'USDC',
      data: encodeFunctionData({
        abi: erc20Abi,
        functionName: 'transfer',
        args: [recipient, parseUnits('5', 6)],
      }),
    },
  ],
})
const signed = await rhinestoneAccount.signTransaction(prepared)
const transaction = await rhinestoneAccount.submitTransaction(signed)

Gas Limit

You can override the default gas limit for the target chain execution with gasLimit. Doing this will make the intent better priced, because we can more accurately calculate the fee that a solver needs to be reimbursed with for paying the gas. If this is not provided, we calculate using a gas limit of 1_000_000.
const transaction = await rhinestoneAccount.prepareTransaction({
  chain: base,
  calls: [
    // …
  ],
  tokenRequests: [
    // …
  ],
  gasLimit: 200_000n,
})

Source Assets

You can specify what token (or tokens) to use as an input asset:
const transaction = await rhinestoneAccount.prepareTransaction({
  chain: base,
  calls: [
    // …
  ],
  tokenRequests: [
    // …
  ],
  sourceAssets: ['USDC', 'ETH']
})

Auxiliary Funds

auxiliaryFunds declares balances that aren’t visible to the orchestrator yet but will be available by the time the intent settles. Use it to quote ahead of an inflow — a pending CEX deposit, a vault withdrawal, an unstake, or any other balance that will arrive before fill.
const transaction = await rhinestoneAccount.prepareTransaction({
  chain: base,
  calls: [
    // …
  ],
  tokenRequests: [
    // …
  ],
  auxiliaryFunds: {
    [base.id]: {
      [USDC_ADDRESS]: parseUnits('100', 6),
      [WETH_ADDRESS]: parseUnits('1', 18)
    }
  }
})
Don’t list funds the account already holds — the orchestrator picks those up automatically, and adding them via auxiliaryFunds double-counts the balance and inflates the input amount in the quote.

Wait for Execution

submitTransaction returns once the intent has been accepted by the orchestrator. To wait until it actually settles onchain, use waitForExecution:
const transaction = await rhinestoneAccount.submitTransaction(signed)
const transactionResult = await rhinestoneAccount.waitForExecution(transaction)

Get Intent Status

You can also fetch the intent status directly to implement a custom polling logic:
const transaction = await rhinestoneAccount.submitTransaction(signed)
const transactionResult = await rhinestone.getIntentStatus(transaction.id)