@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
JavaScript
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
};