@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 +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>;
@@ -9,7 +9,6 @@ const SessionKeyValidatorAbi_js_1 = require("../abis/SessionKeyValidatorAbi.js")
9
9
  const constants_js_1 = require("../constants.js");
10
10
  const KernelAccountAbi_js_1 = require("../abis/KernelAccountAbi.js");
11
11
  const merkletreejs_1 = require("merkletreejs");
12
- const provider_js_1 = require("../provider.js");
13
12
  const index_js_1 = require("../api/index.js");
14
13
  const utils_js_1 = require("../utils.js");
15
14
  BigInt.prototype.toJSON = function () {
@@ -57,7 +56,7 @@ function getAbiItem({ abi, args = [], name, }) {
57
56
  .reduce((a, c) => `${a}\n${c}`)}`);
58
57
  }
59
58
  exports.getAbiItem = getAbiItem;
60
- function getPermissionFromABI({ abi, target, args, functionName, operation, valueLimit, }) {
59
+ function getPermissionFromABI({ abi, target, args, functionName, valueLimit, }) {
61
60
  const abiItem = getAbiItem({
62
61
  abi,
63
62
  args,
@@ -83,7 +82,6 @@ function getPermissionFromABI({ abi, target, args, functionName, operation, valu
83
82
  sig: functionSelector,
84
83
  rules: paramRules,
85
84
  target,
86
- operation: operation ?? provider_js_1.Operation.Call,
87
85
  valueLimit: valueLimit ?? 0n,
88
86
  };
89
87
  }
@@ -116,17 +114,19 @@ class SessionKeyValidator extends base_js_1.KernelBaseValidator {
116
114
  validUntil: params.sessionKeyData.validUntil ?? 0,
117
115
  paymaster: params.sessionKeyData.paymaster ?? viem_1.zeroAddress,
118
116
  };
119
- this.sessionKeyData.permissions = this.sessionKeyData.permissions?.map((perm) => ({
117
+ this.sessionKeyData.permissions = this.sessionKeyData.permissions?.map((perm, index) => ({
120
118
  ...perm,
121
- operation: perm.operation ?? provider_js_1.Operation.Call,
122
119
  valueLimit: perm.valueLimit ?? 0n,
123
120
  sig: perm.sig ?? (0, viem_1.pad)("0x", { size: 4 }),
124
121
  rules: perm.rules ?? [],
122
+ index,
123
+ executionRule: perm.executionRule ?? {
124
+ validAfter: 0,
125
+ interval: 0,
126
+ runs: 0,
127
+ },
125
128
  }));
126
129
  this.merkleTree = this.getMerkleTree();
127
- if (this.shouldDelegateViaFallback()) {
128
- throw Error("Session key permissions not set");
129
- }
130
130
  this.selector =
131
131
  params.selector ??
132
132
  (0, viem_1.getFunctionSelector)("execute(address, uint256, bytes, uint8)");
@@ -145,29 +145,53 @@ class SessionKeyValidator extends base_js_1.KernelBaseValidator {
145
145
  shouldDelegateViaFallback() {
146
146
  return this.merkleTree.getHexRoot() === (0, viem_1.pad)("0x00", { size: 32 });
147
147
  }
148
- findMatchingPermission(callData) {
148
+ findMatchingPermissions(callData) {
149
149
  try {
150
150
  const { functionName, args } = (0, viem_1.decodeFunctionData)({
151
151
  abi: KernelAccountAbi_js_1.KernelAccountAbi,
152
152
  data: callData,
153
153
  });
154
- if (functionName !== "execute")
154
+ if (functionName !== "execute" && functionName !== "executeBatch")
155
155
  return undefined;
156
+ if (functionName === "execute") {
157
+ const [to, value, data] = args;
158
+ return this.filterPermissions([to], [data], [value])?.[0];
159
+ }
160
+ else if (functionName === "executeBatch") {
161
+ let targets = [], values = [], dataArray = [];
162
+ args[0].forEach((arg) => {
163
+ targets.push(arg.to);
164
+ values.push(arg.value);
165
+ dataArray.push(arg.data);
166
+ });
167
+ return this.filterPermissions(targets, dataArray, values);
168
+ }
169
+ else {
170
+ throw Error("Invalid function");
171
+ }
172
+ }
173
+ catch (error) {
174
+ return undefined;
175
+ }
176
+ }
177
+ filterPermissions(targets, dataArray, values) {
178
+ if (targets.length !== dataArray.length ||
179
+ targets.length !== values.length) {
180
+ throw Error("Invalid arguments");
181
+ }
182
+ const filteredPermissions = targets.map((target, index) => {
156
183
  const permissionsList = this.sessionKeyData.permissions;
157
184
  if (!permissionsList || !permissionsList.length)
158
185
  return undefined;
159
- const targetToMatch = args[0].toLowerCase();
186
+ const targetToMatch = target.toLowerCase();
160
187
  let targetPermissions = permissionsList.filter((permission) => permission.target.toLowerCase() === targetToMatch);
161
188
  if (!targetPermissions.length) {
162
189
  targetPermissions = permissionsList.filter((permission) => permission.target.toLowerCase() === viem_1.zeroAddress.toLowerCase());
163
190
  }
164
191
  if (!targetPermissions.length)
165
192
  return undefined;
166
- const operationPermissions = this.filterByOperation(targetPermissions, args[3]);
167
- if (!operationPermissions.length)
168
- return undefined;
169
- const signaturePermissions = this.filterBySignature(operationPermissions, args[2].slice(0, 10).toLowerCase());
170
- const valueLimitPermissions = signaturePermissions.filter((permission) => (permission.valueLimit ?? 0n) >= args[1]);
193
+ const signaturePermissions = this.filterBySignature(targetPermissions, dataArray[index].slice(0, 10).toLowerCase());
194
+ const valueLimitPermissions = signaturePermissions.filter((permission) => (permission.valueLimit ?? 0n) >= values[index]);
171
195
  if (!valueLimitPermissions.length)
172
196
  return undefined;
173
197
  const sortedPermissions = valueLimitPermissions.sort((a, b) => {
@@ -181,14 +205,11 @@ class SessionKeyValidator extends base_js_1.KernelBaseValidator {
181
205
  return 0;
182
206
  }
183
207
  });
184
- return this.findPermissionByRule(sortedPermissions, args[2]);
185
- }
186
- catch (error) {
187
- return undefined;
188
- }
189
- }
190
- filterByOperation(permissions, operation) {
191
- return permissions.filter((permission) => permission.operation === operation || provider_js_1.Operation.Call === operation);
208
+ return this.findPermissionByRule(sortedPermissions, dataArray[index]);
209
+ });
210
+ return filteredPermissions.every((permission) => permission !== undefined)
211
+ ? filteredPermissions
212
+ : undefined;
192
213
  }
193
214
  filterBySignature(permissions, signature) {
194
215
  return permissions.filter((permission) => (permission.sig ?? (0, viem_1.pad)("0x", { size: 4 })).toLowerCase() === signature);
@@ -230,32 +251,38 @@ class SessionKeyValidator extends base_js_1.KernelBaseValidator {
230
251
  }
231
252
  getMerkleTree() {
232
253
  const permissionPacked = this.sessionKeyData.permissions?.map((permission) => this.encodePermissionData(permission));
233
- if (permissionPacked?.length === 1)
254
+ if (permissionPacked && permissionPacked.length === 1)
234
255
  permissionPacked.push(permissionPacked[0]);
235
256
  return permissionPacked && permissionPacked.length !== 0
236
257
  ? new merkletreejs_1.MerkleTree(permissionPacked, viem_1.keccak256, {
237
- sortPairs: true,
238
258
  hashLeaves: true,
259
+ complete: true,
260
+ sort: true,
239
261
  })
240
262
  : new merkletreejs_1.MerkleTree([(0, viem_1.pad)("0x00", { size: 32 })], viem_1.keccak256, {
241
263
  hashLeaves: false,
264
+ complete: true,
242
265
  });
243
266
  }
244
267
  encodePermissionData(permission, merkleProof) {
245
268
  let permissionParam = {
246
269
  components: [
247
270
  {
248
- name: "target",
249
- type: "address",
271
+ name: "index",
272
+ type: "uint32",
250
273
  },
251
274
  {
252
- name: "valueLimit",
253
- type: "uint256",
275
+ name: "target",
276
+ type: "address",
254
277
  },
255
278
  {
256
279
  name: "sig",
257
280
  type: "bytes4",
258
281
  },
282
+ {
283
+ name: "valueLimit",
284
+ type: "uint256",
285
+ },
259
286
  {
260
287
  components: [
261
288
  {
@@ -276,13 +303,27 @@ class SessionKeyValidator extends base_js_1.KernelBaseValidator {
276
303
  type: "tuple[]",
277
304
  },
278
305
  {
279
- internalType: "enum Operation",
280
- name: "operation",
281
- type: "uint8",
306
+ components: [
307
+ {
308
+ name: "interval",
309
+ type: "uint48",
310
+ },
311
+ {
312
+ name: "runs",
313
+ type: "uint48",
314
+ },
315
+ {
316
+ internalType: "ValidAfter",
317
+ name: "validAfter",
318
+ type: "uint48",
319
+ },
320
+ ],
321
+ name: "executionRule",
322
+ type: "tuple",
282
323
  },
283
324
  ],
284
325
  name: "permission",
285
- type: "tuple",
326
+ type: Array.isArray(permission) ? "tuple[]" : "tuple",
286
327
  };
287
328
  let params;
288
329
  let values;
@@ -291,7 +332,7 @@ class SessionKeyValidator extends base_js_1.KernelBaseValidator {
291
332
  permissionParam,
292
333
  {
293
334
  name: "merkleProof",
294
- type: "bytes32[]",
335
+ type: Array.isArray(merkleProof[0]) ? "bytes32[][]" : "bytes32[]",
295
336
  },
296
337
  ];
297
338
  values = [permission, merkleProof];
@@ -318,16 +359,34 @@ class SessionKeyValidator extends base_js_1.KernelBaseValidator {
318
359
  async signer() {
319
360
  return await Promise.resolve(this.sessionKey);
320
361
  }
321
- async getEnableData() {
362
+ async getSessionNonces(kernelAccountAddress) {
363
+ if (!this.publicClient) {
364
+ throw new Error("Validator uninitialized: PublicClient missing");
365
+ }
366
+ const nonce = await this.publicClient.readContract({
367
+ abi: SessionKeyValidatorAbi_js_1.SessionKeyValidatorAbi,
368
+ address: this.validatorAddress,
369
+ functionName: "nonces",
370
+ args: [kernelAccountAddress],
371
+ });
372
+ return { lastNonce: nonce[0], invalidNonce: nonce[1] };
373
+ }
374
+ async getEnableData(kernelAccountAddress, enabledLastNonce) {
322
375
  if (!this.merkleTree) {
323
376
  throw Error("SessionKeyValidator: MerkleTree not generated");
324
377
  }
378
+ if (!kernelAccountAddress) {
379
+ throw Error("SessionKeyValidator: Kernel account address not provided");
380
+ }
381
+ const lastNonce = enabledLastNonce ??
382
+ (await this.getSessionNonces(kernelAccountAddress)).lastNonce + 1n;
325
383
  return (0, viem_1.concat)([
326
384
  await this.sessionKey.getAddress(),
327
385
  (0, viem_1.pad)(this.merkleTree.getHexRoot(), { size: 32 }),
328
386
  (0, viem_1.pad)((0, viem_1.toHex)(this.sessionKeyData.validAfter), { size: 6 }),
329
387
  (0, viem_1.pad)((0, viem_1.toHex)(this.sessionKeyData.validUntil), { size: 6 }),
330
388
  this.sessionKeyData.paymaster,
389
+ (0, viem_1.pad)((0, viem_1.toHex)(lastNonce), { size: 32 }),
331
390
  ]);
332
391
  }
333
392
  async isPluginEnabled(kernelAccountAddress, selector) {
@@ -348,18 +407,26 @@ class SessionKeyValidator extends base_js_1.KernelBaseValidator {
348
407
  });
349
408
  const enableDataHex = (0, viem_1.concatHex)([
350
409
  await this.sessionKey.getAddress(),
351
- (0, viem_1.pad)(enableData[0], { size: 4 }),
410
+ (0, viem_1.pad)(enableData[0], { size: 32 }),
352
411
  (0, viem_1.pad)((0, viem_1.toHex)(enableData[1]), { size: 6 }),
353
412
  (0, viem_1.pad)((0, viem_1.toHex)(enableData[2]), { size: 6 }),
354
413
  enableData[3],
414
+ (0, viem_1.pad)((0, viem_1.toHex)(enableData[4]), { size: 32 }),
355
415
  ]);
356
416
  return (execDetail.validator.toLowerCase() ===
357
417
  this.validatorAddress.toLowerCase() &&
358
- enableData[4] &&
359
- enableDataHex.toLowerCase() === (await this.getEnableData()).toLowerCase());
418
+ enableDataHex.toLowerCase() ===
419
+ (await this.getEnableData(kernelAccountAddress, enableData[4])).toLowerCase());
360
420
  }
361
421
  async getDummyUserOpSignature(callData) {
362
- const matchingPermission = this.findMatchingPermission(callData);
422
+ return (0, viem_1.concatHex)([
423
+ await this.sessionKey.getAddress(),
424
+ constants_js_1.DUMMY_ECDSA_SIG,
425
+ this.getEncodedPermissionProofData(callData),
426
+ ]);
427
+ }
428
+ getEncodedPermissionProofData(callData) {
429
+ const matchingPermission = this.findMatchingPermissions(callData);
363
430
  if (!matchingPermission && !this.shouldDelegateViaFallback()) {
364
431
  throw Error("SessionKeyValidator: No matching permission found for the userOp");
365
432
  }
@@ -368,17 +435,19 @@ class SessionKeyValidator extends base_js_1.KernelBaseValidator {
368
435
  matchingPermission
369
436
  ? this.encodePermissionData(matchingPermission)
370
437
  : "0x";
371
- const merkleProof = this.merkleTree.getHexProof((0, viem_1.keccak256)(encodedPermissionData));
372
- const encodedData = this.sessionKeyData.permissions &&
438
+ let merkleProof = [];
439
+ if (Array.isArray(matchingPermission)) {
440
+ let encodedPerms = matchingPermission.map((permission) => (0, viem_1.keccak256)(this.encodePermissionData(permission)));
441
+ merkleProof = encodedPerms.map((perm) => this.merkleTree.getHexProof(perm));
442
+ }
443
+ else if (matchingPermission) {
444
+ merkleProof = this.merkleTree.getHexProof((0, viem_1.keccak256)(encodedPermissionData));
445
+ }
446
+ return this.sessionKeyData.permissions &&
373
447
  this.sessionKeyData.permissions.length !== 0 &&
374
448
  matchingPermission
375
449
  ? this.encodePermissionData(matchingPermission, merkleProof)
376
450
  : "0x";
377
- return (0, viem_1.concatHex)([
378
- await this.sessionKey.getAddress(),
379
- constants_js_1.DUMMY_ECDSA_SIG,
380
- encodedData,
381
- ]);
382
451
  }
383
452
  encodeEnable(sessionKeyEnableData) {
384
453
  return (0, viem_1.encodeFunctionData)({
@@ -409,25 +478,10 @@ class SessionKeyValidator extends base_js_1.KernelBaseValidator {
409
478
  signature: "0x",
410
479
  }, this.entryPointAddress, BigInt(this.chain.id));
411
480
  const formattedMessage = typeof hash === "string" ? (0, viem_1.toBytes)(hash) : hash;
412
- const matchingPermission = this.findMatchingPermission(userOp.callData);
413
- if (!matchingPermission && !this.shouldDelegateViaFallback()) {
414
- throw Error("SessionKeyValidator: No matching permission found for the userOp");
415
- }
416
- const encodedPermissionData = this.sessionKeyData.permissions &&
417
- this.sessionKeyData.permissions.length !== 0 &&
418
- matchingPermission
419
- ? this.encodePermissionData(matchingPermission)
420
- : "0x";
421
- const merkleProof = this.merkleTree.getHexProof((0, viem_1.keccak256)(encodedPermissionData));
422
- const encodedData = this.sessionKeyData.permissions &&
423
- this.sessionKeyData.permissions.length !== 0 &&
424
- matchingPermission
425
- ? this.encodePermissionData(matchingPermission, merkleProof)
426
- : "0x";
427
481
  const signature = (0, viem_1.concat)([
428
482
  await this.sessionKey.getAddress(),
429
483
  await this.sessionKey.signMessage(formattedMessage),
430
- encodedData,
484
+ this.getEncodedPermissionProofData(userOp.callData),
431
485
  ]);
432
486
  return signature;
433
487
  }