userOperation.send
Broadcasts a User Operation to the Bundler.
Usage
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
})import { , } from 'viem'
import { , } from 'viem/erc4337'
import { } from 'viem'
import { } from 'viem/chains'
const = .({
: ,
: ()
})
export const = await .({
,
: .('0x...'),
})
export const = .({
,
: ('https://public.pimlico.io/v2/1/rpc')
})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).
import { } from 'viem/utils'
import { } from './config'
const = await ..({
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
})import { , } from 'viem'
import { , } from 'viem/erc4337'
import { } from 'viem'
import { } from 'viem/chains'
const = .({
: ,
: ()
})
export const = await .({
,
: .('0x...'),
})
export const = .({
,
,
: ('https://public.pimlico.io/v2/1/rpc')
})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',
}],
})export const = [
// ...
{
: [],
: "mint",
: [],
: "nonpayable",
: "function",
},
// ...
] as ;import { , } from 'viem'
import { , } from 'viem/erc4337'
import { } from 'viem'
import { } from 'viem/chains'
const = .({
: ,
: ()
})
export const = await .({
,
: .('0x...'),
})
export const = .({
,
,
: ('https://public.pimlico.io/v2/1/rpc')
})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,
})