@zerodev/sdk 4.2.3 → 4.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/cjs/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts +58 -4
  2. package/dist/cjs/kernel-zerodev/abis/SessionKeyValidatorAbi.js +75 -4
  3. package/dist/cjs/kernel-zerodev/abis/SessionKeyValidatorAbi.js.map +1 -1
  4. package/dist/cjs/kernel-zerodev/constants.d.ts +1 -1
  5. package/dist/cjs/kernel-zerodev/constants.js +1 -1
  6. package/dist/cjs/kernel-zerodev/constants.js.map +1 -1
  7. package/dist/cjs/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  8. package/dist/cjs/kernel-zerodev/provider.d.ts +3 -0
  9. package/dist/cjs/kernel-zerodev/provider.js +36 -1
  10. package/dist/cjs/kernel-zerodev/provider.js.map +1 -1
  11. package/dist/cjs/kernel-zerodev/validator/base.d.ts +1 -1
  12. package/dist/cjs/kernel-zerodev/validator/base.js +3 -3
  13. package/dist/cjs/kernel-zerodev/validator/base.js.map +1 -1
  14. package/dist/cjs/kernel-zerodev/validator/session-key-validator.d.ts +18 -7
  15. package/dist/cjs/kernel-zerodev/validator/session-key-validator.js +117 -63
  16. package/dist/cjs/kernel-zerodev/validator/session-key-validator.js.map +1 -1
  17. package/dist/cjs/kernel-zerodev/validator/types.d.ts +1 -1
  18. package/dist/cjs/kernel-zerodev/validator/types.js.map +1 -1
  19. package/dist/cjs/kernel-zerodev/validator-provider/base.js +9 -0
  20. package/dist/cjs/kernel-zerodev/validator-provider/base.js.map +1 -1
  21. package/dist/esm/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts +58 -4
  22. package/dist/esm/kernel-zerodev/abis/SessionKeyValidatorAbi.js +75 -4
  23. package/dist/esm/kernel-zerodev/abis/SessionKeyValidatorAbi.js.map +1 -1
  24. package/dist/esm/kernel-zerodev/constants.d.ts +1 -1
  25. package/dist/esm/kernel-zerodev/constants.js +1 -1
  26. package/dist/esm/kernel-zerodev/constants.js.map +1 -1
  27. package/dist/esm/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  28. package/dist/esm/kernel-zerodev/provider.d.ts +3 -0
  29. package/dist/esm/kernel-zerodev/provider.js +38 -3
  30. package/dist/esm/kernel-zerodev/provider.js.map +1 -1
  31. package/dist/esm/kernel-zerodev/validator/base.d.ts +1 -1
  32. package/dist/esm/kernel-zerodev/validator/base.js +3 -3
  33. package/dist/esm/kernel-zerodev/validator/base.js.map +1 -1
  34. package/dist/esm/kernel-zerodev/validator/session-key-validator.d.ts +18 -7
  35. package/dist/esm/kernel-zerodev/validator/session-key-validator.js +118 -64
  36. package/dist/esm/kernel-zerodev/validator/session-key-validator.js.map +1 -1
  37. package/dist/esm/kernel-zerodev/validator/types.d.ts +1 -1
  38. package/dist/esm/kernel-zerodev/validator/types.js.map +1 -1
  39. package/dist/esm/kernel-zerodev/validator-provider/base.js +9 -0
  40. package/dist/esm/kernel-zerodev/validator-provider/base.js.map +1 -1
  41. package/dist/types/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts +58 -4
  42. package/dist/types/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts.map +1 -1
  43. package/dist/types/kernel-zerodev/constants.d.ts +1 -1
  44. package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
  45. package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts.map +1 -1
  46. package/dist/types/kernel-zerodev/provider.d.ts +3 -0
  47. package/dist/types/kernel-zerodev/provider.d.ts.map +1 -1
  48. package/dist/types/kernel-zerodev/validator/base.d.ts +1 -1
  49. package/dist/types/kernel-zerodev/validator/base.d.ts.map +1 -1
  50. package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts +18 -7
  51. package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts.map +1 -1
  52. package/dist/types/kernel-zerodev/validator/types.d.ts +1 -1
  53. package/dist/types/kernel-zerodev/validator/types.d.ts.map +1 -1
  54. package/dist/types/kernel-zerodev/validator-provider/base.d.ts.map +1 -1
  55. package/package.json +5 -4
  56. package/src/kernel-zerodev/__tests__/config/index.ts +18 -0
  57. package/src/kernel-zerodev/abis/SessionKeyValidatorAbi.ts +75 -4
  58. package/src/kernel-zerodev/constants.ts +1 -1
  59. package/src/kernel-zerodev/provider.ts +27 -1
  60. package/src/kernel-zerodev/validator/base.ts +4 -4
  61. package/src/kernel-zerodev/validator/session-key-validator.ts +159 -88
  62. package/src/kernel-zerodev/validator/types.ts +1 -1
  63. package/src/kernel-zerodev/validator-provider/base.ts +13 -0
@@ -1,5 +1,5 @@
1
- import { fromHex, } from "viem";
2
- import { deepHexlify, resolveProperties, getChain, asyncPipe, noOpMiddleware, SmartAccountProvider, } from "@alchemy/aa-core";
1
+ import { fromHex, getAbiItem, } from "viem";
2
+ import { deepHexlify, resolveProperties, getChain, asyncPipe, noOpMiddleware, SmartAccountProvider, EntryPointAbi, } from "@alchemy/aa-core";
3
3
  import { BUNDLER_URL, DEFAULT_SEND_TX_MAX_RETRIES, DEFAULT_SEND_TX_RETRY_INTERVAL_MS, ENTRYPOINT_ADDRESS, minPriorityFeePerBidDefaults, } from "./constants.js";
4
4
  import { KernelSmartContractAccount, isKernelAccount } from "./account.js";
5
5
  import { withZeroDevGasEstimator } from "./middleware/gas-estimator.js";
@@ -23,7 +23,7 @@ export class ZeroDevProvider extends SmartAccountProvider {
23
23
  });
24
24
  super(rpcClient, entryPointAddress, _chain, account, {
25
25
  ...opts,
26
- txMaxRetries: opts?.txMaxRetries ?? 10,
26
+ txMaxRetries: opts?.txMaxRetries ?? 20,
27
27
  txRetryIntervalMs: opts?.txRetryIntervalMs ?? 10000,
28
28
  minPriorityFeePerBid: opts?.minPriorityFeePerBid ??
29
29
  minPriorityFeePerBidDefaults.get(_chain.id),
@@ -52,6 +52,18 @@ export class ZeroDevProvider extends SmartAccountProvider {
52
52
  writable: true,
53
53
  value: void 0
54
54
  });
55
+ Object.defineProperty(this, "_txMaxRetries", {
56
+ enumerable: true,
57
+ configurable: true,
58
+ writable: true,
59
+ value: void 0
60
+ });
61
+ Object.defineProperty(this, "_txRetryIntervalMs", {
62
+ enumerable: true,
63
+ configurable: true,
64
+ writable: true,
65
+ value: void 0
66
+ });
55
67
  Object.defineProperty(this, "getProjectId", {
56
68
  enumerable: true,
57
69
  configurable: true,
@@ -217,6 +229,27 @@ export class ZeroDevProvider extends SmartAccountProvider {
217
229
  };
218
230
  }
219
231
  });
