userOperation.estimateGas
Estimates the gas values for a User Operation to be executed successfully.
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')
})Missing fields are prepared when a Smart Account is available. A partial User Operation can be estimated without an account when entryPointAddress and sender are provided.
Account Hoisting
If you do not wish to pass an account to every userOperation.estimateGas, 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
{
callGasLimit: bigint;
preVerificationGas: bigint;
verificationGasLimit: bigint;
paymasterVerificationGasLimit: bigint | undefined;
paymasterPostOpGasLimit: bigint | undefined;
}The estimated gas values.
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 a delegated account.
callGasLimit
- Type:
bigint
The amount of gas to allocate the main execution call.
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
: 69420n,
})calls
- Type:
{ data: Hex, to: Address, value: bigint }[]
The calls to execute in the User Operation.
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}]
})entryPointAddress
- Type:
Address - Default:
account.entryPoint.address
EntryPoint used for estimation. This is required when estimating without a Smart Account.
factory
- Type:
Address
Account Factory address.
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
: '0x1234567890123456789012345678901234567890',
: '0xdeadbeef',
})factoryData
- Type:
Hex
Call data to execute on the Account Factory to deploy a Smart Account.
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
: '0x1234567890123456789012345678901234567890',
: '0xdeadbeef',
})maxFeePerGas
- Type:
bigint
Maximum fee per gas for User Operation execution.
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
: 420n,
})maxPriorityFeePerGas
- Type:
bigint
Maximum priority fee per gas for User Operation execution.
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
: 420n,
: 10n,
})nonce
- Type:
bigint
Nonce for the User Operation.
import { } from 'viem/utils'
import { , } from './config'
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://public.pimlico.io/v2/11155111/rpc')
})
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
: ,
: {
: 'abc123'
},
})paymasterData
- Type:
Address
Call data to execute on the Paymaster contract.
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
: '0x942fD5017c0F60575930D8574Eaca13BEcD6e1bB',
: '0xdeadbeef',
})paymasterPostOpGasLimit
- Type:
bigint
The amount of gas to allocate for the Paymaster post-operation code.
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
: '0x942fD5017c0F60575930D8574Eaca13BEcD6e1bB',
: '0xdeadbeef',
: 69420n,
})paymasterSignature
- Type:
Hex
EntryPoint 0.9 Paymaster signature. It is excluded from the account-signed User Operation hash.
paymasterVerificationGasLimit
- Type:
bigint
The amount of gas to allocate for the Paymaster validation code.
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
: '0x942fD5017c0F60575930D8574Eaca13BEcD6e1bB',
: '0xdeadbeef',
: 69420n,
})preVerificationGas
- Type:
bigint
Extra gas to pay the Bundler.
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
: 69420n,
})sender
- Type:
Address
Sender address for a partial User Operation supplied without a Smart Account.
signature
- Type:
Hex
Signature for the User Operation.
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
: '0x...',
})stateOverride
- Type:
StateOverrides
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.
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
: {
'0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC': {
: .('1'),
: {
'0x3ea2f1d0abf3fc66cf29eebb70cbd4e7fe762ef8a09bcc06c8edf641230afec0': '0x00000000000000000000000000000000000000000000000000000000000001a4',
},
},
},
})verificationGasLimit
- Type:
bigint
The amount of gas to allocate for the verification step.
import { } from 'viem/utils'
import { , } from './config'
const = await ..({
,
: [{
: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
: .('1')
}],
: 69420n,
})