@0xsequence/wallet-primitives 0.0.0-20250520201059

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 (96) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/CHANGELOG.md +7 -0
  3. package/LICENSE +202 -0
  4. package/dist/address.d.ts +5 -0
  5. package/dist/address.d.ts.map +1 -0
  6. package/dist/address.js +7 -0
  7. package/dist/address.js.map +1 -0
  8. package/dist/attestation.d.ts +24 -0
  9. package/dist/attestation.d.ts.map +1 -0
  10. package/dist/attestation.js +77 -0
  11. package/dist/attestation.js.map +1 -0
  12. package/dist/config.d.ts +85 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +381 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/constants.d.ts +173 -0
  17. package/dist/constants.d.ts.map +1 -0
  18. package/dist/constants.js +31 -0
  19. package/dist/constants.js.map +1 -0
  20. package/dist/context.d.ts +9 -0
  21. package/dist/context.d.ts.map +1 -0
  22. package/dist/context.js +8 -0
  23. package/dist/context.js.map +1 -0
  24. package/dist/erc-6492.d.ts +19 -0
  25. package/dist/erc-6492.d.ts.map +1 -0
  26. package/dist/erc-6492.js +64 -0
  27. package/dist/erc-6492.js.map +1 -0
  28. package/dist/extensions/index.d.ts +9 -0
  29. package/dist/extensions/index.d.ts.map +1 -0
  30. package/dist/extensions/index.js +7 -0
  31. package/dist/extensions/index.js.map +1 -0
  32. package/dist/extensions/passkeys.d.ts +31 -0
  33. package/dist/extensions/passkeys.d.ts.map +1 -0
  34. package/dist/extensions/passkeys.js +224 -0
  35. package/dist/extensions/passkeys.js.map +1 -0
  36. package/dist/extensions/recovery.d.ts +310 -0
  37. package/dist/extensions/recovery.d.ts.map +1 -0
  38. package/dist/extensions/recovery.js +444 -0
  39. package/dist/extensions/recovery.js.map +1 -0
  40. package/dist/generic-tree.d.ts +14 -0
  41. package/dist/generic-tree.d.ts.map +1 -0
  42. package/dist/generic-tree.js +34 -0
  43. package/dist/generic-tree.js.map +1 -0
  44. package/dist/index.d.ts +16 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +16 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/network.d.ts +15 -0
  49. package/dist/network.d.ts.map +1 -0
  50. package/dist/network.js +24 -0
  51. package/dist/network.js.map +1 -0
  52. package/dist/payload.d.ts +108 -0
  53. package/dist/payload.d.ts.map +1 -0
  54. package/dist/payload.js +627 -0
  55. package/dist/payload.js.map +1 -0
  56. package/dist/permission.d.ts +73 -0
  57. package/dist/permission.d.ts.map +1 -0
  58. package/dist/permission.js +188 -0
  59. package/dist/permission.js.map +1 -0
  60. package/dist/session-config.d.ts +113 -0
  61. package/dist/session-config.d.ts.map +1 -0
  62. package/dist/session-config.js +554 -0
  63. package/dist/session-config.js.map +1 -0
  64. package/dist/session-signature.d.ts +24 -0
  65. package/dist/session-signature.d.ts.map +1 -0
  66. package/dist/session-signature.js +141 -0
  67. package/dist/session-signature.js.map +1 -0
  68. package/dist/signature.d.ts +108 -0
  69. package/dist/signature.d.ts.map +1 -0
  70. package/dist/signature.js +1079 -0
  71. package/dist/signature.js.map +1 -0
  72. package/dist/utils.d.ts +45 -0
  73. package/dist/utils.d.ts.map +1 -0
  74. package/dist/utils.js +100 -0
  75. package/dist/utils.js.map +1 -0
  76. package/eslint.config.mjs +4 -0
  77. package/package.json +27 -0
  78. package/src/address.ts +19 -0
  79. package/src/attestation.ts +114 -0
  80. package/src/config.ts +521 -0
  81. package/src/constants.ts +39 -0
  82. package/src/context.ts +16 -0
  83. package/src/erc-6492.ts +97 -0
  84. package/src/extensions/index.ts +14 -0
  85. package/src/extensions/passkeys.ts +283 -0
  86. package/src/extensions/recovery.ts +542 -0
  87. package/src/generic-tree.ts +55 -0
  88. package/src/index.ts +15 -0
  89. package/src/network.ts +37 -0
  90. package/src/payload.ts +825 -0
  91. package/src/permission.ts +252 -0
  92. package/src/session-config.ts +681 -0
  93. package/src/session-signature.ts +197 -0
  94. package/src/signature.ts +1398 -0
  95. package/src/utils.ts +114 -0
  96. package/tsconfig.json +10 -0
