diff --git a/packages/permissionless/utils/getRequiredPrefund.test.ts b/packages/permissionless/utils/getRequiredPrefund.test.ts index 2ce46daa..a076f7d1 100644 --- a/packages/permissionless/utils/getRequiredPrefund.test.ts +++ b/packages/permissionless/utils/getRequiredPrefund.test.ts @@ -40,26 +40,49 @@ describe("getRequiredPrefund", () => { const expectedResult = expectedGas * BigInt(10) expect(result).toBe(expectedResult) }) + }) + describe("v0.7 UserOperation", () => { + test("should calculate the required prefund without paymater gasLimits", () => { + const userOperation = { + callGasLimit: BigInt(1000), + verificationGasLimit: BigInt(2000), + preVerificationGas: BigInt(500), + paymasterVerificationGasLimit: undefined, + paymasterPostOpGasLimit: undefined, + paymaster: undefined, + paymasterData: undefined, + maxFeePerGas: BigInt(10) + } + const result = getRequiredPrefund({ + userOperation: userOperation as UserOperation<"0.7">, + entryPointVersion: "0.7" + }) + const expectedGas = + BigInt(1000) + BigInt(2000) * BigInt(1) + BigInt(500) + const expectedResult = expectedGas * BigInt(10) + expect(result).toBe(expectedResult) + }) - test("should calculate the required prefund with paymaster", () => { + test("should calculate the required prefund with paymaster gasLimits", () => { const userOperation = { callGasLimit: BigInt(1000), verificationGasLimit: BigInt(2000), preVerificationGas: BigInt(500), - maxFeePerGas: BigInt(10), - paymaster: "0xPaymasterAddress", - paymasterPostOpGasLimit: BigInt(100), - paymasterVerificationGasLimit: BigInt(200) + paymasterVerificationGasLimit: BigInt(20), + paymasterPostOpGasLimit: BigInt(30), + paymaster: "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + maxFeePerGas: BigInt(10) } const result = getRequiredPrefund({ userOperation: userOperation as UserOperation<"0.7">, entryPointVersion: "0.7" }) - const multiplier = BigInt(3) - const verificationGasLimit = - BigInt(2000) + BigInt(100) + BigInt(200) const expectedGas = - BigInt(1000) + verificationGasLimit * multiplier + BigInt(500) + BigInt(1000) + + BigInt(2000) + + BigInt(500) + + BigInt(20) + + BigInt(30) const expectedResult = expectedGas * BigInt(10) expect(result).toBe(expectedResult) }) diff --git a/packages/permissionless/utils/getRequiredPrefund.ts b/packages/permissionless/utils/getRequiredPrefund.ts index 84b1bfd3..b90162a4 100644 --- a/packages/permissionless/utils/getRequiredPrefund.ts +++ b/packages/permissionless/utils/getRequiredPrefund.ts @@ -42,17 +42,13 @@ export const getRequiredPrefund = ({ } const userOperationV07 = userOperation as UserOperation<"0.7"> - const multiplier = userOperationV07.paymaster ? BigInt(3) : BigInt(1) - - const verificationGasLimit = - userOperationV07.verificationGasLimit + - (userOperationV07.paymasterPostOpGasLimit || BigInt(0)) + - (userOperationV07.paymasterVerificationGasLimit || BigInt(0)) const requiredGas = + userOperationV07.verificationGasLimit + userOperationV07.callGasLimit + - verificationGasLimit * multiplier + + (userOperationV07.paymasterVerificationGasLimit || 0n) + + (userOperationV07.paymasterPostOpGasLimit || 0n) + userOperationV07.preVerificationGas - return BigInt(requiredGas) * BigInt(userOperationV07.maxFeePerGas) + return requiredGas * userOperationV07.maxFeePerGas }