@owlprotocol/contracts-account-abstraction
Version:
ERC4337 Account Abstraction support for deploying relevant smart contracts and interacting with UserOps.
47 lines (46 loc) • 1.51 kB
JavaScript
import { decodeAbiParameters, encodeAbiParameters, keccak256, sliceHex } from "viem";
function getVerifyingPaymasterHash(params) {
const { chainId, userOperation } = params;
const abi = [
{ type: "address", name: "sender" },
{ type: "uint256", name: "nonce" },
{ type: "bytes32", name: "initCodeHash" },
{ type: "bytes32", name: "callDataHash" },
{ type: "bytes32", name: "accountGasLimits" },
{ type: "uint256", name: "paymasterAndData" },
{ type: "uint256", name: "preVerificationGas" },
{ type: "bytes32", name: "gasFees" },
{ type: "uint256", name: "chainId" },
{ type: "address", name: "paymaster" },
{ type: "uint48", name: "validUntil" },
{ type: "uint48", name: "validAfter" }
];
const [validUntil, validAfter] = decodeAbiParameters(
[
{ name: "validUntil", type: "uint48" },
{ name: "validAfter", type: "uint48" }
],
sliceHex(userOperation.paymasterAndData, 52)
);
return keccak256(
encodeAbiParameters(abi, [
userOperation.sender,
userOperation.nonce,
keccak256(userOperation.initCode),
keccak256(userOperation.callData),
userOperation.accountGasLimits,
sliceHex(userOperation.paymasterAndData, 20, 52),
//paymaster gas
userOperation.preVerificationGas,
userOperation.gasFees,
chainId,
sliceHex(userOperation.paymasterAndData, 0, 20),
// paymaster address
validUntil,
validAfter
])
);
}
export {
getVerifyingPaymasterHash
};