@@ -0,0 +1,554 @@
1
+ import { Address, Bytes, Hash, Hex } from 'ox';
2
+ import * as GenericTree from './generic-tree.js';
3
+ import { decodeSessionPermissions, encodeSessionPermissions, encodeSessionPermissionsForJson, sessionPermissionsFromParsed, } from './permission.js';
4
+ import { minBytesFor } from './utils.js';
5
+ //FIXME Reorder by expected usage
6
+ export const SESSIONS_FLAG_PERMISSIONS = 0;
7
+ export const SESSIONS_FLAG_NODE = 1;
8
+ export const SESSIONS_FLAG_BRANCH = 2;
9
+ export const SESSIONS_FLAG_BLACKLIST = 3;
10
+ export const SESSIONS_FLAG_IDENTITY_SIGNER = 4;
11
+ function isSessionsNode(topology) {
12
+ return Hex.validate(topology) && Hex.size(topology) === 32;
13
+ }
14
+ function isImplicitBlacklist(topology) {
15
+ return typeof topology === 'object' && topology !== null && 'blacklist' in topology;
16
+ }
17
+ function isIdentitySignerLeaf(topology) {
18
+ return typeof topology === 'object' && topology !== null && 'identitySigner' in topology;
19
+ }
20
+ function isSessionPermissions(topology) {
21
+ return typeof topology === 'object' && topology !== null && 'signer' in topology;
22
+ }
23
+ function isSessionsLeaf(topology) {
24
+ return isImplicitBlacklist(topology) || isIdentitySignerLeaf(topology) || isSessionPermissions(topology);
25
+ }
26
+ function isSessionsBranch(topology) {
27
+ return Array.isArray(topology) && topology.length >= 2 && topology.every((child) => isSessionsTopology(child));
28
+ }
29
+ export function isSessionsTopology(topology) {
30
+ return isSessionsBranch(topology) || isSessionsLeaf(topology) || isSessionsNode(topology);
31
+ }
32
+ /**
33
+ * Checks if the topology is complete.
34
+ * A complete topology has exactly one identity signer and one blacklist.
35
+ * @param topology The topology to check
36
+ * @returns True if the topology is complete
37
+ */
38
+ export function isCompleteSessionsTopology(topology) {
39
+ // Ensure the object is a sessions topology
40
+ if (!isSessionsTopology(topology)) {
41
+ return false;
42
+ }
43
+ // Check the topology contains exactly one identity signer and one blacklist
44
+ const { identitySignerCount, blacklistCount } = checkIsCompleteSessionsBranch(topology);
45
+ return identitySignerCount === 1 && blacklistCount === 1;
46
+ }
47
+ function checkIsCompleteSessionsBranch(topology) {
48
+ let thisHasIdentitySigner = 0;
49
+ let thisHasBlacklist = 0;
50
+ if (isSessionsBranch(topology)) {
51
+ for (const child of topology) {
52
+ const { identitySignerCount, blacklistCount } = checkIsCompleteSessionsBranch(child);
53
+ thisHasIdentitySigner += identitySignerCount;
54
+ thisHasBlacklist += blacklistCount;
55
+ }
56
+ }
57
+ if (isIdentitySignerLeaf(topology)) {
58
+ thisHasIdentitySigner++;
59
+ }
60
+ if (isImplicitBlacklist(topology)) {
61
+ thisHasBlacklist++;
62
+ }
63
+ return { identitySignerCount: thisHasIdentitySigner, blacklistCount: thisHasBlacklist };
64
+ }
65
+ /**
66
+ * Gets the identity signer from the topology.
67
+ * @param topology The topology to get the identity signer from
68
+ * @returns The identity signer or null if it's not present
69
+ */
70
+ export function getIdentitySigner(topology) {
71
+ if (isIdentitySignerLeaf(topology)) {
72
+ // Got it
73
+ return topology.identitySigner;
74
+ }
75
+ if (isSessionsBranch(topology)) {
76
+ // Check branches
77
+ const results = topology.map(getIdentitySigner).filter((t) => t !== null);
78
+ if (results.length > 1) {
79
+ throw new Error('Multiple identity signers');
80
+ }
81
+ if (results.length === 1) {
82
+ return results[0];
83
+ }
84
+ }
85
+ return null;
86
+ }
87
+ /**
88
+ * Gets the implicit blacklist from the topology.
89
+ * @param topology The topology to get the implicit blacklist from
90
+ * @returns The implicit blacklist or null if it's not present
91
+ */
92
+ export function getImplicitBlacklist(topology) {
93
+ const blacklistNode = getImplicitBlacklistLeaf(topology);
94
+ if (!blacklistNode) {
95
+ return null;
96
+ }
97
+ return blacklistNode.blacklist;
98
+ }
99
+ /**
100
+ * Gets the implicit blacklist leaf from the topology.
101
+ * @param topology The topology to get the implicit blacklist leaf from
102
+ * @returns The implicit blacklist leaf or null if it's not present
103
+ */
104
+ export function getImplicitBlacklistLeaf(topology) {
105
+ if (isImplicitBlacklist(topology)) {
106
+ // Got it
107
+ return topology;
108
+ }
109
+ if (isSessionsBranch(topology)) {
110
+ // Check branches
111
+ const results = topology.map(getImplicitBlacklistLeaf).filter((t) => t !== null);
112
+ if (results.length > 1) {
113
+ throw new Error('Multiple blacklists');
114
+ }
115
+ if (results.length === 1) {
116
+ return results[0];
117
+ }
118
+ }
119
+ return null;
120
+ }
121
+ export function getSessionPermissions(topology, address) {
122
+ if (isSessionPermissions(topology)) {
123
+ if (Address.isEqual(topology.signer, address)) {
124
+ return topology;
125
+ }
126
+ }
127
+ if (isSessionsBranch(topology)) {
128
+ for (const child of topology) {
129
+ const result = getSessionPermissions(child, address);
130
+ if (result) {
131
+ return result;
132
+ }
133
+ }
134
+ }
135
+ return null;
136
+ }
137
+ export function getExplicitSigners(topology) {
138
+ return getExplicitSignersFromBranch(topology, []);
139
+ }
140
+ function getExplicitSignersFromBranch(topology, current) {
141
+ if (isSessionPermissions(topology)) {
142
+ return [...current, topology.signer];
143
+ }
144
+ if (isSessionsBranch(topology)) {
145
+ const result = [...current];
146
+ for (const child of topology) {
147
+ result.push(...getExplicitSignersFromBranch(child, current));
148
+ }
149
+ return result;
150
+ }
151
+ return current;
152
+ }
153
+ // Encode / decode to configuration tree
154
+ /**
155
+ * Encodes a leaf to bytes.
156
+ * This can be Hash.keccak256'd to convert to a node..
157
+ * @param leaf The leaf to encode
158
+ * @returns The encoded leaf
159
+ */
160
+ export function encodeLeafToGeneric(leaf) {
161
+ if (isSessionPermissions(leaf)) {
162
+ return {
163
+ type: 'leaf',
164
+ value: Bytes.concat(Bytes.fromNumber(SESSIONS_FLAG_PERMISSIONS), encodeSessionPermissions(leaf)),
165
+ };
166
+ }
167
+ if (isImplicitBlacklist(leaf)) {
168
+ return {
169
+ type: 'leaf',
170
+ value: Bytes.concat(Bytes.fromNumber(SESSIONS_FLAG_BLACKLIST), Bytes.concat(...leaf.blacklist.map((b) => Bytes.padLeft(Bytes.fromHex(b), 20)))),
171
+ };
172
+ }
173
+ if (isIdentitySignerLeaf(leaf)) {
174
+ return {
175
+ type: 'leaf',
176
+ value: Bytes.concat(Bytes.fromNumber(SESSIONS_FLAG_IDENTITY_SIGNER), Bytes.padLeft(Bytes.fromHex(leaf.identitySigner), 20)),
177
+ };
178
+ }
179
+ // Unreachable
180
+ throw new Error('Invalid leaf');
181
+ }
182
+ export function decodeLeafFromBytes(bytes) {
183
+ const flag = bytes[0];
184
+ if (flag === SESSIONS_FLAG_BLACKLIST) {
185
+ const blacklist = [];
186
+ for (let i = 1; i < bytes.length; i += 20) {
187
+ blacklist.push(Bytes.toHex(bytes.slice(i, i + 20)));
188
+ }
189
+ return { type: 'implicit-blacklist', blacklist };
190
+ }
191
+ if (flag === SESSIONS_FLAG_IDENTITY_SIGNER) {
192
+ return { type: 'identity-signer', identitySigner: Bytes.toHex(bytes.slice(1, 21)) };
193
+ }
194
+ if (flag === SESSIONS_FLAG_PERMISSIONS) {
195
+ return { type: 'session-permissions', ...decodeSessionPermissions(bytes.slice(1)) };
196
+ }
197
+ throw new Error('Invalid leaf');
198
+ }
199
+ export function sessionsTopologyToConfigurationTree(topology) {
200
+ if (isSessionsBranch(topology)) {
201
+ return topology.map(sessionsTopologyToConfigurationTree);
202
+ }
203
+ if (isImplicitBlacklist(topology) || isIdentitySignerLeaf(topology) || isSessionPermissions(topology)) {
204
+ return encodeLeafToGeneric(topology);
205
+ }
206
+ if (isSessionsNode(topology)) {
207
+ // A node is already encoded and hashed
208
+ return topology;
209
+ }
210
+ throw new Error('Invalid topology');
211
+ }
212
+ export function configurationTreeToSessionsTopology(tree) {
213
+ if (GenericTree.isBranch(tree)) {
214
+ return tree.map(configurationTreeToSessionsTopology);
215
+ }
216
+ if (GenericTree.isNode(tree)) {
217
+ throw new Error('Unknown in configuration tree');
218
+ }
219
+ return decodeLeafFromBytes(tree.value);
220
+ }
221
+ // Encoding for contract validation
222
+ /**
223
+ * Encodes a topology into bytes for contract validation.
224
+ * @param topology The topology to encode
225
+ * @returns The encoded topology
226
+ */
227
+ export function encodeSessionsTopology(topology) {
228
+ if (isSessionsBranch(topology)) {
229
+ const encodedBranches = [];
230
+ for (const node of topology) {
231
+ encodedBranches.push(encodeSessionsTopology(node));
232
+ }
233
+ const encoded = Bytes.concat(...encodedBranches);
234
+ const encodedSize = minBytesFor(BigInt(encoded.length));
235
+ if (encodedSize > 15) {
236
+ throw new Error('Branch too large');
237
+ }
238
+ const flagByte = (SESSIONS_FLAG_BRANCH << 4) | encodedSize;
239
+ return Bytes.concat(Bytes.fromNumber(flagByte), Bytes.padLeft(Bytes.fromNumber(encoded.length), encodedSize), encoded);
240
+ }
241
+ if (isSessionPermissions(topology)) {
242
+ const flagByte = SESSIONS_FLAG_PERMISSIONS << 4;
243
+ const encodedLeaf = encodeSessionPermissions(topology);
244
+ return Bytes.concat(Bytes.fromNumber(flagByte), encodedLeaf);
245
+ }
246
+ if (isSessionsNode(topology)) {
247
+ const flagByte = SESSIONS_FLAG_NODE << 4;
248
+ return Bytes.concat(Bytes.fromNumber(flagByte), Hex.toBytes(topology));
249
+ }
250
+ if (isImplicitBlacklist(topology)) {
251
+ const encoded = Bytes.concat(...topology.blacklist.map((b) => Bytes.fromHex(b)));
252
+ if (topology.blacklist.length >= 0x0f) {
253
+ // If the blacklist is too large, we can't encode the length into the flag byte.
254
+ // Instead we encode 0x0f and the length in the next 2 bytes.
255
+ if (topology.blacklist.length > 0xffff) {
256
+ throw new Error('Blacklist too large');
257
+ }
258
+ return Bytes.concat(Bytes.fromNumber((SESSIONS_FLAG_BLACKLIST << 4) | 0x0f), Bytes.fromNumber(topology.blacklist.length, { size: 2 }), encoded);
259
+ }
260
+ // Encode the size into the flag byte
261
+ const flagByte = (SESSIONS_FLAG_BLACKLIST << 4) | topology.blacklist.length;
262
+ return Bytes.concat(Bytes.fromNumber(flagByte), encoded);
263
+ }
264
+ if (isIdentitySignerLeaf(topology)) {
265
+ const flagByte = SESSIONS_FLAG_IDENTITY_SIGNER << 4;
266
+ return Bytes.concat(Bytes.fromNumber(flagByte), Bytes.padLeft(Bytes.fromHex(topology.identitySigner), 20));
267
+ }
268
+ throw new Error('Invalid topology');
269
+ }
270
+ // JSON
271
+ export function sessionsTopologyToJson(topology) {
272
+ return JSON.stringify(encodeSessionsTopologyForJson(topology));
273
+ }
274
+ function encodeSessionsTopologyForJson(topology) {
275
+ if (isSessionsNode(topology)) {
276
+ return topology;
277
+ }
278
+ if (isSessionPermissions(topology)) {
279
+ return encodeSessionPermissionsForJson(topology);
280
+ }
281
+ if (isImplicitBlacklist(topology) || isIdentitySignerLeaf(topology)) {
282
+ return topology; // No encoding necessary
283
+ }
284
+ if (isSessionsBranch(topology)) {
285
+ return topology.map((node) => encodeSessionsTopologyForJson(node));
286
+ }
287
+ throw new Error('Invalid topology');
288
+ }
289
+ export function sessionsTopologyFromJson(json) {
290
+ const parsed = JSON.parse(json);
291
+ return sessionsTopologyFromParsed(parsed);
292
+ }
293
+ function sessionsTopologyFromParsed(parsed) {
294
+ // Parse branch
295
+ if (Array.isArray(parsed)) {
296
+ const branches = parsed.map((node) => sessionsTopologyFromParsed(node));
297
+ return branches;
298
+ }
299
+ // Parse node
300
+ if (typeof parsed === 'string' && Hex.validate(parsed) && Hex.size(parsed) === 32) {
301
+ return parsed;
302
+ }
303
+ // Parse permissions
304
+ if (typeof parsed === 'object' &&
305
+ parsed !== null &&
306
+ 'signer' in parsed &&
307
+ 'valueLimit' in parsed &&
308
+ 'deadline' in parsed &&
309
+ 'permissions' in parsed) {
310
+ return { type: 'session-permissions', ...sessionPermissionsFromParsed(parsed) };
311
+ }
312
+ // Parse identity signer
313
+ if (typeof parsed === 'object' && parsed !== null && 'identitySigner' in parsed) {
314
+ const identitySigner = parsed.identitySigner;
315
+ return { type: 'identity-signer', identitySigner };
316
+ }
317
+ // Parse blacklist
318
+ if (typeof parsed === 'object' && parsed !== null && 'blacklist' in parsed) {
319
+ const blacklist = parsed.blacklist.map((address) => Address.from(address));
320
+ return { type: 'implicit-blacklist', blacklist };
321
+ }
322
+ throw new Error('Invalid topology');
323
+ }
324
+ // Operations
325
+ /**
326
+ * Removes all explicit sessions (permissions leaf nodes) that match the given signer from the topology.
327
+ * Returns the updated topology or null if it becomes empty (for nesting).
328
+ * If the signer is not found, the topology is returned unchanged.
329
+ */
330
+ export function removeExplicitSession(topology, signerAddress) {
331
+ if (isSessionPermissions(topology)) {
332
+ if (Address.isEqual(topology.signer, signerAddress)) {
333
+ return null;
334
+ }
335
+ // Return the leaf unchanged
336
+ return topology;
337
+ }
338
+ // If it's a branch, recurse on each child:
339
+ if (isSessionsBranch(topology)) {
340
+ const newChildren = [];
341
+ for (const child of topology) {
342
+ const updatedChild = removeExplicitSession(child, signerAddress);
343
+ if (updatedChild != null) {
344
+ newChildren.push(updatedChild);
345
+ }
346
+ }
347
+ // If no children remain, return null to remove entire branch
348
+ if (newChildren.length === 0) {
349
+ return null;
350
+ }
351
+ // If exactly one child remains, collapse upward
352
+ if (newChildren.length === 1) {
353
+ return newChildren[0];
354
+ }
355
+ // Otherwise, return the updated branch
356
+ return newChildren;
357
+ }
358
+ // Other leaf, return unchanged
359
+ return topology;
360
+ }
361
+ export function addExplicitSession(topology, sessionPermissions) {
362
+ // Find the session in the topology
363
+ if (getSessionPermissions(topology, sessionPermissions.signer)) {
364
+ throw new Error('Session already exists');
365
+ }
366
+ // Merge and balance
367
+ const merged = mergeSessionsTopologies(topology, { type: 'session-permissions', ...sessionPermissions });
368
+ return balanceSessionsTopology(merged);
369
+ }
370
+ /**
371
+ * Merges two topologies into a new branch of [a, b].
372
+ */
373
+ export function mergeSessionsTopologies(a, b) {
374
+ return [a, b];
375
+ }
376
+ /**
377
+ * Helper to flatten a topology into an array of leaves and nodes only.
378
+ * We ignore branches by recursing into them.
379
+ */
380
+ function flattenSessionsTopology(topology) {
381
+ if (isSessionsLeaf(topology) || isSessionsNode(topology)) {
382
+ return [topology];
383
+ }
384
+ // If it's a branch, flatten all children
385
+ const result = [];
386
+ for (const child of topology) {
387
+ result.push(...flattenSessionsTopology(child));
388
+ }
389
+ return result;
390
+ }
391
+ /**
392
+ * Helper to build a balanced binary tree from an array of leaves/nodes.
393
+ * This function returns:
394
+ * - A single leaf/node if there's only 1 item
395
+ * - A branch of two subtrees otherwise
396
+ */
397
+ function buildBalancedSessionsTopology(items) {
398
+ if (items.length === 1) {
399
+ return items[0];
400
+ }
401
+ if (items.length === 0) {
402
+ throw new Error('Cannot build a topology from an empty list');
403
+ }
404
+ const mid = Math.floor(items.length / 2);
405
+ const left = items.slice(0, mid);
406
+ const right = items.slice(mid);
407
+ // Recursively build subtrees
408
+ const leftTopo = buildBalancedSessionsTopology(left);
409
+ const rightTopo = buildBalancedSessionsTopology(right);
410
+ return [leftTopo, rightTopo];
411
+ }
412
+ /**
413
+ * Balances the topology by flattening and rebuilding as a balanced binary tree.
414
+ * This does not make a binary tree as the blacklist and identity signer are included at the top level.
415
+ */
416
+ export function balanceSessionsTopology(topology) {
417
+ const flattened = flattenSessionsTopology(topology);
418
+ const blacklist = flattened.find((l) => isImplicitBlacklist(l));
419
+ const identitySigner = flattened.find((l) => isIdentitySignerLeaf(l));
420
+ const leaves = flattened.filter((l) => isSessionPermissions(l));
421
+ if (!blacklist || !identitySigner) {
422
+ throw new Error('No blacklist or identity signer');
423
+ }
424
+ return buildBalancedSessionsTopology([blacklist, identitySigner, ...leaves]);
425
+ }
426
+ /**
427
+ * Cleans a topology by removing leaves (SessionPermissions) whose deadline has expired.
428
+ * - currentTime is compared against `session.deadline`.
429
+ * - If a branch ends up with zero valid leaves, return `null`.
430
+ * - If it has one child, collapse that child upward.
431
+ */
432
+ export function cleanSessionsTopology(topology, currentTime = BigInt(Math.floor(Date.now() / 1000))) {
433
+ // If it's a node, just return it as is.
434
+ if (isSessionsNode(topology)) {
435
+ return topology;
436
+ }
437
+ // If it's a leaf, check the deadline
438
+ if (isSessionPermissions(topology)) {
439
+ if (topology.deadline < currentTime) {
440
+ // Expired => remove
441
+ return null;
442
+ }
443
+ // Valid => keep
444
+ return topology;
445
+ }
446
+ if (isIdentitySignerLeaf(topology) || isImplicitBlacklist(topology)) {
447
+ return topology;
448
+ }
449
+ // If it's a branch, clean all children
450
+ const newChildren = [];
451
+ for (const child of topology) {
452
+ const cleanedChild = cleanSessionsTopology(child, currentTime);
453
+ if (cleanedChild !== null) {
454
+ newChildren.push(cleanedChild);
455
+ }
456
+ }
457
+ // If no children remain, return null
458
+ if (newChildren.length === 0) {
459
+ return null;
460
+ }
461
+ // If exactly one child remains, collapse upward:
462
+ if (newChildren.length === 1) {
463
+ return newChildren[0];
464
+ }
465
+ // Otherwise, return a new branch with the cleaned children
466
+ return newChildren;
467
+ }
468
+ /**
469
+ * Minimise the topology by rolling unused signers into nodes.
470
+ * @param topology The topology to minimise
471
+ * @param signers The list of signers to consider
472
+ * @returns The minimised topology
473
+ */
474
+ export function minimiseSessionsTopology(topology, explicitSigners = [], implicitSigners = []) {
475
+ if (isSessionsBranch(topology)) {
476
+ const branches = topology.map((b) => minimiseSessionsTopology(b, explicitSigners, implicitSigners));
477
+ // If all branches are nodes, the branch can be a node too
478
+ if (branches.every((b) => isSessionsNode(b))) {
479
+ return Hash.keccak256(Bytes.concat(...branches.map((b) => Hex.toBytes(b))), { as: 'Hex' });
480
+ }
481
+ return branches;
482
+ }
483
+ if (isSessionPermissions(topology)) {
484
+ if (explicitSigners.includes(topology.signer)) {
485
+ // Don't role it up as signer permissions must be visible
486
+ return topology;
487
+ }
488
+ return GenericTree.hash(encodeLeafToGeneric(topology));
489
+ }
490
+ if (isImplicitBlacklist(topology)) {
491
+ if (implicitSigners.length === 0) {
492
+ // No implicit signers, so we can roll up the blacklist
493
+ return GenericTree.hash(encodeLeafToGeneric(topology));
494
+ }
495
+ // If there are implicit signers, we can't roll up the blacklist
496
+ return topology;
497
+ }
498
+ if (isIdentitySignerLeaf(topology)) {
499
+ // Never roll up the identity signer
500
+ return topology;
501
+ }
502
+ if (isSessionsNode(topology)) {
503
+ // Node is already encoded and hashed
504
+ return topology;
505
+ }
506
+ // Unreachable
507
+ throw new Error('Invalid topology');
508
+ }
509
+ /**
510
+ * Adds an address to the implicit session's blacklist.
511
+ * If the address is not already in the blacklist, it is added and the list is sorted.
512
+ */
513
+ export function addToImplicitBlacklist(topology, address) {
514
+ const blacklistNode = getImplicitBlacklistLeaf(topology);
515
+ if (!blacklistNode) {
516
+ throw new Error('No blacklist found');
517
+ }
518
+ const { blacklist } = blacklistNode;
519
+ if (blacklist.some((addr) => Address.isEqual(addr, address))) {
520
+ return topology;
521
+ }
522
+ blacklist.push(address);
523
+ blacklist.sort(); // keep sorted so on-chain binary search works as expected
524
+ return topology;
525
+ }
526
+ /**
527
+ * Removes an address from the implicit session's blacklist.
528
+ */
529
+ export function removeFromImplicitBlacklist(topology, address) {
530
+ const blacklistNode = getImplicitBlacklistLeaf(topology);
531
+ if (!blacklistNode) {
532
+ throw new Error('No blacklist found');
533
+ }
534
+ const { blacklist } = blacklistNode;
535
+ const newBlacklist = blacklist.filter((a) => a !== address);
536
+ blacklistNode.blacklist = newBlacklist;
537
+ return topology;
538
+ }
539
+ /**
540
+ * Generate an empty sessions topology with the given identity signer. No session permission and an empty blacklist
541
+ */
542
+ export function emptySessionsTopology(identitySigner) {
543
+ return [
544
+ {
545
+ type: 'implicit-blacklist',
546
+ blacklist: [],
547
+ },
548
+ {
549
+ type: 'identity-signer',
550
+ identitySigner,
551
+ },
552
+ ];
553
+ }
554
+ //# sourceMappingURL=session-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-config.js","sourceRoot":"","sources":["../src/session-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Address, Bytes, Hex } from 'ox';
2
+ import { Attestation } from './attestation.js';
3
+ import { SessionsTopology } from './session-config.js';
4
+ import { RSY } from './signature.js';
5
+ import { Payload } from './index.js';
6
+ export type ImplicitSessionCallSignature = {
7
+ attestation: Attestation;
8
+ identitySignature: RSY;
9
+ sessionSignature: RSY;
10
+ };
11
+ export type ExplicitSessionCallSignature = {
12
+ permissionIndex: bigint;
13
+ sessionSignature: RSY;
14
+ };
15
+ export type SessionCallSignature = ImplicitSessionCallSignature | ExplicitSessionCallSignature;
16
+ export declare function isImplicitSessionCallSignature(callSignature: SessionCallSignature): callSignature is ImplicitSessionCallSignature;
17
+ export declare function isExplicitSessionCallSignature(callSignature: SessionCallSignature): callSignature is ExplicitSessionCallSignature;
18
+ export declare function sessionCallSignatureToJson(callSignature: SessionCallSignature): string;
19
+ export declare function encodeSessionCallSignatureForJson(callSignature: SessionCallSignature): any;
20
+ export declare function sessionCallSignatureFromJson(json: string): SessionCallSignature;
21
+ export declare function sessionCallSignatureFromParsed(decoded: any): SessionCallSignature;
22
+ export declare function encodeSessionCallSignatures(callSignatures: SessionCallSignature[], topology: SessionsTopology, explicitSigners?: Address.Address[], implicitSigners?: Address.Address[]): Bytes.Bytes;
23
+ export declare function hashCallWithReplayProtection(call: Payload.Call, chainId: bigint, space: bigint, nonce: bigint): Hex.Hex;
24
+ //# sourceMappingURL=session-signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-signature.d.ts","sourceRoot":"","sources":["../src/session-signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAQ,GAAG,EAAE,MAAM,IAAI,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAqC,MAAM,kBAAkB,CAAA;AAEjF,OAAO,EAIL,gBAAgB,EACjB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAEpC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC,MAAM,MAAM,4BAA4B,GAAG;IACzC,WAAW,EAAE,WAAW,CAAA;IACxB,iBAAiB,EAAE,GAAG,CAAA;IACtB,gBAAgB,EAAE,GAAG,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,GAAG,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,4BAA4B,GAAG,4BAA4B,CAAA;AAE9F,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,oBAAoB,GAClC,aAAa,IAAI,4BAA4B,CAE/C;AAED,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,oBAAoB,GAClC,aAAa,IAAI,4BAA4B,CAE/C;AAID,wBAAgB,0BAA0B,CAAC,aAAa,EAAE,oBAAoB,GAAG,MAAM,CAEtF;AAED,wBAAgB,iCAAiC,CAAC,aAAa,EAAE,oBAAoB,GAAG,GAAG,CAe1F;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAG/E;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,GAAG,GAAG,oBAAoB,CAejF;AAwBD,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,oBAAoB,EAAE,EACtC,QAAQ,EAAE,gBAAgB,EAC1B,eAAe,GAAE,OAAO,CAAC,OAAO,EAAO,EACvC,eAAe,GAAE,OAAO,CAAC,OAAO,EAAO,GACtC,KAAK,CAAC,KAAK,CAkEb;AAID,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,GAAG,CAAC,GAAG,CAWT"}