232
+ Object.defineProperty(this, "waitForUserOperationTransaction", {
233
+ enumerable: true,
234
+ configurable: true,
235
+ writable: true,
236
+ value: async (hash) => {
237
+ let blockNumber = await this.rpcClient.getBlockNumber();
238
+ for (let i = 0; i < this._txMaxRetries; i++) {
239
+ const logs = await this.rpcClient.getLogs({
240
+ address: ENTRYPOINT_ADDRESS,
241
+ event: getAbiItem({ abi: EntryPointAbi, name: "UserOperationEvent" }),
242
+ args: { userOpHash: hash },
243
+ fromBlock: blockNumber - 100n,
244
+ });
245
+ if (logs.length) {
246
+ return logs[0].transactionHash;
247
+ }
248
+ await new Promise((resolve) => setTimeout(resolve, this._txRetryIntervalMs));
249
+ }
250
+ throw new Error("Failed to find transaction for User Operation");
251
+ }
252
+ });
220
253
  Object.defineProperty(this, "getAccount", {
221
254
  enumerable: true,
222
255
  configurable: true,
@@ -265,6 +298,8 @@ export class ZeroDevProvider extends SmartAccountProvider {
265
298
  }
266
299
  }
267
300
  });
301
+ this._txMaxRetries = opts?.txMaxRetries ?? 20;
302
+ this._txRetryIntervalMs = opts?.txRetryIntervalMs ?? 5000;
268
303
  this.bundlerProvider = bundlerProvider;
269
304
  this.projectId = projectId;
