bitbadgesjs-sdk 0.1.86 → 0.2.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.
@@ -0,0 +1,717 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidateUniversalPermissionUpdate = exports.MergeUniversalPermissionDetails = exports.GetFirstMatchOnly = exports.ApprovalPermissionUsedFlags = exports.BalancesActionPermissionUsedFlags = exports.TimedUpdateWithBadgeIdsPermissionUsedFlags = exports.TimedUpdatePermissionUsedFlags = exports.ActionPermissionUsedFlags = exports.GetListWithOptions = exports.GetListIdWithOptions = exports.GetUintRangesWithOptions = exports.universalRemoveOverlaps = exports.universalRemoveOverlapFromValues = exports.getOverlapsAndNonOverlaps = void 0;
4
+ const addressLists_1 = require("./addressLists");
5
+ const string_numbers_1 = require("../common/string-numbers");
6
+ const uintRanges_1 = require("./uintRanges");
7
+ const { getReservedTrackerList } = addressLists_1.AddressList;
8
+ function getOverlapsAndNonOverlaps(firstDetails, secondDetails) {
9
+ let inOldButNotNew = firstDetails;
10
+ let inNewButNotOld = secondDetails;
11
+ const allOverlaps = [];
12
+ for (const oldPermission of firstDetails) {
13
+ for (const newPermission of secondDetails) {
14
+ const [, overlaps] = universalRemoveOverlaps(newPermission, oldPermission);
15
+ for (const overlap of overlaps) {
16
+ allOverlaps.push({
17
+ overlap,
18
+ firstDetails: oldPermission,
19
+ secondDetails: newPermission
20
+ });
21
+ }
22
+ }
23
+ }
24
+ for (const overlap of allOverlaps) {
25
+ [inOldButNotNew] = universalRemoveOverlapFromValues(overlap.overlap, inOldButNotNew);
26
+ [inNewButNotOld] = universalRemoveOverlapFromValues(overlap.overlap, inNewButNotOld);
27
+ }
28
+ return [allOverlaps, inOldButNotNew, inNewButNotOld];
29
+ }
30
+ exports.getOverlapsAndNonOverlaps = getOverlapsAndNonOverlaps;
31
+ function universalRemoveOverlapFromValues(handled, valuesToCheck) {
32
+ const newValuesToCheck = [];
33
+ const removed = [];
34
+ for (const valueToCheck of valuesToCheck) {
35
+ const [remaining, overlaps] = universalRemoveOverlaps(handled, valueToCheck);
36
+ newValuesToCheck.push(...remaining);
37
+ removed.push(...overlaps);
38
+ }
39
+ return [newValuesToCheck, removed];
40
+ }
41
+ exports.universalRemoveOverlapFromValues = universalRemoveOverlapFromValues;
42
+ function universalRemoveOverlaps(handled, valueToCheck) {
43
+ const [timelineTimesAfterRemoval, removedTimelineTimes] = valueToCheck.timelineTime.getOverlapDetails(handled.timelineTime);
44
+ const [badgesAfterRemoval, removedBadges] = valueToCheck.badgeId.getOverlapDetails(handled.badgeId);
45
+ const [transferTimesAfterRemoval, removedTransferTimes] = valueToCheck.transferTime.getOverlapDetails(handled.transferTime);
46
+ const [ownershipTimesAfterRemoval, removedOwnershipTimes] = valueToCheck.ownershipTime.getOverlapDetails(handled.ownershipTime);
47
+ const [toListAfterRemoval, removedToList] = valueToCheck.toList.getOverlapDetails(handled.toList);
48
+ const [fromListAfterRemoval, removedFromList] = valueToCheck.fromList.getOverlapDetails(handled.fromList);
49
+ const [initiatedByListAfterRemoval, removedInitiatedByList] = valueToCheck.initiatedByList.getOverlapDetails(handled.initiatedByList);
50
+ const [approvalIdListAfterRemoval, removedApprovalIdList] = valueToCheck.approvalIdList.getOverlapDetails(handled.approvalIdList);
51
+ const [amountTrackerIdListAfterRemoval, removedAmountTrackerIdList] = valueToCheck.amountTrackerIdList.getOverlapDetails(handled.amountTrackerIdList);
52
+ const [challengeTrackerIdListAfterRemoval, removedChallengeTrackerIdList] = valueToCheck.challengeTrackerIdList.getOverlapDetails(handled.challengeTrackerIdList);
53
+ const removedToListIsEmpty = removedToList.isEmpty();
54
+ const removedFromListIsEmpty = removedFromList.isEmpty();
55
+ const removedInitiatedByListIsEmpty = removedInitiatedByList.isEmpty();
56
+ const removedApprovalIdListIsEmpty = removedApprovalIdList.isEmpty();
57
+ const removedAmountTrackerIdListIsEmpty = removedAmountTrackerIdList.isEmpty();
58
+ const removedChallengeTrackerIdListIsEmpty = removedChallengeTrackerIdList.isEmpty();
59
+ const remaining = [];
60
+ if (removedTimelineTimes.length === 0 ||
61
+ removedBadges.length === 0 ||
62
+ removedTransferTimes.length === 0 ||
63
+ removedOwnershipTimes.length === 0 ||
64
+ removedToListIsEmpty ||
65
+ removedFromListIsEmpty ||
66
+ removedInitiatedByListIsEmpty ||
67
+ removedApprovalIdListIsEmpty ||
68
+ removedAmountTrackerIdListIsEmpty ||
69
+ removedChallengeTrackerIdListIsEmpty) {
70
+ remaining.push(valueToCheck);
71
+ return [remaining, []];
72
+ }
73
+ for (const timelineTimeAfterRemoval of timelineTimesAfterRemoval) {
74
+ remaining.push({
75
+ timelineTime: timelineTimeAfterRemoval,
76
+ badgeId: valueToCheck.badgeId,
77
+ transferTime: valueToCheck.transferTime,
78
+ ownershipTime: valueToCheck.ownershipTime,
79
+ toList: valueToCheck.toList,
80
+ fromList: valueToCheck.fromList,
81
+ initiatedByList: valueToCheck.initiatedByList,
82
+ approvalIdList: valueToCheck.approvalIdList,
83
+ amountTrackerIdList: valueToCheck.amountTrackerIdList,
84
+ challengeTrackerIdList: valueToCheck.challengeTrackerIdList,
85
+ arbitraryValue: valueToCheck.arbitraryValue,
86
+ permanentlyPermittedTimes: uintRanges_1.UintRangeArray.From([]),
87
+ permanentlyForbiddenTimes: uintRanges_1.UintRangeArray.From([])
88
+ });
89
+ }
90
+ for (const badgeAfterRemoval of badgesAfterRemoval) {
91
+ remaining.push({
92
+ timelineTime: removedTimelineTimes[0],
93
+ badgeId: badgeAfterRemoval,
94
+ transferTime: valueToCheck.transferTime,
95
+ ownershipTime: valueToCheck.ownershipTime,
96
+ toList: valueToCheck.toList,
97
+ fromList: valueToCheck.fromList,
98
+ initiatedByList: valueToCheck.initiatedByList,
99
+ arbitraryValue: valueToCheck.arbitraryValue,
100
+ approvalIdList: valueToCheck.approvalIdList,
101
+ amountTrackerIdList: valueToCheck.amountTrackerIdList,
102
+ challengeTrackerIdList: valueToCheck.challengeTrackerIdList,
103
+ permanentlyPermittedTimes: uintRanges_1.UintRangeArray.From([]),
104
+ permanentlyForbiddenTimes: uintRanges_1.UintRangeArray.From([])
105
+ });
106
+ }
107
+ for (const transferTimeAfterRemoval of transferTimesAfterRemoval) {
108
+ remaining.push({
109
+ timelineTime: removedTimelineTimes[0],
110
+ badgeId: removedBadges[0],
111
+ transferTime: transferTimeAfterRemoval,
112
+ ownershipTime: valueToCheck.ownershipTime,
113
+ toList: valueToCheck.toList,
114
+ fromList: valueToCheck.fromList,
115
+ initiatedByList: valueToCheck.initiatedByList,
116
+ arbitraryValue: valueToCheck.arbitraryValue,
117
+ approvalIdList: valueToCheck.approvalIdList,
118
+ amountTrackerIdList: valueToCheck.amountTrackerIdList,
119
+ challengeTrackerIdList: valueToCheck.challengeTrackerIdList,
120
+ permanentlyPermittedTimes: uintRanges_1.UintRangeArray.From([]),
121
+ permanentlyForbiddenTimes: uintRanges_1.UintRangeArray.From([])
122
+ });
123
+ }
124
+ for (const ownershipTimeAfterRemoval of ownershipTimesAfterRemoval) {
125
+ remaining.push({
126
+ timelineTime: removedTimelineTimes[0],
127
+ badgeId: removedBadges[0],
128
+ transferTime: removedTransferTimes[0],
129
+ ownershipTime: ownershipTimeAfterRemoval,
130
+ toList: valueToCheck.toList,
131
+ fromList: valueToCheck.fromList,
132
+ initiatedByList: valueToCheck.initiatedByList,
133
+ arbitraryValue: valueToCheck.arbitraryValue,
134
+ approvalIdList: valueToCheck.approvalIdList,
135
+ amountTrackerIdList: valueToCheck.amountTrackerIdList,
136
+ challengeTrackerIdList: valueToCheck.challengeTrackerIdList,
137
+ permanentlyPermittedTimes: uintRanges_1.UintRangeArray.From([]),
138
+ permanentlyForbiddenTimes: uintRanges_1.UintRangeArray.From([])
139
+ });
140
+ }
141
+ if (!toListAfterRemoval.isEmpty()) {
142
+ remaining.push({
143
+ timelineTime: removedTimelineTimes[0],
144
+ badgeId: removedBadges[0],
145
+ transferTime: removedTransferTimes[0],
146
+ ownershipTime: removedOwnershipTimes[0],
147
+ toList: toListAfterRemoval,
148
+ fromList: valueToCheck.fromList,
149
+ initiatedByList: valueToCheck.initiatedByList,
150
+ approvalIdList: valueToCheck.approvalIdList,
151
+ amountTrackerIdList: valueToCheck.amountTrackerIdList,
152
+ challengeTrackerIdList: valueToCheck.challengeTrackerIdList,
153
+ arbitraryValue: valueToCheck.arbitraryValue,
154
+ permanentlyPermittedTimes: uintRanges_1.UintRangeArray.From([]),
155
+ permanentlyForbiddenTimes: uintRanges_1.UintRangeArray.From([])
156
+ });
157
+ }
158
+ if (!fromListAfterRemoval.isEmpty()) {
159
+ remaining.push({
160
+ timelineTime: removedTimelineTimes[0],
161
+ badgeId: removedBadges[0],
162
+ transferTime: removedTransferTimes[0],
163
+ ownershipTime: removedOwnershipTimes[0],
164
+ toList: removedToList,
165
+ fromList: fromListAfterRemoval,
166
+ initiatedByList: valueToCheck.initiatedByList,
167
+ approvalIdList: valueToCheck.approvalIdList,
168
+ amountTrackerIdList: valueToCheck.amountTrackerIdList,
169
+ challengeTrackerIdList: valueToCheck.challengeTrackerIdList,
170
+ arbitraryValue: valueToCheck.arbitraryValue,
171
+ permanentlyPermittedTimes: uintRanges_1.UintRangeArray.From([]),
172
+ permanentlyForbiddenTimes: uintRanges_1.UintRangeArray.From([])
173
+ });
174
+ }
175
+ if (!initiatedByListAfterRemoval.isEmpty()) {
176
+ remaining.push({
177
+ timelineTime: removedTimelineTimes[0],
178
+ badgeId: removedBadges[0],
179
+ transferTime: removedTransferTimes[0],
180
+ ownershipTime: removedOwnershipTimes[0],
181
+ toList: removedToList,
182
+ fromList: removedFromList,
183
+ initiatedByList: initiatedByListAfterRemoval,
184
+ approvalIdList: valueToCheck.approvalIdList,
185
+ amountTrackerIdList: valueToCheck.amountTrackerIdList,
186
+ challengeTrackerIdList: valueToCheck.challengeTrackerIdList,
187
+ arbitraryValue: valueToCheck.arbitraryValue,
188
+ permanentlyPermittedTimes: uintRanges_1.UintRangeArray.From([]),
189
+ permanentlyForbiddenTimes: uintRanges_1.UintRangeArray.From([])
190
+ });
191
+ }
192
+ if (!approvalIdListAfterRemoval.isEmpty()) {
193
+ remaining.push({
194
+ timelineTime: removedTimelineTimes[0],
195
+ badgeId: removedBadges[0],
196
+ transferTime: removedTransferTimes[0],
197
+ ownershipTime: removedOwnershipTimes[0],
198
+ toList: removedToList,
199
+ fromList: removedFromList,
200
+ initiatedByList: removedInitiatedByList,
201
+ approvalIdList: approvalIdListAfterRemoval,
202
+ amountTrackerIdList: valueToCheck.amountTrackerIdList,
203
+ challengeTrackerIdList: valueToCheck.challengeTrackerIdList,
204
+ arbitraryValue: valueToCheck.arbitraryValue,
205
+ permanentlyPermittedTimes: uintRanges_1.UintRangeArray.From([]),
206
+ permanentlyForbiddenTimes: uintRanges_1.UintRangeArray.From([])
207
+ });
208
+ }
209
+ if (!amountTrackerIdListAfterRemoval.isEmpty()) {
210
+ remaining.push({
211
+ timelineTime: removedTimelineTimes[0],
212
+ badgeId: removedBadges[0],
213
+ transferTime: removedTransferTimes[0],
214
+ ownershipTime: removedOwnershipTimes[0],
215
+ toList: removedToList,
216
+ fromList: removedFromList,
217
+ initiatedByList: removedInitiatedByList,
218
+ approvalIdList: removedApprovalIdList,
219
+ amountTrackerIdList: amountTrackerIdListAfterRemoval,
220
+ challengeTrackerIdList: valueToCheck.challengeTrackerIdList,
221
+ arbitraryValue: valueToCheck.arbitraryValue,
222
+ permanentlyPermittedTimes: uintRanges_1.UintRangeArray.From([]),
223
+ permanentlyForbiddenTimes: uintRanges_1.UintRangeArray.From([])
224
+ });
225
+ }
226
+ if (!challengeTrackerIdListAfterRemoval.isEmpty()) {
227
+ remaining.push({
228
+ timelineTime: removedTimelineTimes[0],
229
+ badgeId: removedBadges[0],
230
+ transferTime: removedTransferTimes[0],
231
+ ownershipTime: removedOwnershipTimes[0],
232
+ toList: removedToList,
233
+ fromList: removedFromList,
234
+ initiatedByList: removedInitiatedByList,
235
+ approvalIdList: removedApprovalIdList,
236
+ amountTrackerIdList: removedAmountTrackerIdList,
237
+ challengeTrackerIdList: challengeTrackerIdListAfterRemoval,
238
+ arbitraryValue: valueToCheck.arbitraryValue,
239
+ permanentlyPermittedTimes: uintRanges_1.UintRangeArray.From([]),
240
+ permanentlyForbiddenTimes: uintRanges_1.UintRangeArray.From([])
241
+ });
242
+ }
243
+ const removed = [];
244
+ for (const removedTimelineTime of removedTimelineTimes) {
245
+ for (const removedBadge of removedBadges) {
246
+ for (const removedTransferTime of removedTransferTimes) {
247
+ for (const removedOwnershipTime of removedOwnershipTimes) {
248
+ removed.push({
249
+ timelineTime: removedTimelineTime,
250
+ badgeId: removedBadge,
251
+ transferTime: removedTransferTime,
252
+ ownershipTime: removedOwnershipTime,
253
+ toList: removedToList,
254
+ fromList: removedFromList,
255
+ initiatedByList: removedInitiatedByList,
256
+ approvalIdList: removedApprovalIdList,
257
+ amountTrackerIdList: removedAmountTrackerIdList,
258
+ challengeTrackerIdList: removedChallengeTrackerIdList,
259
+ arbitraryValue: valueToCheck.arbitraryValue,
260
+ permanentlyForbiddenTimes: uintRanges_1.UintRangeArray.From([]),
261
+ permanentlyPermittedTimes: uintRanges_1.UintRangeArray.From([])
262
+ });
263
+ }
264
+ }
265
+ }
266
+ }
267
+ return [remaining, removed];
268
+ }
269
+ exports.universalRemoveOverlaps = universalRemoveOverlaps;
270
+ function GetUintRangesWithOptions(_ranges, uses) {
271
+ let ranges = _ranges.map((x) => x.convert(string_numbers_1.BigIntify));
272
+ if (!uses) {
273
+ ranges = [new uintRanges_1.UintRange({ start: BigInt(1), end: BigInt(1) })];
274
+ return uintRanges_1.UintRangeArray.From(ranges);
275
+ }
276
+ return uintRanges_1.UintRangeArray.From(ranges);
277
+ }
278
+ exports.GetUintRangesWithOptions = GetUintRangesWithOptions;
279
+ function GetListIdWithOptions(listId, uses) {
280
+ if (!uses) {
281
+ listId = 'All';
282
+ }
283
+ return listId;
284
+ }
285
+ exports.GetListIdWithOptions = GetListIdWithOptions;
286
+ function GetListWithOptions(_list, uses) {
287
+ const list = new addressLists_1.AddressList(_list);
288
+ if (!uses) {
289
+ list.addresses = [];
290
+ list.whitelist = false;
291
+ }
292
+ return list;
293
+ }
294
+ exports.GetListWithOptions = GetListWithOptions;
295
+ exports.ActionPermissionUsedFlags = {
296
+ usesBadgeIds: false,
297
+ usesTimelineTimes: false,
298
+ usesTransferTimes: false,
299
+ usesToList: false,
300
+ usesFromList: false,
301
+ usesInitiatedByList: false,
302
+ usesOwnershipTimes: false,
303
+ usesApprovalIdList: false,
304
+ usesAmountTrackerIdList: false,
305
+ usesChallengeTrackerIdList: false
306
+ };
307
+ exports.TimedUpdatePermissionUsedFlags = {
308
+ usesBadgeIds: false,
309
+ usesTimelineTimes: true,
310
+ usesTransferTimes: false,
311
+ usesToList: false,
312
+ usesFromList: false,
313
+ usesInitiatedByList: false,
314
+ usesOwnershipTimes: false,
315
+ usesApprovalIdList: false,
316
+ usesAmountTrackerIdList: false,
317
+ usesChallengeTrackerIdList: false
318
+ };
319
+ exports.TimedUpdateWithBadgeIdsPermissionUsedFlags = {
320
+ usesBadgeIds: true,
321
+ usesTimelineTimes: true,
322
+ usesTransferTimes: false,
323
+ usesToList: false,
324
+ usesFromList: false,
325
+ usesInitiatedByList: false,
326
+ usesOwnershipTimes: false,
327
+ usesApprovalIdList: false,
328
+ usesAmountTrackerIdList: false,
329
+ usesChallengeTrackerIdList: false
330
+ };
331
+ exports.BalancesActionPermissionUsedFlags = {
332
+ usesBadgeIds: true,
333
+ usesTimelineTimes: false,
334
+ usesTransferTimes: false,
335
+ usesToList: false,
336
+ usesFromList: false,
337
+ usesInitiatedByList: false,
338
+ usesOwnershipTimes: true,
339
+ usesApprovalIdList: false,
340
+ usesAmountTrackerIdList: false,
341
+ usesChallengeTrackerIdList: false
342
+ };
343
+ exports.ApprovalPermissionUsedFlags = {
344
+ usesBadgeIds: true,
345
+ usesTimelineTimes: false,
346
+ usesTransferTimes: true,
347
+ usesToList: true,
348
+ usesFromList: true,
349
+ usesInitiatedByList: true,
350
+ usesOwnershipTimes: true,
351
+ usesApprovalIdList: true,
352
+ usesAmountTrackerIdList: true,
353
+ usesChallengeTrackerIdList: true
354
+ };
355
+ function GetFirstMatchOnly(permissions, handleAllPossibleCombinations, usesFlags) {
356
+ const handled = [];
357
+ if (handleAllPossibleCombinations && !usesFlags)
358
+ throw new Error('handleAllPossibleCombinations is true but usesFlags is null');
359
+ if (handleAllPossibleCombinations && usesFlags) {
360
+ permissions.push({
361
+ timelineTimes: uintRanges_1.UintRangeArray.FullRanges(),
362
+ fromList: addressLists_1.AddressList.AllAddresses(),
363
+ toList: addressLists_1.AddressList.AllAddresses(),
364
+ initiatedByList: addressLists_1.AddressList.AllAddresses(),
365
+ approvalIdList: getReservedTrackerList('All'),
366
+ amountTrackerIdList: getReservedTrackerList('All'),
367
+ challengeTrackerIdList: getReservedTrackerList('All'),
368
+ transferTimes: uintRanges_1.UintRangeArray.FullRanges(),
369
+ badgeIds: uintRanges_1.UintRangeArray.FullRanges(),
370
+ ownershipTimes: uintRanges_1.UintRangeArray.FullRanges(),
371
+ permanentlyPermittedTimes: uintRanges_1.UintRangeArray.From([]),
372
+ permanentlyForbiddenTimes: uintRanges_1.UintRangeArray.From([]),
373
+ ...usesFlags,
374
+ arbitraryValue: {}
375
+ });
376
+ }
377
+ for (const permission of permissions) {
378
+ const badgeIds = GetUintRangesWithOptions(permission.badgeIds, permission.usesBadgeIds);
379
+ const timelineTimes = GetUintRangesWithOptions(permission.timelineTimes, permission.usesTimelineTimes);
380
+ const transferTimes = GetUintRangesWithOptions(permission.transferTimes, permission.usesTransferTimes);
381
+ const ownershipTimes = GetUintRangesWithOptions(permission.ownershipTimes, permission.usesOwnershipTimes);
382
+ const permanentlyPermittedTimes = GetUintRangesWithOptions(permission.permanentlyPermittedTimes, true);
383
+ const permanentlyForbiddenTimes = GetUintRangesWithOptions(permission.permanentlyForbiddenTimes, true);
384
+ const arbitraryValue = permission.arbitraryValue;
385
+ const toList = GetListWithOptions(permission.toList, permission.usesToList);
386
+ const fromList = GetListWithOptions(permission.fromList, permission.usesFromList);
387
+ const initiatedByList = GetListWithOptions(permission.initiatedByList, permission.usesInitiatedByList);
388
+ const approvalIdList = GetListWithOptions(permission.approvalIdList, permission.usesApprovalIdList);
389
+ const amountTrackerIdList = GetListWithOptions(permission.amountTrackerIdList, permission.usesAmountTrackerIdList);
390
+ const challengeTrackerIdList = GetListWithOptions(permission.challengeTrackerIdList, permission.usesChallengeTrackerIdList);
391
+ for (const badgeId of badgeIds) {
392
+ for (const timelineTime of timelineTimes) {
393
+ for (const transferTime of transferTimes) {
394
+ for (const ownershipTime of ownershipTimes) {
395
+ const brokenDown = [
396
+ {
397
+ badgeId: badgeId,
398
+ timelineTime: timelineTime,
399
+ transferTime: transferTime,
400
+ ownershipTime: ownershipTime,
401
+ toList: toList,
402
+ fromList: fromList,
403
+ initiatedByList: initiatedByList,
404
+ approvalIdList: approvalIdList,
405
+ amountTrackerIdList: amountTrackerIdList,
406
+ challengeTrackerIdList: challengeTrackerIdList,
407
+ permanentlyPermittedTimes: permanentlyPermittedTimes,
408
+ permanentlyForbiddenTimes: permanentlyForbiddenTimes,
409
+ arbitraryValue
410
+ }
411
+ ];
412
+ const [, remainingAfterHandledIsRemoved] = getOverlapsAndNonOverlaps(brokenDown, handled);
413
+ for (const remaining of remainingAfterHandledIsRemoved) {
414
+ handled.push({
415
+ timelineTime: remaining.timelineTime,
416
+ badgeId: remaining.badgeId,
417
+ transferTime: remaining.transferTime,
418
+ ownershipTime: remaining.ownershipTime,
419
+ toList: remaining.toList,
420
+ fromList: remaining.fromList,
421
+ initiatedByList: remaining.initiatedByList,
422
+ approvalIdList: remaining.approvalIdList,
423
+ amountTrackerIdList: remaining.amountTrackerIdList,
424
+ challengeTrackerIdList: remaining.challengeTrackerIdList,
425
+ permanentlyPermittedTimes: permanentlyPermittedTimes,
426
+ permanentlyForbiddenTimes: permanentlyForbiddenTimes,
427
+ arbitraryValue: arbitraryValue
428
+ });
429
+ }
430
+ }
431
+ }
432
+ }
433
+ }
434
+ }
435
+ return handled;
436
+ }
437
+ exports.GetFirstMatchOnly = GetFirstMatchOnly;
438
+ function MergeUniversalPermissionDetails(permissions, doNotMerge) {
439
+ let merged = permissions.map((permission) => {
440
+ return {
441
+ badgeIds: uintRanges_1.UintRangeArray.From([permission.badgeId]),
442
+ timelineTimes: uintRanges_1.UintRangeArray.From([permission.timelineTime]),
443
+ transferTimes: uintRanges_1.UintRangeArray.From([permission.transferTime]),
444
+ ownershipTimes: uintRanges_1.UintRangeArray.From([permission.ownershipTime]),
445
+ toList: permission.toList,
446
+ fromList: permission.fromList,
447
+ initiatedByList: permission.initiatedByList,
448
+ approvalIdList: permission.approvalIdList,
449
+ amountTrackerIdList: permission.amountTrackerIdList,
450
+ challengeTrackerIdList: permission.challengeTrackerIdList,
451
+ permanentlyPermittedTimes: permission.permanentlyPermittedTimes,
452
+ permanentlyForbiddenTimes: permission.permanentlyForbiddenTimes,
453
+ arbitraryValue: permission.arbitraryValue
454
+ };
455
+ });
456
+ if (doNotMerge) {
457
+ return merged;
458
+ }
459
+ let unhandledLeft = true;
460
+ while (unhandledLeft) {
461
+ unhandledLeft = false;
462
+ for (let i = 0; i < merged.length; i++) {
463
+ for (let j = i + 1; j < merged.length; j++) {
464
+ const first = merged[i];
465
+ const second = merged[j];
466
+ const badgeIdsAreSame = JSON.stringify(first.badgeIds) === JSON.stringify(second.badgeIds);
467
+ const timelineTimesAreSame = JSON.stringify(first.timelineTimes) === JSON.stringify(second.timelineTimes);
468
+ const transferTimesAreSame = JSON.stringify(first.transferTimes) === JSON.stringify(second.transferTimes);
469
+ const ownershipTimesAreSame = JSON.stringify(first.ownershipTimes) === JSON.stringify(second.ownershipTimes);
470
+ const toListsAreSame = first.toList.whitelist === second.toList.whitelist && JSON.stringify(first.toList.addresses) === JSON.stringify(second.toList.addresses);
471
+ const fromListsAreSame = first.fromList.whitelist === second.fromList.whitelist &&
472
+ JSON.stringify(first.fromList.addresses) === JSON.stringify(second.fromList.addresses);
473
+ const initiatedByListsAreSame = first.initiatedByList.whitelist === second.initiatedByList.whitelist &&
474
+ JSON.stringify(first.initiatedByList.addresses) === JSON.stringify(second.initiatedByList.addresses);
475
+ const approvalIdListsAreSame = first.approvalIdList.whitelist === second.approvalIdList.whitelist &&
476
+ JSON.stringify(first.approvalIdList.addresses) === JSON.stringify(second.approvalIdList.addresses);
477
+ const amountTrackerIdListsAreSame = first.amountTrackerIdList.whitelist === second.amountTrackerIdList.whitelist &&
478
+ JSON.stringify(first.amountTrackerIdList.addresses) === JSON.stringify(second.amountTrackerIdList.addresses);
479
+ const challengeTrackerIdListsAreSame = first.challengeTrackerIdList.whitelist === second.challengeTrackerIdList.whitelist &&
480
+ JSON.stringify(first.challengeTrackerIdList.addresses) === JSON.stringify(second.challengeTrackerIdList.addresses);
481
+ const permittedTimesAreSame = JSON.stringify(first.permanentlyPermittedTimes) === JSON.stringify(second.permanentlyPermittedTimes);
482
+ const forbiddenTimesAreSame = JSON.stringify(first.permanentlyForbiddenTimes) === JSON.stringify(second.permanentlyForbiddenTimes);
483
+ const arbitraryValuesAreSame = JSON.stringify(first.arbitraryValue) === JSON.stringify(second.arbitraryValue);
484
+ if (badgeIdsAreSame)
485
+ first.badgeIds.push(...second.badgeIds);
486
+ if (timelineTimesAreSame)
487
+ first.timelineTimes.push(...second.timelineTimes);
488
+ if (transferTimesAreSame)
489
+ first.transferTimes.push(...second.transferTimes);
490
+ if (ownershipTimesAreSame)
491
+ first.ownershipTimes.push(...second.ownershipTimes);
492
+ first.badgeIds.sortAndMerge();
493
+ first.timelineTimes.sortAndMerge();
494
+ first.transferTimes.sortAndMerge();
495
+ first.ownershipTimes.sortAndMerge();
496
+ const newBadgeIds = first.badgeIds;
497
+ const newTimelineTimes = first.timelineTimes;
498
+ const newTransferTimes = first.transferTimes;
499
+ const newOwnershipTimes = first.ownershipTimes;
500
+ let sameCount = 0;
501
+ if (badgeIdsAreSame)
502
+ sameCount++;
503
+ if (timelineTimesAreSame)
504
+ sameCount++;
505
+ if (transferTimesAreSame)
506
+ sameCount++;
507
+ if (ownershipTimesAreSame)
508
+ sameCount++;
509
+ let addressSameCount = 0;
510
+ if (toListsAreSame)
511
+ addressSameCount++;
512
+ if (fromListsAreSame)
513
+ addressSameCount++;
514
+ if (initiatedByListsAreSame)
515
+ addressSameCount++;
516
+ if (approvalIdListsAreSame)
517
+ addressSameCount++;
518
+ if (amountTrackerIdListsAreSame)
519
+ addressSameCount++;
520
+ if (challengeTrackerIdListsAreSame)
521
+ addressSameCount++;
522
+ if (sameCount === 3 &&
523
+ approvalIdListsAreSame &&
524
+ amountTrackerIdListsAreSame &&
525
+ challengeTrackerIdListsAreSame &&
526
+ toListsAreSame &&
527
+ fromListsAreSame &&
528
+ initiatedByListsAreSame &&
529
+ permittedTimesAreSame &&
530
+ forbiddenTimesAreSame &&
531
+ arbitraryValuesAreSame) {
532
+ merged.push({
533
+ badgeIds: newBadgeIds,
534
+ timelineTimes: newTimelineTimes,
535
+ transferTimes: newTransferTimes,
536
+ ownershipTimes: newOwnershipTimes,
537
+ toList: first.toList,
538
+ fromList: first.fromList,
539
+ initiatedByList: first.initiatedByList,
540
+ approvalIdList: first.approvalIdList,
541
+ amountTrackerIdList: first.amountTrackerIdList,
542
+ challengeTrackerIdList: first.challengeTrackerIdList,
543
+ permanentlyPermittedTimes: first.permanentlyPermittedTimes,
544
+ permanentlyForbiddenTimes: first.permanentlyForbiddenTimes,
545
+ arbitraryValue: first.arbitraryValue
546
+ });
547
+ merged = merged.filter((_, idx) => idx !== i && idx !== j);
548
+ unhandledLeft = true;
549
+ i = Number.MAX_SAFE_INTEGER;
550
+ j = Number.MAX_SAFE_INTEGER;
551
+ }
552
+ else if (sameCount === 4 && addressSameCount == 5 && permittedTimesAreSame && forbiddenTimesAreSame && arbitraryValuesAreSame) {
553
+ merged.push({
554
+ badgeIds: newBadgeIds,
555
+ timelineTimes: newTimelineTimes,
556
+ transferTimes: newTransferTimes,
557
+ ownershipTimes: newOwnershipTimes,
558
+ toList: !toListsAreSame && first.toList.whitelist === second.toList.whitelist
559
+ ? new addressLists_1.AddressList({
560
+ ...first.toList,
561
+ addresses: [...new Set([...first.toList.addresses, ...second.toList.addresses])]
562
+ })
563
+ : first.toList,
564
+ fromList: !fromListsAreSame && first.fromList.whitelist === second.fromList.whitelist
565
+ ? new addressLists_1.AddressList({
566
+ ...first.fromList,
567
+ addresses: [...new Set([...first.fromList.addresses, ...second.fromList.addresses])]
568
+ })
569
+ : first.fromList,
570
+ initiatedByList: !initiatedByListsAreSame && first.initiatedByList.whitelist === second.initiatedByList.whitelist
571
+ ? new addressLists_1.AddressList({
572
+ ...first.initiatedByList,
573
+ addresses: [...new Set([...first.initiatedByList.addresses, ...second.initiatedByList.addresses])]
574
+ })
575
+ : first.initiatedByList,
576
+ approvalIdList: !approvalIdListsAreSame && first.approvalIdList.whitelist === second.approvalIdList.whitelist
577
+ ? new addressLists_1.AddressList({
578
+ ...first.approvalIdList,
579
+ addresses: [...new Set([...first.approvalIdList.addresses, ...second.approvalIdList.addresses])]
580
+ })
581
+ : first.approvalIdList,
582
+ amountTrackerIdList: !amountTrackerIdListsAreSame && first.amountTrackerIdList.whitelist === second.amountTrackerIdList.whitelist
583
+ ? new addressLists_1.AddressList({
584
+ ...first.amountTrackerIdList,
585
+ addresses: [...new Set([...first.amountTrackerIdList.addresses, ...second.amountTrackerIdList.addresses])]
586
+ })
587
+ : first.amountTrackerIdList,
588
+ challengeTrackerIdList: !challengeTrackerIdListsAreSame && first.challengeTrackerIdList.whitelist === second.challengeTrackerIdList.whitelist
589
+ ? new addressLists_1.AddressList({
590
+ ...first.challengeTrackerIdList,
591
+ addresses: [...new Set([...first.challengeTrackerIdList.addresses, ...second.challengeTrackerIdList.addresses])]
592
+ })
593
+ : first.challengeTrackerIdList,
594
+ permanentlyPermittedTimes: first.permanentlyPermittedTimes,
595
+ permanentlyForbiddenTimes: first.permanentlyForbiddenTimes,
596
+ arbitraryValue: first.arbitraryValue
597
+ });
598
+ merged = merged.filter((_, idx) => idx !== i && idx !== j);
599
+ unhandledLeft = true;
600
+ i = Number.MAX_SAFE_INTEGER;
601
+ j = Number.MAX_SAFE_INTEGER;
602
+ }
603
+ }
604
+ }
605
+ }
606
+ return merged;
607
+ }
608
+ exports.MergeUniversalPermissionDetails = MergeUniversalPermissionDetails;
609
+ function GetPermissionString(permission) {
610
+ let str = '(';
611
+ if (permission.badgeId.start === BigInt('18446744073709551615') || permission.badgeId.end === BigInt('18446744073709551615')) {
612
+ str += 'badgeId: ' + permission.badgeId.start.toString() + ' ';
613
+ }
614
+ if (permission.timelineTime.start === BigInt('18446744073709551615') || permission.timelineTime.end === BigInt('18446744073709551615')) {
615
+ str += 'timelineTime: ' + permission.timelineTime.start.toString() + ' ';
616
+ }
617
+ if (permission.transferTime.start === BigInt('18446744073709551615') || permission.transferTime.end === BigInt('18446744073709551615')) {
618
+ str += 'transferTime: ' + permission.transferTime.start.toString() + ' ';
619
+ }
620
+ if (permission.ownershipTime.start === BigInt('18446744073709551615') || permission.ownershipTime.end === BigInt('18446744073709551615')) {
621
+ str += 'ownershipTime: ' + permission.ownershipTime.start.toString() + ' ';
622
+ }
623
+ if (permission.toList !== null) {
624
+ str += 'toList: ';
625
+ if (!permission.toList.whitelist) {
626
+ str += permission.toList.addresses.length.toString() + ' addresses ';
627
+ }
628
+ else {
629
+ str += 'all except ' + permission.toList.addresses.length.toString() + ' addresses ';
630
+ }
631
+ if (permission.toList.addresses.length > 0 && permission.toList.addresses.length <= 5) {
632
+ str += '(';
633
+ for (const address of permission.toList.addresses) {
634
+ str += address + ' ';
635
+ }
636
+ str += ')';
637
+ }
638
+ }
639
+ if (permission.fromList !== null) {
640
+ str += 'fromList: ';
641
+ if (!permission.fromList.whitelist) {
642
+ str += permission.fromList.addresses.length.toString() + ' addresses ';
643
+ }
644
+ else {
645
+ str += 'all except ' + permission.fromList.addresses.length.toString() + ' addresses ';
646
+ }
647
+ if (permission.fromList.addresses.length > 0 && permission.fromList.addresses.length <= 5) {
648
+ str += '(';
649
+ for (const address of permission.fromList.addresses) {
650
+ str += address + ' ';
651
+ }
652
+ str += ')';
653
+ }
654
+ }
655
+ if (permission.initiatedByList !== null) {
656
+ str += 'initiatedByList: ';
657
+ if (!permission.initiatedByList.whitelist) {
658
+ str += permission.initiatedByList.addresses.length.toString() + ' addresses ';
659
+ }
660
+ else {
661
+ str += 'all except ' + permission.initiatedByList.addresses.length.toString() + ' addresses ';
662
+ }
663
+ if (permission.initiatedByList.addresses.length > 0 && permission.initiatedByList.addresses.length <= 5) {
664
+ str += '(';
665
+ for (const address of permission.initiatedByList.addresses) {
666
+ str += address + ' ';
667
+ }
668
+ str += ')';
669
+ }
670
+ }
671
+ str += ') ';
672
+ return str;
673
+ }
674
+ function ValidateUniversalPermissionUpdate(oldPermissions, newPermissions) {
675
+ const [allOverlaps, inOldButNotNew] = getOverlapsAndNonOverlaps(oldPermissions, newPermissions);
676
+ if (inOldButNotNew.length > 0) {
677
+ let errMsg = 'permission ';
678
+ errMsg += GetPermissionString(inOldButNotNew[0]);
679
+ errMsg += 'found in old permissions but not in new permissions';
680
+ if (inOldButNotNew.length > 1) {
681
+ errMsg += ' (along with ' + (inOldButNotNew.length - 1) + ' more)';
682
+ }
683
+ return new Error(errMsg);
684
+ }
685
+ for (const overlapObj of allOverlaps) {
686
+ const oldPermission = overlapObj.firstDetails;
687
+ const newPermission = overlapObj.secondDetails;
688
+ const [leftoverPermittedTimes] = oldPermission.permanentlyPermittedTimes.getOverlapDetails(newPermission.permanentlyPermittedTimes);
689
+ const [leftoverForbiddenTimes] = oldPermission.permanentlyForbiddenTimes.getOverlapDetails(newPermission.permanentlyForbiddenTimes);
690
+ if (leftoverPermittedTimes.length > 0 || leftoverForbiddenTimes.length > 0) {
691
+ let errMsg = 'permission ';
692
+ errMsg += GetPermissionString(oldPermission);
693
+ errMsg += 'found in both new and old permissions but ';
694
+ if (leftoverPermittedTimes.length > 0) {
695
+ errMsg += 'previously explicitly allowed the times ( ';
696
+ for (const oldPermittedTime of leftoverPermittedTimes) {
697
+ errMsg += oldPermittedTime.start.toString() + '-' + oldPermittedTime.end.toString() + ' ';
698
+ }
699
+ errMsg += ') which are now set to disApproved';
700
+ }
701
+ if (leftoverForbiddenTimes.length > 0 && leftoverPermittedTimes.length > 0) {
702
+ errMsg += ' and';
703
+ }
704
+ if (leftoverForbiddenTimes.length > 0) {
705
+ errMsg += ' previously explicitly disApproved the times ( ';
706
+ for (const oldForbiddenTime of leftoverForbiddenTimes) {
707
+ errMsg += oldForbiddenTime.start.toString() + '-' + oldForbiddenTime.end.toString() + ' ';
708
+ }
709
+ errMsg += ') which are now set to allowed.';
710
+ }
711
+ return new Error(errMsg);
712
+ }
713
+ }
714
+ return null;
715
+ }
716
+ exports.ValidateUniversalPermissionUpdate = ValidateUniversalPermissionUpdate;
717
+ //# sourceMappingURL=overlaps.js.map