bitbadgesjs-sdk 0.31.1 → 0.31.2

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 (99) hide show
  1. package/dist/cjs/api-indexer/BitBadgesCollection.d.ts +1 -0
  2. package/dist/cjs/api-indexer/BitBadgesCollection.d.ts.map +1 -1
  3. package/dist/cjs/api-indexer/BitBadgesCollection.js +4 -1
  4. package/dist/cjs/api-indexer/BitBadgesCollection.js.map +1 -1
  5. package/dist/cjs/core/approval-utils.spec.d.ts +2 -0
  6. package/dist/cjs/core/approval-utils.spec.d.ts.map +1 -0
  7. package/dist/cjs/core/approval-utils.spec.js +240 -0
  8. package/dist/cjs/core/approval-utils.spec.js.map +1 -0
  9. package/dist/cjs/core/approvals.spec.js +96 -0
  10. package/dist/cjs/core/approvals.spec.js.map +1 -1
  11. package/dist/cjs/core/bids.spec.d.ts +2 -0
  12. package/dist/cjs/core/bids.spec.d.ts.map +1 -0
  13. package/dist/cjs/core/bids.spec.js +201 -0
  14. package/dist/cjs/core/bids.spec.js.map +1 -0
  15. package/dist/cjs/core/blockin.spec.d.ts +2 -0
  16. package/dist/cjs/core/blockin.spec.d.ts.map +1 -0
  17. package/dist/cjs/core/blockin.spec.js +163 -0
  18. package/dist/cjs/core/blockin.spec.js.map +1 -0
  19. package/dist/cjs/core/coin.spec.d.ts +2 -0
  20. package/dist/cjs/core/coin.spec.d.ts.map +1 -0
  21. package/dist/cjs/core/coin.spec.js +80 -0
  22. package/dist/cjs/core/coin.spec.js.map +1 -0
  23. package/dist/cjs/core/cosmos-wrappers.spec.d.ts +2 -0
  24. package/dist/cjs/core/cosmos-wrappers.spec.d.ts.map +1 -0
  25. package/dist/cjs/core/cosmos-wrappers.spec.js +623 -0
  26. package/dist/cjs/core/cosmos-wrappers.spec.js.map +1 -0
  27. package/dist/cjs/core/managersplitter.spec.d.ts +2 -0
  28. package/dist/cjs/core/managersplitter.spec.d.ts.map +1 -0
  29. package/dist/cjs/core/managersplitter.spec.js +170 -0
  30. package/dist/cjs/core/managersplitter.spec.js.map +1 -0
  31. package/dist/cjs/core/overlaps.spec.js +201 -0
  32. package/dist/cjs/core/overlaps.spec.js.map +1 -1
  33. package/dist/cjs/core/permission-utils.spec.d.ts +2 -0
  34. package/dist/cjs/core/permission-utils.spec.d.ts.map +1 -0
  35. package/dist/cjs/core/permission-utils.spec.js +192 -0
  36. package/dist/cjs/core/permission-utils.spec.js.map +1 -0
  37. package/dist/cjs/core/permissions.spec.js +1069 -0
  38. package/dist/cjs/core/permissions.spec.js.map +1 -1
  39. package/dist/cjs/core/transfers.spec.js +524 -0
  40. package/dist/cjs/core/transfers.spec.js.map +1 -1
  41. package/dist/cjs/core/userBalances.spec.d.ts +2 -0
  42. package/dist/cjs/core/userBalances.spec.d.ts.map +1 -0
  43. package/dist/cjs/core/userBalances.spec.js +184 -0
  44. package/dist/cjs/core/userBalances.spec.js.map +1 -0
  45. package/dist/cjs/core/validate-utils.spec.d.ts +2 -0
  46. package/dist/cjs/core/validate-utils.spec.d.ts.map +1 -0
  47. package/dist/cjs/core/validate-utils.spec.js +202 -0
  48. package/dist/cjs/core/validate-utils.spec.js.map +1 -0
  49. package/dist/cjs/tsconfig.build.tsbuildinfo +1 -1
  50. package/dist/esm/api-indexer/BitBadgesCollection.d.ts +1 -0
  51. package/dist/esm/api-indexer/BitBadgesCollection.d.ts.map +1 -1
  52. package/dist/esm/api-indexer/BitBadgesCollection.js +4 -1
  53. package/dist/esm/api-indexer/BitBadgesCollection.js.map +1 -1
  54. package/dist/esm/core/approval-utils.spec.d.ts +2 -0
  55. package/dist/esm/core/approval-utils.spec.d.ts.map +1 -0
  56. package/dist/esm/core/approval-utils.spec.js +238 -0
  57. package/dist/esm/core/approval-utils.spec.js.map +1 -0
  58. package/dist/esm/core/approvals.spec.js +97 -1
  59. package/dist/esm/core/approvals.spec.js.map +1 -1
  60. package/dist/esm/core/bids.spec.d.ts +2 -0
  61. package/dist/esm/core/bids.spec.d.ts.map +1 -0
  62. package/dist/esm/core/bids.spec.js +199 -0
  63. package/dist/esm/core/bids.spec.js.map +1 -0
  64. package/dist/esm/core/blockin.spec.d.ts +2 -0
  65. package/dist/esm/core/blockin.spec.d.ts.map +1 -0
  66. package/dist/esm/core/blockin.spec.js +161 -0
  67. package/dist/esm/core/blockin.spec.js.map +1 -0
  68. package/dist/esm/core/coin.spec.d.ts +2 -0
  69. package/dist/esm/core/coin.spec.d.ts.map +1 -0
  70. package/dist/esm/core/coin.spec.js +78 -0
  71. package/dist/esm/core/coin.spec.js.map +1 -0
  72. package/dist/esm/core/cosmos-wrappers.spec.d.ts +2 -0
  73. package/dist/esm/core/cosmos-wrappers.spec.d.ts.map +1 -0
  74. package/dist/esm/core/cosmos-wrappers.spec.js +621 -0
  75. package/dist/esm/core/cosmos-wrappers.spec.js.map +1 -0
  76. package/dist/esm/core/managersplitter.spec.d.ts +2 -0
  77. package/dist/esm/core/managersplitter.spec.d.ts.map +1 -0
  78. package/dist/esm/core/managersplitter.spec.js +168 -0
  79. package/dist/esm/core/managersplitter.spec.js.map +1 -0
  80. package/dist/esm/core/overlaps.spec.js +202 -1
  81. package/dist/esm/core/overlaps.spec.js.map +1 -1
  82. package/dist/esm/core/permission-utils.spec.d.ts +2 -0
  83. package/dist/esm/core/permission-utils.spec.d.ts.map +1 -0
  84. package/dist/esm/core/permission-utils.spec.js +190 -0
  85. package/dist/esm/core/permission-utils.spec.js.map +1 -0
  86. package/dist/esm/core/permissions.spec.js +1069 -0
  87. package/dist/esm/core/permissions.spec.js.map +1 -1
  88. package/dist/esm/core/transfers.spec.js +525 -1
  89. package/dist/esm/core/transfers.spec.js.map +1 -1
  90. package/dist/esm/core/userBalances.spec.d.ts +2 -0
  91. package/dist/esm/core/userBalances.spec.d.ts.map +1 -0
  92. package/dist/esm/core/userBalances.spec.js +182 -0
  93. package/dist/esm/core/userBalances.spec.js.map +1 -0
  94. package/dist/esm/core/validate-utils.spec.d.ts +2 -0
  95. package/dist/esm/core/validate-utils.spec.d.ts.map +1 -0
  96. package/dist/esm/core/validate-utils.spec.js +200 -0
  97. package/dist/esm/core/validate-utils.spec.js.map +1 -0
  98. package/dist/esm/tsconfig-esm.build.tsbuildinfo +1 -1
  99. package/package.json +4 -5
