UNPKG

@owlprotocol/contracts-account-abstraction

Version:

ERC4337 Account Abstraction support for deploying relevant smart contracts and interacting with UserOps.

59 lines (58 loc) 2.29 kB
import { concatHex } from "viem"; import { getAction, encodeAbiParameters } from "viem/utils"; import { getChainId } from "viem/actions"; import { toPackedUserOperation } from "../../models/PackedUserOperation.js"; import { dummySignature, encodeUserOp } from "../../models/UserOperation.js"; import { getSupportedEntryPoints } from "../bundler/getSupportedEntryPoints.js"; import { getVerifyingPaymasterHash } from "../../VerifyingPaymaster.js"; async function getPaymasterData(client, parameters) { const { entryPointAddress, ...userOperation } = parameters; const { paymaster } = client; const chainId = client.chain?.id ?? await getAction(client, getChainId, "getChainId")({}); const supportedEntryPoints = await getAction( client, getSupportedEntryPoints, "getSupportedEntryPoints" )({}); if (!supportedEntryPoints.includes(entryPointAddress)) { throw new Error(`Unsupported entrypoint ${entryPointAddress}, expected one of ${supportedEntryPoints}`); } const validUntil = Date.now() + 3600; const validAfter = 0; const paymasterDataUnsigned = encodeAbiParameters( [ { name: "validUntil", type: "uint48" }, { name: "validAfter", type: "uint48" } ], [validUntil, validAfter] ); const userOpPaymasterPacked = toPackedUserOperation( encodeUserOp({ ...userOperation, preVerificationGas: userOperation.preVerificationGas ?? 0n, verificationGasLimit: userOperation.verificationGasLimit ?? 0n, callGasLimit: userOperation.callGasLimit ?? 0n, maxFeePerGas: userOperation.maxFeePerGas ?? 0n, maxPriorityFeePerGas: userOperation.maxPriorityFeePerGas ?? 0n, signature: dummySignature, paymaster, paymasterData: concatHex([paymasterDataUnsigned, dummySignature]) }) ); const userOpPaymasterHash = getVerifyingPaymasterHash({ chainId, userOperation: userOpPaymasterPacked }); const paymasterSignature = await client.account.signMessage({ message: { raw: userOpPaymasterHash } }); const paymasterDataSigned = concatHex([paymasterDataUnsigned, paymasterSignature]); return { paymaster, paymasterData: paymasterDataSigned, paymasterVerificationGasLimit: 100000n, paymasterPostOpGasLimit: 100000n }; } export { getPaymasterData };