270
305
  this.sendTxMaxRetries =
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/kernel-zerodev/provider.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n fromHex,\n type Address,\n type Chain,\n type Hash,\n type Hex,\n type HttpTransport,\n type RpcTransactionRequest,\n} from \"viem\";\nimport {\n deepHexlify,\n resolveProperties,\n type SmartAccountProviderOpts,\n getChain,\n type UserOperationCallData,\n type BatchUserOperationCallData,\n type SendUserOperationResult,\n asyncPipe,\n noOpMiddleware,\n type UserOperationStruct,\n type BytesLike,\n SmartAccountProvider,\n type AccountMiddlewareFn,\n type UserOperationOverrides,\n} from \"@alchemy/aa-core\";\nimport {\n BUNDLER_URL,\n DEFAULT_SEND_TX_MAX_RETRIES,\n DEFAULT_SEND_TX_RETRY_INTERVAL_MS,\n ENTRYPOINT_ADDRESS,\n minPriorityFeePerBidDefaults,\n} from \"./constants.js\";\nimport { KernelSmartContractAccount, isKernelAccount } from \"./account.js\";\nimport { withZeroDevGasEstimator } from \"./middleware/gas-estimator.js\";\nimport { isValidRequest } from \"./utils/ERC4337-utils.js\";\nimport { InvalidOperation } from \"./errors.js\";\nimport { withZeroDevPaymasterAndData } from \"./middleware/paymaster.js\";\nimport { createZeroDevPublicErc4337Client } from \"./client/create-client.js\";\nimport type {\n PaymasterAndBundlerProviders,\n PaymasterConfig,\n PaymasterPolicy,\n} from \"./paymaster/types.js\";\n\nexport type ZeroDevProviderConfig = {\n projectId: string;\n chain: Chain | number;\n entryPointAddress?: Address;\n rpcUrl?: string;\n account?: KernelSmartContractAccount;\n bundlerProvider?: PaymasterAndBundlerProviders;\n opts?: SmartAccountProviderOpts & {\n sendTxMaxRetries?: number;\n sendTxRetryIntervalMs?: number;\n };\n};\n\nexport enum Operation {\n Call = 0,\n DelegateCall = 1,\n}\n\ntype UserOpDataOperationTypes<T> = T extends UserOperationCallData\n ? Operation.Call | Operation.DelegateCall\n : T extends BatchUserOperationCallData\n ? Operation.Call\n : never;\n\nexport class ZeroDevProvider extends SmartAccountProvider<HttpTransport> {\n protected projectId: string;\n protected sendTxMaxRetries: number;\n protected sendTxRetryIntervalMs: number;\n readonly bundlerProvider?: PaymasterAndBundlerProviders;\n\n constructor({\n projectId,\n chain,\n entryPointAddress = ENTRYPOINT_ADDRESS,\n rpcUrl = BUNDLER_URL,\n account,\n bundlerProvider,\n opts,\n }: ZeroDevProviderConfig) {\n const _chain = typeof chain === \"number\" ? getChain(chain) : chain;\n const rpcClient = createZeroDevPublicErc4337Client({\n chain: _chain,\n rpcUrl,\n projectId,\n bundlerProvider,\n });\n\n super(rpcClient, entryPointAddress, _chain, account, {\n ...opts,\n txMaxRetries: opts?.txMaxRetries ?? 10,\n txRetryIntervalMs: opts?.txRetryIntervalMs ?? 10000,\n minPriorityFeePerBid:\n opts?.minPriorityFeePerBid ??\n minPriorityFeePerBidDefaults.get(_chain.id),\n });\n\n this.bundlerProvider = bundlerProvider;\n this.projectId = projectId;\n this.sendTxMaxRetries =\n opts?.sendTxMaxRetries ?? DEFAULT_SEND_TX_MAX_RETRIES;\n this.sendTxRetryIntervalMs =\n opts?.sendTxRetryIntervalMs ?? DEFAULT_SEND_TX_RETRY_INTERVAL_MS;\n\n withZeroDevGasEstimator(this);\n }\n\n getProjectId = (): string => this.projectId;\n\n sendTransaction = async (\n request: RpcTransactionRequest,\n operation: UserOpDataOperationTypes<UserOperationCallData> = Operation.Call\n ): Promise<Hash> => {\n if (!request.to) {\n throw new Error(\"transaction is missing to address\");\n }\n\n const overrides: UserOperationOverrides = {};\n if (request.maxFeePerGas) {\n overrides.maxFeePerGas = request.maxFeePerGas;\n }\n if (request.maxPriorityFeePerGas) {\n overrides.maxPriorityFeePerGas = request.maxPriorityFeePerGas;\n }\n\n const { hash } = await this.sendUserOperation(\n {\n target: request.to,\n data: request.data ?? \"0x\",\n value: request.value ? fromHex(request.value, \"bigint\") : 0n,\n },\n overrides,\n operation\n );\n\n return await this.waitForUserOperationTransaction(hash as Hash);\n };\n\n buildUserOperation = async <\n T extends UserOperationCallData | BatchUserOperationCallData\n >(\n data: T,\n overrides?: UserOperationOverrides,\n operation: UserOpDataOperationTypes<T> = Operation.Call as UserOpDataOperationTypes<T>\n ): Promise<UserOperationStruct> => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n if (!this.account.validator) {\n throw new Error(\"validator not connected!\");\n }\n\n let callData: BytesLike = \"0x\";\n\n if (Array.isArray(data)) {\n if (operation === Operation.Call) {\n callData = await this.account.encodeBatchExecute(data);\n } else {\n throw InvalidOperation;\n }\n } else if (isKernelAccount(this.account)) {\n if (operation === Operation.DelegateCall) {\n callData = await this.account.encodeExecuteDelegate(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else if (operation === Operation.Call) {\n callData = await this.account.encodeExecute(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else {\n throw InvalidOperation;\n }\n } else {\n throw InvalidOperation;\n }\n\n const initCode = await this.account.getInitCode();\n const nonce = await this.account.getNonce();\n return await this._runMiddlewareStack(\n {\n initCode,\n sender: this.getAddress(),\n nonce,\n callData,\n signature: await this.account\n .getValidator()\n .getDynamicDummySignature(await this.getAddress(), callData as Hex),\n } as UserOperationStruct,\n overrides\n );\n };\n\n private _runMiddlewareStack = async (\n uo: UserOperationStruct,\n overrides?: UserOperationOverrides\n ): Promise<UserOperationStruct> => {\n const result = await asyncPipe(\n this.dummyPaymasterDataMiddleware,\n this.feeDataGetter,\n this.paymasterDataMiddleware,\n this.gasEstimator,\n this.customMiddleware ?? noOpMiddleware,\n async (struct) => ({ ...struct, ...overrides })\n )(uo);\n\n return deepHexlify(await resolveProperties<UserOperationStruct>(result));\n };\n\n sendUserOperation = async <\n T extends UserOperationCallData | BatchUserOperationCallData\n >(\n data: T,\n overrides?: UserOperationOverrides,\n operation: UserOpDataOperationTypes<T> = Operation.Call as UserOpDataOperationTypes<T>\n ): Promise<SendUserOperationResult> => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n if (!this.account.validator) {\n throw new Error(\"validator not connected!\");\n }\n\n let callData: BytesLike = \"0x\";\n\n if (Array.isArray(data)) {\n if (operation === Operation.Call) {\n callData = await this.account.encodeBatchExecute(data);\n } else {\n throw InvalidOperation;\n }\n } else if (isKernelAccount(this.account)) {\n if (operation === Operation.DelegateCall) {\n callData = await this.account.encodeExecuteDelegate(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else if (operation === Operation.Call) {\n callData = await this.account.encodeExecute(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else {\n throw InvalidOperation;\n }\n } else {\n throw InvalidOperation;\n }\n\n const initCode = await this.account.getInitCode();\n let hash: string = \"\";\n let i = 0;\n const nonce = await this.account.getNonce();\n let uoStruct: UserOperationStruct;\n let request: UserOperationStruct;\n let maxFeePerGas, maxPriorityFeePerGas;\n do {\n uoStruct = await asyncPipe(\n this.dummyPaymasterDataMiddleware,\n this.feeDataGetter,\n this.paymasterDataMiddleware,\n this.gasEstimator,\n this.customMiddleware ?? noOpMiddleware,\n async (struct) => ({ ...struct, ...overrides })\n )({\n initCode,\n sender: this.getAddress(),\n nonce,\n callData,\n signature: await this.account\n .getValidator()\n .getDynamicDummySignature(await this.getAddress(), callData as Hex),\n maxFeePerGas,\n maxPriorityFeePerGas,\n } as UserOperationStruct);\n request = deepHexlify(await resolveProperties(uoStruct));\n\n if (!isValidRequest(request)) {\n // this pretty prints the uo\n throw new Error(\n `Request is missing parameters. All properties on UserOperationStruct must be set. uo: ${JSON.stringify(\n request,\n null,\n 2\n )}`\n );\n }\n\n await this.account.approvePlugin();\n\n request.signature = await this.account.validator.getSignature(request);\n try {\n hash = await this.rpcClient.sendUserOperation(\n request,\n this.entryPointAddress\n );\n } catch (error: any) {\n if (this.isReplacementOpError(error) && i++ < this.sendTxMaxRetries) {\n maxFeePerGas = (BigInt(request.maxFeePerGas) * 113n) / 100n;\n maxPriorityFeePerGas =\n (BigInt(request.maxPriorityFeePerGas) * 113n) / 100n;\n\n console.log(\n `After ${\n this.sendTxRetryIntervalMs / 60000\n } minutes, resending tx with Increased Gas fees: maxFeePerGas: ${maxFeePerGas}, maxPriorityFeePerGas: ${maxPriorityFeePerGas}`\n );\n await new Promise((resolve) =>\n setTimeout(resolve, this.sendTxRetryIntervalMs)\n );\n continue;\n }\n throw this.unwrapError(error);\n }\n } while (hash === \"\");\n\n return {\n hash,\n request,\n };\n };\n\n isReplacementOpError(errorIn: any): boolean {\n if (errorIn.cause != null) {\n const failedOpMessage: string | undefined = errorIn?.cause?.message;\n return (\n (failedOpMessage?.includes(\n \"replacement op must increase maxFeePerGas and MaxPriorityFeePerGas\"\n ) ||\n failedOpMessage?.match(/.*replacement.*underpriced.*/) !== null) ??\n false\n );\n }\n return false;\n }\n\n unwrapError(errorIn: any): Error {\n if (errorIn?.cause != null) {\n let paymasterInfo: string = \"\";\n let failedOpMessage: string | undefined = errorIn?.cause?.message;\n if (failedOpMessage?.includes(\"FailedOp\") === true) {\n // TODO: better error extraction methods will be needed\n const matched = failedOpMessage.match(/FailedOp\\((.*)\\)/);\n if (matched != null) {\n const split = matched[1].split(\",\");\n paymasterInfo = `(paymaster address: ${split[1]})`;\n failedOpMessage = split[2];\n }\n }\n const error = new Error(\n `The bundler has failed to include UserOperation in a batch: ${failedOpMessage} ${paymasterInfo}`\n );\n error.stack = errorIn.stack;\n return error;\n }\n return errorIn;\n }\n\n getAccount: () => KernelSmartContractAccount = () => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n return this.account;\n };\n\n dummyPaymasterDataMiddleware: AccountMiddlewareFn = async (\n struct: UserOperationStruct\n ): Promise<UserOperationStruct> => {\n struct.paymasterAndData = \"0x\";\n return struct;\n };\n\n withZeroDevPaymasterAndData(config: PaymasterConfig<PaymasterPolicy>) {\n if (!this.isConnected()) {\n throw new Error(\n \"ZeroDevProvider: account is not set, did you call `connect` first?\"\n );\n }\n\n return withZeroDevPaymasterAndData(this, config);\n }\n\n request: (args: { method: string; params?: any[] }) => Promise<any> = async (\n args\n ) => {\n const { method, params } = args;\n switch (method) {\n case \"eth_chainId\":\n return this.chain.id;\n case \"eth_sendTransaction\":\n const [tx] = params as [RpcTransactionRequest];\n return this.sendTransaction(tx);\n case \"eth_signTypedData_v4\":\n //@ts-expect-error\n return this.signTypedData(JSON.parse(params[1]));\n case \"personal_sign\":\n if (!this.account) {\n throw new Error(\"account not connected!\");\n }\n const [data, address] = params!;\n if (address.toLowerCase() !== (await this.getAddress()).toLowerCase()) {\n throw new Error(\n \"cannot sign for address that is not the current account\"\n );\n }\n // @ts-ignore\n return this.account.signMessageWith6492(data);\n default:\n // @ts-ignore\n return this.rpcClient.request(args);\n }\n };\n}\n"]}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/kernel-zerodev/provider.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n fromHex,\n type Address,\n type Chain,\n type Hash,\n type Hex,\n type HttpTransport,\n type RpcTransactionRequest,\n getAbiItem,\n} from \"viem\";\nimport {\n deepHexlify,\n resolveProperties,\n type SmartAccountProviderOpts,\n getChain,\n type UserOperationCallData,\n type BatchUserOperationCallData,\n type SendUserOperationResult,\n asyncPipe,\n noOpMiddleware,\n type UserOperationStruct,\n type BytesLike,\n SmartAccountProvider,\n type AccountMiddlewareFn,\n type UserOperationOverrides,\n EntryPointAbi,\n} from \"@alchemy/aa-core\";\nimport {\n BUNDLER_URL,\n DEFAULT_SEND_TX_MAX_RETRIES,\n DEFAULT_SEND_TX_RETRY_INTERVAL_MS,\n ENTRYPOINT_ADDRESS,\n minPriorityFeePerBidDefaults,\n} from \"./constants.js\";\nimport { KernelSmartContractAccount, isKernelAccount } from \"./account.js\";\nimport { withZeroDevGasEstimator } from \"./middleware/gas-estimator.js\";\nimport { isValidRequest } from \"./utils/ERC4337-utils.js\";\nimport { InvalidOperation } from \"./errors.js\";\nimport { withZeroDevPaymasterAndData } from \"./middleware/paymaster.js\";\nimport { createZeroDevPublicErc4337Client } from \"./client/create-client.js\";\nimport type {\n PaymasterAndBundlerProviders,\n PaymasterConfig,\n PaymasterPolicy,\n} from \"./paymaster/types.js\";\n\nexport type ZeroDevProviderConfig = {\n projectId: string;\n chain: Chain | number;\n entryPointAddress?: Address;\n rpcUrl?: string;\n account?: KernelSmartContractAccount;\n bundlerProvider?: PaymasterAndBundlerProviders;\n opts?: SmartAccountProviderOpts & {\n sendTxMaxRetries?: number;\n sendTxRetryIntervalMs?: number;\n };\n};\n\nexport enum Operation {\n Call = 0,\n DelegateCall = 1,\n}\n\ntype UserOpDataOperationTypes<T> = T extends UserOperationCallData\n ? Operation.Call | Operation.DelegateCall\n : T extends BatchUserOperationCallData\n ? Operation.Call\n : never;\n\nexport class ZeroDevProvider extends SmartAccountProvider<HttpTransport> {\n protected projectId: string;\n protected sendTxMaxRetries: number;\n protected sendTxRetryIntervalMs: number;\n readonly bundlerProvider?: PaymasterAndBundlerProviders;\n private _txMaxRetries: number;\n private _txRetryIntervalMs: number;\n\n constructor({\n projectId,\n chain,\n entryPointAddress = ENTRYPOINT_ADDRESS,\n rpcUrl = BUNDLER_URL,\n account,\n bundlerProvider,\n opts,\n }: ZeroDevProviderConfig) {\n const _chain = typeof chain === \"number\" ? getChain(chain) : chain;\n const rpcClient = createZeroDevPublicErc4337Client({\n chain: _chain,\n rpcUrl,\n projectId,\n bundlerProvider,\n });\n\n super(rpcClient, entryPointAddress, _chain, account, {\n ...opts,\n txMaxRetries: opts?.txMaxRetries ?? 20,\n txRetryIntervalMs: opts?.txRetryIntervalMs ?? 10000,\n minPriorityFeePerBid:\n opts?.minPriorityFeePerBid ??\n minPriorityFeePerBidDefaults.get(_chain.id),\n });\n\n this._txMaxRetries = opts?.txMaxRetries ?? 20;\n this._txRetryIntervalMs = opts?.txRetryIntervalMs ?? 5000;\n this.bundlerProvider = bundlerProvider;\n this.projectId = projectId;\n this.sendTxMaxRetries =\n opts?.sendTxMaxRetries ?? DEFAULT_SEND_TX_MAX_RETRIES;\n this.sendTxRetryIntervalMs =\n opts?.sendTxRetryIntervalMs ?? DEFAULT_SEND_TX_RETRY_INTERVAL_MS;\n\n withZeroDevGasEstimator(this);\n }\n\n getProjectId = (): string => this.projectId;\n\n sendTransaction = async (\n request: RpcTransactionRequest,\n operation: UserOpDataOperationTypes<UserOperationCallData> = Operation.Call\n ): Promise<Hash> => {\n if (!request.to) {\n throw new Error(\"transaction is missing to address\");\n }\n\n const overrides: UserOperationOverrides = {};\n if (request.maxFeePerGas) {\n overrides.maxFeePerGas = request.maxFeePerGas;\n }\n if (request.maxPriorityFeePerGas) {\n overrides.maxPriorityFeePerGas = request.maxPriorityFeePerGas;\n }\n\n const { hash } = await this.sendUserOperation(\n {\n target: request.to,\n data: request.data ?? \"0x\",\n value: request.value ? fromHex(request.value, \"bigint\") : 0n,\n },\n overrides,\n operation\n );\n\n return await this.waitForUserOperationTransaction(hash as Hash);\n };\n\n buildUserOperation = async <\n T extends UserOperationCallData | BatchUserOperationCallData\n >(\n data: T,\n overrides?: UserOperationOverrides,\n operation: UserOpDataOperationTypes<T> = Operation.Call as UserOpDataOperationTypes<T>\n ): Promise<UserOperationStruct> => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n if (!this.account.validator) {\n throw new Error(\"validator not connected!\");\n }\n\n let callData: BytesLike = \"0x\";\n\n if (Array.isArray(data)) {\n if (operation === Operation.Call) {\n callData = await this.account.encodeBatchExecute(data);\n } else {\n throw InvalidOperation;\n }\n } else if (isKernelAccount(this.account)) {\n if (operation === Operation.DelegateCall) {\n callData = await this.account.encodeExecuteDelegate(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else if (operation === Operation.Call) {\n callData = await this.account.encodeExecute(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else {\n throw InvalidOperation;\n }\n } else {\n throw InvalidOperation;\n }\n\n const initCode = await this.account.getInitCode();\n const nonce = await this.account.getNonce();\n return await this._runMiddlewareStack(\n {\n initCode,\n sender: this.getAddress(),\n nonce,\n callData,\n signature: await this.account\n .getValidator()\n .getDynamicDummySignature(await this.getAddress(), callData as Hex),\n } as UserOperationStruct,\n overrides\n );\n };\n\n private _runMiddlewareStack = async (\n uo: UserOperationStruct,\n overrides?: UserOperationOverrides\n ): Promise<UserOperationStruct> => {\n const result = await asyncPipe(\n this.dummyPaymasterDataMiddleware,\n this.feeDataGetter,\n this.paymasterDataMiddleware,\n this.gasEstimator,\n this.customMiddleware ?? noOpMiddleware,\n async (struct) => ({ ...struct, ...overrides })\n )(uo);\n\n return deepHexlify(await resolveProperties<UserOperationStruct>(result));\n };\n\n sendUserOperation = async <\n T extends UserOperationCallData | BatchUserOperationCallData\n >(\n data: T,\n overrides?: UserOperationOverrides,\n operation: UserOpDataOperationTypes<T> = Operation.Call as UserOpDataOperationTypes<T>\n ): Promise<SendUserOperationResult> => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n if (!this.account.validator) {\n throw new Error(\"validator not connected!\");\n }\n\n let callData: BytesLike = \"0x\";\n\n if (Array.isArray(data)) {\n if (operation === Operation.Call) {\n callData = await this.account.encodeBatchExecute(data);\n } else {\n throw InvalidOperation;\n }\n } else if (isKernelAccount(this.account)) {\n if (operation === Operation.DelegateCall) {\n callData = await this.account.encodeExecuteDelegate(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else if (operation === Operation.Call) {\n callData = await this.account.encodeExecute(\n data.target,\n data.value ?? 0n,\n data.data\n );\n } else {\n throw InvalidOperation;\n }\n } else {\n throw InvalidOperation;\n }\n\n const initCode = await this.account.getInitCode();\n let hash: string = \"\";\n let i = 0;\n const nonce = await this.account.getNonce();\n let uoStruct: UserOperationStruct;\n let request: UserOperationStruct;\n let maxFeePerGas, maxPriorityFeePerGas;\n do {\n uoStruct = await asyncPipe(\n this.dummyPaymasterDataMiddleware,\n this.feeDataGetter,\n this.paymasterDataMiddleware,\n this.gasEstimator,\n this.customMiddleware ?? noOpMiddleware,\n async (struct) => ({ ...struct, ...overrides })\n )({\n initCode,\n sender: this.getAddress(),\n nonce,\n callData,\n signature: await this.account\n .getValidator()\n .getDynamicDummySignature(await this.getAddress(), callData as Hex),\n maxFeePerGas,\n maxPriorityFeePerGas,\n } as UserOperationStruct);\n request = deepHexlify(await resolveProperties(uoStruct));\n\n if (!isValidRequest(request)) {\n // this pretty prints the uo\n throw new Error(\n `Request is missing parameters. All properties on UserOperationStruct must be set. uo: ${JSON.stringify(\n request,\n null,\n 2\n )}`\n );\n }\n\n await this.account.approvePlugin();\n\n request.signature = await this.account.validator.getSignature(request);\n try {\n hash = await this.rpcClient.sendUserOperation(\n request,\n this.entryPointAddress\n );\n } catch (error: any) {\n if (this.isReplacementOpError(error) && i++ < this.sendTxMaxRetries) {\n maxFeePerGas = (BigInt(request.maxFeePerGas) * 113n) / 100n;\n maxPriorityFeePerGas =\n (BigInt(request.maxPriorityFeePerGas) * 113n) / 100n;\n\n console.log(\n `After ${\n this.sendTxRetryIntervalMs / 60000\n } minutes, resending tx with Increased Gas fees: maxFeePerGas: ${maxFeePerGas}, maxPriorityFeePerGas: ${maxPriorityFeePerGas}`\n );\n await new Promise((resolve) =>\n setTimeout(resolve, this.sendTxRetryIntervalMs)\n );\n continue;\n }\n throw this.unwrapError(error);\n }\n } while (hash === \"\");\n\n return {\n hash,\n request,\n };\n };\n\n isReplacementOpError(errorIn: any): boolean {\n if (errorIn.cause != null) {\n const failedOpMessage: string | undefined = errorIn?.cause?.message;\n return (\n (failedOpMessage?.includes(\n \"replacement op must increase maxFeePerGas and MaxPriorityFeePerGas\"\n ) ||\n failedOpMessage?.match(/.*replacement.*underpriced.*/) !== null) ??\n false\n );\n }\n return false;\n }\n\n unwrapError(errorIn: any): Error {\n if (errorIn?.cause != null) {\n let paymasterInfo: string = \"\";\n let failedOpMessage: string | undefined = errorIn?.cause?.message;\n if (failedOpMessage?.includes(\"FailedOp\") === true) {\n // TODO: better error extraction methods will be needed\n const matched = failedOpMessage.match(/FailedOp\\((.*)\\)/);\n if (matched != null) {\n const split = matched[1].split(\",\");\n paymasterInfo = `(paymaster address: ${split[1]})`;\n failedOpMessage = split[2];\n }\n }\n const error = new Error(\n `The bundler has failed to include UserOperation in a batch: ${failedOpMessage} ${paymasterInfo}`\n );\n error.stack = errorIn.stack;\n return error;\n }\n return errorIn;\n }\n\n waitForUserOperationTransaction = async (hash: Hash): Promise<Hash> => {\n let blockNumber = await this.rpcClient.getBlockNumber();\n for (let i = 0; i < this._txMaxRetries; i++) {\n const logs = await this.rpcClient.getLogs({\n address: ENTRYPOINT_ADDRESS,\n event: getAbiItem({ abi: EntryPointAbi, name: \"UserOperationEvent\" }),\n args: { userOpHash: hash },\n fromBlock: blockNumber - 100n,\n });\n if (logs.length) {\n return logs[0].transactionHash;\n }\n await new Promise((resolve) =>\n setTimeout(resolve, this._txRetryIntervalMs)\n );\n }\n\n throw new Error(\"Failed to find transaction for User Operation\");\n };\n\n getAccount: () => KernelSmartContractAccount = () => {\n if (!isKernelAccount(this.account)) {\n throw new Error(\"account not connected!\");\n }\n return this.account;\n };\n\n dummyPaymasterDataMiddleware: AccountMiddlewareFn = async (\n struct: UserOperationStruct\n ): Promise<UserOperationStruct> => {\n struct.paymasterAndData = \"0x\";\n return struct;\n };\n\n withZeroDevPaymasterAndData(config: PaymasterConfig<PaymasterPolicy>) {\n if (!this.isConnected()) {\n throw new Error(\n \"ZeroDevProvider: account is not set, did you call `connect` first?\"\n );\n }\n\n return withZeroDevPaymasterAndData(this, config);\n }\n\n request: (args: { method: string; params?: any[] }) => Promise<any> = async (\n args\n ) => {\n const { method, params } = args;\n switch (method) {\n case \"eth_chainId\":\n return this.chain.id;\n case \"eth_sendTransaction\":\n const [tx] = params as [RpcTransactionRequest];\n return this.sendTransaction(tx);\n case \"eth_signTypedData_v4\":\n //@ts-expect-error\n return this.signTypedData(JSON.parse(params[1]));\n case \"personal_sign\":\n if (!this.account) {\n throw new Error(\"account not connected!\");\n }\n const [data, address] = params!;\n if (address.toLowerCase() !== (await this.getAddress()).toLowerCase()) {\n throw new Error(\n \"cannot sign for address that is not the current account\"\n );\n }\n // @ts-ignore\n return this.account.signMessageWith6492(data);\n default:\n // @ts-ignore\n return this.rpcClient.request(args);\n }\n };\n}\n"]}
@@ -35,7 +35,7 @@ export declare abstract class KernelBaseValidator {
35
35
  constructor(params: KernelBaseValidatorParams);
36
36
  abstract encodeEnable(enableData: Hex): Hex;
37
37
  abstract encodeDisable(enableData: Hex): Hex;
38
- abstract getEnableData(): Promise<Hex>;
38
+ abstract getEnableData(kernelAccountAddress?: Address): Promise<Hex>;
39
39
  abstract signMessage(message: Uint8Array | string | Hex): Promise<Hex>;
40
40
  abstract signTypedData(params: SignTypedDataParams): Promise<Hex>;
41
41
  abstract signUserOp(userOp: UserOperationRequest): Promise<Hex>;
@@ -120,7 +120,7 @@ export class KernelBaseValidator {
120
120
  const dummyECDSASig = "0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c";
121
121
  const validatorMode = await this.resolveValidatorMode(kernelAccountAddress, calldata);
122
122
  if (validatorMode === ValidatorMode.enable) {
123
- const enableData = await this.getEnableData();
123
+ const enableData = await this.getEnableData(kernelAccountAddress);
124
124
  const enableDataLength = enableData.length / 2 - 1;
125
125
  const enableSigLength = 65;
126
126
  const staticDummySig = concatHex([
@@ -204,7 +204,7 @@ export class KernelBaseValidator {
204
204
  validator.getAddress(),
205
205
  ]), { size: 32 }),
206
206
  executor: executor,
207
- enableData: await validator.getEnableData(),
207
+ enableData: await validator.getEnableData(kernel),
208
208
  },
209
209
  primaryType: "ValidatorApproved",
210
210
  });
