@zerodev/sdk 4.2.3 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/cjs/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts +58 -4
  2. package/dist/cjs/kernel-zerodev/abis/SessionKeyValidatorAbi.js +75 -4
  3. package/dist/cjs/kernel-zerodev/abis/SessionKeyValidatorAbi.js.map +1 -1
  4. package/dist/cjs/kernel-zerodev/constants.d.ts +1 -1
  5. package/dist/cjs/kernel-zerodev/constants.js +1 -1
  6. package/dist/cjs/kernel-zerodev/constants.js.map +1 -1
  7. package/dist/cjs/kernel-zerodev/validator/base.d.ts +1 -1
  8. package/dist/cjs/kernel-zerodev/validator/base.js +3 -3
  9. package/dist/cjs/kernel-zerodev/validator/base.js.map +1 -1
  10. package/dist/cjs/kernel-zerodev/validator/session-key-validator.d.ts +18 -7
  11. package/dist/cjs/kernel-zerodev/validator/session-key-validator.js +117 -63
  12. package/dist/cjs/kernel-zerodev/validator/session-key-validator.js.map +1 -1
  13. package/dist/cjs/kernel-zerodev/validator/types.d.ts +1 -1
  14. package/dist/cjs/kernel-zerodev/validator/types.js.map +1 -1
  15. package/dist/cjs/kernel-zerodev/validator-provider/base.js +9 -0
  16. package/dist/cjs/kernel-zerodev/validator-provider/base.js.map +1 -1
  17. package/dist/esm/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts +58 -4
  18. package/dist/esm/kernel-zerodev/abis/SessionKeyValidatorAbi.js +75 -4
  19. package/dist/esm/kernel-zerodev/abis/SessionKeyValidatorAbi.js.map +1 -1
  20. package/dist/esm/kernel-zerodev/constants.d.ts +1 -1
  21. package/dist/esm/kernel-zerodev/constants.js +1 -1
  22. package/dist/esm/kernel-zerodev/constants.js.map +1 -1
  23. package/dist/esm/kernel-zerodev/validator/base.d.ts +1 -1
  24. package/dist/esm/kernel-zerodev/validator/base.js +3 -3
  25. package/dist/esm/kernel-zerodev/validator/base.js.map +1 -1
  26. package/dist/esm/kernel-zerodev/validator/session-key-validator.d.ts +18 -7
  27. package/dist/esm/kernel-zerodev/validator/session-key-validator.js +118 -64
  28. package/dist/esm/kernel-zerodev/validator/session-key-validator.js.map +1 -1
  29. package/dist/esm/kernel-zerodev/validator/types.d.ts +1 -1
  30. package/dist/esm/kernel-zerodev/validator/types.js.map +1 -1
  31. package/dist/esm/kernel-zerodev/validator-provider/base.js +9 -0
  32. package/dist/esm/kernel-zerodev/validator-provider/base.js.map +1 -1
  33. package/dist/types/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts +58 -4
  34. package/dist/types/kernel-zerodev/abis/SessionKeyValidatorAbi.d.ts.map +1 -1
  35. package/dist/types/kernel-zerodev/constants.d.ts +1 -1
  36. package/dist/types/kernel-zerodev/validator/base.d.ts +1 -1
  37. package/dist/types/kernel-zerodev/validator/base.d.ts.map +1 -1
  38. package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts +18 -7
  39. package/dist/types/kernel-zerodev/validator/session-key-validator.d.ts.map +1 -1
  40. package/dist/types/kernel-zerodev/validator/types.d.ts +1 -1
  41. package/dist/types/kernel-zerodev/validator/types.d.ts.map +1 -1
  42. package/dist/types/kernel-zerodev/validator-provider/base.d.ts.map +1 -1
  43. package/package.json +5 -4
  44. package/src/kernel-zerodev/__tests__/config/index.ts +18 -0
  45. package/src/kernel-zerodev/abis/SessionKeyValidatorAbi.ts +75 -4
  46. package/src/kernel-zerodev/constants.ts +1 -1
  47. package/src/kernel-zerodev/validator/base.ts +4 -4
  48. package/src/kernel-zerodev/validator/session-key-validator.ts +159 -88
  49. package/src/kernel-zerodev/validator/types.ts +1 -1
  50. package/src/kernel-zerodev/validator-provider/base.ts +13 -0
@@ -1,12 +1,11 @@
1
1
  import { getUserOperationHash, getChain, } from "@alchemy/aa-core";
2
2
  import { KernelBaseValidator, ValidatorMode, } from "./base.js";
3
- import { encodeFunctionData, toBytes, concat, pad, toHex, keccak256, encodeAbiParameters, concatHex, zeroAddress, decodeFunctionData, isHex, getFunctionSelector, } from "viem";
3
+ import { encodeFunctionData, toBytes, concat, pad, toHex, encodeAbiParameters, concatHex, zeroAddress, decodeFunctionData, isHex, getFunctionSelector, keccak256, } from "viem";
4
4
  import { formatAbiItem } from "viem/utils";
5
5
  import { SessionKeyValidatorAbi } from "../abis/SessionKeyValidatorAbi.js";
6
6
  import { DUMMY_ECDSA_SIG } from "../constants.js";
7
7
  import { KernelAccountAbi } from "../abis/KernelAccountAbi.js";
8
8
  import { MerkleTree } from "merkletreejs";
9
- import { Operation } from "../provider.js";
10
9
  import { getChainId } from "../api/index.js";
11
10
  import { fixSignedData } from "../utils.js";
12
11
  import {} from "abitype";
