From 082f5b8cf67c486b2e7f29697d361f1322f24a5c Mon Sep 17 00:00:00 2001 From: mouseless <97399882+mouseless-eth@users.noreply.github.com> Date: Thu, 29 Aug 2024 15:02:35 +0100 Subject: [PATCH 1/2] fix v07 prefund calculations --- .../utils/getRequiredPrefund.test.ts | 47 +++++++++++++++++++ .../utils/getRequiredPrefund.ts | 12 ++--- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/packages/permissionless/utils/getRequiredPrefund.test.ts b/packages/permissionless/utils/getRequiredPrefund.test.ts index 2ce46daa..eafd923a 100644 --- a/packages/permissionless/utils/getRequiredPrefund.test.ts +++ b/packages/permissionless/utils/getRequiredPrefund.test.ts @@ -64,4 +64,51 @@ describe("getRequiredPrefund", () => { 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 gasLimits", () => { + const userOperation = { + callGasLimit: BigInt(1000), + verificationGasLimit: BigInt(2000), + preVerificationGas: BigInt(500), + paymasterVerificationGasLimit: BigInt(20), + paymasterPostOpGasLimit: BigInt(30), + paymaster: "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + paymasterData: "0x1234", + maxFeePerGas: BigInt(10) + } + const result = getRequiredPrefund({ + userOperation: userOperation as UserOperation<"0.7">, + entryPointVersion: "0.7" + }) + const expectedGas = + 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 } From 3c5f61781dff820256dd121db9bf0f49dc3910d2 Mon Sep 17 00:00:00 2001 From: mouseless <97399882+mouseless-eth@users.noreply.github.com> Date: Thu, 29 Aug 2024 15:12:08 +0100 Subject: [PATCH 2/2] fix failing tests --- .../utils/getRequiredPrefund.test.ts | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/packages/permissionless/utils/getRequiredPrefund.test.ts b/packages/permissionless/utils/getRequiredPrefund.test.ts index eafd923a..a076f7d1 100644 --- a/packages/permissionless/utils/getRequiredPrefund.test.ts +++ b/packages/permissionless/utils/getRequiredPrefund.test.ts @@ -40,29 +40,6 @@ describe("getRequiredPrefund", () => { const expectedResult = expectedGas * BigInt(10) expect(result).toBe(expectedResult) }) - - test("should calculate the required prefund with paymaster", () => { - const userOperation = { - callGasLimit: BigInt(1000), - verificationGasLimit: BigInt(2000), - preVerificationGas: BigInt(500), - maxFeePerGas: BigInt(10), - paymaster: "0xPaymasterAddress", - paymasterPostOpGasLimit: BigInt(100), - paymasterVerificationGasLimit: BigInt(200) - } - 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) - const expectedResult = expectedGas * BigInt(10) - expect(result).toBe(expectedResult) - }) }) describe("v0.7 UserOperation", () => { test("should calculate the required prefund without paymater gasLimits", () => { @@ -94,7 +71,6 @@ describe("getRequiredPrefund", () => { paymasterVerificationGasLimit: BigInt(20), paymasterPostOpGasLimit: BigInt(30), paymaster: "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - paymasterData: "0x1234", maxFeePerGas: BigInt(10) } const result = getRequiredPrefund({