@@ -249,7 +249,7 @@ export class KernelBaseValidator {
249
249
  return concatHex([this.mode, await this.signUserOp(userOp)]);
250
250
  }
251
251
  else {
252
- const enableData = await this.getEnableData();
252
+ const enableData = await this.getEnableData(userOp.sender);
253
253
  const enableDataLength = enableData.length / 2 - 1;
254
254
  const enableSignature = this.getEnableSignature();
255
255
  if (!enableSignature) {
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/base.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type SignTypedDataParams,\n type SmartAccountSigner,\n type UserOperationRequest,\n} from \"@alchemy/aa-core\";\nimport {\n concat,\n type Chain,\n type Hex,\n pad,\n toHex,\n type Address,\n concatHex,\n hexToBigInt,\n type PublicClient,\n type Transport,\n createPublicClient,\n http,\n zeroAddress,\n} from \"viem\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport {\n BUNDLER_URL,\n CHAIN_ID_TO_NODE,\n ECDSA_VALIDATOR_ADDRESS,\n ENTRYPOINT_ADDRESS,\n KERNEL_IMPL_ADDRESS,\n} from \"../constants.js\";\nimport { polygonMumbai } from \"viem/chains\";\n\nexport enum ValidatorMode {\n sudo = \"0x00000000\",\n plugin = \"0x00000001\",\n enable = \"0x00000002\",\n}\n\nexport interface KernelBaseValidatorParams {\n projectId: string;\n validatorAddress?: Hex;\n mode?: ValidatorMode;\n chain?: Chain;\n entryPointAddress?: Address;\n enableSignature?: Hex;\n validUntil?: number;\n validAfter?: number;\n executor?: Address;\n selector?: Hex;\n rpcUrl?: string;\n}\n\nexport type ValidatorPluginData = Required<\n Pick<\n KernelBaseValidatorParams,\n \"executor\" | \"selector\" | \"validAfter\" | \"validUntil\"\n >\n>;\n\n//Kernel wallet implementation separates out validation and execution phase. It allows you to have\n// custom wrapper logic for the validation phase in addition to signature of choice.\nexport abstract class KernelBaseValidator {\n readonly validatorAddress: Hex;\n mode: ValidatorMode;\n protected projectId: string;\n protected chain?: Chain;\n protected entryPointAddress: Address;\n protected enableSignature?: Hex;\n protected validUntil: number;\n protected validAfter: number;\n protected executor?: Address;\n protected selector?: Hex;\n protected rpcUrl?: string;\n publicClient?: PublicClient<Transport, Chain>;\n\n constructor(params: KernelBaseValidatorParams) {\n this.projectId = params.projectId;\n this.validatorAddress = params.validatorAddress ?? ECDSA_VALIDATOR_ADDRESS;\n this.mode = params.mode ?? ValidatorMode.sudo;\n this.entryPointAddress = params.entryPointAddress ?? ENTRYPOINT_ADDRESS;\n this.enableSignature = params.enableSignature;\n this.validUntil = params.validUntil ?? 0;\n this.validAfter = params.validAfter ?? 0;\n this.executor = params.executor;\n this.selector = params.selector;\n this.chain = params.chain;\n this.rpcUrl = params.rpcUrl ?? BUNDLER_URL;\n this.publicClient = createPublicClient({\n transport: http(CHAIN_ID_TO_NODE[this.chain?.id ?? polygonMumbai.id]),\n chain: this.chain ?? polygonMumbai,\n });\n }\n\n abstract encodeEnable(enableData: Hex): Hex;\n\n abstract encodeDisable(enableData: Hex): Hex;\n\n abstract getEnableData(): Promise<Hex>;\n\n abstract signMessage(message: Uint8Array | string | Hex): Promise<Hex>;\n\n abstract signTypedData(params: SignTypedDataParams): Promise<Hex>;\n\n abstract signUserOp(userOp: UserOperationRequest): Promise<Hex>;\n\n abstract signer(): Promise<SmartAccountSigner>;\n\n abstract getDummyUserOpSignature(callData?: Hex): Promise<Hex>;\n\n abstract isPluginEnabled(\n kernelAccountAddress: Address,\n selector: Hex\n ): Promise<boolean>;\n\n shouldDelegateViaFallback(): boolean {\n return true;\n }\n\n getPluginValidatorData(): ValidatorPluginData {\n if (!this.selector || !this.executor) {\n throw Error(\"Plugin Validator data params uninitialised\");\n }\n return {\n selector: this.selector,\n executor: this.executor,\n validAfter: this.validAfter,\n validUntil: this.validUntil,\n };\n }\n\n getNonceKey(): bigint {\n return 0n;\n }\n\n async getDynamicDummySignature(\n kernelAccountAddress: Address,\n calldata: Hex\n ): Promise<Hex> {\n const dummyECDSASig =\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\";\n const validatorMode = await this.resolveValidatorMode(\n kernelAccountAddress,\n calldata\n );\n if (validatorMode === ValidatorMode.enable) {\n const enableData = await this.getEnableData();\n const enableDataLength = enableData.length / 2 - 1;\n const enableSigLength = 65;\n const staticDummySig = concatHex([\n \"0x000000000000000000000000\",\n this.getAddress(),\n this.executor!,\n ]);\n\n return concatHex([\n ValidatorMode.enable,\n staticDummySig,\n pad(toHex(enableDataLength), { size: 32 }),\n enableData,\n pad(toHex(enableSigLength), { size: 32 }),\n dummyECDSASig,\n await this.getDummyUserOpSignature(calldata),\n ]);\n }\n return concatHex([\n validatorMode,\n await this.getDummyUserOpSignature(calldata),\n ]);\n }\n\n setEnableSignature(enableSignature: Hex) {\n this.enableSignature = enableSignature;\n }\n\n getEnableSignature(): Hex | undefined {\n return this.enableSignature;\n }\n\n getAddress(): Hex {\n return this.validatorAddress;\n }\n\n getPublicClient(): PublicClient<Transport, Chain> {\n if (!this.publicClient) {\n throw new Error(\"Validator uninitialized: PublicClient missing\");\n }\n return this.publicClient;\n }\n\n async approveExecutor(\n kernel: Address,\n selector: Hex,\n executor: Address,\n validUntil: number,\n validAfter: number,\n validator: KernelBaseValidator\n ): Promise<Hex> {\n if (!this.chain) {\n throw new Error(\"Validator uninitialized\");\n }\n let kernelImplAddr;\n try {\n const strgAddr = await this.getPublicClient().getStorageAt({\n address: kernel,\n slot: \"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc\",\n });\n kernelImplAddr = strgAddr\n ? ((\"0x\" + strgAddr.slice(26)) as Hex)\n : strgAddr;\n } catch (error) {}\n const sender = kernel;\n const signer = await this.signer();\n const ownerSig = await signer.signTypedData({\n domain: {\n name: \"Kernel\",\n version:\n kernelImplAddr?.toLowerCase() === KERNEL_IMPL_ADDRESS.toLowerCase() ||\n kernelImplAddr?.toLowerCase() ===\n \"0x8dD4DBB54d8A8Cf0DE6F9CCC4609470A30EfF18C\".toLowerCase() ||\n kernelImplAddr === undefined ||\n kernelImplAddr === zeroAddress\n ? \"0.2.2\"\n : \"0.2.1\",\n chainId: this.chain.id,\n verifyingContract: sender,\n },\n types: {\n ValidatorApproved: [\n { name: \"sig\", type: \"bytes4\" },\n { name: \"validatorData\", type: \"uint256\" },\n { name: \"executor\", type: \"address\" },\n { name: \"enableData\", type: \"bytes\" },\n ],\n },\n message: {\n sig: selector as Hex,\n validatorData: hexToBigInt(\n concatHex([\n pad(toHex(validUntil), { size: 6 }),\n pad(toHex(validAfter), { size: 6 }),\n validator.getAddress(),\n ]),\n { size: 32 }\n ),\n executor: executor as Address,\n enableData: await validator.getEnableData(),\n },\n primaryType: \"ValidatorApproved\",\n });\n return ownerSig;\n }\n\n async resolveValidatorMode(\n kernelAccountAddress: Address,\n callData: Hex\n ): Promise<ValidatorMode> {\n if (!this.chain || !this.publicClient) {\n throw new Error(\"Validator uninitialized\");\n }\n\n let mode: ValidatorMode;\n try {\n const defaultValidatorAddress = await this.publicClient.readContract({\n abi: KernelAccountAbi,\n address: kernelAccountAddress,\n functionName: \"getDefaultValidator\",\n });\n if (\n defaultValidatorAddress?.toLowerCase() ===\n this.validatorAddress.toLowerCase() ||\n this.mode === ValidatorMode.sudo\n ) {\n mode = ValidatorMode.sudo;\n } else if (\n await this.isPluginEnabled(\n kernelAccountAddress,\n callData.toString().slice(0, 10) as Hex\n )\n ) {\n mode = ValidatorMode.plugin;\n } else {\n mode = ValidatorMode.enable;\n }\n } catch (error) {\n if (this.mode === ValidatorMode.plugin) {\n mode = ValidatorMode.enable;\n } else {\n mode = this.mode;\n }\n }\n return mode;\n }\n\n async getSignature(userOp: UserOperationRequest): Promise<Hex> {\n const mode = await this.resolveValidatorMode(\n userOp.sender,\n userOp.callData\n );\n if (mode === ValidatorMode.sudo || mode === ValidatorMode.plugin) {\n return concatHex([this.mode, await this.signUserOp(userOp)]);\n } else {\n const enableData = await this.getEnableData();\n const enableDataLength = enableData.length / 2 - 1;\n const enableSignature = this.getEnableSignature();\n if (!enableSignature) {\n throw new Error(\"Enable signature not set\");\n }\n return concat([\n mode, // 4 bytes 0 - 4\n pad(toHex(this.validUntil), { size: 6 }), // 6 bytes 4 - 10\n pad(toHex(this.validAfter), { size: 6 }), // 6 bytes 10 - 16\n pad(this.validatorAddress, { size: 20 }), // 20 bytes 16 - 36\n pad(this.executor!, { size: 20 }), // 20 bytes 36 - 56\n pad(toHex(enableDataLength), { size: 32 }), // 32 bytes 56 - 88\n enableData, // 88 - 88 + enableData.length\n pad(toHex(enableSignature.length / 2 - 1), { size: 32 }), // 32 bytes 88 + enableData.length - 120 + enableData.length\n enableSignature, // 120 + enableData.length - 120 + enableData.length + enableSignature.length\n await this.signUserOp(userOp), // 120 + enableData.length + enableSignature.length - 120 + enableData.length + enableSignature.length + userOperation.length\n ]);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/base.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type SignTypedDataParams,\n type SmartAccountSigner,\n type UserOperationRequest,\n} from \"@alchemy/aa-core\";\nimport {\n concat,\n type Chain,\n type Hex,\n pad,\n toHex,\n type Address,\n concatHex,\n hexToBigInt,\n type PublicClient,\n type Transport,\n createPublicClient,\n http,\n zeroAddress,\n} from \"viem\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport {\n BUNDLER_URL,\n CHAIN_ID_TO_NODE,\n ECDSA_VALIDATOR_ADDRESS,\n ENTRYPOINT_ADDRESS,\n KERNEL_IMPL_ADDRESS,\n} from \"../constants.js\";\nimport { polygonMumbai } from \"viem/chains\";\n\nexport enum ValidatorMode {\n sudo = \"0x00000000\",\n plugin = \"0x00000001\",\n enable = \"0x00000002\",\n}\n\nexport interface KernelBaseValidatorParams {\n projectId: string;\n validatorAddress?: Hex;\n mode?: ValidatorMode;\n chain?: Chain;\n entryPointAddress?: Address;\n enableSignature?: Hex;\n validUntil?: number;\n validAfter?: number;\n executor?: Address;\n selector?: Hex;\n rpcUrl?: string;\n}\n\nexport type ValidatorPluginData = Required<\n Pick<\n KernelBaseValidatorParams,\n \"executor\" | \"selector\" | \"validAfter\" | \"validUntil\"\n >\n>;\n\n//Kernel wallet implementation separates out validation and execution phase. It allows you to have\n// custom wrapper logic for the validation phase in addition to signature of choice.\nexport abstract class KernelBaseValidator {\n readonly validatorAddress: Hex;\n mode: ValidatorMode;\n protected projectId: string;\n protected chain?: Chain;\n protected entryPointAddress: Address;\n protected enableSignature?: Hex;\n protected validUntil: number;\n protected validAfter: number;\n protected executor?: Address;\n protected selector?: Hex;\n protected rpcUrl?: string;\n publicClient?: PublicClient<Transport, Chain>;\n\n constructor(params: KernelBaseValidatorParams) {\n this.projectId = params.projectId;\n this.validatorAddress = params.validatorAddress ?? ECDSA_VALIDATOR_ADDRESS;\n this.mode = params.mode ?? ValidatorMode.sudo;\n this.entryPointAddress = params.entryPointAddress ?? ENTRYPOINT_ADDRESS;\n this.enableSignature = params.enableSignature;\n this.validUntil = params.validUntil ?? 0;\n this.validAfter = params.validAfter ?? 0;\n this.executor = params.executor;\n this.selector = params.selector;\n this.chain = params.chain;\n this.rpcUrl = params.rpcUrl ?? BUNDLER_URL;\n this.publicClient = createPublicClient({\n transport: http(CHAIN_ID_TO_NODE[this.chain?.id ?? polygonMumbai.id]),\n chain: this.chain ?? polygonMumbai,\n });\n }\n\n abstract encodeEnable(enableData: Hex): Hex;\n\n abstract encodeDisable(enableData: Hex): Hex;\n\n abstract getEnableData(kernelAccountAddress?: Address): Promise<Hex>;\n\n abstract signMessage(message: Uint8Array | string | Hex): Promise<Hex>;\n\n abstract signTypedData(params: SignTypedDataParams): Promise<Hex>;\n\n abstract signUserOp(userOp: UserOperationRequest): Promise<Hex>;\n\n abstract signer(): Promise<SmartAccountSigner>;\n\n abstract getDummyUserOpSignature(callData?: Hex): Promise<Hex>;\n\n abstract isPluginEnabled(\n kernelAccountAddress: Address,\n selector: Hex\n ): Promise<boolean>;\n\n shouldDelegateViaFallback(): boolean {\n return true;\n }\n\n getPluginValidatorData(): ValidatorPluginData {\n if (!this.selector || !this.executor) {\n throw Error(\"Plugin Validator data params uninitialised\");\n }\n return {\n selector: this.selector,\n executor: this.executor,\n validAfter: this.validAfter,\n validUntil: this.validUntil,\n };\n }\n\n getNonceKey(): bigint {\n return 0n;\n }\n\n async getDynamicDummySignature(\n kernelAccountAddress: Address,\n calldata: Hex\n ): Promise<Hex> {\n const dummyECDSASig =\n \"0xfffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c\";\n const validatorMode = await this.resolveValidatorMode(\n kernelAccountAddress,\n calldata\n );\n if (validatorMode === ValidatorMode.enable) {\n const enableData = await this.getEnableData(kernelAccountAddress);\n const enableDataLength = enableData.length / 2 - 1;\n const enableSigLength = 65;\n const staticDummySig = concatHex([\n \"0x000000000000000000000000\",\n this.getAddress(),\n this.executor!,\n ]);\n\n return concatHex([\n ValidatorMode.enable,\n staticDummySig,\n pad(toHex(enableDataLength), { size: 32 }),\n enableData,\n pad(toHex(enableSigLength), { size: 32 }),\n dummyECDSASig,\n await this.getDummyUserOpSignature(calldata),\n ]);\n }\n return concatHex([\n validatorMode,\n await this.getDummyUserOpSignature(calldata),\n ]);\n }\n\n setEnableSignature(enableSignature: Hex) {\n this.enableSignature = enableSignature;\n }\n\n getEnableSignature(): Hex | undefined {\n return this.enableSignature;\n }\n\n getAddress(): Hex {\n return this.validatorAddress;\n }\n\n getPublicClient(): PublicClient<Transport, Chain> {\n if (!this.publicClient) {\n throw new Error(\"Validator uninitialized: PublicClient missing\");\n }\n return this.publicClient;\n }\n\n async approveExecutor(\n kernel: Address,\n selector: Hex,\n executor: Address,\n validUntil: number,\n validAfter: number,\n validator: KernelBaseValidator\n ): Promise<Hex> {\n if (!this.chain) {\n throw new Error(\"Validator uninitialized\");\n }\n let kernelImplAddr;\n try {\n const strgAddr = await this.getPublicClient().getStorageAt({\n address: kernel,\n slot: \"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc\",\n });\n kernelImplAddr = strgAddr\n ? ((\"0x\" + strgAddr.slice(26)) as Hex)\n : strgAddr;\n } catch (error) {}\n const sender = kernel;\n const signer = await this.signer();\n const ownerSig = await signer.signTypedData({\n domain: {\n name: \"Kernel\",\n version:\n kernelImplAddr?.toLowerCase() === KERNEL_IMPL_ADDRESS.toLowerCase() ||\n kernelImplAddr?.toLowerCase() ===\n \"0x8dD4DBB54d8A8Cf0DE6F9CCC4609470A30EfF18C\".toLowerCase() ||\n kernelImplAddr === undefined ||\n kernelImplAddr === zeroAddress\n ? \"0.2.2\"\n : \"0.2.1\",\n chainId: this.chain.id,\n verifyingContract: sender,\n },\n types: {\n ValidatorApproved: [\n { name: \"sig\", type: \"bytes4\" },\n { name: \"validatorData\", type: \"uint256\" },\n { name: \"executor\", type: \"address\" },\n { name: \"enableData\", type: \"bytes\" },\n ],\n },\n message: {\n sig: selector as Hex,\n validatorData: hexToBigInt(\n concatHex([\n pad(toHex(validUntil), { size: 6 }),\n pad(toHex(validAfter), { size: 6 }),\n validator.getAddress(),\n ]),\n { size: 32 }\n ),\n executor: executor as Address,\n enableData: await validator.getEnableData(kernel),\n },\n primaryType: \"ValidatorApproved\",\n });\n return ownerSig;\n }\n\n async resolveValidatorMode(\n kernelAccountAddress: Address,\n callData: Hex\n ): Promise<ValidatorMode> {\n if (!this.chain || !this.publicClient) {\n throw new Error(\"Validator uninitialized\");\n }\n\n let mode: ValidatorMode;\n try {\n const defaultValidatorAddress = await this.publicClient.readContract({\n abi: KernelAccountAbi,\n address: kernelAccountAddress,\n functionName: \"getDefaultValidator\",\n });\n if (\n defaultValidatorAddress?.toLowerCase() ===\n this.validatorAddress.toLowerCase() ||\n this.mode === ValidatorMode.sudo\n ) {\n mode = ValidatorMode.sudo;\n } else if (\n await this.isPluginEnabled(\n kernelAccountAddress,\n callData.toString().slice(0, 10) as Hex\n )\n ) {\n mode = ValidatorMode.plugin;\n } else {\n mode = ValidatorMode.enable;\n }\n } catch (error) {\n if (this.mode === ValidatorMode.plugin) {\n mode = ValidatorMode.enable;\n } else {\n mode = this.mode;\n }\n }\n return mode;\n }\n\n async getSignature(userOp: UserOperationRequest): Promise<Hex> {\n const mode = await this.resolveValidatorMode(\n userOp.sender,\n userOp.callData\n );\n if (mode === ValidatorMode.sudo || mode === ValidatorMode.plugin) {\n return concatHex([this.mode, await this.signUserOp(userOp)]);\n } else {\n const enableData = await this.getEnableData(userOp.sender);\n const enableDataLength = enableData.length / 2 - 1;\n const enableSignature = this.getEnableSignature();\n if (!enableSignature) {\n throw new Error(\"Enable signature not set\");\n }\n return concat([\n mode, // 4 bytes 0 - 4\n pad(toHex(this.validUntil), { size: 6 }), // 6 bytes 4 - 10\n pad(toHex(this.validAfter), { size: 6 }), // 6 bytes 10 - 16\n pad(this.validatorAddress, { size: 20 }), // 20 bytes 16 - 36\n pad(this.executor!, { size: 20 }), // 20 bytes 36 - 56\n pad(toHex(enableDataLength), { size: 32 }), // 32 bytes 56 - 88\n enableData, // 88 - 88 + enableData.length\n pad(toHex(enableSignature.length / 2 - 1), { size: 32 }), // 32 bytes 88 + enableData.length - 120 + enableData.length\n enableSignature, // 120 + enableData.length - 120 + enableData.length + enableSignature.length\n await this.signUserOp(userOp), // 120 + enableData.length + enableSignature.length - 120 + enableData.length + enableSignature.length + userOperation.length\n ]);\n }\n }\n}\n"]}
@@ -2,7 +2,6 @@ import { type Address, type Hex, type SmartAccountSigner, type UserOperationRequ
2
2
  import { KernelBaseValidator, type KernelBaseValidatorParams, type ValidatorPluginData } from "./base.js";
3
3
  import { type GetAbiItemParameters } from "viem";
4
4
  import { MerkleTree } from "merkletreejs";
5
- import { Operation } from "../provider.js";
6
5
  import type { GetAbiItemReturnType } from "viem/dist/types/utils/abi/getAbiItem.js";
7
6
  import type { GeneratePermissionFromArgsParameters } from "./types.js";
8
7
  export interface SessionKeyValidatorParams extends KernelBaseValidatorParams {
@@ -22,6 +21,15 @@ export declare enum ParamOperator {
22
21
  LESS_THAN_OR_EQUAL = 4,
23
22
  NOT_EQUAL = 5
24
23
  }
24
+ export type SessionNonces = {
25
+ lastNonce: bigint;
26
+ invalidNonce: bigint;
27
+ };
28
+ export type ExecutionRule = {
29
+ validAfter: number;
30
+ interval: number;
31
+ runs: number;
32
+ };
25
33
  export interface ParamRules {
26
34
  offset: number;
27
35
  condition: ParamOperator;
@@ -29,10 +37,11 @@ export interface ParamRules {
29
37
  }
30
38
  export type Permission = {
31
39
  target: Address;
40
+ index?: number;
32
41
  rules?: ParamRules[];
33
42
  sig?: Hex;
34
43
  valueLimit?: bigint;
35
- operation?: Operation;
44
+ executionRule?: ExecutionRule;
36
45
  };
37
46
  export interface SessionKeyData {
38
47
  validUntil: number;
@@ -41,7 +50,7 @@ export interface SessionKeyData {
41
50
  permissions?: Permission[];
42
51
  }
43
52
  export declare function getAbiItem<TAbi extends Abi | readonly unknown[], TItemName extends string>({ abi, args, name, }: GetAbiItemParameters<TAbi, TItemName>): GetAbiItemReturnType<TAbi, TItemName>;
44
- export declare function getPermissionFromABI<TAbi extends Abi | readonly unknown[], TFunctionName extends string | undefined = string>({ abi, target, args, functionName, operation, valueLimit, }: GeneratePermissionFromArgsParameters<TAbi, TFunctionName>): Permission;
53
+ export declare function getPermissionFromABI<TAbi extends Abi | readonly unknown[], TFunctionName extends string | undefined = string>({ abi, target, args, functionName, valueLimit, }: GeneratePermissionFromArgsParameters<TAbi, TFunctionName>): Permission;
45
54
  export declare class SessionKeyValidator extends KernelBaseValidator {
46
55
  protected sessionKey: SmartAccountSigner;
47
56
  sessionKeyData: SessionKeyData;
@@ -49,19 +58,21 @@ export declare class SessionKeyValidator extends KernelBaseValidator {
49
58
  constructor(params: SessionKeyValidatorParams);
50
59
  static init(params: SessionKeyValidatorParams): Promise<SessionKeyValidator>;
51
60
  shouldDelegateViaFallback(): boolean;
52
- findMatchingPermission(callData: Hex): Permission | undefined;
53
- private filterByOperation;
61
+ findMatchingPermissions(callData: Hex): Permission | Permission[] | undefined;
62
+ private filterPermissions;
54
63
  private filterBySignature;
55
64
  private findPermissionByRule;
56
65
  private getFormattedHex;
57
66
  private evaluateRuleCondition;
58
67
  getMerkleTree(): MerkleTree;
59
- encodePermissionData(permission: Permission, merkleProof?: string[]): Hex;
68
+ encodePermissionData(permission: Permission | Permission[], merkleProof?: string[] | string[][]): Hex;
60
69
  getSessionData(): SessionKeyParams;
61
70
  signer(): Promise<SmartAccountSigner>;
62
- getEnableData(): Promise<Hex>;
71
+ getSessionNonces(kernelAccountAddress: Address): Promise<SessionNonces>;
72
+ getEnableData(kernelAccountAddress?: Address, enabledLastNonce?: bigint): Promise<Hex>;
63
73
  isPluginEnabled(kernelAccountAddress: Address, selector: Hex): Promise<boolean>;
64
74
  getDummyUserOpSignature(callData: Hex): Promise<Hex>;
75
+ private getEncodedPermissionProofData;
65
76
  encodeEnable(sessionKeyEnableData: Hex): Hex;
66
77
  encodeDisable(sessionKey: Hex): Hex;
67
78
  signMessage(message: string | Uint8Array): Promise<Hex>;