> ## 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

> Send same-chain transactions via Warp intents

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](../../home/concepts/intents-and-erc4337) 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](../../home/introduction/rhinestone-intents).

## Example

Here's how you can make a token transfer:

```ts theme={null}
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`.

```ts {9} theme={null}
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:

```ts {9} theme={null}
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.

```ts {9-14} theme={null}
const transaction = await rhinestoneAccount.prepareTransaction({
  chain: base,
  calls: [
    // …
  ],
  tokenRequests: [
    // …
  ],
  auxiliaryFunds: {
    [base.id]: {
      [USDC_ADDRESS]: parseUnits('100', 6),
      [WETH_ADDRESS]: parseUnits('1', 18)
    }
  }
})
```

<Warning>
  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.
</Warning>

## Wait for Execution

`submitTransaction` returns once the intent has been accepted by the orchestrator. To wait until it actually settles onchain, use `waitForExecution`:

```ts theme={null}
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:

```ts theme={null}
const transaction = await rhinestoneAccount.submitTransaction(signed)
const transactionResult = await rhinestone.getIntentStatus(transaction.id)
```