@@ -54,7 +53,7 @@ export function getAbiItem({ abi, args = [], name, }) {
54
53
  .map((item) => formatAbiItem(item))
55
54
  .reduce((a, c) => `${a}\n${c}`)}`);
56
55
  }
57
- export function getPermissionFromABI({ abi, target, args, functionName, operation, valueLimit, }) {
56
+ export function getPermissionFromABI({ abi, target, args, functionName, valueLimit, }) {
58
57
  const abiItem = getAbiItem({
59
58
  abi,
60
59
  args,
@@ -80,7 +79,6 @@ export function getPermissionFromABI({ abi, target, args, functionName, operatio
80
79
  sig: functionSelector,
81
80
  rules: paramRules,
82
81
  target,
83
- operation: operation ?? Operation.Call,
84
82
  valueLimit: valueLimit ?? 0n,
85
83
  };
86
84
  }
@@ -112,17 +110,19 @@ export class SessionKeyValidator extends KernelBaseValidator {
112
110
  validUntil: params.sessionKeyData.validUntil ?? 0,
113
111
  paymaster: params.sessionKeyData.paymaster ?? zeroAddress,
114
112
  };
115
- this.sessionKeyData.permissions = this.sessionKeyData.permissions?.map((perm) => ({
113
+ this.sessionKeyData.permissions = this.sessionKeyData.permissions?.map((perm, index) => ({
116
114
  ...perm,
117
- operation: perm.operation ?? Operation.Call,
118
115
  valueLimit: perm.valueLimit ?? 0n,
119
116
  sig: perm.sig ?? pad("0x", { size: 4 }),
120
117
  rules: perm.rules ?? [],
118
+ index,
119
+ executionRule: perm.executionRule ?? {
120
+ validAfter: 0,
121
+ interval: 0,
122
+ runs: 0,
123
+ },
121
124
  }));
122
125
  this.merkleTree = this.getMerkleTree();
123
- if (this.shouldDelegateViaFallback()) {
124
- throw Error("Session key permissions not set");
125
- }
126
126
  this.selector =
127
127
  params.selector ??
128
128
  getFunctionSelector("execute(address, uint256, bytes, uint8)");
@@ -141,29 +141,53 @@ export class SessionKeyValidator extends KernelBaseValidator {
141
141
  shouldDelegateViaFallback() {
142
142
  return this.merkleTree.getHexRoot() === pad("0x00", { size: 32 });
143
143
  }
144
- findMatchingPermission(callData) {
144
+ findMatchingPermissions(callData) {
145
145
  try {
146
146
  const { functionName, args } = decodeFunctionData({
147
147
  abi: KernelAccountAbi,
148
148
  data: callData,
149
149
  });
150
- if (functionName !== "execute")
150
+ if (functionName !== "execute" && functionName !== "executeBatch")
151
151
  return undefined;
152
+ if (functionName === "execute") {
153
+ const [to, value, data] = args;
154
+ return this.filterPermissions([to], [data], [value])?.[0];
155
+ }
156
+ else if (functionName === "executeBatch") {
157
+ let targets = [], values = [], dataArray = [];
158
+ args[0].forEach((arg) => {
159
+ targets.push(arg.to);
160
+ values.push(arg.value);
161
+ dataArray.push(arg.data);
162
+ });
163
+ return this.filterPermissions(targets, dataArray, values);
164
+ }
165
+ else {
166
+ throw Error("Invalid function");
167
+ }
168
+ }
169
+ catch (error) {
170
+ return undefined;
171
+ }
172
+ }
173
+ filterPermissions(targets, dataArray, values) {
174
+ if (targets.length !== dataArray.length ||
175
+ targets.length !== values.length) {
176
+ throw Error("Invalid arguments");
177
+ }
178
+ const filteredPermissions = targets.map((target, index) => {
152
179
  const permissionsList = this.sessionKeyData.permissions;
153
180
  if (!permissionsList || !permissionsList.length)
154
181
  return undefined;
155
- const targetToMatch = args[0].toLowerCase();
182
+ const targetToMatch = target.toLowerCase();
156
183
  let targetPermissions = permissionsList.filter((permission) => permission.target.toLowerCase() === targetToMatch);
157
184
  if (!targetPermissions.length) {
158
185
  targetPermissions = permissionsList.filter((permission) => permission.target.toLowerCase() === zeroAddress.toLowerCase());
159
186
  }
160
187
  if (!targetPermissions.length)
161
188
  return undefined;
162
- const operationPermissions = this.filterByOperation(targetPermissions, args[3]);
163
- if (!operationPermissions.length)
164
- return undefined;
165
- const signaturePermissions = this.filterBySignature(operationPermissions, args[2].slice(0, 10).toLowerCase());
166
- const valueLimitPermissions = signaturePermissions.filter((permission) => (permission.valueLimit ?? 0n) >= args[1]);
189
+ const signaturePermissions = this.filterBySignature(targetPermissions, dataArray[index].slice(0, 10).toLowerCase());
190
+ const valueLimitPermissions = signaturePermissions.filter((permission) => (permission.valueLimit ?? 0n) >= values[index]);
167
191
  if (!valueLimitPermissions.length)
168
192
  return undefined;
169
193
  const sortedPermissions = valueLimitPermissions.sort((a, b) => {
@@ -177,14 +201,11 @@ export class SessionKeyValidator extends KernelBaseValidator {
177
201
  return 0;
178
202
  }
179
203
  });
180
- return this.findPermissionByRule(sortedPermissions, args[2]);
181
- }
182
- catch (error) {
183
- return undefined;
184
- }
185
- }
186
- filterByOperation(permissions, operation) {
187
- return permissions.filter((permission) => permission.operation === operation || Operation.Call === operation);
204
+ return this.findPermissionByRule(sortedPermissions, dataArray[index]);
205
+ });
206
+ return filteredPermissions.every((permission) => permission !== undefined)
207
+ ? filteredPermissions
208
+ : undefined;
188
209
  }
189
210
  filterBySignature(permissions, signature) {
190
211
  return permissions.filter((permission) => (permission.sig ?? pad("0x", { size: 4 })).toLowerCase() === signature);
@@ -226,32 +247,38 @@ export class SessionKeyValidator extends KernelBaseValidator {
226
247
  }
227
248
  getMerkleTree() {
228
249
  const permissionPacked = this.sessionKeyData.permissions?.map((permission) => this.encodePermissionData(permission));
229
- if (permissionPacked?.length === 1)
250
+ if (permissionPacked && permissionPacked.length === 1)
230
251
  permissionPacked.push(permissionPacked[0]);
231
252
  return permissionPacked && permissionPacked.length !== 0
232
253
  ? new MerkleTree(permissionPacked, keccak256, {
233
- sortPairs: true,
234
254
  hashLeaves: true,
255
+ complete: true,
256
+ sort: true,
235
257
  })
236
258
  : new MerkleTree([pad("0x00", { size: 32 })], keccak256, {
237
259
  hashLeaves: false,
260
+ complete: true,
238
261
  });
239
262
  }
240
263
  encodePermissionData(permission, merkleProof) {
241
264
  let permissionParam = {
242
265
  components: [
243
266
  {
244
- name: "target",
245
- type: "address",
267
+ name: "index",
268
+ type: "uint32",
246
269
  },
247
270
  {
248
- name: "valueLimit",
249
- type: "uint256",
271
+ name: "target",
272
+ type: "address",
250
273
  },
251
274
  {
252
275
  name: "sig",
253
276
  type: "bytes4",
254
277
  },
278
+ {
279
+ name: "valueLimit",
280
+ type: "uint256",
281
+ },
255
282
  {
256
283
  components: [
257
284
  {
@@ -272,13 +299,27 @@ export class SessionKeyValidator extends KernelBaseValidator {
272
299
  type: "tuple[]",
273
300
  },
274
301
  {
275
- internalType: "enum Operation",
276
- name: "operation",
277
- type: "uint8",
302
+ components: [
303
+ {
304
+ name: "interval",
305
+ type: "uint48",
306
+ },
307
+ {
308
+ name: "runs",
309
+ type: "uint48",
310
+ },
311
+ {
312
+ internalType: "ValidAfter",
313
+ name: "validAfter",
314
+ type: "uint48",
315
+ },
316
+ ],
317
+ name: "executionRule",
318
+ type: "tuple",
278
319
  },
279
320
  ],
280
321
  name: "permission",
281
- type: "tuple",
322
+ type: Array.isArray(permission) ? "tuple[]" : "tuple",
282
323
  };
283
324
  let params;
284
325
  let values;
@@ -287,7 +328,7 @@ export class SessionKeyValidator extends KernelBaseValidator {
287
328
  permissionParam,
288
329
  {
289
330
  name: "merkleProof",
290
- type: "bytes32[]",
331
+ type: Array.isArray(merkleProof[0]) ? "bytes32[][]" : "bytes32[]",
291
332
  },
292
333
  ];
293
334
  values = [permission, merkleProof];
@@ -314,16 +355,34 @@ export class SessionKeyValidator extends KernelBaseValidator {
314
355
  async signer() {
315
356
  return await Promise.resolve(this.sessionKey);
316
357
  }
317
- async getEnableData() {
358
+ async getSessionNonces(kernelAccountAddress) {
359
+ if (!this.publicClient) {
360
+ throw new Error("Validator uninitialized: PublicClient missing");
361
+ }
362
+ const nonce = await this.publicClient.readContract({
363
+ abi: SessionKeyValidatorAbi,
364
+ address: this.validatorAddress,
365
+ functionName: "nonces",
366
+ args: [kernelAccountAddress],
367
+ });
368
+ return { lastNonce: nonce[0], invalidNonce: nonce[1] };
369
+ }
370
+ async getEnableData(kernelAccountAddress, enabledLastNonce) {
318
371
  if (!this.merkleTree) {
319
372
  throw Error("SessionKeyValidator: MerkleTree not generated");
320
373
  }
374
+ if (!kernelAccountAddress) {
375
+ throw Error("SessionKeyValidator: Kernel account address not provided");
376
+ }
377
+ const lastNonce = enabledLastNonce ??
378
+ (await this.getSessionNonces(kernelAccountAddress)).lastNonce + 1n;
321
379
  return concat([
322
380
  await this.sessionKey.getAddress(),
323
381
  pad(this.merkleTree.getHexRoot(), { size: 32 }),
324
382
  pad(toHex(this.sessionKeyData.validAfter), { size: 6 }),
325
383
  pad(toHex(this.sessionKeyData.validUntil), { size: 6 }),
326
384
  this.sessionKeyData.paymaster,
385
+ pad(toHex(lastNonce), { size: 32 }),
327
386
  ]);
328
387
  }
329
388
  async isPluginEnabled(kernelAccountAddress, selector) {
@@ -344,18 +403,26 @@ export class SessionKeyValidator extends KernelBaseValidator {
344
403
  });
345
404
  const enableDataHex = concatHex([
346
405
  await this.sessionKey.getAddress(),
347
- pad(enableData[0], { size: 4 }),
406
+ pad(enableData[0], { size: 32 }),
348
407
  pad(toHex(enableData[1]), { size: 6 }),
349
408
  pad(toHex(enableData[2]), { size: 6 }),
350
409
  enableData[3],
410
+ pad(toHex(enableData[4]), { size: 32 }),
351
411
  ]);
352
412
  return (execDetail.validator.toLowerCase() ===
353
413
  this.validatorAddress.toLowerCase() &&
354
- enableData[4] &&
355
- enableDataHex.toLowerCase() === (await this.getEnableData()).toLowerCase());
414
+ enableDataHex.toLowerCase() ===
415
+ (await this.getEnableData(kernelAccountAddress, enableData[4])).toLowerCase());
356
416
  }
357
417
  async getDummyUserOpSignature(callData) {
358
- const matchingPermission = this.findMatchingPermission(callData);
418
+ return concatHex([
419
+ await this.sessionKey.getAddress(),
420
+ DUMMY_ECDSA_SIG,
421
+ this.getEncodedPermissionProofData(callData),
422
+ ]);
423
+ }
424
+ getEncodedPermissionProofData(callData) {
425
+ const matchingPermission = this.findMatchingPermissions(callData);
359
426
  if (!matchingPermission && !this.shouldDelegateViaFallback()) {
360
427
  throw Error("SessionKeyValidator: No matching permission found for the userOp");
361
428
  }
@@ -364,17 +431,19 @@ export class SessionKeyValidator extends KernelBaseValidator {
364
431
  matchingPermission
365
432
  ? this.encodePermissionData(matchingPermission)
366
433
  : "0x";
367
- const merkleProof = this.merkleTree.getHexProof(keccak256(encodedPermissionData));
368
- const encodedData = this.sessionKeyData.permissions &&
434
+ let merkleProof = [];
435
+ if (Array.isArray(matchingPermission)) {
436
+ let encodedPerms = matchingPermission.map((permission) => keccak256(this.encodePermissionData(permission)));
437
+ merkleProof = encodedPerms.map((perm) => this.merkleTree.getHexProof(perm));
438
+ }
439
+ else if (matchingPermission) {
440
+ merkleProof = this.merkleTree.getHexProof(keccak256(encodedPermissionData));
441
+ }
442
+ return this.sessionKeyData.permissions &&
369
443
  this.sessionKeyData.permissions.length !== 0 &&
370
444
  matchingPermission
371
445
  ? this.encodePermissionData(matchingPermission, merkleProof)
372
446
  : "0x";
373
- return concatHex([
374
- await this.sessionKey.getAddress(),
375
- DUMMY_ECDSA_SIG,
376
- encodedData,
377
- ]);
378
447
  }
379
448
  encodeEnable(sessionKeyEnableData) {
380
449
  return encodeFunctionData({
@@ -405,25 +474,10 @@ export class SessionKeyValidator extends KernelBaseValidator {
405
474
  signature: "0x",
406
475
  }, this.entryPointAddress, BigInt(this.chain.id));
407
476
  const formattedMessage = typeof hash === "string" ? toBytes(hash) : hash;
408
- const matchingPermission = this.findMatchingPermission(userOp.callData);
409
- if (!matchingPermission && !this.shouldDelegateViaFallback()) {
410
- throw Error("SessionKeyValidator: No matching permission found for the userOp");
411
- }
412
- const encodedPermissionData = this.sessionKeyData.permissions &&
413
- this.sessionKeyData.permissions.length !== 0 &&
414
- matchingPermission
415
- ? this.encodePermissionData(matchingPermission)
416
- : "0x";
417
- const merkleProof = this.merkleTree.getHexProof(keccak256(encodedPermissionData));
418
- const encodedData = this.sessionKeyData.permissions &&
419
- this.sessionKeyData.permissions.length !== 0 &&
420
- matchingPermission
421
- ? this.encodePermissionData(matchingPermission, merkleProof)
422
- : "0x";
423
477
  const signature = concat([
424
478
  await this.sessionKey.getAddress(),
425
479
  await this.sessionKey.signMessage(formattedMessage),
426
- encodedData,
480
+ this.getEncodedPermissionProofData(userOp.callData),
427
481
  ]);
428
482
  return signature;
429
483
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-key-validator.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/session-key-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EAKpB,QAAQ,GAGT,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,aAAa,GAGd,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,kBAAkB,EAClB,OAAO,EACP,MAAM,EACN,GAAG,EACH,KAAK,EACL,SAAS,EACT,mBAAmB,EACnB,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,KAAK,EACL,mBAAmB,GAEpB,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAoB,MAAM,SAAS,CAAC;AAS1C,MAAM,CAAC,SAAiB,CAAC,MAAM,GAAG;IACjC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;AACzB,CAAC,CAAC;AAiBF,MAAM,CAAN,IAAY,aAOX;AAPD,WAAY,aAAa;IACvB,mDAAS,CAAA;IACT,iEAAgB,CAAA;IAChB,2DAAa,CAAA;IACb,mFAAyB,CAAA;IACzB,6EAAsB,CAAA;IACtB,2DAAa,CAAA;AACf,CAAC,EAPW,aAAa,KAAb,aAAa,QAOxB;AAuBD,MAAM,UAAU,UAAU,CAGxB,EACA,GAAG,EACH,IAAI,GAAG,EAAE,EACT,IAAI,GACkC;IAItC,MAAM,QAAQ,GAAI,GAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC5E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAgB,CAAC;IACnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC,CAAC,CAAQ,CAAC;IACrD,MAAM,qBAAqB,GAAG,EAAE,CAAC;IACjC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC9B,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC;YAAE,SAAS;QACrC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAc,CAAC;YAC1E,SAAS;SACV;QACD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,SAAS;QAC9B,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAC1C,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;YAAE,SAAS;QACpD,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KACrC;IACD,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC,CAAC,CAAQ,CAAC;SAC7D,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC;QACzC,OAAO,qBAAqB,CAAC,CAAC,CAAQ,CAAC;;QAEvC,MAAM,KAAK,CACT,mFAAmF,qBAAqB;aACrG,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;aAClC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CACpC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,oBAAoB,CAGlC,EACA,GAAG,EACH,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,UAAU,GACgD;IAC1D,MAAM,OAAO,GAAG,UAAU,CAAC;QACzB,GAAG;QACH,IAAI;QACJ,IAAI,EAAE,YAAY;KACK,CAAC,CAAC;IAC3B,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE;QAC/B,MAAM,KAAK,CAAC,GAAG,YAAY,mBAAmB,CAAC,CAAC;KACjD;IACD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,UAAU,GAAiB,EAAE,CAAC;IAClC,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC/B,UAAU,GAAI,IAA4C;aACvD,GAAG,CACF,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CACT,GAAG,IAAI;YACL,KAAK,EAAE,GAAG,CACR,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;gBACd,CAAC,CAAC,GAAG,CAAC,KAAK;gBACX,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAoC,CAAC,EACnD,EAAE,IAAI,EAAE,EAAE,EAAE,CACb;YACD,MAAM,EAAE,CAAC,GAAG,EAAE;YACd,SAAS,EAAE,GAAG,CAAC,QAAQ;SACxB,CACJ;aACA,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAiB,CAAC;KAC3C;IACD,OAAO;QACL,GAAG,EAAE,gBAAgB;QACrB,KAAK,EAAE,UAAU;QACjB,MAAM;QACN,SAAS,EAAE,SAAS,IAAI,SAAS,CAAC,IAAI;QACtC,UAAU,EAAE,UAAU,IAAI,EAAE;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,mBAAoB,SAAQ,mBAAmB;IAK1D,YAAY,MAAiC;QAC3C,KAAK,CAAC,MAAM,CAAC,CAAC;QALN;;;;;WAA+B;QACzC;;;;;WAA+B;QAC/B;;;;;WAAuB;QAIrB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG;YACpB,GAAG,MAAM,CAAC,cAAc;YACxB,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,UAAU,IAAI,CAAC;YACjD,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,UAAU,IAAI,CAAC;YACjD,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,SAAS,IAAI,WAAW;SAC1D,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,GAAG,CACpE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACT,GAAG,IAAI;YACP,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI;YAC3C,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;YACjC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACvC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;SACxB,CAAC,CACH,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE;YACpC,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC;SAChD;QACD,IAAI,CAAC,QAAQ;YACX,MAAM,CAAC,QAAQ;gBACf,mBAAmB,CAAC,yCAAyC,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,WAAW,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,aAAa,CAAC,MAAM,CAAC;IAClD,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,IAAI,CACtB,MAAiC;QAEjC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;SACtC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,yBAAyB;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,sBAAsB,CAAC,QAAa;QAClC,IAAI;YACF,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC;gBAChD,GAAG,EAAE,gBAAgB;gBACrB,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;YAEH,IAAI,YAAY,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAEjD,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;YACxD,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAC;YAElE,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAG5C,IAAI,iBAAiB,GAAG,eAAe,CAAC,MAAM,CAC5C,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,aAAa,CAClE,CAAC;YAGF,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE;gBAC7B,iBAAiB,GAAG,eAAe,CAAC,MAAM,CACxC,CAAC,UAAU,EAAE,EAAE,CACb,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE,CAChE,CAAC;aACH;YAED,IAAI,CAAC,iBAAiB,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAC;YAEhD,MAAM,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,CACjD,iBAAiB,EACjB,IAAI,CAAC,CAAC,CAAC,CACR,CAAC;YAEF,IAAI,CAAC,oBAAoB,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAC;YAEnD,MAAM,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,CACjD,oBAAoB,EACpB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CACnC,CAAC;YAEF,MAAM,qBAAqB,GAAG,oBAAoB,CAAC,MAAM,CACvD,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CACzD,CAAC;YAEF,IAAI,CAAC,qBAAqB,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAC;YAEpD,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC5D,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;oBAC/C,OAAO,CAAC,CAAC;iBACV;qBAAM,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;oBACtD,OAAO,CAAC,CAAC,CAAC;iBACX;qBAAM;oBACL,OAAO,CAAC,CAAC;iBACV;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9D;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,SAAS,CAAC;SAClB;IACH,CAAC;IAEO,iBAAiB,CACvB,WAAyB,EACzB,SAAoB;QAEpB,OAAO,WAAW,CAAC,MAAM,CACvB,CAAC,UAAU,EAAE,EAAE,CACb,UAAU,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,CACrE,CAAC;IACJ,CAAC;IAEO,iBAAiB,CACvB,WAAyB,EACzB,SAAiB;QAEjB,OAAO,WAAW,CAAC,MAAM,CACvB,CAAC,UAAU,EAAE,EAAE,CACb,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,SAAS,CACzE,CAAC;IACJ,CAAC;IAEO,oBAAoB,CAC1B,WAAyB,EACzB,IAAY;QAEZ,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;YACrC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,IAAI,EAAE,EAAE;gBACzC,MAAM,SAAS,GAAQ,IAAI,CAAC,eAAe,CACzC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,CACnE,CAAC;gBACF,MAAM,SAAS,GAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAExD,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE;oBACrE,OAAO,KAAK,CAAC;iBACd;aACF;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe,CAAC,KAAa;QACnC,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YAC9C,IAAI,EAAE,EAAE;SACT,CAAC,CAAC,WAAW,EAAS,CAAC;IAC1B,CAAC;IAEO,qBAAqB,CAC3B,SAAc,EACd,SAAc,EACd,SAAwB;QAExB,QAAQ,SAAS,EAAE;YACjB,KAAK,aAAa,CAAC,KAAK;gBACtB,OAAO,SAAS,KAAK,SAAS,CAAC;YACjC,KAAK,aAAa,CAAC,YAAY;gBAC7B,OAAO,SAAS,GAAG,SAAS,CAAC;YAC/B,KAAK,aAAa,CAAC,SAAS;gBAC1B,OAAO,SAAS,GAAG,SAAS,CAAC;YAC/B,KAAK,aAAa,CAAC,qBAAqB;gBACtC,OAAO,SAAS,IAAI,SAAS,CAAC;YAChC,KAAK,aAAa,CAAC,kBAAkB;gBACnC,OAAO,SAAS,IAAI,SAAS,CAAC;YAChC,KAAK,aAAa,CAAC,SAAS;gBAC1B,OAAO,SAAS,KAAK,SAAS,CAAC;YACjC;gBACE,OAAO,KAAK,CAAC;SAChB;IACH,CAAC;IAED,aAAa;QACX,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,GAAG,CAC3D,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CACtD,CAAC;QAIF,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAC;YAChC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7C,OAAO,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;YACtD,CAAC,CAAC,IAAI,UAAU,CAAC,gBAAgB,EAAE,SAAS,EAAE;gBAC1C,SAAS,EAAE,IAAI;gBACf,UAAU,EAAE,IAAI;aACjB,CAAC;YACJ,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE;gBACrD,UAAU,EAAE,KAAK;aAClB,CAAC,CAAC;IACT,CAAC;IAED,oBAAoB,CAAC,UAAsB,EAAE,WAAsB;QACjE,IAAI,eAAe,GAAG;YACpB,UAAU,EAAE;gBACV;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,SAAS;iBAChB;gBACD;oBACE,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,SAAS;iBAChB;gBACD;oBACE,IAAI,EAAE,KAAK;oBACX,IAAI,EAAE,QAAQ;iBACf;gBACD;oBACE,UAAU,EAAE;wBACV;4BACE,IAAI,EAAE,QAAQ;4BACd,IAAI,EAAE,SAAS;yBAChB;wBACD;4BACE,YAAY,EAAE,qBAAqB;4BACnC,IAAI,EAAE,WAAW;4BACjB,IAAI,EAAE,OAAO;yBACd;wBACD;4BACE,IAAI,EAAE,OAAO;4BACb,IAAI,EAAE,SAAS;yBAChB;qBACF;oBACD,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,SAAS;iBAChB;gBACD;oBACE,YAAY,EAAE,gBAAgB;oBAC9B,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,OAAO;iBACd;aACF;YACD,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,OAAO;SACd,CAAC;QACF,IAAI,MAAM,CAAC;QACX,IAAI,MAAM,CAAC;QACX,IAAI,WAAW,EAAE;YACf,MAAM,GAAG;gBACP,eAAe;gBACf;oBACE,IAAI,EAAE,aAAa;oBACnB,IAAI,EAAE,WAAW;iBAClB;aACF,CAAC;YACF,MAAM,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;SACpC;aAAM;YACL,MAAM,GAAG,CAAC,eAAe,CAAC,CAAC;YAC3B,MAAM,GAAG,CAAC,UAAU,CAAC,CAAC;SACvB;QACD,OAAO,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YACpC,MAAM,KAAK,CAAC,4CAA4C,CAAC,CAAC;SAC3D;QACD,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,MAAM,KAAK,CAAC,+CAA+C,CAAC,CAAC;SAC9D;QACD,OAAO,MAAM,CAAC;YACZ,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;YAClC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAS,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YACtD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACvD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,cAAc,CAAC,SAAU;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,oBAA6B,EAC7B,QAAa;QAEb,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;SAClE;QACD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;YACtD,GAAG,EAAE,gBAAgB;YACrB,OAAO,EAAE,oBAAoB;YAC7B,YAAY,EAAE,cAAc;YAC5B,IAAI,EAAE,CAAC,QAAQ,CAAC;SACjB,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;YACtD,GAAG,EAAE,sBAAsB;YAC3B,OAAO,EAAE,IAAI,CAAC,gBAAgB;YAC9B,YAAY,EAAE,aAAa;YAC3B,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,oBAAoB,CAAC;SACjE,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,SAAS,CAAC;YAC9B,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;YAClC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACtC,UAAU,CAAC,CAAC,CAAC;SACd,CAAC,CAAC;QACH,OAAO,CACL,UAAU,CAAC,SAAS,CAAC,WAAW,EAAE;YAChC,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE;YACrC,UAAU,CAAC,CAAC,CAAC;YACb,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,WAAW,EAAE,CAC3E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,QAAa;QACzC,MAAM,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QACjE,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE;YAC5D,MAAM,KAAK,CACT,kEAAkE,CACnE,CAAC;SACH;QACD,MAAM,qBAAqB,GACzB,IAAI,CAAC,cAAc,CAAC,WAAW;YAC/B,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YAC5C,kBAAkB;YAChB,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC;YAC/C,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAC7C,SAAS,CAAC,qBAAqB,CAAC,CACjC,CAAC;QACF,MAAM,WAAW,GACf,IAAI,CAAC,cAAc,CAAC,WAAW;YAC/B,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YAC5C,kBAAkB;YAChB,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,EAAE,WAAW,CAAC;YAC5D,CAAC,CAAC,IAAI,CAAC;QACX,OAAO,SAAS,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;YAClC,eAAe;YACf,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,oBAAyB;QACpC,OAAO,kBAAkB,CAAC;YACxB,GAAG,EAAE,sBAAsB;YAC3B,YAAY,EAAE,QAAQ;YACtB,IAAI,EAAE,CAAC,oBAAoB,CAAC;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,UAAe;QAC3B,OAAO,kBAAkB,CAAC;YACxB,GAAG,EAAE,sBAAsB;YAC3B,YAAY,EAAE,SAAS;YACvB,IAAI,EAAE,CAAC,UAAU,CAAC;SACnB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAA4B;QAC5C,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAA2B;QAC7C,OAAO,aAAa,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAA4B;QAC3C,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC5C;QACD,MAAM,IAAI,GAAG,oBAAoB,CAC/B;YACE,GAAG,MAAM;YACT,SAAS,EAAE,IAAI;SAChB,EACD,IAAI,CAAC,iBAAiB,EACtB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CACtB,CAAC;QACF,MAAM,gBAAgB,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEzE,MAAM,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxE,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE;YAC5D,MAAM,KAAK,CACT,kEAAkE,CACnE,CAAC;SACH;QACD,MAAM,qBAAqB,GACzB,IAAI,CAAC,cAAc,CAAC,WAAW;YAC/B,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YAC5C,kBAAkB;YAChB,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC;YAC/C,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAC7C,SAAS,CAAC,qBAAqB,CAAC,CACjC,CAAC;QACF,MAAM,WAAW,GACf,IAAI,CAAC,cAAc,CAAC,WAAW;YAC/B,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YAC5C,kBAAkB;YAChB,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,EAAE,WAAW,CAAC;YAC5D,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,SAAS,GAAG,MAAM,CAAC;YACvB,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;YAClC,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,gBAAgB,CAAC;YACnD,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;CACF","sourcesContent":["import {\n getUserOperationHash,\n type Address,\n type Hex,\n type SmartAccountSigner,\n type UserOperationRequest,\n getChain,\n type SignTypedDataParams,\n type Abi,\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 type GetAbiItemParameters,\n} from \"viem\";\nimport { formatAbiItem } from \"viem/utils\";\nimport { SessionKeyValidatorAbi } from \"../abis/SessionKeyValidatorAbi.js\";\nimport { DUMMY_ECDSA_SIG } from \"../constants.js\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport { MerkleTree } from \"merkletreejs\";\nimport { Operation } from \"../provider.js\";\nimport { getChainId } from \"../api/index.js\";\nimport { fixSignedData } from \"../utils.js\";\nimport type { GetAbiItemReturnType } from \"viem/dist/types/utils/abi/getAbiItem.js\";\nimport { type AbiFunction } from \"abitype\";\nimport type {\n CombinedArgs,\n GeneratePermissionFromArgsParameters,\n} from \"./types.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 ParamOperator {\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: ParamOperator;\n param: Hex;\n}\n\nexport type Permission = {\n target: Address;\n rules?: ParamRules[];\n sig?: Hex;\n valueLimit?: bigint;\n operation?: Operation;\n};\n\nexport interface SessionKeyData {\n validUntil: number;\n validAfter: number;\n paymaster?: Address;\n permissions?: Permission[];\n}\n\nexport function getAbiItem<\n TAbi extends Abi | readonly unknown[],\n TItemName extends string\n>({\n abi,\n args = [],\n name,\n}: GetAbiItemParameters<TAbi, TItemName>): GetAbiItemReturnType<\n TAbi,\n TItemName\n> {\n const abiItems = (abi as Abi).filter((x) => \"name\" in x && x.name === name);\n if (abiItems.length === 0) return undefined as any;\n if (abiItems.length === 1) return abiItems[0] as any;\n const abiItemsParamFiltered = [];\n for (const abiItem of abiItems) {\n if (!(\"inputs\" in abiItem)) continue;\n if (!args || args.length === 0) {\n if (!abiItem.inputs || abiItem.inputs.length === 0) return abiItem as any;\n continue;\n }\n if (!abiItem.inputs) continue;\n if (abiItem.inputs.length === 0) continue;\n if (abiItem.inputs.length !== args.length) continue;\n abiItemsParamFiltered.push(abiItem);\n }\n if (abiItemsParamFiltered.length === 0) return abiItems[0] as any;\n else if (abiItemsParamFiltered.length === 1)\n return abiItemsParamFiltered[0] as any;\n else\n throw Error(\n `Couldn't parse funtion signature using params, set appropriate one from below:\\n${abiItemsParamFiltered\n .map((item) => formatAbiItem(item))\n .reduce((a, c) => `${a}\\n${c}`)}`\n );\n}\n\nexport function getPermissionFromABI<\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends string | undefined = string\n>({\n abi,\n target,\n args,\n functionName,\n operation,\n valueLimit,\n}: GeneratePermissionFromArgsParameters<TAbi, TFunctionName>): Permission {\n const abiItem = getAbiItem({\n abi,\n args,\n name: functionName,\n } as GetAbiItemParameters);\n if (abiItem.type !== \"function\") {\n throw Error(`${functionName} not found in abi`);\n }\n const functionSelector = getFunctionSelector(abiItem);\n let paramRules: ParamRules[] = [];\n if (args && Array.isArray(args)) {\n paramRules = (args as CombinedArgs<AbiFunction[\"inputs\"]>)\n .map(\n (arg, i) =>\n arg && {\n param: pad(\n isHex(arg.value)\n ? arg.value\n : toHex(arg.value as Parameters<typeof toHex>[0]),\n { size: 32 }\n ),\n offset: i * 32,\n condition: arg.operator,\n }\n )\n .filter((rule) => rule) as ParamRules[];\n }\n return {\n sig: functionSelector,\n rules: paramRules,\n target,\n operation: operation ?? Operation.Call,\n valueLimit: valueLimit ?? 0n,\n };\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 validAfter: params.sessionKeyData.validAfter ?? 0,\n validUntil: params.sessionKeyData.validUntil ?? 0,\n paymaster: params.sessionKeyData.paymaster ?? zeroAddress,\n };\n this.sessionKeyData.permissions = this.sessionKeyData.permissions?.map(\n (perm) => ({\n ...perm,\n operation: perm.operation ?? Operation.Call,\n valueLimit: perm.valueLimit ?? 0n,\n sig: perm.sig ?? pad(\"0x\", { size: 4 }),\n rules: perm.rules ?? [],\n })\n );\n this.merkleTree = this.getMerkleTree();\n if (this.shouldDelegateViaFallback()) {\n throw Error(\"Session key permissions not set\");\n }\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 ?? 0n) >= args[1]\n );\n\n if (!valueLimitPermissions.length) return undefined;\n\n const sortedPermissions = valueLimitPermissions.sort((a, b) => {\n if ((b.valueLimit ?? 0n) > (a.valueLimit ?? 0n)) {\n return 1;\n } else if ((b.valueLimit ?? 0n) < (a.valueLimit ?? 0n)) {\n return -1;\n } else {\n return 0;\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) =>\n permission.operation === operation || Operation.Call === operation\n );\n }\n\n private filterBySignature(\n permissions: Permission[],\n signature: string\n ): Permission[] {\n return permissions.filter(\n (permission) =>\n (permission.sig ?? pad(\"0x\", { size: 4 })).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: ParamOperator\n ): boolean {\n switch (condition) {\n case ParamOperator.EQUAL:\n return dataParam === ruleParam;\n case ParamOperator.GREATER_THAN:\n return dataParam > ruleParam;\n case ParamOperator.LESS_THAN:\n return dataParam < ruleParam;\n case ParamOperator.GREATER_THAN_OR_EQUAL:\n return dataParam >= ruleParam;\n case ParamOperator.LESS_THAN_OR_EQUAL:\n return dataParam <= ruleParam;\n case ParamOperator.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 type Abi,\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 encodeAbiParameters,\n concatHex,\n zeroAddress,\n decodeFunctionData,\n isHex,\n getFunctionSelector,\n type GetAbiItemParameters,\n keccak256,\n} from \"viem\";\nimport { formatAbiItem } from \"viem/utils\";\nimport { SessionKeyValidatorAbi } from \"../abis/SessionKeyValidatorAbi.js\";\nimport { DUMMY_ECDSA_SIG } from \"../constants.js\";\nimport { KernelAccountAbi } from \"../abis/KernelAccountAbi.js\";\nimport { MerkleTree } from \"merkletreejs\";\nimport { getChainId } from \"../api/index.js\";\nimport { fixSignedData } from \"../utils.js\";\nimport type { GetAbiItemReturnType } from \"viem/dist/types/utils/abi/getAbiItem.js\";\nimport { type AbiFunction } from \"abitype\";\nimport type {\n CombinedArgs,\n GeneratePermissionFromArgsParameters,\n} from \"./types.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 ParamOperator {\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 type SessionNonces = {\n lastNonce: bigint;\n invalidNonce: bigint;\n};\n\nexport type ExecutionRule = {\n validAfter: number; // 48 bits\n interval: number; // 48 bits\n runs: number; // 48 bits\n};\nexport interface ParamRules {\n offset: number;\n condition: ParamOperator;\n param: Hex;\n}\n\nexport type Permission = {\n target: Address;\n index?: number;\n rules?: ParamRules[];\n sig?: Hex;\n valueLimit?: bigint;\n executionRule?: ExecutionRule;\n};\n\nexport interface SessionKeyData {\n validUntil: number;\n validAfter: number;\n paymaster?: Address;\n permissions?: Permission[];\n}\n\nexport function getAbiItem<\n TAbi extends Abi | readonly unknown[],\n TItemName extends string\n>({\n abi,\n args = [],\n name,\n}: GetAbiItemParameters<TAbi, TItemName>): GetAbiItemReturnType<\n TAbi,\n TItemName\n> {\n const abiItems = (abi as Abi).filter((x) => \"name\" in x && x.name === name);\n if (abiItems.length === 0) return undefined as any;\n if (abiItems.length === 1) return abiItems[0] as any;\n const abiItemsParamFiltered = [];\n for (const abiItem of abiItems) {\n if (!(\"inputs\" in abiItem)) continue;\n if (!args || args.length === 0) {\n if (!abiItem.inputs || abiItem.inputs.length === 0) return abiItem as any;\n continue;\n }\n if (!abiItem.inputs) continue;\n if (abiItem.inputs.length === 0) continue;\n if (abiItem.inputs.length !== args.length) continue;\n abiItemsParamFiltered.push(abiItem);\n }\n if (abiItemsParamFiltered.length === 0) return abiItems[0] as any;\n else if (abiItemsParamFiltered.length === 1)\n return abiItemsParamFiltered[0] as any;\n else\n throw Error(\n `Couldn't parse funtion signature using params, set appropriate one from below:\\n${abiItemsParamFiltered\n .map((item) => formatAbiItem(item))\n .reduce((a, c) => `${a}\\n${c}`)}`\n );\n}\n\nexport function getPermissionFromABI<\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends string | undefined = string\n>({\n abi,\n target,\n args,\n functionName,\n valueLimit,\n}: GeneratePermissionFromArgsParameters<TAbi, TFunctionName>): Permission {\n const abiItem = getAbiItem({\n abi,\n args,\n name: functionName,\n } as GetAbiItemParameters);\n if (abiItem.type !== \"function\") {\n throw Error(`${functionName} not found in abi`);\n }\n const functionSelector = getFunctionSelector(abiItem);\n let paramRules: ParamRules[] = [];\n if (args && Array.isArray(args)) {\n paramRules = (args as CombinedArgs<AbiFunction[\"inputs\"]>)\n .map(\n (arg, i) =>\n arg && {\n param: pad(\n isHex(arg.value)\n ? arg.value\n : toHex(arg.value as Parameters<typeof toHex>[0]),\n { size: 32 }\n ),\n offset: i * 32,\n condition: arg.operator,\n }\n )\n .filter((rule) => rule) as ParamRules[];\n }\n return {\n sig: functionSelector,\n rules: paramRules,\n target,\n valueLimit: valueLimit ?? 0n,\n };\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 validAfter: params.sessionKeyData.validAfter ?? 0,\n validUntil: params.sessionKeyData.validUntil ?? 0,\n paymaster: params.sessionKeyData.paymaster ?? zeroAddress,\n };\n this.sessionKeyData.permissions = this.sessionKeyData.permissions?.map(\n (perm, index) => ({\n ...perm,\n valueLimit: perm.valueLimit ?? 0n,\n sig: perm.sig ?? pad(\"0x\", { size: 4 }),\n rules: perm.rules ?? [],\n index,\n executionRule: perm.executionRule ?? {\n validAfter: 0,\n interval: 0,\n runs: 0,\n },\n })\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 findMatchingPermissions(\n callData: Hex\n ): Permission | Permission[] | undefined {\n try {\n const { functionName, args } = decodeFunctionData({\n abi: KernelAccountAbi,\n data: callData,\n });\n\n if (functionName !== \"execute\" && functionName !== \"executeBatch\")\n return undefined;\n if (functionName === \"execute\") {\n const [to, value, data] = args;\n return this.filterPermissions([to], [data], [value])?.[0];\n } else if (functionName === \"executeBatch\") {\n let targets: Hex[] = [],\n values: bigint[] = [],\n dataArray: Hex[] = [];\n args[0].forEach((arg) => {\n targets.push(arg.to);\n values.push(arg.value);\n dataArray.push(arg.data);\n });\n return this.filterPermissions(targets, dataArray, values);\n } else {\n throw Error(\"Invalid function\");\n }\n } catch (error) {\n return undefined;\n }\n }\n\n private filterPermissions(\n targets: Address[],\n dataArray: Hex[],\n values: bigint[]\n ): Permission[] | undefined {\n if (\n targets.length !== dataArray.length ||\n targets.length !== values.length\n ) {\n throw Error(\"Invalid arguments\");\n }\n const filteredPermissions = targets.map((target, index) => {\n const permissionsList = this.sessionKeyData.permissions;\n if (!permissionsList || !permissionsList.length) return undefined;\n\n const targetToMatch = target.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 signaturePermissions = this.filterBySignature(\n targetPermissions,\n dataArray[index].slice(0, 10).toLowerCase()\n );\n\n const valueLimitPermissions = signaturePermissions.filter(\n (permission) => (permission.valueLimit ?? 0n) >= values[index]\n );\n\n if (!valueLimitPermissions.length) return undefined;\n\n const sortedPermissions = valueLimitPermissions.sort((a, b) => {\n if ((b.valueLimit ?? 0n) > (a.valueLimit ?? 0n)) {\n return 1;\n } else if ((b.valueLimit ?? 0n) < (a.valueLimit ?? 0n)) {\n return -1;\n } else {\n return 0;\n }\n });\n\n return this.findPermissionByRule(sortedPermissions, dataArray[index]);\n });\n return filteredPermissions.every((permission) => permission !== undefined)\n ? (filteredPermissions as Permission[])\n : undefined;\n }\n\n private filterBySignature(\n permissions: Permission[],\n signature: string\n ): Permission[] {\n return permissions.filter(\n (permission) =>\n (permission.sig ?? pad(\"0x\", { size: 4 })).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: ParamOperator\n ): boolean {\n switch (condition) {\n case ParamOperator.EQUAL:\n return dataParam === ruleParam;\n case ParamOperator.GREATER_THAN:\n return dataParam > ruleParam;\n case ParamOperator.LESS_THAN:\n return dataParam < ruleParam;\n case ParamOperator.GREATER_THAN_OR_EQUAL:\n return dataParam >= ruleParam;\n case ParamOperator.LESS_THAN_OR_EQUAL:\n return dataParam <= ruleParam;\n case ParamOperator.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 && permissionPacked.length === 1)\n permissionPacked.push(permissionPacked[0]);\n\n return permissionPacked && permissionPacked.length !== 0\n ? new MerkleTree(permissionPacked, keccak256, {\n hashLeaves: true,\n complete: true,\n sort: true,\n })\n : new MerkleTree([pad(\"0x00\", { size: 32 })], keccak256, {\n hashLeaves: false,\n complete: true,\n });\n }\n\n encodePermissionData(\n permission: Permission | Permission[],\n merkleProof?: string[] | string[][]\n ): Hex {\n let permissionParam = {\n components: [\n {\n name: \"index\",\n type: \"uint32\",\n },\n {\n name: \"target\",\n type: \"address\",\n },\n {\n name: \"sig\",\n type: \"bytes4\",\n },\n {\n name: \"valueLimit\",\n type: \"uint256\",\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 components: [\n {\n name: \"interval\",\n type: \"uint48\",\n },\n {\n name: \"runs\",\n type: \"uint48\",\n },\n {\n internalType: \"ValidAfter\",\n name: \"validAfter\",\n type: \"uint48\",\n },\n ],\n name: \"executionRule\",\n type: \"tuple\",\n },\n ],\n name: \"permission\",\n type: Array.isArray(permission) ? \"tuple[]\" : \"tuple\",\n };\n let params;\n let values;\n if (merkleProof) {\n params = [\n permissionParam,\n {\n name: \"merkleProof\",\n type: Array.isArray(merkleProof[0]) ? \"bytes32[][]\" : \"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 getSessionNonces(\n kernelAccountAddress: Address\n ): Promise<SessionNonces> {\n if (!this.publicClient) {\n throw new Error(\"Validator uninitialized: PublicClient missing\");\n }\n const nonce = await this.publicClient.readContract({\n abi: SessionKeyValidatorAbi,\n address: this.validatorAddress,\n functionName: \"nonces\",\n args: [kernelAccountAddress],\n });\n return { lastNonce: nonce[0], invalidNonce: nonce[1] };\n }\n\n async getEnableData(\n kernelAccountAddress?: Address,\n enabledLastNonce?: bigint\n ): Promise<Hex> {\n if (!this.merkleTree) {\n throw Error(\"SessionKeyValidator: MerkleTree not generated\");\n }\n if (!kernelAccountAddress) {\n throw Error(\"SessionKeyValidator: Kernel account address not provided\");\n }\n const lastNonce =\n enabledLastNonce ??\n (await this.getSessionNonces(kernelAccountAddress)).lastNonce + 1n;\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 pad(toHex(lastNonce), { size: 32 }),\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: 32 }),\n pad(toHex(enableData[1]), { size: 6 }),\n pad(toHex(enableData[2]), { size: 6 }),\n enableData[3],\n pad(toHex(enableData[4]), { size: 32 }),\n ]);\n return (\n execDetail.validator.toLowerCase() ===\n this.validatorAddress.toLowerCase() &&\n enableDataHex.toLowerCase() ===\n (\n await this.getEnableData(kernelAccountAddress, enableData[4])\n ).toLowerCase()\n );\n }\n\n async getDummyUserOpSignature(callData: Hex): Promise<Hex> {\n return concatHex([\n await this.sessionKey.getAddress(),\n DUMMY_ECDSA_SIG,\n this.getEncodedPermissionProofData(callData),\n ]);\n }\n\n private getEncodedPermissionProofData(callData: Hex): Hex {\n const matchingPermission = this.findMatchingPermissions(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 let merkleProof: string[] | string[][] = [];\n if (Array.isArray(matchingPermission)) {\n let encodedPerms = matchingPermission.map((permission) =>\n keccak256(this.encodePermissionData(permission))\n );\n merkleProof = encodedPerms.map((perm) =>\n this.merkleTree.getHexProof(perm)\n );\n } else if (matchingPermission) {\n merkleProof = this.merkleTree.getHexProof(\n keccak256(encodedPermissionData)\n );\n }\n return this.sessionKeyData.permissions &&\n this.sessionKeyData.permissions.length !== 0 &&\n matchingPermission\n ? this.encodePermissionData(matchingPermission, merkleProof)\n : \"0x\";\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 signature = concat([\n await this.sessionKey.getAddress(),\n await this.sessionKey.signMessage(formattedMessage),\n this.getEncodedPermissionProofData(userOp.callData),\n ]);\n return signature;\n }\n}\n"]}
@@ -47,7 +47,7 @@ export type GetFunctionArgs<TAbi extends Abi | readonly unknown[], TFunctionName
47
47
  } : {
48
48
  args?: TArgs;
49
49
  };
50
- export type GeneratePermissionFromArgsParameters<TAbi extends Abi | readonly unknown[], TFunctionName extends string | undefined = string, _FunctionName = TAbi extends Abi ? InferFunctionName<TAbi, TFunctionName> : never> = Pick<Permission, "operation" | "target" | "valueLimit"> & {
50
+ export type GeneratePermissionFromArgsParameters<TAbi extends Abi | readonly unknown[], TFunctionName extends string | undefined = string, _FunctionName = TAbi extends Abi ? InferFunctionName<TAbi, TFunctionName> : never> = Pick<Permission, "target" | "valueLimit"> & {
51
51
  functionName?: _FunctionName;
52
52
  } & (TFunctionName extends string ? {
53
53
  abi: Narrow<TAbi>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAMN,MAAM,SAAS,CAAC;AACjB,OAAO,EAAe,MAAM,sBAAsB,CAAC","sourcesContent":["import {\n type AbiParameter,\n type AbiParameterKind,\n type AbiParameterToPrimitiveType,\n type AbiFunction,\n type ExtractAbiFunction,\n} from \"abitype\";\nimport { type Pretty } from \"abitype/src/types.js\";\nimport type {\n ECDSAValidator,\n ECDSAValidatorParams,\n} from \"./ecdsa-validator.js\";\nimport type {\n ERC165SessionKeyValidator,\n ERC165SessionKeyValidatorParams,\n} from \"./erc165-session-key-validator.js\";\n\nimport type {\n KillSwitchValidator,\n KillSwitchValidatorParams,\n} from \"./kill-switch-validator.js\";\nimport type {\n RecoveryValidator,\n RecoveryValidatorParams,\n} from \"./recovery-validator.js\";\nimport type {\n SessionKeyValidator,\n SessionKeyValidatorParams,\n ParamRules,\n Permission,\n SessionKeyData,\n SessionKeyParams,\n ParamOperator,\n} from \"./session-key-validator.js\";\nimport type { Abi, InferFunctionName, Narrow } from \"viem\";\n\nexport type SupportedValidators =\n | \"ECDSA\"\n | \"KILL_SWITCH\"\n | \"ERC165_SESSION_KEY\"\n | \"SESSION_KEY\"\n | \"RECOVERY\";\n\nexport type ValidatorTypeMap = {\n ECDSA: ECDSAValidator;\n KILL_SWITCH: KillSwitchValidator;\n ERC165_SESSION_KEY: ERC165SessionKeyValidator;\n SESSION_KEY: SessionKeyValidator;\n RECOVERY: RecoveryValidator;\n};\n\nexport type ValidatorParamsMap = {\n ECDSA: ECDSAValidatorParams;\n KILL_SWITCH: KillSwitchValidatorParams;\n ERC165_SESSION_KEY: ERC165SessionKeyValidatorParams;\n SESSION_KEY: SessionKeyValidatorParams;\n RECOVERY: RecoveryValidatorParams;\n};\n\nexport type ValidatorMap = {\n [V in SupportedValidators]: new (\n params: ValidatorParamsMap[V]\n ) => ValidatorTypeMap[V];\n};\n\nexport type EthereumProvider = { request(...args: any): Promise<any> };\n\nexport type { ParamRules, Permission, SessionKeyData, SessionKeyParams };\n\n// Session Key types\nexport type AbiParametersToPrimitiveTypes<\n TAbiParameters extends readonly AbiParameter[],\n TAbiParameterKind extends AbiParameterKind = AbiParameterKind\n> = Pretty<{\n [K in keyof TAbiParameters]: AbiParameterToPrimitiveType<\n TAbiParameters[K],\n TAbiParameterKind\n >;\n}>;\n\nexport type AbiParametersToConditons<\n TAbiParameters extends readonly AbiParameter[]\n> = Pretty<{\n [K in keyof TAbiParameters]: ParamOperator;\n}>;\n\nexport type CombinedArgs<\n TAbiParameters extends readonly AbiParameter[],\n TAbiParameterKind extends AbiParameterKind = AbiParameterKind\n> = {\n [K in keyof TAbiParameters]: {\n operator: ParamOperator;\n value: AbiParameterToPrimitiveType<TAbiParameters[K], TAbiParameterKind>;\n } | null;\n};\n\nexport type GetFunctionArgs<\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends string,\n TAbiFunction extends AbiFunction = TAbi extends Abi\n ? ExtractAbiFunction<TAbi, TFunctionName>\n : AbiFunction,\n TArgs = CombinedArgs<TAbiFunction[\"inputs\"]>,\n FailedToParseArgs =\n | ([TArgs] extends [never] ? true : false)\n | (readonly unknown[] extends TArgs ? true : false)\n> = true extends FailedToParseArgs\n ? {\n args?: readonly unknown[];\n }\n : TArgs extends readonly []\n ? { args?: never }\n : {\n args?: TArgs;\n };\n\nexport type GeneratePermissionFromArgsParameters<\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends string | undefined = string,\n _FunctionName = TAbi extends Abi\n ? InferFunctionName<TAbi, TFunctionName>\n : never\n> = Pick<Permission, \"operation\" | \"target\" | \"valueLimit\"> & {\n functionName?: _FunctionName;\n} & (TFunctionName extends string\n ? { abi: Narrow<TAbi> } & GetFunctionArgs<TAbi, TFunctionName>\n : _FunctionName extends string\n ? { abi: [Narrow<TAbi[number]>] } & GetFunctionArgs<TAbi, _FunctionName>\n : never);\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAMN,MAAM,SAAS,CAAC;AACjB,OAAO,EAAe,MAAM,sBAAsB,CAAC","sourcesContent":["import {\n type AbiParameter,\n type AbiParameterKind,\n type AbiParameterToPrimitiveType,\n type AbiFunction,\n type ExtractAbiFunction,\n} from \"abitype\";\nimport { type Pretty } from \"abitype/src/types.js\";\nimport type {\n ECDSAValidator,\n ECDSAValidatorParams,\n} from \"./ecdsa-validator.js\";\nimport type {\n ERC165SessionKeyValidator,\n ERC165SessionKeyValidatorParams,\n} from \"./erc165-session-key-validator.js\";\n\nimport type {\n KillSwitchValidator,\n KillSwitchValidatorParams,\n} from \"./kill-switch-validator.js\";\nimport type {\n RecoveryValidator,\n RecoveryValidatorParams,\n} from \"./recovery-validator.js\";\nimport type {\n SessionKeyValidator,\n SessionKeyValidatorParams,\n ParamRules,\n Permission,\n SessionKeyData,\n SessionKeyParams,\n ParamOperator,\n} from \"./session-key-validator.js\";\nimport type { Abi, InferFunctionName, Narrow } from \"viem\";\n\nexport type SupportedValidators =\n | \"ECDSA\"\n | \"KILL_SWITCH\"\n | \"ERC165_SESSION_KEY\"\n | \"SESSION_KEY\"\n | \"RECOVERY\";\n\nexport type ValidatorTypeMap = {\n ECDSA: ECDSAValidator;\n KILL_SWITCH: KillSwitchValidator;\n ERC165_SESSION_KEY: ERC165SessionKeyValidator;\n SESSION_KEY: SessionKeyValidator;\n RECOVERY: RecoveryValidator;\n};\n\nexport type ValidatorParamsMap = {\n ECDSA: ECDSAValidatorParams;\n KILL_SWITCH: KillSwitchValidatorParams;\n ERC165_SESSION_KEY: ERC165SessionKeyValidatorParams;\n SESSION_KEY: SessionKeyValidatorParams;\n RECOVERY: RecoveryValidatorParams;\n};\n\nexport type ValidatorMap = {\n [V in SupportedValidators]: new (\n params: ValidatorParamsMap[V]\n ) => ValidatorTypeMap[V];\n};\n\nexport type EthereumProvider = { request(...args: any): Promise<any> };\n\nexport type { ParamRules, Permission, SessionKeyData, SessionKeyParams };\n\n// Session Key types\nexport type AbiParametersToPrimitiveTypes<\n TAbiParameters extends readonly AbiParameter[],\n TAbiParameterKind extends AbiParameterKind = AbiParameterKind\n> = Pretty<{\n [K in keyof TAbiParameters]: AbiParameterToPrimitiveType<\n TAbiParameters[K],\n TAbiParameterKind\n >;\n}>;\n\nexport type AbiParametersToConditons<\n TAbiParameters extends readonly AbiParameter[]\n> = Pretty<{\n [K in keyof TAbiParameters]: ParamOperator;\n}>;\n\nexport type CombinedArgs<\n TAbiParameters extends readonly AbiParameter[],\n TAbiParameterKind extends AbiParameterKind = AbiParameterKind\n> = {\n [K in keyof TAbiParameters]: {\n operator: ParamOperator;\n value: AbiParameterToPrimitiveType<TAbiParameters[K], TAbiParameterKind>;\n } | null;\n};\n\nexport type GetFunctionArgs<\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends string,\n TAbiFunction extends AbiFunction = TAbi extends Abi\n ? ExtractAbiFunction<TAbi, TFunctionName>\n : AbiFunction,\n TArgs = CombinedArgs<TAbiFunction[\"inputs\"]>,\n FailedToParseArgs =\n | ([TArgs] extends [never] ? true : false)\n | (readonly unknown[] extends TArgs ? true : false)\n> = true extends FailedToParseArgs\n ? {\n args?: readonly unknown[];\n }\n : TArgs extends readonly []\n ? { args?: never }\n : {\n args?: TArgs;\n };\n\nexport type GeneratePermissionFromArgsParameters<\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends string | undefined = string,\n _FunctionName = TAbi extends Abi\n ? InferFunctionName<TAbi, TFunctionName>\n : never\n> = Pick<Permission, \"target\" | \"valueLimit\"> & {\n functionName?: _FunctionName;\n} & (TFunctionName extends string\n ? { abi: Narrow<TAbi> } & GetFunctionArgs<TAbi, TFunctionName>\n : _FunctionName extends string\n ? { abi: [Narrow<TAbi[number]>] } & GetFunctionArgs<TAbi, _FunctionName>\n : never);\n"]}
@@ -92,6 +92,15 @@ export class ValidatorProvider extends ZeroDevProvider {
92
92
  }
93
93
  });
94
94
  this.defaultProvider = params.defaultProvider;
95
+ if ((typeof params.opts?.providerConfig?.chain === "number" &&
96
+ typeof params.defaultProvider?.chain === "number" &&
97
+ params.opts?.providerConfig?.chain !== params.defaultProvider?.chain) ||
98
+ (typeof params.opts?.providerConfig?.chain === "object" &&
99
+ typeof params.defaultProvider?.chain === "object" &&
100
+ params.opts?.providerConfig?.chain.id !==
101
+ params.defaultProvider?.chain.id)) {
102
+ throw new Error("chainId mismatch between default provider and current provider - check projectIds");
103
+ }
95
104
  this.connect(() => new KernelSmartContractAccount({
96
105
  projectId: params.projectId,
97
106
  validator,
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator-provider/base.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Hex, type SendUserOperationResult } from \"@alchemy/aa-core\";\nimport { ZeroDevProvider, type ZeroDevProviderConfig } from \"../provider.js\";\nimport type {\n KernelBaseValidator,\n KernelBaseValidatorParams,\n} from \"../validator/base.js\";\nimport type {\n PaymasterAndBundlerProviders,\n PaymasterConfig,\n PaymasterPolicy,\n} from \"../paymaster/types.js\";\nimport {\n KernelSmartContractAccount,\n type KernelSmartAccountParams,\n isKernelAccount,\n} from \"../account.js\";\nimport { polygonMumbai } from \"viem/chains\";\nimport { withZeroDevPaymasterAndData } from \"../middleware/paymaster.js\";\nimport type { RequiredProps } from \"../types.js\";\n\nexport type ValidatorProviderParamsOpts<P extends KernelBaseValidatorParams> = {\n paymasterConfig?: PaymasterConfig<PaymasterPolicy>;\n providerConfig?: Partial<ZeroDevProviderConfig>;\n accountConfig?: Omit<\n KernelSmartAccountParams,\n keyof ExtendedValidatorProviderParams<P>\n >;\n validatorConfig?: Omit<P, keyof ExtendedValidatorProviderParams<P>>;\n};\n\nexport interface ValidatorProviderParams<P extends KernelBaseValidatorParams> {\n projectId: string;\n bundlerProvider?: PaymasterAndBundlerProviders;\n opts?: ValidatorProviderParamsOpts<P>;\n usePaymaster?: boolean;\n defaultProvider?: ValidatorProvider<\n KernelBaseValidator,\n KernelBaseValidatorParams\n >;\n}\n\nexport type ExtendedValidatorProviderParams<\n P extends KernelBaseValidatorParams\n> = ValidatorProviderParams<P> & RequiredProps<P>;\n\n// A simple facade abstraction for validator related provider operations\n// Needs to be implemented for each validator plugin\nexport abstract class ValidatorProvider<\n V extends KernelBaseValidator,\n P extends KernelBaseValidatorParams\n> extends ZeroDevProvider {\n protected defaultProvider?: ValidatorProvider<\n KernelBaseValidator,\n KernelBaseValidatorParams\n >;\n constructor(\n params: ExtendedValidatorProviderParams<P>,\n validator: KernelBaseValidator\n ) {\n let bundlerProvider = params.bundlerProvider;\n const shouldUsePaymaster =\n params.usePaymaster === undefined || params.usePaymaster;\n if (\n params.opts?.paymasterConfig &&\n params.opts?.paymasterConfig.policy === \"TOKEN_PAYMASTER\" &&\n shouldUsePaymaster\n ) {\n bundlerProvider = \"STACKUP\";\n }\n super({\n ...params.opts?.providerConfig,\n chain: params.opts?.providerConfig?.chain ?? polygonMumbai,\n rpcUrl: params.opts?.providerConfig?.rpcUrl,\n projectId: params.projectId,\n bundlerProvider,\n });\n this.defaultProvider = params.defaultProvider;\n this.connect(\n () =>\n new KernelSmartContractAccount({\n projectId: params.projectId,\n validator,\n defaultValidator: params.defaultProvider?.getValidator(),\n rpcClient: this.rpcClient,\n bundlerProvider,\n index: params.defaultProvider?.getAccount().getIndex(),\n ...params.opts?.accountConfig,\n })\n );\n if (shouldUsePaymaster) {\n let paymasterConfig = params.opts?.paymasterConfig ?? {\n policy: \"VERIFYING_PAYMASTER\",\n };\n paymasterConfig = {\n ...paymasterConfig,\n paymasterProvider:\n params.opts?.paymasterConfig?.paymasterProvider ?? bundlerProvider,\n };\n withZeroDevPaymasterAndData(this, paymasterConfig);\n }\n }\n\n getValidator = (): V => {\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n return this.account.getValidator() as unknown as V;\n };\n\n getEncodedEnableData = async (enableData: Hex): Promise<Hex> => {\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n return await this.account.validator.encodeEnable(enableData);\n };\n\n getEncodedDisableData = async (disableData: Hex = \"0x\"): Promise<Hex> => {\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n return await this.account.validator.encodeDisable(disableData);\n };\n\n sendEnableUserOperation = async (\n enableData: Hex\n ): Promise<SendUserOperationResult> => {\n const encodedEnableData = await this.getEncodedEnableData(enableData);\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n\n return await this.sendUserOperation({\n target: this.account.validator.validatorAddress,\n data: encodedEnableData,\n });\n };\n\n sendDisableUserOperation = async (\n disableData: Hex = \"0x\"\n ): Promise<SendUserOperationResult> => {\n const encodedDisableData = await this.getEncodedDisableData(disableData);\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n if (!this.defaultProvider) {\n throw Error(\"Default Validator provider unintialized\");\n }\n\n return await this.defaultProvider.sendUserOperation({\n target: this.account.validator.validatorAddress,\n data: encodedDisableData,\n });\n };\n}\n"]}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/kernel-zerodev/validator-provider/base.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Hex, type SendUserOperationResult } from \"@alchemy/aa-core\";\nimport { ZeroDevProvider, type ZeroDevProviderConfig } from \"../provider.js\";\nimport type {\n KernelBaseValidator,\n KernelBaseValidatorParams,\n} from \"../validator/base.js\";\nimport type {\n PaymasterAndBundlerProviders,\n PaymasterConfig,\n PaymasterPolicy,\n} from \"../paymaster/types.js\";\nimport {\n KernelSmartContractAccount,\n type KernelSmartAccountParams,\n isKernelAccount,\n} from \"../account.js\";\nimport { polygonMumbai } from \"viem/chains\";\nimport { withZeroDevPaymasterAndData } from \"../middleware/paymaster.js\";\nimport type { RequiredProps } from \"../types.js\";\n\nexport type ValidatorProviderParamsOpts<P extends KernelBaseValidatorParams> = {\n paymasterConfig?: PaymasterConfig<PaymasterPolicy>;\n providerConfig?: Partial<ZeroDevProviderConfig>;\n accountConfig?: Omit<\n KernelSmartAccountParams,\n keyof ExtendedValidatorProviderParams<P>\n >;\n validatorConfig?: Omit<P, keyof ExtendedValidatorProviderParams<P>>;\n};\n\nexport interface ValidatorProviderParams<P extends KernelBaseValidatorParams> {\n projectId: string;\n bundlerProvider?: PaymasterAndBundlerProviders;\n opts?: ValidatorProviderParamsOpts<P>;\n usePaymaster?: boolean;\n defaultProvider?: ValidatorProvider<\n KernelBaseValidator,\n KernelBaseValidatorParams\n >;\n}\n\nexport type ExtendedValidatorProviderParams<\n P extends KernelBaseValidatorParams\n> = ValidatorProviderParams<P> & RequiredProps<P>;\n\n// A simple facade abstraction for validator related provider operations\n// Needs to be implemented for each validator plugin\nexport abstract class ValidatorProvider<\n V extends KernelBaseValidator,\n P extends KernelBaseValidatorParams\n> extends ZeroDevProvider {\n protected defaultProvider?: ValidatorProvider<\n KernelBaseValidator,\n KernelBaseValidatorParams\n >;\n constructor(\n params: ExtendedValidatorProviderParams<P>,\n validator: KernelBaseValidator\n ) {\n let bundlerProvider = params.bundlerProvider;\n const shouldUsePaymaster =\n params.usePaymaster === undefined || params.usePaymaster;\n if (\n params.opts?.paymasterConfig &&\n params.opts?.paymasterConfig.policy === \"TOKEN_PAYMASTER\" &&\n shouldUsePaymaster\n ) {\n bundlerProvider = \"STACKUP\";\n }\n super({\n ...params.opts?.providerConfig,\n chain: params.opts?.providerConfig?.chain ?? polygonMumbai,\n rpcUrl: params.opts?.providerConfig?.rpcUrl,\n projectId: params.projectId,\n bundlerProvider,\n });\n this.defaultProvider = params.defaultProvider;\n if (\n (typeof params.opts?.providerConfig?.chain === \"number\" &&\n typeof params.defaultProvider?.chain === \"number\" &&\n params.opts?.providerConfig?.chain !== params.defaultProvider?.chain) ||\n (typeof params.opts?.providerConfig?.chain === \"object\" &&\n typeof params.defaultProvider?.chain === \"object\" &&\n params.opts?.providerConfig?.chain.id !==\n params.defaultProvider?.chain.id)\n ) {\n throw new Error(\n \"chainId mismatch between default provider and current provider - check projectIds\"\n );\n }\n this.connect(\n () =>\n new KernelSmartContractAccount({\n projectId: params.projectId,\n validator,\n defaultValidator: params.defaultProvider?.getValidator(),\n rpcClient: this.rpcClient,\n bundlerProvider,\n index: params.defaultProvider?.getAccount().getIndex(),\n ...params.opts?.accountConfig,\n })\n );\n if (shouldUsePaymaster) {\n let paymasterConfig = params.opts?.paymasterConfig ?? {\n policy: \"VERIFYING_PAYMASTER\",\n };\n paymasterConfig = {\n ...paymasterConfig,\n paymasterProvider:\n params.opts?.paymasterConfig?.paymasterProvider ?? bundlerProvider,\n };\n withZeroDevPaymasterAndData(this, paymasterConfig);\n }\n }\n\n getValidator = (): V => {\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n return this.account.getValidator() as unknown as V;\n };\n\n getEncodedEnableData = async (enableData: Hex): Promise<Hex> => {\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n return await this.account.validator.encodeEnable(enableData);\n };\n\n getEncodedDisableData = async (disableData: Hex = \"0x\"): Promise<Hex> => {\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n return await this.account.validator.encodeDisable(disableData);\n };\n\n sendEnableUserOperation = async (\n enableData: Hex\n ): Promise<SendUserOperationResult> => {\n const encodedEnableData = await this.getEncodedEnableData(enableData);\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n\n return await this.sendUserOperation({\n target: this.account.validator.validatorAddress,\n data: encodedEnableData,\n });\n };\n\n sendDisableUserOperation = async (\n disableData: Hex = \"0x\"\n ): Promise<SendUserOperationResult> => {\n const encodedDisableData = await this.getEncodedDisableData(disableData);\n if (!isKernelAccount(this.account) || !this.account.validator) {\n throw new Error(\n \"ValidatorProvider: account with validator is not set, did you call all connects first?\"\n );\n }\n if (!this.defaultProvider) {\n throw Error(\"Default Validator provider unintialized\");\n }\n\n return await this.defaultProvider.sendUserOperation({\n target: this.account.validator.validatorAddress,\n data: encodedDisableData,\n });\n };\n}\n"]}