> For the complete documentation index, see [llms.txt](/llms.txt).

# Bundler Client actions reference

These actions extend the [Viem Bundler Client](https://viem.sh/account-abstraction/clients/bundler) to support [ERC-7710](https://eips.ethereum.org/EIPS/eip-7710) utilities.

## `sendUserOperationWithDelegation`[​](#senduseroperationwithdelegation "Direct link to senduseroperationwithdelegation")

Sends a [user operation](/smart-accounts-kit/development/reference/glossary#user-operation)**User operation** A pseudo-transaction object defined by ERC-4337 that describes what a smart account should execute. User operations are submitted to the alternate mempool managed by bundlers. with redeem permissions according to the [ERC-7710](https://eips.ethereum.org/EIPS/eip-7710) specifications.

info

To use `sendUserOperationWithDelegation`, the Viem Bundler Client must be extended with `erc7710BundlerActions`.

### Parameters[​](#parameters "Direct link to Parameters")

See the [Viem sendUserOperation parameters](https://viem.sh/account-abstraction/actions/bundler/sendUserOperation). This function has the same parameters, except it does not accept `callData`.

Objects in the `calls` array also require the following parameters:

| Name              | Type              | Required | Description                                                                                                                                                                                                                                                |
| ----------------- | ----------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| delegationManager | Address           | Yes      | The address of the [Delegation Manager](/smart-accounts-kit/development/reference/glossary#delegation-manager)**Delegation Manager** The ERC-7710 component that validates and redeems delegations, including signature checks and caveat enforcer hooks.. |
| permissionContext | PermissionContext | Yes      | An encoded delegation chain (Hex) or a decoded delegation chain (Delegation[]) for redeeming permissions.                                                                                                                                                  |

### Example[​](#example "Direct link to Example")

- example.ts
- client.ts

```
import { sessionAccount, bundlerClient, publicClient } from './client.ts'

// These properties must be extracted from the permission response.
const permissionContext = permissionsResponse[0].context
const delegationManager = permissionsResponse[0].delegationManager

// Calls without permissionContext and delegationManager will be executed
// as a normal user operation.
const userOperationHash = await bundlerClient.sendUserOperationWithDelegation({
  publicClient,
  account: sessionAccount,
  calls: [
    {
      to: sessionAccount.address,
      data: '0x',
      value: 1n,
      permissionContext,
      delegationManager,
    },
  ],
  // Appropriate values must be used for fee-per-gas.
  maxFeePerGas: 1n,
  maxPriorityFeePerGas: 1n,
})

```

```
import { createPublicClient, http, createBundlerClient } from 'viem'
import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
import { sepolia as chain } from 'viem/chains'
import { createBundlerClient } from 'viem/account-abstraction'
import { erc7710BundlerActions } from '@metamask/smart-accounts-kit/actions'
import { toMetaMaskSmartAccount, Implementation } from '@metamask/smart-accounts-kit'

export const publicClient = createPublicClient({
  chain: chain,
  transport: http(),
})

// Your session account for requesting and redeeming should be the same.
const privateKey = '0x...'
const account = privateKeyToAccount(privateKey)

export const sessionAccount = await toMetaMaskSmartAccount({
  client: publicClient,
  implementation: Implementation.Hybrid,
  deployParams: [account.address, [], [], []],
  deploySalt: '0x',
  signer: { account },
})

export const bundlerClient = createBundlerClient({
  transport: http(`https://your-bundler-url`),
  // Allows you to use the same Bundler Client as paymaster.
  paymaster: true,
}).extend(erc7710BundlerActions())

```
