userop & 7702 hash calculator

erc-4337 userOpHash for entrypoint v0.6–v0.9, and eip-7702 authorization hashes.

userOp jsonv0.6 or v0.7+ fields, packed or not. eth_sendUserOperation params work too
try
entrypointabi-encoded hash of the packed userOp
chainthe chain id goes into the hash

userOpHash

entrypoint v0.7
userOpHash: keccak256(abi.encode(packHash, entryPoint, chainId))
0x551f7f54a198928c07a006728dc59e6e0ebd4ca0b6920be3d95fdd23e82c322bwhat validateUserOp receives and what the account's owner signs
keccak256(pack(userOp))
0x341fd4e972feaecfa2c5c3b19d97f4442dfd8a8d91518b2e90c86db8c418e12devery field except the signature; dynamic fields go in as their keccak256

simpleaccount-style v0.6 / v0.7 accounts check personal_sign over this hash (the \x19Ethereum Signed Message prefix is added).

the fields

sender
0x5a6b2f7d1e3c8B4A9F0E1D2c3b4A5968778695A4
nonce
seq 0
callGasLimit
80,000
verificationGasLimit
100,000
preVerificationGas
46,536
maxFeePerGas
0.1 gwei
maxPriorityFeePerGas
0.001 gwei
max gas cost
0.0000226536 ETH226,536 gas × maxFeePerGas: the prefund the entrypoint holds back
packed form (what handleOps and the entrypoint take)
initCode
0x
accountGasLimits
0x000000000000000000000000000186a000000000000000000000000000013880
gasFees
0x000000000000000000000000000f424000000000000000000000000005f5e100
paymasterAndData
0x

what it does

account function
execute(address,uint256,bytes)
used by
simpleaccount, light account, coinbase smart wallet, simple7702
calls
1
  1. 1. 0xa9059cbb

    to 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913

good to know

  • the signature is never part of the hash, so you can compute it before signing, and the same op on another chain or entrypoint gets a different hash.
  • bundlers return this hash from eth_sendUserOperation; look it up with eth_getUserOperationReceipt or on a 4337 explorer like jiffyscan or blockscout.
  • v0.7+ rpc fields (factory, paymaster…) and the packed onchain form (initCode, accountGasLimits, gasFees, paymasterAndData) give the same hash.

about this tool

Paste a UserOperation (v0.6, v0.7+ RPC or packed fields) to get its userOpHash for any EntryPoint version and chain, checked against the deployed EntryPoint, with the account callData decoded. The EIP-7702 tab builds the authorization hash from chain id, delegate and nonce, shows the RLP preimage, and recovers the signer from a signature.

good to know

why does my userOpHash differ from the bundler’s?

the hash covers the chain id and the entrypoint address, so check both, plus the entrypoint version: v0.6/v0.7 abi-encode the op, v0.8+ use eip-712. the signature is never part of it.

what does an eip-7702 authorization sign?

keccak256(0x05 ‖ rlp([chain_id, delegate address, nonce])), signed as raw ecdsa with no message prefix. chain id 0 means every chain, and if the eoa sends the type-4 tx itself it must sign its nonce + 1.

how do i decode a userop’s callData?

it is a call to the smart account itself, usually execute or executeBatch (or erc-7579 execute(mode, data)). the tool unpacks those into the inner calls and names each function by its selector.