@@ -0,0 +1,168 @@
1
+ import { PermissionCriteria, ManagerSplitterPermissions } from './managersplitter.js';
2
+ BigInt.prototype.toJSON = function () {
3
+ return this.toString();
4
+ };
5
+ describe('PermissionCriteria', () => {
6
+ describe('constructor', () => {
7
+ it('should construct with approved addresses', () => {
8
+ const pc = new PermissionCriteria({ approvedAddresses: ['bb1abc', 'bb1def'] });
9
+ expect(pc.approvedAddresses).toEqual(['bb1abc', 'bb1def']);
10
+ });
11
+ it('should default to empty array when approvedAddresses is undefined', () => {
12
+ const pc = new PermissionCriteria({ approvedAddresses: undefined });
13
+ expect(pc.approvedAddresses).toEqual([]);
14
+ });
15
+ it('should construct with empty array', () => {
16
+ const pc = new PermissionCriteria({ approvedAddresses: [] });
17
+ expect(pc.approvedAddresses).toEqual([]);
18
+ });
19
+ });
20
+ describe('getNumberFieldNames', () => {
21
+ it('should return empty array', () => {
22
+ const pc = new PermissionCriteria({ approvedAddresses: [] });
23
+ expect(pc.getNumberFieldNames()).toEqual([]);
24
+ });
25
+ });
26
+ describe('convert', () => {
27
+ it('should return a deep copy (no number fields)', () => {
28
+ const pc = new PermissionCriteria({ approvedAddresses: ['bb1abc'] });
29
+ const converted = pc.convert(String);
30
+ expect(converted.approvedAddresses).toEqual(['bb1abc']);
31
+ converted.approvedAddresses.push('bb1new');
32
+ expect(pc.approvedAddresses.length).toBe(1);
33
+ });
34
+ });
35
+ describe('toProto / fromProto round-trip', () => {
36
+ it('should survive proto round-trip with addresses', () => {
37
+ const pc = new PermissionCriteria({ approvedAddresses: ['bb1abc', 'bb1def'] });
38
+ const proto = pc.toProto();
39
+ const restored = PermissionCriteria.fromProto(proto);
40
+ expect(restored.approvedAddresses).toEqual(['bb1abc', 'bb1def']);
41
+ });
42
+ it('should survive proto round-trip with empty addresses', () => {
43
+ const pc = new PermissionCriteria({ approvedAddresses: [] });
44
+ const proto = pc.toProto();
45
+ const restored = PermissionCriteria.fromProto(proto);
46
+ expect(restored.approvedAddresses).toEqual([]);
47
+ });
48
+ });
49
+ describe('fromJson / fromJsonString', () => {
50
+ it('should construct from JSON value', () => {
51
+ const json = { approvedAddresses: ['bb1test'] };
52
+ const pc = PermissionCriteria.fromJson(json);
53
+ expect(pc.approvedAddresses).toEqual(['bb1test']);
54
+ });
55
+ it('should construct from JSON string', () => {
56
+ const jsonStr = JSON.stringify({ approvedAddresses: ['bb1test', 'bb1other'] });
57
+ const pc = PermissionCriteria.fromJsonString(jsonStr);
58
+ expect(pc.approvedAddresses).toEqual(['bb1test', 'bb1other']);
59
+ });
60
+ });
61
+ });
62
+ describe('ManagerSplitterPermissions', () => {
63
+ describe('constructor', () => {
64
+ it('should construct with all permissions set', () => {
65
+ const perms = new ManagerSplitterPermissions({
66
+ canDeleteCollection: { approvedAddresses: ['bb1admin'] },
67
+ canArchiveCollection: { approvedAddresses: ['bb1admin'] },
68
+ canUpdateStandards: { approvedAddresses: [] },
69
+ canUpdateCustomData: { approvedAddresses: ['bb1a', 'bb1b'] },
70
+ canUpdateManager: { approvedAddresses: ['bb1admin'] },
71
+ canUpdateCollectionMetadata: undefined,
72
+ canUpdateValidTokenIds: undefined,
73
+ canUpdateTokenMetadata: undefined,
74
+ canUpdateCollectionApprovals: { approvedAddresses: ['bb1admin'] }
75
+ });
76
+ expect(perms.canDeleteCollection?.approvedAddresses).toEqual(['bb1admin']);
77
+ expect(perms.canUpdateStandards?.approvedAddresses).toEqual([]);
78
+ expect(perms.canUpdateCustomData?.approvedAddresses).toEqual(['bb1a', 'bb1b']);
79
+ expect(perms.canUpdateCollectionMetadata).toBeUndefined();
80
+ expect(perms.canUpdateValidTokenIds).toBeUndefined();
81
+ expect(perms.canUpdateTokenMetadata).toBeUndefined();
82
+ });
83
+ it('should construct with all permissions undefined', () => {
84
+ const perms = new ManagerSplitterPermissions({});
85
+ expect(perms.canDeleteCollection).toBeUndefined();
86
+ expect(perms.canArchiveCollection).toBeUndefined();
87
+ expect(perms.canUpdateManager).toBeUndefined();
88
+ });
89
+ });
90
+ describe('getNumberFieldNames', () => {
91
+ it('should return empty array', () => {
92
+ const perms = new ManagerSplitterPermissions({});
93
+ expect(perms.getNumberFieldNames()).toEqual([]);
94
+ });
95
+ });
96
+ describe('convert', () => {
97
+ it('should return a deep copy', () => {
98
+ const perms = new ManagerSplitterPermissions({
99
+ canDeleteCollection: { approvedAddresses: ['bb1admin'] }
100
+ });
101
+ const converted = perms.convert(String);
102
+ expect(converted.canDeleteCollection?.approvedAddresses).toEqual(['bb1admin']);
103
+ });
104
+ });
105
+ describe('toProto / fromProto round-trip', () => {
106
+ it('should survive proto round-trip with all permissions set', () => {
107
+ const perms = new ManagerSplitterPermissions({
108
+ canDeleteCollection: { approvedAddresses: ['bb1admin'] },
109
+ canArchiveCollection: { approvedAddresses: ['bb1archive'] },
110
+ canUpdateStandards: { approvedAddresses: [] },
111
+ canUpdateCustomData: { approvedAddresses: ['bb1data'] },
112
+ canUpdateManager: { approvedAddresses: ['bb1mgr'] },
113
+ canUpdateCollectionMetadata: { approvedAddresses: ['bb1meta'] },
114
+ canUpdateValidTokenIds: { approvedAddresses: ['bb1tok'] },
115
+ canUpdateTokenMetadata: { approvedAddresses: ['bb1tmeta'] },
116
+ canUpdateCollectionApprovals: { approvedAddresses: ['bb1appr'] }
117
+ });
118
+ const proto = perms.toProto();
119
+ const restored = ManagerSplitterPermissions.fromProto(proto);
120
+ expect(restored.canDeleteCollection?.approvedAddresses).toEqual(['bb1admin']);
121
+ expect(restored.canArchiveCollection?.approvedAddresses).toEqual(['bb1archive']);
122
+ expect(restored.canUpdateStandards?.approvedAddresses).toEqual([]);
123
+ expect(restored.canUpdateCustomData?.approvedAddresses).toEqual(['bb1data']);
124
+ expect(restored.canUpdateManager?.approvedAddresses).toEqual(['bb1mgr']);
125
+ expect(restored.canUpdateCollectionMetadata?.approvedAddresses).toEqual(['bb1meta']);
126
+ expect(restored.canUpdateValidTokenIds?.approvedAddresses).toEqual(['bb1tok']);
127
+ expect(restored.canUpdateTokenMetadata?.approvedAddresses).toEqual(['bb1tmeta']);
128
+ expect(restored.canUpdateCollectionApprovals?.approvedAddresses).toEqual(['bb1appr']);
129
+ });
130
+ it('should survive proto round-trip with all permissions undefined', () => {
131
+ const perms = new ManagerSplitterPermissions({});
132
+ const proto = perms.toProto();
133
+ const restored = ManagerSplitterPermissions.fromProto(proto);
134
+ expect(restored.canDeleteCollection).toBeUndefined();
135
+ expect(restored.canArchiveCollection).toBeUndefined();
136
+ expect(restored.canUpdateStandards).toBeUndefined();
137
+ expect(restored.canUpdateCustomData).toBeUndefined();
138
+ expect(restored.canUpdateManager).toBeUndefined();
139
+ expect(restored.canUpdateCollectionMetadata).toBeUndefined();
140
+ expect(restored.canUpdateValidTokenIds).toBeUndefined();
141
+ expect(restored.canUpdateTokenMetadata).toBeUndefined();
142
+ expect(restored.canUpdateCollectionApprovals).toBeUndefined();
143
+ });
144
+ });
145
+ describe('fromJson / fromJsonString', () => {
146
+ it('should construct from JSON value', () => {
147
+ const json = {
148
+ canDeleteCollection: { approvedAddresses: ['bb1admin'] }
149
+ };
150
+ const perms = ManagerSplitterPermissions.fromJson(json);
151
+ expect(perms.canDeleteCollection?.approvedAddresses).toEqual(['bb1admin']);
152
+ });
153
+ it('should construct from JSON string', () => {
154
+ const jsonStr = JSON.stringify({
155
+ canUpdateManager: { approvedAddresses: ['bb1mgr'] },
156
+ canUpdateCollectionApprovals: { approvedAddresses: ['bb1a', 'bb1b'] }
157
+ });
158
+ const perms = ManagerSplitterPermissions.fromJsonString(jsonStr);
159
+ expect(perms.canUpdateManager?.approvedAddresses).toEqual(['bb1mgr']);
160
+ expect(perms.canUpdateCollectionApprovals?.approvedAddresses).toEqual(['bb1a', 'bb1b']);
161
+ });
162
+ it('should handle empty JSON', () => {
163
+ const perms = ManagerSplitterPermissions.fromJson({});
164
+ expect(perms.canDeleteCollection).toBeUndefined();
165
+ });
166
+ });
167
+ });
168
+ //# sourceMappingURL=managersplitter.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managersplitter.spec.js","sourceRoot":"","sources":["../../../src/core/managersplitter.spec.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { AddressList } from './addressLists.js';
2
- import { ActionPermissionUsedFlags, ApprovalPermissionUsedFlags, GetFirstMatchOnly, GetListWithOptions, GetUintRangesWithOptions, MergeUniversalPermissionDetails, TimedUpdatePermissionUsedFlags, ValidateUniversalPermissionUpdate, getOverlapsAndNonOverlaps, universalRemoveOverlapFromValues, universalRemoveOverlaps } from './overlaps.js';
2
+ import { ActionPermissionUsedFlags, ApprovalPermissionUsedFlags, GetFirstMatchOnly, GetListIdWithOptions, GetListWithOptions, GetUintRangesWithOptions, MergeUniversalPermissionDetails, TimedUpdatePermissionUsedFlags, TimedUpdateWithTokenIdsPermissionUsedFlags, TokenIdsActionPermissionUsedFlags, ValidateUniversalPermissionUpdate, getOverlapsAndNonOverlaps, universalRemoveOverlapFromValues, universalRemoveOverlaps } from './overlaps.js';
3
3
  import { UintRange, UintRangeArray } from './uintRanges.js';
