@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.
- package/.turbo/turbo-build.log +5 -0
- package/CHANGELOG.md +7 -0
- package/LICENSE +202 -0
- package/dist/address.d.ts +5 -0
- package/dist/address.d.ts.map +1 -0
- package/dist/address.js +7 -0
- package/dist/address.js.map +1 -0
- package/dist/attestation.d.ts +24 -0
- package/dist/attestation.d.ts.map +1 -0
- package/dist/attestation.js +77 -0
- package/dist/attestation.js.map +1 -0
- package/dist/config.d.ts +85 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +381 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +173 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +31 -0
- package/dist/constants.js.map +1 -0
- package/dist/context.d.ts +9 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +8 -0
- package/dist/context.js.map +1 -0
- package/dist/erc-6492.d.ts +19 -0
- package/dist/erc-6492.d.ts.map +1 -0
- package/dist/erc-6492.js +64 -0
- package/dist/erc-6492.js.map +1 -0
- package/dist/extensions/index.d.ts +9 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +7 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/passkeys.d.ts +31 -0
- package/dist/extensions/passkeys.d.ts.map +1 -0
- package/dist/extensions/passkeys.js +224 -0
- package/dist/extensions/passkeys.js.map +1 -0
- package/dist/extensions/recovery.d.ts +310 -0
- package/dist/extensions/recovery.d.ts.map +1 -0
- package/dist/extensions/recovery.js +444 -0
- package/dist/extensions/recovery.js.map +1 -0
- package/dist/generic-tree.d.ts +14 -0
- package/dist/generic-tree.d.ts.map +1 -0
- package/dist/generic-tree.js +34 -0
- package/dist/generic-tree.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/network.d.ts +15 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +24 -0
- package/dist/network.js.map +1 -0
- package/dist/payload.d.ts +108 -0
- package/dist/payload.d.ts.map +1 -0
- package/dist/payload.js +627 -0
- package/dist/payload.js.map +1 -0
- package/dist/permission.d.ts +73 -0
- package/dist/permission.d.ts.map +1 -0
- package/dist/permission.js +188 -0
- package/dist/permission.js.map +1 -0
- package/dist/session-config.d.ts +113 -0
- package/dist/session-config.d.ts.map +1 -0
- package/dist/session-config.js +554 -0
- package/dist/session-config.js.map +1 -0
- package/dist/session-signature.d.ts +24 -0
- package/dist/session-signature.d.ts.map +1 -0
- package/dist/session-signature.js +141 -0
- package/dist/session-signature.js.map +1 -0
- package/dist/signature.d.ts +108 -0
- package/dist/signature.d.ts.map +1 -0
- package/dist/signature.js +1079 -0
- package/dist/signature.js.map +1 -0
- package/dist/utils.d.ts +45 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +100 -0
- package/dist/utils.js.map +1 -0
- package/eslint.config.mjs +4 -0
- package/package.json +27 -0
- package/src/address.ts +19 -0
- package/src/attestation.ts +114 -0
- package/src/config.ts +521 -0
- package/src/constants.ts +39 -0
- package/src/context.ts +16 -0
- package/src/erc-6492.ts +97 -0
- package/src/extensions/index.ts +14 -0
- package/src/extensions/passkeys.ts +283 -0
- package/src/extensions/recovery.ts +542 -0
- package/src/generic-tree.ts +55 -0
- package/src/index.ts +15 -0
- package/src/network.ts +37 -0
- package/src/payload.ts +825 -0
- package/src/permission.ts +252 -0
- package/src/session-config.ts +681 -0
- package/src/session-signature.ts +197 -0
- package/src/signature.ts +1398 -0
- package/src/utils.ts +114 -0
- 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":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,IAAI,CAAA;AAC9C,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAA;AAChD,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,+BAA+B,EAE/B,4BAA4B,GAC7B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,iCAAiC;AACjC,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAA;AAC1C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAA;AACnC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAA;AACrC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAA;AACxC,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAA;AAqB9C,SAAS,cAAc,CAAC,QAAa;IACnC,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;AAC5D,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAa;IACxC,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,WAAW,IAAI,QAAQ,CAAA;AACrF,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAa;IACzC,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,gBAAgB,IAAI,QAAQ,CAAA;AAC1F,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAa;IACzC,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,IAAI,QAAQ,CAAA;AAClF,CAAC;AAED,SAAS,cAAc,CAAC,QAAa;IACnC,OAAO,mBAAmB,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAAA;AAC1G,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAa;IACrC,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAA;AAChH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAa;IAC9C,OAAO,gBAAgB,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAA;AAC3F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAAa;IACtD,2CAA2C;IAC3C,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,OAAO,KAAK,CAAA;IACd,CAAC;IACD,4EAA4E;IAC5E,MAAM,EAAE,mBAAmB,EAAE,cAAc,EAAE,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAA;IACvF,OAAO,mBAAmB,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,CAAA;AAC1D,CAAC;AAED,SAAS,6BAA6B,CAAC,QAA0B;IAI/D,IAAI,qBAAqB,GAAG,CAAC,CAAA;IAC7B,IAAI,gBAAgB,GAAG,CAAC,CAAA;IACxB,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,EAAE,mBAAmB,EAAE,cAAc,EAAE,GAAG,6BAA6B,CAAC,KAAK,CAAC,CAAA;YACpF,qBAAqB,IAAI,mBAAmB,CAAA;YAC5C,gBAAgB,IAAI,cAAc,CAAA;QACpC,CAAC;IACH,CAAC;IACD,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,qBAAqB,EAAE,CAAA;IACzB,CAAC;IACD,IAAI,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,gBAAgB,EAAE,CAAA;IACpB,CAAC;IACD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAA;AACzF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAA0B;IAC1D,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,SAAS;QACT,OAAO,QAAQ,CAAC,cAAc,CAAA;IAChC,CAAC;IAED,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,iBAAiB;QACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;QACzE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAC9C,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,CAAC,CAAE,CAAA;QACpB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAA0B;IAC7D,MAAM,aAAa,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAA;IACxD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,aAAa,CAAC,SAAS,CAAA;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAA0B;IACjE,IAAI,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,SAAS;QACT,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,iBAAiB;QACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;QAChF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACxC,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,CAAC,CAAE,CAAA;QACpB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAA0B,EAAE,OAAwB;IACxF,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YAC9C,OAAO,QAAQ,CAAA;QACjB,CAAC;IACH,CAAC;IACD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YACpD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAA0B;IAC3D,OAAO,4BAA4B,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;AACnD,CAAC;AAED,SAAS,4BAA4B,CAAC,QAA0B,EAAE,OAA0B;IAC1F,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC;IACD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAsB,CAAC,GAAG,OAAO,CAAC,CAAA;QAC9C,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,4BAA4B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;QAC9D,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,wCAAwC;AAExC;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAiB;IACnD,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,yBAAyB,CAAC,EAAE,wBAAwB,CAAC,IAAI,CAAC,CAAC;SACjG,CAAA;IACH,CAAC;IACD,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,KAAK,CAAC,MAAM,CACjB,KAAK,CAAC,UAAU,CAAC,uBAAuB,CAAC,EACzC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAChF;SACF,CAAA;IACH,CAAC;IACD,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,KAAK,CAAC,MAAM,CACjB,KAAK,CAAC,UAAU,CAAC,6BAA6B,CAAC,EAC/C,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CACtD;SACF,CAAA;IACH,CAAC;IACD,cAAc;IACd,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAkB;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;IACtB,IAAI,IAAI,KAAK,uBAAuB,EAAE,CAAC;QACrC,MAAM,SAAS,GAAoB,EAAE,CAAA;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1C,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;QACrD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAA;IAClD,CAAC;IACD,IAAI,IAAI,KAAK,6BAA6B,EAAE,CAAC;QAC3C,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAA;IACrF,CAAC;IACD,IAAI,IAAI,KAAK,yBAAyB,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,GAAG,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACrF,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,mCAAmC,CAAC,QAA0B;IAC5E,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO,QAAQ,CAAC,GAAG,CAAC,mCAAmC,CAAuB,CAAA;IAChF,CAAC;IACD,IAAI,mBAAmB,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtG,OAAO,mBAAmB,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC;IACD,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,uCAAuC;QACvC,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,mCAAmC,CAAC,IAAsB;IACxE,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,mCAAmC,CAAkB,CAAA;IACvE,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAClD,CAAC;IAED,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACxC,CAAC;AAED,mCAAmC;AAEnC;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA0B;IAC/D,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,EAAE,CAAA;QAC1B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,eAAe,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAA;QACpD,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC,CAAA;QAChD,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;QACvD,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACrC,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,oBAAoB,IAAI,CAAC,CAAC,GAAG,WAAW,CAAA;QAC1D,OAAO,KAAK,CAAC,MAAM,CACjB,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAC1B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAC5D,OAAO,CACR,CAAA;IACH,CAAC;IAED,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,yBAAyB,IAAI,CAAC,CAAA;QAC/C,MAAM,WAAW,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAA;QACtD,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAA;IAC9D,CAAC;IAED,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,kBAAkB,IAAI,CAAC,CAAA;QACxC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;IACxE,CAAC;IAED,IAAI,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAChF,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YACtC,gFAAgF;YAChF,6DAA6D;YAC7D,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;YACxC,CAAC;YACD,OAAO,KAAK,CAAC,MAAM,CACjB,KAAK,CAAC,UAAU,CAAC,CAAC,uBAAuB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EACvD,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EACxD,OAAO,CACR,CAAA;QACH,CAAC;QACD,qCAAqC;QACrC,MAAM,QAAQ,GAAG,CAAC,uBAAuB,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAA;QAC3E,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAA;IAC1D,CAAC;IAED,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,6BAA6B,IAAI,CAAC,CAAA;QACnD,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IAC5G,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;AACrC,CAAC;AAED,OAAO;AAEP,MAAM,UAAU,sBAAsB,CAAC,QAA0B;IAC/D,OAAO,IAAI,CAAC,SAAS,CAAC,6BAA6B,CAAC,QAAQ,CAAC,CAAC,CAAA;AAChE,CAAC;AAED,SAAS,6BAA6B,CAAC,QAA0B;IAC/D,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,+BAA+B,CAAC,QAAQ,CAAC,CAAA;IAClD,CAAC;IAED,IAAI,mBAAmB,CAAC,QAAQ,CAAC,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpE,OAAO,QAAQ,CAAA,CAAC,wBAAwB;IAC1C,CAAC;IAED,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAA;IACpE,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/B,OAAO,0BAA0B,CAAC,MAAM,CAAC,CAAA;AAC3C,CAAC;AAED,SAAS,0BAA0B,CAAC,MAAW;IAC7C,eAAe;IACf,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAA;QAC5E,OAAO,QAAyB,CAAA;IAClC,CAAC;IAED,aAAa;IACb,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QAClF,OAAO,MAAM,CAAA;IACf,CAAC;IAED,oBAAoB;IACpB,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,KAAK,IAAI;QACf,QAAQ,IAAI,MAAM;QAClB,YAAY,IAAI,MAAM;QACtB,UAAU,IAAI,MAAM;QACpB,aAAa,IAAI,MAAM,EACvB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,GAAG,4BAA4B,CAAC,MAAM,CAAC,EAAE,CAAA;IACjF,CAAC;IAED,wBAAwB;IACxB,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,gBAAgB,IAAI,MAAM,EAAE,CAAC;QAChF,MAAM,cAAc,GAAG,MAAM,CAAC,cAA+B,CAAA;QAC7D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAA;IACpD,CAAC;IAED,kBAAkB;IAClB,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;QAC3E,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;QAC/E,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAA;IAClD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;AACrC,CAAC;AAED,aAAa;AAEb;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAA0B,EAC1B,aAA4B;IAE5B,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;YACpD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,4BAA4B;QAC5B,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,2CAA2C;IAC3C,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAuB,EAAE,CAAA;QAC1C,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,YAAY,GAAG,qBAAqB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAA;YAChE,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;gBACzB,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAChC,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,gDAAgD;QAChD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,WAAW,CAAC,CAAC,CAAE,CAAA;QACxB,CAAC;QAED,uCAAuC;QACvC,OAAO,WAA4B,CAAA;IACrC,CAAC;IAED,+BAA+B;IAC/B,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAA0B,EAC1B,kBAAsC;IAEtC,mCAAmC;IACnC,IAAI,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC3C,CAAC;IACD,oBAAoB;IACpB,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,GAAG,kBAAkB,EAAE,CAAC,CAAA;IACxG,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAA;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,CAAmB,EAAE,CAAmB;IAC9E,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB,CAAC,QAA0B;IACzD,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnB,CAAC;IACD,yCAAyC;IACzC,MAAM,MAAM,GAAkC,EAAE,CAAA;IAChD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,6BAA6B,CAAC,KAAoC;IACzE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,CAAC,CAAE,CAAA;IAClB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC9B,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAA;IACpD,MAAM,SAAS,GAAG,6BAA6B,CAAC,KAAK,CAAC,CAAA;IACtD,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAA0B;IAChE,MAAM,SAAS,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAA;IACnD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/D,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAA;IACrE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/D,IAAI,CAAC,SAAS,IAAI,CAAC,cAAc,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,6BAA6B,CAAC,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,CAAC,CAAA;AAC9E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAA0B,EAC1B,cAAsB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAE3D,wCAAwC;IACxC,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,qCAAqC;IACrC,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,IAAI,QAAQ,CAAC,QAAQ,GAAG,WAAW,EAAE,CAAC;YACpC,oBAAoB;YACpB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,gBAAgB;QAChB,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,IAAI,oBAAoB,CAAC,QAAQ,CAAC,IAAI,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpE,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,uCAAuC;IACvC,MAAM,WAAW,GAAuB,EAAE,CAAA;IAC1C,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QAC9D,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,iDAAiD;IACjD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAC,CAAC,CAAE,CAAA;IACxB,CAAC;IAED,2DAA2D;IAC3D,OAAO,WAA4B,CAAA;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAA0B,EAC1B,kBAAqC,EAAE,EACvC,kBAAqC,EAAE;IAEvC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAC,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC,CAAA;QACnG,0DAA0D;QAC1D,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5F,CAAC;QACD,OAAO,QAAyB,CAAA;IAClC,CAAC;IACD,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,yDAAyD;YACzD,OAAO,QAAQ,CAAA;QACjB,CAAC;QACD,OAAO,WAAW,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAA;IACxD,CAAC;IACD,IAAI,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,uDAAuD;YACvD,OAAO,WAAW,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAA;QACxD,CAAC;QACD,gEAAgE;QAChE,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,oCAAoC;QACpC,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,qCAAqC;QACrC,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,cAAc;IACd,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA0B,EAAE,OAAwB;IACzF,MAAM,aAAa,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAA;IACxD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACvC,CAAC;IACD,MAAM,EAAE,SAAS,EAAE,GAAG,aAAa,CAAA;IACnC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACvB,SAAS,CAAC,IAAI,EAAE,CAAA,CAAC,0DAA0D;IAC3E,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAA0B,EAAE,OAAwB;IAC9F,MAAM,aAAa,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAA;IACxD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACvC,CAAC;IACD,MAAM,EAAE,SAAS,EAAE,GAAG,aAAa,CAAA;IACnC,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAA;IAC3D,aAAa,CAAC,SAAS,GAAG,YAAY,CAAA;IACtC,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,cAA+B;IACnE,OAAO;QACL;YACE,IAAI,EAAE,oBAAoB;YAC1B,SAAS,EAAE,EAAE;SACd;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,cAAc;SACf;KACF,CAAA;AACH,CAAC"}
|
|
@@ -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"}
|