> ## 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 singleChainTx = await rhinestoneAccount.sendTransaction({
  chain: base,
  calls: [
    {
      to: 'USDC',
      data: encodeFunctionData({
        abi: erc20Abi,
        functionName: 'transfer',
        args: [recipient, parseUnits('5', 6)],
      }),
    },
  ],
})
```

## 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.sendTransaction({
  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.sendTransaction({
  chain: base,
  calls: [
    // …
  ],
  tokenRequests: [
    // …
  ],
  sourceAssets: ['USDC', 'ETH']
})
```

## Auxiliary Funds

In case you have funds not available immediately for an intent (e.g. locked in a vault or sitting in an exchange), you can specify them as auxiliary funds:

```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)
    }
  }
})
```

This lets you get a quote before getting the funds ready on the account.

## Wait for Execution

`sendTransaction` returns a pending intent. To wait until it gets executed, use `waitForExecution`:

```ts theme={null}
const transaction = await rhinestoneAccount.sendTransaction({
  // …
})
const transactionResult = await rhinestoneAccount.waitForExecution(transaction)
```

By default, intents are pre-confirmed by a relayer to be executed before they actually land onchain. You can opt out of this by waiting for onchain execution:

```ts theme={null}
const acceptPreconfirmations = false;
const transactionResult = await rhinestoneAccount.waitForExecution(transaction, acceptPreconfirmations)
```

## Get Intent Status

You can also fetch the intent status directly to implement a custom polling logic:

```ts theme={null}
const transaction = await rhinestoneAccount.sendTransaction({
  // …
})
const transactionResult = await rhinestone.getIntentStatus(transaction.id)
```
