prepareUserOperation
Prepares a User Operation for execution and fills in missing properties.
Usage
import { parseEther } from 'viem'
import { account, bundlerClient } from './config'
 
const userOperation = await bundlerClient.prepareUserOperation({ 
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }]
})Account Hoisting
If you do not wish to pass an account to every prepareUserOperation, you can also hoist the Account on the Bundler Client (see config.ts).
import { parseEther } from 'viem'
import { bundlerClient } from './config'
 
const userOperation = await bundlerClient.prepareUserOperation({ 
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
})Contract Calls
The calls property also accepts Contract Calls, and can be used via the abi, functionName, and args properties.
import { parseEther } from 'viem'
import { bundlerClient, publicClient } from './config'
import { wagmiAbi } from './abi'
 
const userOperation = await bundlerClient.prepareUserOperation({ 
  calls: [{
    abi: wagmiAbi,
    functionName: 'mint',
    to: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
  }],
})Returns
UserOperation
The prepared User Operation.
Parameters
account
- Type: 
SmartAccount 
The Account to use for User Operation execution.
const userOperation = await bundlerClient.prepareUserOperation({
  account, 
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }]
})calls
- Type: 
{ data: Hex, to: Address, value: bigint }[] 
The calls to execute in the User Operation.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{ 
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', 
    value: parseEther('1') 
  }] 
})callGasLimit (optional)
- Type: 
bigint 
The amount of gas to allocate the main execution call.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  callGasLimit: 69420n, 
})factory (optional)
- Type: 
Address 
Account Factory address.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  factory: '0x1234567890123456789012345678901234567890', 
  factoryData: '0xdeadbeef',
})factoryData (optional)
- Type: 
Hex 
Call data to execute on the Account Factory to deploy a Smart Account.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  factory: '0x1234567890123456789012345678901234567890',
  factoryData: '0xdeadbeef', 
})maxFeePerGas (optional)
- Type: 
bigint 
Maximum fee per gas for User Operation execution.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  maxFeePerGas: 420n, 
})maxPriorityFeePerGas (optional)
- Type: 
bigint 
Maximum priority fee per gas for User Operation execution.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  maxPriorityFeePerGas: 420n, 
  maxFeePerGas: 10n, 
})nonce (optional)
- Type: 
bigint 
Nonce for the User Operation.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  nonce: 10n, 
})paymaster (optional)
- Type: 
Address | true | PaymasterClient | PaymasterActions 
Sets Paymaster configuration for the User Operation.
- If 
paymaster: Address, it will use the provided Paymaster contract address for sponsorship. - If 
paymaster: PaymasterClient, it will use the provided Paymaster Client for sponsorship. - If 
paymaster: true, it will be assumed that the Bundler Client also supports Paymaster RPC methods (e.g.pm_getPaymasterData), and use them for sponsorship. - If custom functions are provided to 
paymaster, it will use them for sponsorship. 
Using a Paymaster Contract Address
const hash = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  paymaster: '0x942fD5017c0F60575930D8574Eaca13BEcD6e1bB', 
  paymasterData: '0xdeadbeef',
})Using a Paymaster Client
const paymasterClient = createPaymasterClient({ 
  transport: http('https://api.pimlico.io/v2/1/rpc?apikey={API_KEY}') 
}) 
 
const hash = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  paymaster: paymasterClient, 
})Using the Bundler Client as Paymaster
const hash = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  paymaster: true, 
})paymasterContext (optional)
- Type: 
unknown 
Paymaster specific fields.
const paymasterClient = createPaymasterClient({
  transport: http('https://api.pimlico.io/v2/1/rpc?apikey={API_KEY}')
})
 
const hash = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  paymaster: paymasterClient,
  paymasterContext: { 
    policyId: 'abc123'
  }, 
})paymasterData (optional)
- Type: 
Address 
Call data to execute on the Paymaster contract.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  paymaster: '0x942fD5017c0F60575930D8574Eaca13BEcD6e1bB',
  paymasterData: '0xdeadbeef', 
})paymasterPostOpGasLimit (optional)
- Type: 
bigint 
The amount of gas to allocate for the Paymaster post-operation code.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  paymaster: '0x942fD5017c0F60575930D8574Eaca13BEcD6e1bB',
  paymasterData: '0xdeadbeef',
  paymasterPostOpGasLimit: 69420n, 
})paymasterVerificationGasLimit (optional)
- Type: 
bigint 
The amount of gas to allocate for the Paymaster validation code.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  paymaster: '0x942fD5017c0F60575930D8574Eaca13BEcD6e1bB',
  paymasterData: '0xdeadbeef',
  paymasterVerificationGasLimit: 69420n, 
})preVerificationGas (optional)
- Type: 
bigint 
Extra gas to pay the Bundler.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  preVerificationGas: 69420n, 
})signature (optional)
- Type: 
Hex 
Signature for the User Operation.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  signature: '0x...', 
})stateOverride (optional)
- Type: 
StateOverride 
The state override set is an optional address-to-state mapping, where each entry specifies some state to be ephemerally overridden prior to executing the call.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  stateOverride: [ 
    { 
      address: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', 
      balance: parseEther('1'), 
      stateDiff: [ 
        { 
          slot: '0x3ea2f1d0abf3fc66cf29eebb70cbd4e7fe762ef8a09bcc06c8edf641230afec0', 
          value: '0x00000000000000000000000000000000000000000000000000000000000001a4', 
        }, 
      ], 
    } 
  ], 
})verificationGasLimit (optional)
- Type: 
bigint 
The amount of gas to allocate for the verification step.
const userOperation = await bundlerClient.prepareUserOperation({
  account,
  calls: [{
    to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    value: parseEther('1')
  }],
  verificationGasLimit: 69420n, 
})