Skip to content
LogoLogo

userOperation.send

Broadcasts a User Operation to the Bundler.

Usage

import {  } from 'viem/utils'
import { ,  } from './config'
 
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
})

Pass either calls for Smart Account encoding or an already encoded callData. A complete User Operation can be sent without an account when entryPointAddress, sender, and signature are provided.

Simple7702 Authorization

The first User Operation from a Simple7702SmartAccount needs a signed EIP-7702 authorization.

import { Actions as CoreActions } from 'viem'
 
const authorization = await CoreActions.wallet.signAuthorization(
  client,
  account.authorization,
)
 
const hash = await bundlerClient.userOperation.send({
  authorization,
  calls: [{ to: '0x0000000000000000000000000000000000000000' }],
})

Later User Operations can omit authorization after the account is delegated.

Account Hoisting

If you do not wish to pass an account to every userOperation.send, you can also hoist the Account on the Bundler Client (see config.ts).

Learn more.

import {  } from 'viem/utils'
import {  } from './config'
 
const  = await ..({
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
})

Contract Calls

The calls property also accepts Contract Calls, and can be used via the abi, functionName, and args properties.

import {  } from './config'
import {  } from './abi'
 
const  = await ..({
  : [{
    : ,
    : 'mint',
    : '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
  }],
})

Returns

Hash

The User Operation hash.

Parameters

account

  • Type: SmartAccount
  • Default: bundlerClient.account

The Account to use for User Operation execution.

import {  } from 'viem/utils'
import { ,  } from './config'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }]
})

authorization

  • Type: Authorization.Signed

Signed EIP-7702 authorization for the first User Operation from a delegated account.

callGasLimit

  • Type: bigint

The amount of gas to allocate the main execution call.

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : 69420n,
})

calls

  • Type: ({ data?: Hex | undefined, to: Address, value?: bigint | undefined } | { abi: Abi, functionName: string, args: unknown[], to: Address, value?: bigint | undefined })[]

The calls to execute in the User Operation.

import { ,  } from './config'
import {  } from 'viem/utils'
import {  } from './abi'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }, {
    : ,
    : 'mint',
    : '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
  }]
})

dataSuffix

  • Type: Hex

Data to append to the end of User Operation calldata. Useful for adding transaction attribution.

If not provided, the dataSuffix configured on the Bundler Client (or inherited from the underlying client) will be used.

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : '0xdeadbeef',
})

entryPointAddress

  • Type: Address
  • Default: account.entryPoint.address

EntryPoint that receives the User Operation. This is required when sending a complete User Operation without a Smart Account.

factory

  • Type: Address

Account Factory address.

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : '0x1234567890123456789012345678901234567890',
  : '0xdeadbeef',
})

factoryData

  • Type: Hex

Call data to execute on the Account Factory to deploy a Smart Account.

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : '0x1234567890123456789012345678901234567890',
  : '0xdeadbeef',
})

maxFeePerGas

  • Type: bigint

Maximum fee per gas for User Operation execution.

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : 420n,
})

maxPriorityFeePerGas

  • Type: bigint

Maximum priority fee per gas for User Operation execution.

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : 420n,
  : 10n,
})

nonce

  • Type: bigint

Nonce for the User Operation.

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : 10n,
})

paymaster

  • 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

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : '0x942fD5017c0F60575930D8574Eaca13BEcD6e1bB',
  : '0xdeadbeef',
})

Using a Paymaster Client

import { ,  } from './config'
import {  } from 'viem'
import {  } from 'viem/utils'
import {  } from 'viem/erc4337'
const  = .({
  : ('https://api.pimlico.io/v2/1/rpc?apikey={API_KEY}')
})
 
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : ,
})

Using the Bundler Client as Paymaster

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : true,
})

paymasterContext

  • Type: unknown

Paymaster specific fields.

import { ,  } from './config'
import {  } from 'viem'
import {  } from 'viem/utils'
import {  } from 'viem/erc4337'
const  = .({
  : ('https://api.pimlico.io/v2/1/rpc?apikey={API_KEY}')
})
 
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : ,
  : {
    : 'abc123'
  },
})

paymasterData

  • Type: Address

Call data to execute on the Paymaster contract.

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : '0x942fD5017c0F60575930D8574Eaca13BEcD6e1bB',
  : '0xdeadbeef',
})

paymasterPostOpGasLimit

  • Type: bigint

The amount of gas to allocate for the Paymaster post-operation code.

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : '0x942fD5017c0F60575930D8574Eaca13BEcD6e1bB',
  : '0xdeadbeef',
  : 69420n,
})

paymasterSignature

  • Type: Hex

EntryPoint 0.9 Paymaster signature. Viem packs it after paymasterData without changing the account-signed User Operation hash.

paymasterVerificationGasLimit

  • Type: bigint

The amount of gas to allocate for the Paymaster validation code.

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : '0x942fD5017c0F60575930D8574Eaca13BEcD6e1bB',
  : '0xdeadbeef',
  : 69420n,
})

preVerificationGas

  • Type: bigint

Extra gas to pay the Bundler.

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : 69420n,
})

sender

  • Type: Address

Sender address for a complete User Operation supplied without a Smart Account.

signature

  • Type: Hex

Signature for the User Operation.

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : '0x...',
})

verificationGasLimit

  • Type: bigint

The amount of gas to allocate for the verification step.

import { ,  } from './config'
import {  } from 'viem/utils'
const  = await ..({
  ,
  : [{
    : '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
    : .('1')
  }],
  : 69420n,
})