4
4
  const alice = 'bb1e0w5t53nrq7p66fye6c8p0ynyhf6y24lke5430';
5
5
  const bob = 'bb1jmjfq0tplp9tmx4v9uemw72y4d2wa5nrjmmk3q';
@@ -522,6 +522,207 @@ describe('overlaps', () => {
522
522
  expect(ApprovalPermissionUsedFlags.usesOwnershipTimes).toBe(true);
523
523
  expect(ApprovalPermissionUsedFlags.usesApprovalIdList).toBe(true);
524
524
  });
525
+ test('TimedUpdateWithTokenIdsPermissionUsedFlags should have tokenIds and timelineTimes true', () => {
526
+ expect(TimedUpdateWithTokenIdsPermissionUsedFlags.usesTokenIds).toBe(true);
527
+ expect(TimedUpdateWithTokenIdsPermissionUsedFlags.usesTimelineTimes).toBe(true);
528
+ expect(TimedUpdateWithTokenIdsPermissionUsedFlags.usesTransferTimes).toBe(false);
529
+ expect(TimedUpdateWithTokenIdsPermissionUsedFlags.usesToList).toBe(false);
530
+ });
531
+ test('TokenIdsActionPermissionUsedFlags should only have usesTokenIds true', () => {
532
+ expect(TokenIdsActionPermissionUsedFlags.usesTokenIds).toBe(true);
533
+ expect(TokenIdsActionPermissionUsedFlags.usesTimelineTimes).toBe(false);
534
+ expect(TokenIdsActionPermissionUsedFlags.usesTransferTimes).toBe(false);
535
+ expect(TokenIdsActionPermissionUsedFlags.usesToList).toBe(false);
536
+ expect(TokenIdsActionPermissionUsedFlags.usesFromList).toBe(false);
537
+ expect(TokenIdsActionPermissionUsedFlags.usesInitiatedByList).toBe(false);
538
+ expect(TokenIdsActionPermissionUsedFlags.usesOwnershipTimes).toBe(false);
539
+ expect(TokenIdsActionPermissionUsedFlags.usesApprovalIdList).toBe(false);
540
+ });
541
+ });
542
+ describe('GetListIdWithOptions', () => {
543
+ test('should return original listId when uses is true', () => {
544
+ const result = GetListIdWithOptions('custom-list', true);
545
+ expect(result).toBe('custom-list');
546
+ });
547
+ test('should return "All" when uses is false', () => {
548
+ const result = GetListIdWithOptions('custom-list', false);
549
+ expect(result).toBe('All');
550
+ });
551
+ test('should return "All" when uses is undefined', () => {
552
+ const result = GetListIdWithOptions('custom-list', undefined);
553
+ expect(result).toBe('All');
554
+ });
555
+ test('should return "All" when uses is explicitly false and listId is empty', () => {
556
+ const result = GetListIdWithOptions('', false);
557
+ expect(result).toBe('All');
558
+ });
559
+ });
560
+ describe('Boundary conditions for universalRemoveOverlaps', () => {
561
+ test('should handle adjacent non-overlapping ranges', () => {
562
+ const handled = createPermissionDetails({ start: 1n, end: 5n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false });
563
+ const valueToCheck = createPermissionDetails({ start: 6n, end: 10n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false });
564
+ const [remaining, removed] = universalRemoveOverlaps(handled, valueToCheck);
565
+ expect(remaining.length).toBe(1);
566
+ expect(removed.length).toBe(0);
567
+ expect(remaining[0].tokenId.start).toBe(6n);
568
+ expect(remaining[0].tokenId.end).toBe(10n);
569
+ });
570
+ test('should handle single-point overlap at boundary', () => {
571
+ const handled = createPermissionDetails({ start: 1n, end: 5n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false });
572
+ const valueToCheck = createPermissionDetails({ start: 5n, end: 10n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false });
573
+ const [remaining, removed] = universalRemoveOverlaps(handled, valueToCheck);
574
+ expect(removed.length).toBe(1);
575
+ expect(removed[0].tokenId.start).toBe(5n);
576
+ expect(removed[0].tokenId.end).toBe(5n);
577
+ expect(remaining.length).toBeGreaterThan(0);
578
+ const hasRemaining = remaining.some((r) => r.tokenId.start === 6n && r.tokenId.end === 10n);
579
+ expect(hasRemaining).toBe(true);
580
+ });
581
+ test('should handle start == end (single point range)', () => {
582
+ const handled = createPermissionDetails({ start: 5n, end: 5n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false });
583
+ const valueToCheck = createPermissionDetails({ start: 5n, end: 5n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false });
584
+ const [remaining, removed] = universalRemoveOverlaps(handled, valueToCheck);
585
+ expect(remaining.length).toBe(0);
586
+ expect(removed.length).toBe(1);
587
+ expect(removed[0].tokenId.start).toBe(5n);
588
+ expect(removed[0].tokenId.end).toBe(5n);
589
+ });
590
+ });
591
+ describe('ValidateUniversalPermissionUpdate - additional edge cases', () => {
592
+ test('should allow adding forbidden times that were not previously defined', () => {
593
+ const oldPermissions = [
594
+ createPermissionDetails({ start: 1n, end: 10n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false })
595
+ ];
596
+ oldPermissions[0].permanentlyForbiddenTimes = UintRangeArray.From([]);
597
+ oldPermissions[0].permanentlyPermittedTimes = UintRangeArray.From([]);
598
+ const newPermissions = [
599
+ createPermissionDetails({ start: 1n, end: 10n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false })
600
+ ];
601
+ newPermissions[0].permanentlyForbiddenTimes = UintRangeArray.From([{ start: 1n, end: 100n }]);
602
+ newPermissions[0].permanentlyPermittedTimes = UintRangeArray.From([]);
603
+ const error = ValidateUniversalPermissionUpdate(oldPermissions, newPermissions);
604
+ expect(error).toBeNull();
605
+ });
606
+ test('should return error when revoking previously forbidden times', () => {
607
+ const oldPermissions = [
608
+ createPermissionDetails({ start: 1n, end: 10n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false })
609
+ ];
610
+ oldPermissions[0].permanentlyForbiddenTimes = UintRangeArray.From([{ start: 1n, end: 100n }]);
611
+ oldPermissions[0].permanentlyPermittedTimes = UintRangeArray.From([]);
612
+ const newPermissions = [
613
+ createPermissionDetails({ start: 1n, end: 10n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false })
614
+ ];
615
+ newPermissions[0].permanentlyForbiddenTimes = UintRangeArray.From([{ start: 1n, end: 49n }]);
616
+ newPermissions[0].permanentlyPermittedTimes = UintRangeArray.From([]);
617
+ const error = ValidateUniversalPermissionUpdate(oldPermissions, newPermissions);
618
+ expect(error).not.toBeNull();
619
+ expect(error.message).toContain('previously explicitly disApproved');
620
+ });
621
+ });
622
+ describe('GetFirstMatchOnly - additional edge cases', () => {
623
+ test('should handle permission with all uses flags true', () => {
624
+ const permission = {
625
+ tokenIds: UintRangeArray.From([{ start: 1n, end: 10n }]),
626
+ timelineTimes: UintRangeArray.From([{ start: 1n, end: 5n }]),
627
+ transferTimes: UintRangeArray.From([{ start: 1n, end: 5n }]),
628
+ ownershipTimes: UintRangeArray.From([{ start: 1n, end: 5n }]),
629
+ toList: AddressList.AllAddresses(),
630
+ fromList: AddressList.AllAddresses(),
631
+ initiatedByList: AddressList.AllAddresses(),
632
+ approvalIdList: new AddressList({ listId: '', addresses: [], whitelist: false, uri: '', customData: '' }),
633
+ permanentlyPermittedTimes: UintRangeArray.From([{ start: 1n, end: 100n }]),
634
+ permanentlyForbiddenTimes: UintRangeArray.From([]),
635
+ usesTokenIds: true,
636
+ usesTimelineTimes: true,
637
+ usesTransferTimes: true,
638
+ usesToList: true,
639
+ usesFromList: true,
640
+ usesInitiatedByList: true,
641
+ usesOwnershipTimes: true,
642
+ usesApprovalIdList: false,
643
+ arbitraryValue: {}
644
+ };
645
+ const result = GetFirstMatchOnly([permission]);
646
+ expect(result.length).toBeGreaterThanOrEqual(1);
647
+ for (const r of result) {
648
+ expect(r.permanentlyPermittedTimes[0].start).toBe(1n);
649
+ expect(r.permanentlyPermittedTimes[0].end).toBe(100n);
650
+ }
651
+ });
652
+ test('should handle single permission covering entire space', () => {
653
+ const permission = {
654
+ tokenIds: UintRangeArray.From([{ start: 1n, end: 18446744073709551615n }]),
655
+ timelineTimes: UintRangeArray.From([{ start: 1n, end: 1n }]),
656
+ transferTimes: UintRangeArray.From([{ start: 1n, end: 1n }]),
657
+ ownershipTimes: UintRangeArray.From([{ start: 1n, end: 1n }]),
658
+ toList: AddressList.AllAddresses(),
659
+ fromList: AddressList.AllAddresses(),
660
+ initiatedByList: AddressList.AllAddresses(),
661
+ approvalIdList: new AddressList({ listId: '', addresses: [], whitelist: false, uri: '', customData: '' }),
662
+ permanentlyPermittedTimes: UintRangeArray.From([{ start: 1n, end: 18446744073709551615n }]),
663
+ permanentlyForbiddenTimes: UintRangeArray.From([]),
664
+ usesTokenIds: true,
665
+ usesTimelineTimes: false,
666
+ usesTransferTimes: false,
667
+ usesToList: false,
668
+ usesFromList: false,
669
+ usesInitiatedByList: false,
670
+ usesOwnershipTimes: false,
671
+ usesApprovalIdList: false,
672
+ arbitraryValue: {}
673
+ };
674
+ const result = GetFirstMatchOnly([permission]);
675
+ expect(result.length).toBe(1);
676
+ expect(result[0].tokenId.start).toBe(1n);
677
+ expect(result[0].tokenId.end).toBe(18446744073709551615n);
678
+ });
679
+ });
680
+ describe('universalRemoveOverlaps - approvalIdList remaining branch', () => {
681
+ test('should produce approvalId remaining entry when approvalIdList partially overlaps', () => {
682
+ const handled = createPermissionDetails({ start: 1n, end: 10n }, { start: 1n, end: 10n }, { start: 1n, end: 10n }, { start: 1n, end: 10n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [alice], whitelist: true });
683
+ const valueToCheck = createPermissionDetails({ start: 1n, end: 10n }, { start: 1n, end: 10n }, { start: 1n, end: 10n }, { start: 1n, end: 10n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [alice, bob], whitelist: true });
684
+ const [remaining, removed] = universalRemoveOverlaps(handled, valueToCheck);
685
+ expect(remaining.length).toBeGreaterThan(0);
686
+ expect(removed.length).toBeGreaterThan(0);
687
+ });
688
+ });
689
+ describe('ValidateUniversalPermissionUpdate - GetPermissionString branches', () => {
690
+ test('should include field info in error message when values are at MAX_UINT64', () => {
691
+ const MAX = 18446744073709551615n;
692
+ const oldPermissions = [
693
+ createPermissionDetails({ start: MAX, end: MAX }, { start: MAX, end: MAX }, { start: MAX, end: MAX }, { start: MAX, end: MAX }, { addresses: [alice], whitelist: true }, { addresses: [alice], whitelist: true }, { addresses: [alice], whitelist: true })
694
+ ];
695
+ oldPermissions[0].permanentlyPermittedTimes = UintRangeArray.From([{ start: 1n, end: 100n }]);
696
+ const newPermissions = [];
697
+ const error = ValidateUniversalPermissionUpdate(oldPermissions, newPermissions);
698
+ expect(error).not.toBeNull();
699
+ expect(error.message).toContain('found in old permissions but not in new permissions');
700
+ });
701
+ test('should include address details in error message when address list has 1-5 addresses', () => {
702
+ const oldPermissions = [
703
+ createPermissionDetails({ start: 1n, end: 5n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { addresses: [alice, bob], whitelist: true }, { addresses: [alice, bob], whitelist: true }, { addresses: [alice, bob], whitelist: true })
704
+ ];
705
+ oldPermissions[0].permanentlyPermittedTimes = UintRangeArray.From([{ start: 1n, end: 100n }]);
706
+ const newPermissions = [];
707
+ const error = ValidateUniversalPermissionUpdate(oldPermissions, newPermissions);
708
+ expect(error).not.toBeNull();
709
+ expect(error.message).toContain('found in old permissions but not in new permissions');
710
+ });
711
+ test('should produce error with both permitted and forbidden leftover error message', () => {
712
+ const oldPermissions = [
713
+ createPermissionDetails({ start: 1n, end: 10n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false })
714
+ ];
715
+ oldPermissions[0].permanentlyPermittedTimes = UintRangeArray.From([{ start: 1n, end: 50n }]);
716
+ oldPermissions[0].permanentlyForbiddenTimes = UintRangeArray.From([{ start: 51n, end: 100n }]);
717
+ const newPermissions = [
718
+ createPermissionDetails({ start: 1n, end: 10n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { start: 1n, end: 1n }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false }, { addresses: [], whitelist: false })
719
+ ];
720
+ newPermissions[0].permanentlyPermittedTimes = UintRangeArray.From([]);
721
+ newPermissions[0].permanentlyForbiddenTimes = UintRangeArray.From([]);
722
+ const error = ValidateUniversalPermissionUpdate(oldPermissions, newPermissions);
723
+ expect(error).not.toBeNull();
724
+ expect(error.message.toLowerCase()).toMatch(/allowed|disapproved/i);
725
+ });
525
726
  });
526
727
  });
527
728
  //# sourceMappingURL=overlaps.spec.js.map