@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.
- package/dist/cjs/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts +58 -4
- package/dist/cjs/kernel-zerodev/abis/SessionKeyValidatorAbi.js +75 -4
- package/dist/cjs/kernel-zerodev/abis/SessionKeyValidatorAbi.js.map +1 -1
- package/dist/cjs/kernel-zerodev/constants.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/constants.js +1 -1
- package/dist/cjs/kernel-zerodev/constants.js.map +1 -1
- package/dist/cjs/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/provider.d.ts +3 -0
- package/dist/cjs/kernel-zerodev/provider.js +36 -1
- package/dist/cjs/kernel-zerodev/provider.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator/base.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/validator/base.js +3 -3
- package/dist/cjs/kernel-zerodev/validator/base.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator/session-key-validator.d.ts +18 -7
- package/dist/cjs/kernel-zerodev/validator/session-key-validator.js +117 -63
- package/dist/cjs/kernel-zerodev/validator/session-key-validator.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator/types.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/validator/types.js.map +1 -1
- package/dist/cjs/kernel-zerodev/validator-provider/base.js +9 -0
- package/dist/cjs/kernel-zerodev/validator-provider/base.js.map +1 -1
- package/dist/esm/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts +58 -4
- package/dist/esm/kernel-zerodev/abis/SessionKeyValidatorAbi.js +75 -4
- package/dist/esm/kernel-zerodev/abis/SessionKeyValidatorAbi.js.map +1 -1
- package/dist/esm/kernel-zerodev/constants.d.ts +1 -1
- package/dist/esm/kernel-zerodev/constants.js +1 -1
- package/dist/esm/kernel-zerodev/constants.js.map +1 -1
- package/dist/esm/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
- package/dist/esm/kernel-zerodev/provider.d.ts +3 -0
- package/dist/esm/kernel-zerodev/provider.js +38 -3
- package/dist/esm/kernel-zerodev/provider.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator/base.d.ts +1 -1
- package/dist/esm/kernel-zerodev/validator/base.js +3 -3
- package/dist/esm/kernel-zerodev/validator/base.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator/session-key-validator.d.ts +18 -7
- package/dist/esm/kernel-zerodev/validator/session-key-validator.js +118 -64
- package/dist/esm/kernel-zerodev/validator/session-key-validator.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator/types.d.ts +1 -1
- package/dist/esm/kernel-zerodev/validator/types.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator-provider/base.js +9 -0
- package/dist/esm/kernel-zerodev/validator-provider/base.js.map +1 -1
- package/dist/types/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts +58 -4
- package/dist/types/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/constants.d.ts +1 -1
- package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts +1 -1
- package/dist/types/kernel-zerodev/ethers-provider/account-signer.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/provider.d.ts +3 -0
- package/dist/types/kernel-zerodev/provider.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator/base.d.ts +1 -1
- package/dist/types/kernel-zerodev/validator/base.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts +18 -7
- package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator/types.d.ts +1 -1
- package/dist/types/kernel-zerodev/validator/types.d.ts.map +1 -1
- package/dist/types/kernel-zerodev/validator-provider/base.d.ts.map +1 -1
- package/package.json +5 -4
- package/src/kernel-zerodev/__tests__/config/index.ts +18 -0
- package/src/kernel-zerodev/abis/SessionKeyValidatorAbi.ts +75 -4
- package/src/kernel-zerodev/constants.ts +1 -1
- package/src/kernel-zerodev/provider.ts +27 -1
- package/src/kernel-zerodev/validator/base.ts +4 -4
- package/src/kernel-zerodev/validator/session-key-validator.ts +159 -88
- package/src/kernel-zerodev/validator/types.ts +1 -1
- 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
|
-
|
|
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,
|
|
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
|
-
|
|
53
|
-
private
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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 =
|
|
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
|
|
167
|
-
|
|
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,
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
|
|
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
|
|
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: "
|
|
249
|
-
type: "
|
|
271
|
+
name: "index",
|
|
272
|
+
type: "uint32",
|
|
250
273
|
},
|
|
251
274
|
{
|
|
252
|
-
name: "
|
|
253
|
-
type: "
|
|
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
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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
|
|
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:
|
|
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
|
-
|
|
359
|
-
|
|
418
|
+
enableDataHex.toLowerCase() ===
|
|
419
|
+
(await this.getEnableData(kernelAccountAddress, enableData[4])).toLowerCase());
|
|
360
420
|
}
|
|
361
421
|
async getDummyUserOpSignature(callData) {
|
|
362
|
-
|
|
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
|
-
|
|
372
|
-
|
|
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
|
-
|
|
484
|
+
this.getEncodedPermissionProofData(userOp.callData),
|
|
431
485
|
]);
|
|
432
486
|
return signature;
|
|
433
487
|
}
|