@zerodev/sdk 4.0.16 → 4.0.17
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/validator/session-key-validator.d.ts +1 -1
- package/dist/cjs/kernel-zerodev/validator/session-key-validator.js +14 -1
- package/dist/cjs/kernel-zerodev/validator/session-key-validator.js.map +1 -1
- package/dist/esm/kernel-zerodev/validator/session-key-validator.d.ts +1 -1
- package/dist/esm/kernel-zerodev/validator/session-key-validator.js +14 -1
- package/dist/esm/kernel-zerodev/validator/session-key-validator.js.map +1 -1
- package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts +1 -1
- package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/kernel-zerodev/validator/session-key-validator.ts +31 -16
|
@@ -10,6 +10,9 @@ const KernelAccountAbi_js_1 = require("../abis/KernelAccountAbi.js");
|
|
|
10
10
|
const merkletreejs_1 = require("merkletreejs");
|
|
11
11
|
const index_js_1 = require("../api/index.js");
|
|
12
12
|
const utils_js_1 = require("../utils.js");
|
|
13
|
+
BigInt.prototype.toJSON = function () {
|
|
14
|
+
return this.toString();
|
|
15
|
+
};
|
|
13
16
|
var ParamCondition;
|
|
14
17
|
(function (ParamCondition) {
|
|
15
18
|
ParamCondition[ParamCondition["EQUAL"] = 0] = "EQUAL";
|
|
@@ -89,7 +92,17 @@ class SessionKeyValidator extends base_js_1.KernelBaseValidator {
|
|
|
89
92
|
const valueLimitPermissions = signaturePermissions.filter((permission) => permission.valueLimit >= args[1]);
|
|
90
93
|
if (!valueLimitPermissions.length)
|
|
91
94
|
return undefined;
|
|
92
|
-
const sortedPermissions = valueLimitPermissions.sort((a, b) =>
|
|
95
|
+
const sortedPermissions = valueLimitPermissions.sort((a, b) => {
|
|
96
|
+
if (b.valueLimit > a.valueLimit) {
|
|
97
|
+
return 1;
|
|
98
|
+
}
|
|
99
|
+
else if (b.valueLimit < a.valueLimit) {
|
|
100
|
+
return -1;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
return 0;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
93
106
|
return this.findPermissionByRule(sortedPermissions, args[2]);
|
|
94
107
|
}
|
|
95
108
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-key-validator.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/session-key-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getUserOperationHash,\n type Address,\n type Hex,\n type SmartAccountSigner,\n type UserOperationRequest,\n getChain,\n type SignTypedDataParams,\n} from \"@alchemy/aa-core\";\nimport {\n KernelBaseValidator,\n ValidatorMode,\n type KernelBaseValidatorParams,\n type ValidatorPluginData,\n} from \"./base.js\";\nimport {\n encodeFunctionData,\n toBytes,\n concat,\n pad,\n toHex,\n keccak256,\n encodeAbiParameters,\n concatHex,\n zeroAddress,\n decodeFunctionData,\n isHex,\n getFunctionSelector,\n} from \"viem\";\nimport { SessionKeyValidatorAbi } from \"../abis/SessionKeyValidatorAbi.js\";\nimport { DUMMY_ECDSA_SIG } from \"../constants.js\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport { MerkleTree } from \"merkletreejs\";\nimport type { Operation } from \"../provider.js\";\nimport { getChainId } from \"../api/index.js\";\nimport { fixSignedData } from \"../utils.js\";\n\nexport interface SessionKeyValidatorParams extends KernelBaseValidatorParams {\n sessionKey: SmartAccountSigner;\n sessionKeyData: SessionKeyData;\n}\n\nexport type SessionKeyParams = Pick<\n SessionKeyValidatorParams,\n \"sessionKeyData\" | \"enableSignature\"\n> &\n ValidatorPluginData & {\n sessionPrivateKey?: Hex;\n initCode?: Hex;\n accountAddress?: Address;\n };\n\nexport enum ParamCondition {\n EQUAL = 0,\n GREATER_THAN = 1,\n LESS_THAN = 2,\n GREATER_THAN_OR_EQUAL = 3,\n LESS_THAN_OR_EQUAL = 4,\n NOT_EQUAL = 5,\n}\n\nexport interface ParamRules {\n offset: number;\n condition: ParamCondition;\n param: Hex;\n}\n\nexport interface Permission {\n target: Address;\n valueLimit: number;\n sig: Hex;\n rules: ParamRules[];\n operation: Operation;\n}\n\nexport interface SessionKeyData {\n validUntil: number;\n validAfter: number;\n paymaster?: Address;\n permissions?: Permission[];\n}\n\nexport class SessionKeyValidator extends KernelBaseValidator {\n protected sessionKey: SmartAccountSigner;\n sessionKeyData: SessionKeyData;\n merkleTree: MerkleTree;\n\n constructor(params: SessionKeyValidatorParams) {\n super(params);\n this.sessionKey = params.sessionKey;\n this.sessionKeyData = {\n ...params.sessionKeyData,\n paymaster: params.sessionKeyData.paymaster ?? zeroAddress,\n };\n this.merkleTree = this.getMerkleTree();\n this.selector =\n params.selector ??\n getFunctionSelector(\"execute(address, uint256, bytes, uint8)\");\n this.executor = params.executor ?? zeroAddress;\n this.mode = params.mode ?? ValidatorMode.plugin;\n }\n\n public static async init(\n params: SessionKeyValidatorParams\n ): Promise<SessionKeyValidator> {\n const chainId = await getChainId(params.projectId);\n if (!chainId) {\n throw new Error(\"ChainId not found\");\n }\n const chain = getChain(chainId);\n const instance = new SessionKeyValidator({ ...params, chain });\n return instance;\n }\n\n shouldDelegateViaFallback(): boolean {\n return this.merkleTree.getHexRoot() === pad(\"0x00\", { size: 32 });\n }\n\n findMatchingPermission(callData: Hex): Permission | undefined {\n try {\n const { functionName, args } = decodeFunctionData({\n abi: KernelAccountAbi,\n data: callData,\n });\n\n if (functionName !== \"execute\") return undefined;\n\n const permissionsList = this.sessionKeyData.permissions;\n if (!permissionsList || !permissionsList.length) return undefined;\n\n const targetToMatch = args[0].toLowerCase();\n\n // Filter permissions by target\n let targetPermissions = permissionsList.filter(\n (permission) => permission.target.toLowerCase() === targetToMatch\n );\n\n // If no permissions match the exact target, check for generic permissions (using zero address)\n if (!targetPermissions.length) {\n targetPermissions = permissionsList.filter(\n (permission) =>\n permission.target.toLowerCase() === zeroAddress.toLowerCase()\n );\n }\n\n if (!targetPermissions.length) return undefined;\n\n const operationPermissions = this.filterByOperation(\n targetPermissions,\n args[3]\n );\n\n if (!operationPermissions.length) return undefined;\n\n const signaturePermissions = this.filterBySignature(\n operationPermissions,\n args[2].slice(0, 10).toLowerCase()\n );\n\n const valueLimitPermissions = signaturePermissions.filter(\n (permission) => permission.valueLimit >= args[1]\n );\n\n if (!valueLimitPermissions.length) return undefined;\n\n const sortedPermissions = valueLimitPermissions.sort(\n (a, b) => b.valueLimit - a.valueLimit\n );\n\n return this.findPermissionByRule(sortedPermissions, args[2]);\n } catch (error) {\n return undefined;\n }\n }\n\n private filterByOperation(\n permissions: Permission[],\n operation: Operation\n ): Permission[] {\n return permissions.filter(\n (permission) => permission.operation === operation\n );\n }\n\n private filterBySignature(\n permissions: Permission[],\n signature: string\n ): Permission[] {\n return permissions.filter(\n (permission) => permission.sig.toLowerCase() === signature\n );\n }\n\n private findPermissionByRule(\n permissions: Permission[],\n data: string\n ): Permission | undefined {\n return permissions.find((permission) => {\n for (const rule of permission.rules) {\n const dataParam: Hex = this.getFormattedHex(\n \"0x\" + data.slice(10 + rule.offset * 2, 10 + rule.offset * 2 + 64)\n );\n const ruleParam: Hex = this.getFormattedHex(rule.param);\n\n if (!this.evaluateRuleCondition(dataParam, ruleParam, rule.condition)) {\n return false;\n }\n }\n return true;\n });\n }\n\n private getFormattedHex(value: string): Hex {\n return pad(isHex(value) ? value : toHex(value), {\n size: 32,\n }).toLowerCase() as Hex;\n }\n\n private evaluateRuleCondition(\n dataParam: Hex,\n ruleParam: Hex,\n condition: ParamCondition\n ): boolean {\n switch (condition) {\n case ParamCondition.EQUAL:\n return dataParam === ruleParam;\n case ParamCondition.GREATER_THAN:\n return dataParam > ruleParam;\n case ParamCondition.LESS_THAN:\n return dataParam < ruleParam;\n case ParamCondition.GREATER_THAN_OR_EQUAL:\n return dataParam >= ruleParam;\n case ParamCondition.LESS_THAN_OR_EQUAL:\n return dataParam <= ruleParam;\n case ParamCondition.NOT_EQUAL:\n return dataParam !== ruleParam;\n default:\n return false;\n }\n }\n\n getMerkleTree(): MerkleTree {\n const permissionPacked = this.sessionKeyData.permissions?.map(\n (permission) => this.encodePermissionData(permission)\n );\n\n // Having one leaf returns empty array in getProof(). To hack it we push the leaf twice\n // issue - https://github.com/merkletreejs/merkletreejs/issues/58\n if (permissionPacked?.length === 1)\n permissionPacked.push(permissionPacked[0]);\n\n return permissionPacked && permissionPacked.length !== 0\n ? new MerkleTree(permissionPacked, keccak256, {\n sortPairs: true,\n hashLeaves: true,\n })\n : new MerkleTree([pad(\"0x00\", { size: 32 })], keccak256, {\n hashLeaves: false,\n });\n }\n\n encodePermissionData(permission: Permission, merkleProof?: string[]): Hex {\n let permissionParam = {\n components: [\n {\n name: \"target\",\n type: \"address\",\n },\n {\n name: \"valueLimit\",\n type: \"uint256\",\n },\n {\n name: \"sig\",\n type: \"bytes4\",\n },\n {\n components: [\n {\n name: \"offset\",\n type: \"uint256\",\n },\n {\n internalType: \"enum ParamCondition\",\n name: \"condition\",\n type: \"uint8\",\n },\n {\n name: \"param\",\n type: \"bytes32\",\n },\n ],\n name: \"rules\",\n type: \"tuple[]\",\n },\n {\n internalType: \"enum Operation\",\n name: \"operation\",\n type: \"uint8\",\n },\n ],\n name: \"permission\",\n type: \"tuple\",\n };\n let params;\n let values;\n if (merkleProof) {\n params = [\n permissionParam,\n {\n name: \"merkleProof\",\n type: \"bytes32[]\",\n },\n ];\n values = [permission, merkleProof];\n } else {\n params = [permissionParam];\n values = [permission];\n }\n return encodeAbiParameters(params, values);\n }\n\n getSessionData(): SessionKeyParams {\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 validUntil: this.validUntil,\n validAfter: this.validAfter,\n sessionKeyData: this.sessionKeyData,\n enableSignature: this.enableSignature,\n };\n }\n\n async signer(): Promise<SmartAccountSigner> {\n return await Promise.resolve(this.sessionKey);\n }\n\n async getEnableData(): Promise<Hex> {\n if (!this.merkleTree) {\n throw Error(\"SessionKeyValidator: MerkleTree not generated\");\n }\n return concat([\n await this.sessionKey.getAddress(),\n pad(this.merkleTree.getHexRoot() as Hex, { size: 32 }),\n pad(toHex(this.sessionKeyData.validAfter), { size: 6 }),\n pad(toHex(this.sessionKeyData.validUntil), { size: 6 }),\n this.sessionKeyData.paymaster!,\n ]);\n }\n\n async isPluginEnabled(\n kernelAccountAddress: Address,\n selector: Hex\n ): Promise<boolean> {\n if (!this.publicClient) {\n throw new Error(\"Validator uninitialized: PublicClient missing\");\n }\n const execDetail = await this.publicClient.readContract({\n abi: KernelAccountAbi,\n address: kernelAccountAddress,\n functionName: \"getExecution\",\n args: [selector],\n });\n const enableData = await this.publicClient.readContract({\n abi: SessionKeyValidatorAbi,\n address: this.validatorAddress,\n functionName: \"sessionData\",\n args: [await this.sessionKey.getAddress(), kernelAccountAddress],\n });\n const enableDataHex = concatHex([\n await this.sessionKey.getAddress(),\n pad(enableData[0], { size: 4 }),\n pad(toHex(enableData[1]), { size: 6 }),\n pad(toHex(enableData[2]), { size: 6 }),\n enableData[3],\n ]);\n return (\n execDetail.validator.toLowerCase() ===\n this.validatorAddress.toLowerCase() &&\n enableData[4] &&\n enableDataHex.toLowerCase() === (await this.getEnableData()).toLowerCase()\n );\n }\n\n async getDummyUserOpSignature(callData: Hex): Promise<Hex> {\n const matchingPermission = this.findMatchingPermission(callData);\n if (!matchingPermission && !this.shouldDelegateViaFallback()) {\n throw Error(\n \"SessionKeyValidator: No matching permission found for the userOp\"\n );\n }\n const encodedPermissionData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission)\n : \"0x\";\n const merkleProof = this.merkleTree.getHexProof(\n keccak256(encodedPermissionData)\n );\n const encodedData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission, merkleProof)\n : \"0x\";\n return concatHex([\n await this.sessionKey.getAddress(),\n DUMMY_ECDSA_SIG,\n encodedData,\n ]);\n }\n\n encodeEnable(sessionKeyEnableData: Hex): Hex {\n return encodeFunctionData({\n abi: SessionKeyValidatorAbi,\n functionName: \"enable\",\n args: [sessionKeyEnableData],\n });\n }\n\n encodeDisable(sessionKey: Hex): Hex {\n return encodeFunctionData({\n abi: SessionKeyValidatorAbi,\n functionName: \"disable\",\n args: [sessionKey],\n });\n }\n\n async signMessage(message: string | Uint8Array): Promise<Hex> {\n return await this.sessionKey.signMessage(message);\n }\n\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n return fixSignedData(await this.sessionKey.signTypedData(params));\n }\n\n async signUserOp(userOp: UserOperationRequest): Promise<Hex> {\n if (!this.chain) {\n throw new Error(\"Validator uninitialized\");\n }\n const hash = getUserOperationHash(\n {\n ...userOp,\n signature: \"0x\",\n },\n this.entryPointAddress,\n BigInt(this.chain.id)\n );\n const formattedMessage = typeof hash === \"string\" ? toBytes(hash) : hash;\n\n const matchingPermission = this.findMatchingPermission(userOp.callData);\n if (!matchingPermission && !this.shouldDelegateViaFallback()) {\n throw Error(\n \"SessionKeyValidator: No matching permission found for the userOp\"\n );\n }\n const encodedPermissionData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission)\n : \"0x\";\n const merkleProof = this.merkleTree.getHexProof(\n keccak256(encodedPermissionData)\n );\n const encodedData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission, merkleProof)\n : \"0x\";\n const signature = concat([\n await this.sessionKey.getAddress(),\n await this.sessionKey.signMessage(formattedMessage),\n encodedData,\n ]);\n return signature;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-key-validator.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/session-key-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getUserOperationHash,\n type Address,\n type Hex,\n type SmartAccountSigner,\n type UserOperationRequest,\n getChain,\n type SignTypedDataParams,\n} from \"@alchemy/aa-core\";\nimport {\n KernelBaseValidator,\n ValidatorMode,\n type KernelBaseValidatorParams,\n type ValidatorPluginData,\n} from \"./base.js\";\nimport {\n encodeFunctionData,\n toBytes,\n concat,\n pad,\n toHex,\n keccak256,\n encodeAbiParameters,\n concatHex,\n zeroAddress,\n decodeFunctionData,\n isHex,\n getFunctionSelector,\n} from \"viem\";\nimport { SessionKeyValidatorAbi } from \"../abis/SessionKeyValidatorAbi.js\";\nimport { DUMMY_ECDSA_SIG } from \"../constants.js\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport { MerkleTree } from \"merkletreejs\";\nimport type { Operation } from \"../provider.js\";\nimport { getChainId } from \"../api/index.js\";\nimport { fixSignedData } from \"../utils.js\";\n\n// We need to be able to serialize bigint to transmit session key over\n// the network.\n// Using this trick: https://github.com/GoogleChromeLabs/jsbi/issues/30#issuecomment-1006086291\n(BigInt.prototype as any).toJSON = function () {\n return this.toString();\n}\n\nexport interface SessionKeyValidatorParams extends KernelBaseValidatorParams {\n sessionKey: SmartAccountSigner;\n sessionKeyData: SessionKeyData;\n}\n\nexport type SessionKeyParams = Pick<\n SessionKeyValidatorParams,\n \"sessionKeyData\" | \"enableSignature\"\n> &\n ValidatorPluginData & {\n sessionPrivateKey?: Hex;\n initCode?: Hex;\n accountAddress?: Address;\n };\n\nexport enum ParamCondition {\n EQUAL = 0,\n GREATER_THAN = 1,\n LESS_THAN = 2,\n GREATER_THAN_OR_EQUAL = 3,\n LESS_THAN_OR_EQUAL = 4,\n NOT_EQUAL = 5,\n}\n\nexport interface ParamRules {\n offset: number;\n condition: ParamCondition;\n param: Hex;\n}\n\nexport interface Permission {\n target: Address;\n valueLimit: bigint;\n sig: Hex;\n rules: ParamRules[];\n operation: Operation;\n}\n\nexport interface SessionKeyData {\n validUntil: number;\n validAfter: number;\n paymaster?: Address;\n permissions?: Permission[];\n}\n\nexport class SessionKeyValidator extends KernelBaseValidator {\n protected sessionKey: SmartAccountSigner;\n sessionKeyData: SessionKeyData;\n merkleTree: MerkleTree;\n\n constructor(params: SessionKeyValidatorParams) {\n super(params);\n this.sessionKey = params.sessionKey;\n this.sessionKeyData = {\n ...params.sessionKeyData,\n paymaster: params.sessionKeyData.paymaster ?? zeroAddress,\n };\n this.merkleTree = this.getMerkleTree();\n this.selector =\n params.selector ??\n getFunctionSelector(\"execute(address, uint256, bytes, uint8)\");\n this.executor = params.executor ?? zeroAddress;\n this.mode = params.mode ?? ValidatorMode.plugin;\n }\n\n public static async init(\n params: SessionKeyValidatorParams\n ): Promise<SessionKeyValidator> {\n const chainId = await getChainId(params.projectId);\n if (!chainId) {\n throw new Error(\"ChainId not found\");\n }\n const chain = getChain(chainId);\n const instance = new SessionKeyValidator({ ...params, chain });\n return instance;\n }\n\n shouldDelegateViaFallback(): boolean {\n return this.merkleTree.getHexRoot() === pad(\"0x00\", { size: 32 });\n }\n\n findMatchingPermission(callData: Hex): Permission | undefined {\n try {\n const { functionName, args } = decodeFunctionData({\n abi: KernelAccountAbi,\n data: callData,\n });\n\n if (functionName !== \"execute\") return undefined;\n\n const permissionsList = this.sessionKeyData.permissions;\n if (!permissionsList || !permissionsList.length) return undefined;\n\n const targetToMatch = args[0].toLowerCase();\n\n // Filter permissions by target\n let targetPermissions = permissionsList.filter(\n (permission) => permission.target.toLowerCase() === targetToMatch\n );\n\n // If no permissions match the exact target, check for generic permissions (using zero address)\n if (!targetPermissions.length) {\n targetPermissions = permissionsList.filter(\n (permission) =>\n permission.target.toLowerCase() === zeroAddress.toLowerCase()\n );\n }\n\n if (!targetPermissions.length) return undefined;\n\n const operationPermissions = this.filterByOperation(\n targetPermissions,\n args[3]\n );\n\n if (!operationPermissions.length) return undefined;\n\n const signaturePermissions = this.filterBySignature(\n operationPermissions,\n args[2].slice(0, 10).toLowerCase()\n );\n\n const valueLimitPermissions = signaturePermissions.filter(\n (permission) => permission.valueLimit >= args[1]\n );\n\n if (!valueLimitPermissions.length) return undefined;\n\n const sortedPermissions = valueLimitPermissions.sort(\n (a, b) => {\n if (b.valueLimit > a.valueLimit) {\n return 1\n } else if (b.valueLimit < a.valueLimit) {\n return -1\n } else {\n return 0\n }\n }\n );\n\n return this.findPermissionByRule(sortedPermissions, args[2]);\n } catch (error) {\n return undefined;\n }\n }\n\n private filterByOperation(\n permissions: Permission[],\n operation: Operation\n ): Permission[] {\n return permissions.filter(\n (permission) => permission.operation === operation\n );\n }\n\n private filterBySignature(\n permissions: Permission[],\n signature: string\n ): Permission[] {\n return permissions.filter(\n (permission) => permission.sig.toLowerCase() === signature\n );\n }\n\n private findPermissionByRule(\n permissions: Permission[],\n data: string\n ): Permission | undefined {\n return permissions.find((permission) => {\n for (const rule of permission.rules) {\n const dataParam: Hex = this.getFormattedHex(\n \"0x\" + data.slice(10 + rule.offset * 2, 10 + rule.offset * 2 + 64)\n );\n const ruleParam: Hex = this.getFormattedHex(rule.param);\n\n if (!this.evaluateRuleCondition(dataParam, ruleParam, rule.condition)) {\n return false;\n }\n }\n return true;\n });\n }\n\n private getFormattedHex(value: string): Hex {\n return pad(isHex(value) ? value : toHex(value), {\n size: 32,\n }).toLowerCase() as Hex;\n }\n\n private evaluateRuleCondition(\n dataParam: Hex,\n ruleParam: Hex,\n condition: ParamCondition\n ): boolean {\n switch (condition) {\n case ParamCondition.EQUAL:\n return dataParam === ruleParam;\n case ParamCondition.GREATER_THAN:\n return dataParam > ruleParam;\n case ParamCondition.LESS_THAN:\n return dataParam < ruleParam;\n case ParamCondition.GREATER_THAN_OR_EQUAL:\n return dataParam >= ruleParam;\n case ParamCondition.LESS_THAN_OR_EQUAL:\n return dataParam <= ruleParam;\n case ParamCondition.NOT_EQUAL:\n return dataParam !== ruleParam;\n default:\n return false;\n }\n }\n\n getMerkleTree(): MerkleTree {\n const permissionPacked = this.sessionKeyData.permissions?.map(\n (permission) => this.encodePermissionData(permission)\n );\n\n // Having one leaf returns empty array in getProof(). To hack it we push the leaf twice\n // issue - https://github.com/merkletreejs/merkletreejs/issues/58\n if (permissionPacked?.length === 1)\n permissionPacked.push(permissionPacked[0]);\n\n return permissionPacked && permissionPacked.length !== 0\n ? new MerkleTree(permissionPacked, keccak256, {\n sortPairs: true,\n hashLeaves: true,\n })\n : new MerkleTree([pad(\"0x00\", { size: 32 })], keccak256, {\n hashLeaves: false,\n });\n }\n\n encodePermissionData(permission: Permission, merkleProof?: string[]): Hex {\n let permissionParam = {\n components: [\n {\n name: \"target\",\n type: \"address\",\n },\n {\n name: \"valueLimit\",\n type: \"uint256\",\n },\n {\n name: \"sig\",\n type: \"bytes4\",\n },\n {\n components: [\n {\n name: \"offset\",\n type: \"uint256\",\n },\n {\n internalType: \"enum ParamCondition\",\n name: \"condition\",\n type: \"uint8\",\n },\n {\n name: \"param\",\n type: \"bytes32\",\n },\n ],\n name: \"rules\",\n type: \"tuple[]\",\n },\n {\n internalType: \"enum Operation\",\n name: \"operation\",\n type: \"uint8\",\n },\n ],\n name: \"permission\",\n type: \"tuple\",\n };\n let params;\n let values;\n if (merkleProof) {\n params = [\n permissionParam,\n {\n name: \"merkleProof\",\n type: \"bytes32[]\",\n },\n ];\n values = [permission, merkleProof];\n } else {\n params = [permissionParam];\n values = [permission];\n }\n return encodeAbiParameters(params, values);\n }\n\n getSessionData(): SessionKeyParams {\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 validUntil: this.validUntil,\n validAfter: this.validAfter,\n sessionKeyData: this.sessionKeyData,\n enableSignature: this.enableSignature,\n };\n }\n\n async signer(): Promise<SmartAccountSigner> {\n return await Promise.resolve(this.sessionKey);\n }\n\n async getEnableData(): Promise<Hex> {\n if (!this.merkleTree) {\n throw Error(\"SessionKeyValidator: MerkleTree not generated\");\n }\n return concat([\n await this.sessionKey.getAddress(),\n pad(this.merkleTree.getHexRoot() as Hex, { size: 32 }),\n pad(toHex(this.sessionKeyData.validAfter), { size: 6 }),\n pad(toHex(this.sessionKeyData.validUntil), { size: 6 }),\n this.sessionKeyData.paymaster!,\n ]);\n }\n\n async isPluginEnabled(\n kernelAccountAddress: Address,\n selector: Hex\n ): Promise<boolean> {\n if (!this.publicClient) {\n throw new Error(\"Validator uninitialized: PublicClient missing\");\n }\n const execDetail = await this.publicClient.readContract({\n abi: KernelAccountAbi,\n address: kernelAccountAddress,\n functionName: \"getExecution\",\n args: [selector],\n });\n const enableData = await this.publicClient.readContract({\n abi: SessionKeyValidatorAbi,\n address: this.validatorAddress,\n functionName: \"sessionData\",\n args: [await this.sessionKey.getAddress(), kernelAccountAddress],\n });\n const enableDataHex = concatHex([\n await this.sessionKey.getAddress(),\n pad(enableData[0], { size: 4 }),\n pad(toHex(enableData[1]), { size: 6 }),\n pad(toHex(enableData[2]), { size: 6 }),\n enableData[3],\n ]);\n return (\n execDetail.validator.toLowerCase() ===\n this.validatorAddress.toLowerCase() &&\n enableData[4] &&\n enableDataHex.toLowerCase() === (await this.getEnableData()).toLowerCase()\n );\n }\n\n async getDummyUserOpSignature(callData: Hex): Promise<Hex> {\n const matchingPermission = this.findMatchingPermission(callData);\n if (!matchingPermission && !this.shouldDelegateViaFallback()) {\n throw Error(\n \"SessionKeyValidator: No matching permission found for the userOp\"\n );\n }\n const encodedPermissionData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission)\n : \"0x\";\n const merkleProof = this.merkleTree.getHexProof(\n keccak256(encodedPermissionData)\n );\n const encodedData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission, merkleProof)\n : \"0x\";\n return concatHex([\n await this.sessionKey.getAddress(),\n DUMMY_ECDSA_SIG,\n encodedData,\n ]);\n }\n\n encodeEnable(sessionKeyEnableData: Hex): Hex {\n return encodeFunctionData({\n abi: SessionKeyValidatorAbi,\n functionName: \"enable\",\n args: [sessionKeyEnableData],\n });\n }\n\n encodeDisable(sessionKey: Hex): Hex {\n return encodeFunctionData({\n abi: SessionKeyValidatorAbi,\n functionName: \"disable\",\n args: [sessionKey],\n });\n }\n\n async signMessage(message: string | Uint8Array): Promise<Hex> {\n return await this.sessionKey.signMessage(message);\n }\n\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n return fixSignedData(await this.sessionKey.signTypedData(params));\n }\n\n async signUserOp(userOp: UserOperationRequest): Promise<Hex> {\n if (!this.chain) {\n throw new Error(\"Validator uninitialized\");\n }\n const hash = getUserOperationHash(\n {\n ...userOp,\n signature: \"0x\",\n },\n this.entryPointAddress,\n BigInt(this.chain.id)\n );\n const formattedMessage = typeof hash === \"string\" ? toBytes(hash) : hash;\n\n const matchingPermission = this.findMatchingPermission(userOp.callData);\n if (!matchingPermission && !this.shouldDelegateViaFallback()) {\n throw Error(\n \"SessionKeyValidator: No matching permission found for the userOp\"\n );\n }\n const encodedPermissionData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission)\n : \"0x\";\n const merkleProof = this.merkleTree.getHexProof(\n keccak256(encodedPermissionData)\n );\n const encodedData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission, merkleProof)\n : \"0x\";\n const signature = concat([\n await this.sessionKey.getAddress(),\n await this.sessionKey.signMessage(formattedMessage),\n encodedData,\n ]);\n return signature;\n }\n}\n"]}
|
|
@@ -7,6 +7,9 @@ import { KernelAccountAbi } from "../abis/KernelAccountAbi.js";
|
|
|
7
7
|
import { MerkleTree } from "merkletreejs";
|
|
8
8
|
import { getChainId } from "../api/index.js";
|
|
9
9
|
import { fixSignedData } from "../utils.js";
|
|
10
|
+
BigInt.prototype.toJSON = function () {
|
|
11
|
+
return this.toString();
|
|
12
|
+
};
|
|
10
13
|
export var ParamCondition;
|
|
11
14
|
(function (ParamCondition) {
|
|
12
15
|
ParamCondition[ParamCondition["EQUAL"] = 0] = "EQUAL";
|
|
@@ -86,7 +89,17 @@ export class SessionKeyValidator extends KernelBaseValidator {
|
|
|
86
89
|
const valueLimitPermissions = signaturePermissions.filter((permission) => permission.valueLimit >= args[1]);
|
|
87
90
|
if (!valueLimitPermissions.length)
|
|
88
91
|
return undefined;
|
|
89
|
-
const sortedPermissions = valueLimitPermissions.sort((a, b) =>
|
|
92
|
+
const sortedPermissions = valueLimitPermissions.sort((a, b) => {
|
|
93
|
+
if (b.valueLimit > a.valueLimit) {
|
|
94
|
+
return 1;
|
|
95
|
+
}
|
|
96
|
+
else if (b.valueLimit < a.valueLimit) {
|
|
97
|
+
return -1;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
});
|
|
90
103
|
return this.findPermissionByRule(sortedPermissions, args[2]);
|
|
91
104
|
}
|
|
92
105
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-key-validator.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/session-key-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getUserOperationHash,\n type Address,\n type Hex,\n type SmartAccountSigner,\n type UserOperationRequest,\n getChain,\n type SignTypedDataParams,\n} from \"@alchemy/aa-core\";\nimport {\n KernelBaseValidator,\n ValidatorMode,\n type KernelBaseValidatorParams,\n type ValidatorPluginData,\n} from \"./base.js\";\nimport {\n encodeFunctionData,\n toBytes,\n concat,\n pad,\n toHex,\n keccak256,\n encodeAbiParameters,\n concatHex,\n zeroAddress,\n decodeFunctionData,\n isHex,\n getFunctionSelector,\n} from \"viem\";\nimport { SessionKeyValidatorAbi } from \"../abis/SessionKeyValidatorAbi.js\";\nimport { DUMMY_ECDSA_SIG } from \"../constants.js\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport { MerkleTree } from \"merkletreejs\";\nimport type { Operation } from \"../provider.js\";\nimport { getChainId } from \"../api/index.js\";\nimport { fixSignedData } from \"../utils.js\";\n\nexport interface SessionKeyValidatorParams extends KernelBaseValidatorParams {\n sessionKey: SmartAccountSigner;\n sessionKeyData: SessionKeyData;\n}\n\nexport type SessionKeyParams = Pick<\n SessionKeyValidatorParams,\n \"sessionKeyData\" | \"enableSignature\"\n> &\n ValidatorPluginData & {\n sessionPrivateKey?: Hex;\n initCode?: Hex;\n accountAddress?: Address;\n };\n\nexport enum ParamCondition {\n EQUAL = 0,\n GREATER_THAN = 1,\n LESS_THAN = 2,\n GREATER_THAN_OR_EQUAL = 3,\n LESS_THAN_OR_EQUAL = 4,\n NOT_EQUAL = 5,\n}\n\nexport interface ParamRules {\n offset: number;\n condition: ParamCondition;\n param: Hex;\n}\n\nexport interface Permission {\n target: Address;\n valueLimit: number;\n sig: Hex;\n rules: ParamRules[];\n operation: Operation;\n}\n\nexport interface SessionKeyData {\n validUntil: number;\n validAfter: number;\n paymaster?: Address;\n permissions?: Permission[];\n}\n\nexport class SessionKeyValidator extends KernelBaseValidator {\n protected sessionKey: SmartAccountSigner;\n sessionKeyData: SessionKeyData;\n merkleTree: MerkleTree;\n\n constructor(params: SessionKeyValidatorParams) {\n super(params);\n this.sessionKey = params.sessionKey;\n this.sessionKeyData = {\n ...params.sessionKeyData,\n paymaster: params.sessionKeyData.paymaster ?? zeroAddress,\n };\n this.merkleTree = this.getMerkleTree();\n this.selector =\n params.selector ??\n getFunctionSelector(\"execute(address, uint256, bytes, uint8)\");\n this.executor = params.executor ?? zeroAddress;\n this.mode = params.mode ?? ValidatorMode.plugin;\n }\n\n public static async init(\n params: SessionKeyValidatorParams\n ): Promise<SessionKeyValidator> {\n const chainId = await getChainId(params.projectId);\n if (!chainId) {\n throw new Error(\"ChainId not found\");\n }\n const chain = getChain(chainId);\n const instance = new SessionKeyValidator({ ...params, chain });\n return instance;\n }\n\n shouldDelegateViaFallback(): boolean {\n return this.merkleTree.getHexRoot() === pad(\"0x00\", { size: 32 });\n }\n\n findMatchingPermission(callData: Hex): Permission | undefined {\n try {\n const { functionName, args } = decodeFunctionData({\n abi: KernelAccountAbi,\n data: callData,\n });\n\n if (functionName !== \"execute\") return undefined;\n\n const permissionsList = this.sessionKeyData.permissions;\n if (!permissionsList || !permissionsList.length) return undefined;\n\n const targetToMatch = args[0].toLowerCase();\n\n // Filter permissions by target\n let targetPermissions = permissionsList.filter(\n (permission) => permission.target.toLowerCase() === targetToMatch\n );\n\n // If no permissions match the exact target, check for generic permissions (using zero address)\n if (!targetPermissions.length) {\n targetPermissions = permissionsList.filter(\n (permission) =>\n permission.target.toLowerCase() === zeroAddress.toLowerCase()\n );\n }\n\n if (!targetPermissions.length) return undefined;\n\n const operationPermissions = this.filterByOperation(\n targetPermissions,\n args[3]\n );\n\n if (!operationPermissions.length) return undefined;\n\n const signaturePermissions = this.filterBySignature(\n operationPermissions,\n args[2].slice(0, 10).toLowerCase()\n );\n\n const valueLimitPermissions = signaturePermissions.filter(\n (permission) => permission.valueLimit >= args[1]\n );\n\n if (!valueLimitPermissions.length) return undefined;\n\n const sortedPermissions = valueLimitPermissions.sort(\n (a, b) => b.valueLimit - a.valueLimit\n );\n\n return this.findPermissionByRule(sortedPermissions, args[2]);\n } catch (error) {\n return undefined;\n }\n }\n\n private filterByOperation(\n permissions: Permission[],\n operation: Operation\n ): Permission[] {\n return permissions.filter(\n (permission) => permission.operation === operation\n );\n }\n\n private filterBySignature(\n permissions: Permission[],\n signature: string\n ): Permission[] {\n return permissions.filter(\n (permission) => permission.sig.toLowerCase() === signature\n );\n }\n\n private findPermissionByRule(\n permissions: Permission[],\n data: string\n ): Permission | undefined {\n return permissions.find((permission) => {\n for (const rule of permission.rules) {\n const dataParam: Hex = this.getFormattedHex(\n \"0x\" + data.slice(10 + rule.offset * 2, 10 + rule.offset * 2 + 64)\n );\n const ruleParam: Hex = this.getFormattedHex(rule.param);\n\n if (!this.evaluateRuleCondition(dataParam, ruleParam, rule.condition)) {\n return false;\n }\n }\n return true;\n });\n }\n\n private getFormattedHex(value: string): Hex {\n return pad(isHex(value) ? value : toHex(value), {\n size: 32,\n }).toLowerCase() as Hex;\n }\n\n private evaluateRuleCondition(\n dataParam: Hex,\n ruleParam: Hex,\n condition: ParamCondition\n ): boolean {\n switch (condition) {\n case ParamCondition.EQUAL:\n return dataParam === ruleParam;\n case ParamCondition.GREATER_THAN:\n return dataParam > ruleParam;\n case ParamCondition.LESS_THAN:\n return dataParam < ruleParam;\n case ParamCondition.GREATER_THAN_OR_EQUAL:\n return dataParam >= ruleParam;\n case ParamCondition.LESS_THAN_OR_EQUAL:\n return dataParam <= ruleParam;\n case ParamCondition.NOT_EQUAL:\n return dataParam !== ruleParam;\n default:\n return false;\n }\n }\n\n getMerkleTree(): MerkleTree {\n const permissionPacked = this.sessionKeyData.permissions?.map(\n (permission) => this.encodePermissionData(permission)\n );\n\n // Having one leaf returns empty array in getProof(). To hack it we push the leaf twice\n // issue - https://github.com/merkletreejs/merkletreejs/issues/58\n if (permissionPacked?.length === 1)\n permissionPacked.push(permissionPacked[0]);\n\n return permissionPacked && permissionPacked.length !== 0\n ? new MerkleTree(permissionPacked, keccak256, {\n sortPairs: true,\n hashLeaves: true,\n })\n : new MerkleTree([pad(\"0x00\", { size: 32 })], keccak256, {\n hashLeaves: false,\n });\n }\n\n encodePermissionData(permission: Permission, merkleProof?: string[]): Hex {\n let permissionParam = {\n components: [\n {\n name: \"target\",\n type: \"address\",\n },\n {\n name: \"valueLimit\",\n type: \"uint256\",\n },\n {\n name: \"sig\",\n type: \"bytes4\",\n },\n {\n components: [\n {\n name: \"offset\",\n type: \"uint256\",\n },\n {\n internalType: \"enum ParamCondition\",\n name: \"condition\",\n type: \"uint8\",\n },\n {\n name: \"param\",\n type: \"bytes32\",\n },\n ],\n name: \"rules\",\n type: \"tuple[]\",\n },\n {\n internalType: \"enum Operation\",\n name: \"operation\",\n type: \"uint8\",\n },\n ],\n name: \"permission\",\n type: \"tuple\",\n };\n let params;\n let values;\n if (merkleProof) {\n params = [\n permissionParam,\n {\n name: \"merkleProof\",\n type: \"bytes32[]\",\n },\n ];\n values = [permission, merkleProof];\n } else {\n params = [permissionParam];\n values = [permission];\n }\n return encodeAbiParameters(params, values);\n }\n\n getSessionData(): SessionKeyParams {\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 validUntil: this.validUntil,\n validAfter: this.validAfter,\n sessionKeyData: this.sessionKeyData,\n enableSignature: this.enableSignature,\n };\n }\n\n async signer(): Promise<SmartAccountSigner> {\n return await Promise.resolve(this.sessionKey);\n }\n\n async getEnableData(): Promise<Hex> {\n if (!this.merkleTree) {\n throw Error(\"SessionKeyValidator: MerkleTree not generated\");\n }\n return concat([\n await this.sessionKey.getAddress(),\n pad(this.merkleTree.getHexRoot() as Hex, { size: 32 }),\n pad(toHex(this.sessionKeyData.validAfter), { size: 6 }),\n pad(toHex(this.sessionKeyData.validUntil), { size: 6 }),\n this.sessionKeyData.paymaster!,\n ]);\n }\n\n async isPluginEnabled(\n kernelAccountAddress: Address,\n selector: Hex\n ): Promise<boolean> {\n if (!this.publicClient) {\n throw new Error(\"Validator uninitialized: PublicClient missing\");\n }\n const execDetail = await this.publicClient.readContract({\n abi: KernelAccountAbi,\n address: kernelAccountAddress,\n functionName: \"getExecution\",\n args: [selector],\n });\n const enableData = await this.publicClient.readContract({\n abi: SessionKeyValidatorAbi,\n address: this.validatorAddress,\n functionName: \"sessionData\",\n args: [await this.sessionKey.getAddress(), kernelAccountAddress],\n });\n const enableDataHex = concatHex([\n await this.sessionKey.getAddress(),\n pad(enableData[0], { size: 4 }),\n pad(toHex(enableData[1]), { size: 6 }),\n pad(toHex(enableData[2]), { size: 6 }),\n enableData[3],\n ]);\n return (\n execDetail.validator.toLowerCase() ===\n this.validatorAddress.toLowerCase() &&\n enableData[4] &&\n enableDataHex.toLowerCase() === (await this.getEnableData()).toLowerCase()\n );\n }\n\n async getDummyUserOpSignature(callData: Hex): Promise<Hex> {\n const matchingPermission = this.findMatchingPermission(callData);\n if (!matchingPermission && !this.shouldDelegateViaFallback()) {\n throw Error(\n \"SessionKeyValidator: No matching permission found for the userOp\"\n );\n }\n const encodedPermissionData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission)\n : \"0x\";\n const merkleProof = this.merkleTree.getHexProof(\n keccak256(encodedPermissionData)\n );\n const encodedData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission, merkleProof)\n : \"0x\";\n return concatHex([\n await this.sessionKey.getAddress(),\n DUMMY_ECDSA_SIG,\n encodedData,\n ]);\n }\n\n encodeEnable(sessionKeyEnableData: Hex): Hex {\n return encodeFunctionData({\n abi: SessionKeyValidatorAbi,\n functionName: \"enable\",\n args: [sessionKeyEnableData],\n });\n }\n\n encodeDisable(sessionKey: Hex): Hex {\n return encodeFunctionData({\n abi: SessionKeyValidatorAbi,\n functionName: \"disable\",\n args: [sessionKey],\n });\n }\n\n async signMessage(message: string | Uint8Array): Promise<Hex> {\n return await this.sessionKey.signMessage(message);\n }\n\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n return fixSignedData(await this.sessionKey.signTypedData(params));\n }\n\n async signUserOp(userOp: UserOperationRequest): Promise<Hex> {\n if (!this.chain) {\n throw new Error(\"Validator uninitialized\");\n }\n const hash = getUserOperationHash(\n {\n ...userOp,\n signature: \"0x\",\n },\n this.entryPointAddress,\n BigInt(this.chain.id)\n );\n const formattedMessage = typeof hash === \"string\" ? toBytes(hash) : hash;\n\n const matchingPermission = this.findMatchingPermission(userOp.callData);\n if (!matchingPermission && !this.shouldDelegateViaFallback()) {\n throw Error(\n \"SessionKeyValidator: No matching permission found for the userOp\"\n );\n }\n const encodedPermissionData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission)\n : \"0x\";\n const merkleProof = this.merkleTree.getHexProof(\n keccak256(encodedPermissionData)\n );\n const encodedData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission, merkleProof)\n : \"0x\";\n const signature = concat([\n await this.sessionKey.getAddress(),\n await this.sessionKey.signMessage(formattedMessage),\n encodedData,\n ]);\n return signature;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-key-validator.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/session-key-validator.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getUserOperationHash,\n type Address,\n type Hex,\n type SmartAccountSigner,\n type UserOperationRequest,\n getChain,\n type SignTypedDataParams,\n} from \"@alchemy/aa-core\";\nimport {\n KernelBaseValidator,\n ValidatorMode,\n type KernelBaseValidatorParams,\n type ValidatorPluginData,\n} from \"./base.js\";\nimport {\n encodeFunctionData,\n toBytes,\n concat,\n pad,\n toHex,\n keccak256,\n encodeAbiParameters,\n concatHex,\n zeroAddress,\n decodeFunctionData,\n isHex,\n getFunctionSelector,\n} from \"viem\";\nimport { SessionKeyValidatorAbi } from \"../abis/SessionKeyValidatorAbi.js\";\nimport { DUMMY_ECDSA_SIG } from \"../constants.js\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport { MerkleTree } from \"merkletreejs\";\nimport type { Operation } from \"../provider.js\";\nimport { getChainId } from \"../api/index.js\";\nimport { fixSignedData } from \"../utils.js\";\n\n// We need to be able to serialize bigint to transmit session key over\n// the network.\n// Using this trick: https://github.com/GoogleChromeLabs/jsbi/issues/30#issuecomment-1006086291\n(BigInt.prototype as any).toJSON = function () {\n return this.toString();\n}\n\nexport interface SessionKeyValidatorParams extends KernelBaseValidatorParams {\n sessionKey: SmartAccountSigner;\n sessionKeyData: SessionKeyData;\n}\n\nexport type SessionKeyParams = Pick<\n SessionKeyValidatorParams,\n \"sessionKeyData\" | \"enableSignature\"\n> &\n ValidatorPluginData & {\n sessionPrivateKey?: Hex;\n initCode?: Hex;\n accountAddress?: Address;\n };\n\nexport enum ParamCondition {\n EQUAL = 0,\n GREATER_THAN = 1,\n LESS_THAN = 2,\n GREATER_THAN_OR_EQUAL = 3,\n LESS_THAN_OR_EQUAL = 4,\n NOT_EQUAL = 5,\n}\n\nexport interface ParamRules {\n offset: number;\n condition: ParamCondition;\n param: Hex;\n}\n\nexport interface Permission {\n target: Address;\n valueLimit: bigint;\n sig: Hex;\n rules: ParamRules[];\n operation: Operation;\n}\n\nexport interface SessionKeyData {\n validUntil: number;\n validAfter: number;\n paymaster?: Address;\n permissions?: Permission[];\n}\n\nexport class SessionKeyValidator extends KernelBaseValidator {\n protected sessionKey: SmartAccountSigner;\n sessionKeyData: SessionKeyData;\n merkleTree: MerkleTree;\n\n constructor(params: SessionKeyValidatorParams) {\n super(params);\n this.sessionKey = params.sessionKey;\n this.sessionKeyData = {\n ...params.sessionKeyData,\n paymaster: params.sessionKeyData.paymaster ?? zeroAddress,\n };\n this.merkleTree = this.getMerkleTree();\n this.selector =\n params.selector ??\n getFunctionSelector(\"execute(address, uint256, bytes, uint8)\");\n this.executor = params.executor ?? zeroAddress;\n this.mode = params.mode ?? ValidatorMode.plugin;\n }\n\n public static async init(\n params: SessionKeyValidatorParams\n ): Promise<SessionKeyValidator> {\n const chainId = await getChainId(params.projectId);\n if (!chainId) {\n throw new Error(\"ChainId not found\");\n }\n const chain = getChain(chainId);\n const instance = new SessionKeyValidator({ ...params, chain });\n return instance;\n }\n\n shouldDelegateViaFallback(): boolean {\n return this.merkleTree.getHexRoot() === pad(\"0x00\", { size: 32 });\n }\n\n findMatchingPermission(callData: Hex): Permission | undefined {\n try {\n const { functionName, args } = decodeFunctionData({\n abi: KernelAccountAbi,\n data: callData,\n });\n\n if (functionName !== \"execute\") return undefined;\n\n const permissionsList = this.sessionKeyData.permissions;\n if (!permissionsList || !permissionsList.length) return undefined;\n\n const targetToMatch = args[0].toLowerCase();\n\n // Filter permissions by target\n let targetPermissions = permissionsList.filter(\n (permission) => permission.target.toLowerCase() === targetToMatch\n );\n\n // If no permissions match the exact target, check for generic permissions (using zero address)\n if (!targetPermissions.length) {\n targetPermissions = permissionsList.filter(\n (permission) =>\n permission.target.toLowerCase() === zeroAddress.toLowerCase()\n );\n }\n\n if (!targetPermissions.length) return undefined;\n\n const operationPermissions = this.filterByOperation(\n targetPermissions,\n args[3]\n );\n\n if (!operationPermissions.length) return undefined;\n\n const signaturePermissions = this.filterBySignature(\n operationPermissions,\n args[2].slice(0, 10).toLowerCase()\n );\n\n const valueLimitPermissions = signaturePermissions.filter(\n (permission) => permission.valueLimit >= args[1]\n );\n\n if (!valueLimitPermissions.length) return undefined;\n\n const sortedPermissions = valueLimitPermissions.sort(\n (a, b) => {\n if (b.valueLimit > a.valueLimit) {\n return 1\n } else if (b.valueLimit < a.valueLimit) {\n return -1\n } else {\n return 0\n }\n }\n );\n\n return this.findPermissionByRule(sortedPermissions, args[2]);\n } catch (error) {\n return undefined;\n }\n }\n\n private filterByOperation(\n permissions: Permission[],\n operation: Operation\n ): Permission[] {\n return permissions.filter(\n (permission) => permission.operation === operation\n );\n }\n\n private filterBySignature(\n permissions: Permission[],\n signature: string\n ): Permission[] {\n return permissions.filter(\n (permission) => permission.sig.toLowerCase() === signature\n );\n }\n\n private findPermissionByRule(\n permissions: Permission[],\n data: string\n ): Permission | undefined {\n return permissions.find((permission) => {\n for (const rule of permission.rules) {\n const dataParam: Hex = this.getFormattedHex(\n \"0x\" + data.slice(10 + rule.offset * 2, 10 + rule.offset * 2 + 64)\n );\n const ruleParam: Hex = this.getFormattedHex(rule.param);\n\n if (!this.evaluateRuleCondition(dataParam, ruleParam, rule.condition)) {\n return false;\n }\n }\n return true;\n });\n }\n\n private getFormattedHex(value: string): Hex {\n return pad(isHex(value) ? value : toHex(value), {\n size: 32,\n }).toLowerCase() as Hex;\n }\n\n private evaluateRuleCondition(\n dataParam: Hex,\n ruleParam: Hex,\n condition: ParamCondition\n ): boolean {\n switch (condition) {\n case ParamCondition.EQUAL:\n return dataParam === ruleParam;\n case ParamCondition.GREATER_THAN:\n return dataParam > ruleParam;\n case ParamCondition.LESS_THAN:\n return dataParam < ruleParam;\n case ParamCondition.GREATER_THAN_OR_EQUAL:\n return dataParam >= ruleParam;\n case ParamCondition.LESS_THAN_OR_EQUAL:\n return dataParam <= ruleParam;\n case ParamCondition.NOT_EQUAL:\n return dataParam !== ruleParam;\n default:\n return false;\n }\n }\n\n getMerkleTree(): MerkleTree {\n const permissionPacked = this.sessionKeyData.permissions?.map(\n (permission) => this.encodePermissionData(permission)\n );\n\n // Having one leaf returns empty array in getProof(). To hack it we push the leaf twice\n // issue - https://github.com/merkletreejs/merkletreejs/issues/58\n if (permissionPacked?.length === 1)\n permissionPacked.push(permissionPacked[0]);\n\n return permissionPacked && permissionPacked.length !== 0\n ? new MerkleTree(permissionPacked, keccak256, {\n sortPairs: true,\n hashLeaves: true,\n })\n : new MerkleTree([pad(\"0x00\", { size: 32 })], keccak256, {\n hashLeaves: false,\n });\n }\n\n encodePermissionData(permission: Permission, merkleProof?: string[]): Hex {\n let permissionParam = {\n components: [\n {\n name: \"target\",\n type: \"address\",\n },\n {\n name: \"valueLimit\",\n type: \"uint256\",\n },\n {\n name: \"sig\",\n type: \"bytes4\",\n },\n {\n components: [\n {\n name: \"offset\",\n type: \"uint256\",\n },\n {\n internalType: \"enum ParamCondition\",\n name: \"condition\",\n type: \"uint8\",\n },\n {\n name: \"param\",\n type: \"bytes32\",\n },\n ],\n name: \"rules\",\n type: \"tuple[]\",\n },\n {\n internalType: \"enum Operation\",\n name: \"operation\",\n type: \"uint8\",\n },\n ],\n name: \"permission\",\n type: \"tuple\",\n };\n let params;\n let values;\n if (merkleProof) {\n params = [\n permissionParam,\n {\n name: \"merkleProof\",\n type: \"bytes32[]\",\n },\n ];\n values = [permission, merkleProof];\n } else {\n params = [permissionParam];\n values = [permission];\n }\n return encodeAbiParameters(params, values);\n }\n\n getSessionData(): SessionKeyParams {\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 validUntil: this.validUntil,\n validAfter: this.validAfter,\n sessionKeyData: this.sessionKeyData,\n enableSignature: this.enableSignature,\n };\n }\n\n async signer(): Promise<SmartAccountSigner> {\n return await Promise.resolve(this.sessionKey);\n }\n\n async getEnableData(): Promise<Hex> {\n if (!this.merkleTree) {\n throw Error(\"SessionKeyValidator: MerkleTree not generated\");\n }\n return concat([\n await this.sessionKey.getAddress(),\n pad(this.merkleTree.getHexRoot() as Hex, { size: 32 }),\n pad(toHex(this.sessionKeyData.validAfter), { size: 6 }),\n pad(toHex(this.sessionKeyData.validUntil), { size: 6 }),\n this.sessionKeyData.paymaster!,\n ]);\n }\n\n async isPluginEnabled(\n kernelAccountAddress: Address,\n selector: Hex\n ): Promise<boolean> {\n if (!this.publicClient) {\n throw new Error(\"Validator uninitialized: PublicClient missing\");\n }\n const execDetail = await this.publicClient.readContract({\n abi: KernelAccountAbi,\n address: kernelAccountAddress,\n functionName: \"getExecution\",\n args: [selector],\n });\n const enableData = await this.publicClient.readContract({\n abi: SessionKeyValidatorAbi,\n address: this.validatorAddress,\n functionName: \"sessionData\",\n args: [await this.sessionKey.getAddress(), kernelAccountAddress],\n });\n const enableDataHex = concatHex([\n await this.sessionKey.getAddress(),\n pad(enableData[0], { size: 4 }),\n pad(toHex(enableData[1]), { size: 6 }),\n pad(toHex(enableData[2]), { size: 6 }),\n enableData[3],\n ]);\n return (\n execDetail.validator.toLowerCase() ===\n this.validatorAddress.toLowerCase() &&\n enableData[4] &&\n enableDataHex.toLowerCase() === (await this.getEnableData()).toLowerCase()\n );\n }\n\n async getDummyUserOpSignature(callData: Hex): Promise<Hex> {\n const matchingPermission = this.findMatchingPermission(callData);\n if (!matchingPermission && !this.shouldDelegateViaFallback()) {\n throw Error(\n \"SessionKeyValidator: No matching permission found for the userOp\"\n );\n }\n const encodedPermissionData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission)\n : \"0x\";\n const merkleProof = this.merkleTree.getHexProof(\n keccak256(encodedPermissionData)\n );\n const encodedData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission, merkleProof)\n : \"0x\";\n return concatHex([\n await this.sessionKey.getAddress(),\n DUMMY_ECDSA_SIG,\n encodedData,\n ]);\n }\n\n encodeEnable(sessionKeyEnableData: Hex): Hex {\n return encodeFunctionData({\n abi: SessionKeyValidatorAbi,\n functionName: \"enable\",\n args: [sessionKeyEnableData],\n });\n }\n\n encodeDisable(sessionKey: Hex): Hex {\n return encodeFunctionData({\n abi: SessionKeyValidatorAbi,\n functionName: \"disable\",\n args: [sessionKey],\n });\n }\n\n async signMessage(message: string | Uint8Array): Promise<Hex> {\n return await this.sessionKey.signMessage(message);\n }\n\n async signTypedData(params: SignTypedDataParams): Promise<Hex> {\n return fixSignedData(await this.sessionKey.signTypedData(params));\n }\n\n async signUserOp(userOp: UserOperationRequest): Promise<Hex> {\n if (!this.chain) {\n throw new Error(\"Validator uninitialized\");\n }\n const hash = getUserOperationHash(\n {\n ...userOp,\n signature: \"0x\",\n },\n this.entryPointAddress,\n BigInt(this.chain.id)\n );\n const formattedMessage = typeof hash === \"string\" ? toBytes(hash) : hash;\n\n const matchingPermission = this.findMatchingPermission(userOp.callData);\n if (!matchingPermission && !this.shouldDelegateViaFallback()) {\n throw Error(\n \"SessionKeyValidator: No matching permission found for the userOp\"\n );\n }\n const encodedPermissionData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission)\n : \"0x\";\n const merkleProof = this.merkleTree.getHexProof(\n keccak256(encodedPermissionData)\n );\n const encodedData =\n this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission, merkleProof)\n : \"0x\";\n const signature = concat([\n await this.sessionKey.getAddress(),\n await this.sessionKey.signMessage(formattedMessage),\n encodedData,\n ]);\n return signature;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-key-validator.d.ts","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/session-key-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,GAAG,EACR,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAEzB,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EAEnB,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACzB,MAAM,WAAW,CAAC;AAkBnB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-key-validator.d.ts","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/session-key-validator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -35,6 +35,13 @@ import type { Operation } from "../provider.js";
|
|
|
35
35
|
import { getChainId } from "../api/index.js";
|
|
36
36
|
import { fixSignedData } from "../utils.js";
|
|
37
37
|
|
|
38
|
+
// We need to be able to serialize bigint to transmit session key over
|
|
39
|
+
// the network.
|
|
40
|
+
// Using this trick: https://github.com/GoogleChromeLabs/jsbi/issues/30#issuecomment-1006086291
|
|
41
|
+
(BigInt.prototype as any).toJSON = function () {
|
|
42
|
+
return this.toString();
|
|
43
|
+
}
|
|
44
|
+
|
|
38
45
|
export interface SessionKeyValidatorParams extends KernelBaseValidatorParams {
|
|
39
46
|
sessionKey: SmartAccountSigner;
|
|
40
47
|
sessionKeyData: SessionKeyData;
|
|
@@ -67,7 +74,7 @@ export interface ParamRules {
|
|
|
67
74
|
|
|
68
75
|
export interface Permission {
|
|
69
76
|
target: Address;
|
|
70
|
-
valueLimit:
|
|
77
|
+
valueLimit: bigint;
|
|
71
78
|
sig: Hex;
|
|
72
79
|
rules: ParamRules[];
|
|
73
80
|
operation: Operation;
|
|
@@ -164,7 +171,15 @@ export class SessionKeyValidator extends KernelBaseValidator {
|
|
|
164
171
|
if (!valueLimitPermissions.length) return undefined;
|
|
165
172
|
|
|
166
173
|
const sortedPermissions = valueLimitPermissions.sort(
|
|
167
|
-
(a, b) =>
|
|
174
|
+
(a, b) => {
|
|
175
|
+
if (b.valueLimit > a.valueLimit) {
|
|
176
|
+
return 1
|
|
177
|
+
} else if (b.valueLimit < a.valueLimit) {
|
|
178
|
+
return -1
|
|
179
|
+
} else {
|
|
180
|
+
return 0
|
|
181
|
+
}
|
|
182
|
+
}
|
|
168
183
|
);
|
|
169
184
|
|
|
170
185
|
return this.findPermissionByRule(sortedPermissions, args[2]);
|
|
@@ -251,12 +266,12 @@ export class SessionKeyValidator extends KernelBaseValidator {
|
|
|
251
266
|
|
|
252
267
|
return permissionPacked && permissionPacked.length !== 0
|
|
253
268
|
? new MerkleTree(permissionPacked, keccak256, {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
269
|
+
sortPairs: true,
|
|
270
|
+
hashLeaves: true,
|
|
271
|
+
})
|
|
257
272
|
: new MerkleTree([pad("0x00", { size: 32 })], keccak256, {
|
|
258
|
-
|
|
259
|
-
|
|
273
|
+
hashLeaves: false,
|
|
274
|
+
});
|
|
260
275
|
}
|
|
261
276
|
|
|
262
277
|
encodePermissionData(permission: Permission, merkleProof?: string[]): Hex {
|
|
@@ -379,7 +394,7 @@ export class SessionKeyValidator extends KernelBaseValidator {
|
|
|
379
394
|
]);
|
|
380
395
|
return (
|
|
381
396
|
execDetail.validator.toLowerCase() ===
|
|
382
|
-
|
|
397
|
+
this.validatorAddress.toLowerCase() &&
|
|
383
398
|
enableData[4] &&
|
|
384
399
|
enableDataHex.toLowerCase() === (await this.getEnableData()).toLowerCase()
|
|
385
400
|
);
|
|
@@ -394,8 +409,8 @@ export class SessionKeyValidator extends KernelBaseValidator {
|
|
|
394
409
|
}
|
|
395
410
|
const encodedPermissionData =
|
|
396
411
|
this.sessionKeyData.permissions &&
|
|
397
|
-
|
|
398
|
-
|
|
412
|
+
this.sessionKeyData.permissions.length !== 0 &&
|
|
413
|
+
matchingPermission
|
|
399
414
|
? this.encodePermissionData(matchingPermission)
|
|
400
415
|
: "0x";
|
|
401
416
|
const merkleProof = this.merkleTree.getHexProof(
|
|
@@ -403,8 +418,8 @@ export class SessionKeyValidator extends KernelBaseValidator {
|
|
|
403
418
|
);
|
|
404
419
|
const encodedData =
|
|
405
420
|
this.sessionKeyData.permissions &&
|
|
406
|
-
|
|
407
|
-
|
|
421
|
+
this.sessionKeyData.permissions.length !== 0 &&
|
|
422
|
+
matchingPermission
|
|
408
423
|
? this.encodePermissionData(matchingPermission, merkleProof)
|
|
409
424
|
: "0x";
|
|
410
425
|
return concatHex([
|
|
@@ -460,8 +475,8 @@ export class SessionKeyValidator extends KernelBaseValidator {
|
|
|
460
475
|
}
|
|
461
476
|
const encodedPermissionData =
|
|
462
477
|
this.sessionKeyData.permissions &&
|
|
463
|
-
|
|
464
|
-
|
|
478
|
+
this.sessionKeyData.permissions.length !== 0 &&
|
|
479
|
+
matchingPermission
|
|
465
480
|
? this.encodePermissionData(matchingPermission)
|
|
466
481
|
: "0x";
|
|
467
482
|
const merkleProof = this.merkleTree.getHexProof(
|
|
@@ -469,8 +484,8 @@ export class SessionKeyValidator extends KernelBaseValidator {
|
|
|
469
484
|
);
|
|
470
485
|
const encodedData =
|
|
471
486
|
this.sessionKeyData.permissions &&
|
|
472
|
-
|
|
473
|
-
|
|
487
|
+
this.sessionKeyData.permissions.length !== 0 &&
|
|
488
|
+
matchingPermission
|
|
474
489
|
? this.encodePermissionData(matchingPermission, merkleProof)
|
|
475
490
|
: "0x";
|
|
476
491
|
const signature = concat([
|