@btc-vision/transaction 1.7.7 → 1.7.10

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 (173) hide show
  1. package/browser/_version.d.ts +1 -0
  2. package/browser/chain/ChainData.d.ts +4 -0
  3. package/browser/{src/epoch → epoch}/interfaces/IChallengeSolution.d.ts +4 -4
  4. package/browser/{src/generators → generators}/Features.d.ts +6 -1
  5. package/browser/{src/generators → generators}/Generator.d.ts +1 -0
  6. package/browser/generators/MLDSAData.d.ts +15 -0
  7. package/browser/index.js +1 -1
  8. package/browser/{src/keypair → keypair}/Address.d.ts +9 -3
  9. package/browser/{src/keypair → keypair}/MessageSigner.d.ts +9 -0
  10. package/browser/{src/opnet.d.ts → opnet.d.ts} +1 -0
  11. package/browser/{src/transaction → transaction}/browser/Web3Provider.d.ts +15 -4
  12. package/browser/transaction/browser/types/OPWallet.d.ts +6 -0
  13. package/browser/{src/transaction → transaction}/builders/CustomScriptTransaction.d.ts +1 -0
  14. package/browser/{src/transaction → transaction}/builders/DeploymentTransaction.d.ts +1 -0
  15. package/browser/{src/transaction → transaction}/builders/TransactionBuilder.d.ts +4 -0
  16. package/browser/{src/transaction → transaction}/interfaces/ITransactionParameters.d.ts +3 -0
  17. package/browser/{src/transaction → transaction}/shared/TweakedTransaction.d.ts +6 -0
  18. package/browser/{src/utxo → utxo}/OPNetLimitedProvider.d.ts +1 -0
  19. package/build/_version.d.ts +1 -1
  20. package/build/_version.js +1 -1
  21. package/build/chain/ChainData.d.ts +4 -0
  22. package/build/chain/ChainData.js +20 -0
  23. package/build/epoch/ChallengeSolution.js +4 -4
  24. package/build/epoch/interfaces/IChallengeSolution.d.ts +4 -4
  25. package/build/generators/Features.d.ts +6 -1
  26. package/build/generators/Features.js +1 -0
  27. package/build/generators/Generator.d.ts +1 -0
  28. package/build/generators/Generator.js +24 -2
  29. package/build/generators/MLDSAData.d.ts +15 -0
  30. package/build/generators/MLDSAData.js +19 -0
  31. package/build/generators/builders/CalldataGenerator.js +1 -1
  32. package/build/generators/builders/DeploymentGenerator.js +1 -1
  33. package/build/generators/builders/P2WDAGenerator.js +1 -1
  34. package/build/keypair/Address.d.ts +9 -3
  35. package/build/keypair/Address.js +63 -38
  36. package/build/keypair/MessageSigner.d.ts +9 -0
  37. package/build/keypair/MessageSigner.js +101 -3
  38. package/build/opnet.d.ts +1 -0
  39. package/build/opnet.js +1 -0
  40. package/build/transaction/TransactionFactory.js +3 -0
  41. package/build/transaction/browser/Web3Provider.d.ts +15 -4
  42. package/build/transaction/browser/types/OPWallet.d.ts +2 -10
  43. package/build/transaction/browser/types/OPWallet.js +4 -2
  44. package/build/transaction/builders/CustomScriptTransaction.d.ts +1 -0
  45. package/build/transaction/builders/CustomScriptTransaction.js +3 -0
  46. package/build/transaction/builders/DeploymentTransaction.d.ts +1 -0
  47. package/build/transaction/builders/DeploymentTransaction.js +26 -1
  48. package/build/transaction/builders/InteractionTransaction.js +14 -1
  49. package/build/transaction/builders/InteractionTransactionP2WDA.js +14 -1
  50. package/build/transaction/builders/TransactionBuilder.d.ts +4 -0
  51. package/build/transaction/builders/TransactionBuilder.js +77 -0
  52. package/build/transaction/interfaces/ITransactionParameters.d.ts +3 -0
  53. package/build/transaction/shared/P2TR_MS.js +1 -0
  54. package/build/transaction/shared/TweakedTransaction.d.ts +6 -0
  55. package/build/transaction/shared/TweakedTransaction.js +19 -0
  56. package/build/utxo/OPNetLimitedProvider.d.ts +1 -0
  57. package/build/utxo/OPNetLimitedProvider.js +11 -1
  58. package/eslint.config.js +2 -1
  59. package/package.json +1 -1
  60. package/src/_version.ts +1 -1
  61. package/src/chain/ChainData.ts +32 -0
  62. package/src/epoch/ChallengeSolution.ts +4 -4
  63. package/src/epoch/interfaces/IChallengeSolution.ts +4 -4
  64. package/src/generators/Features.ts +8 -2
  65. package/src/generators/Generator.ts +35 -2
  66. package/src/generators/MLDSAData.ts +30 -0
  67. package/src/generators/builders/CalldataGenerator.ts +1 -1
  68. package/src/generators/builders/DeploymentGenerator.ts +2 -1
  69. package/src/generators/builders/LegacyCalldataGenerator.ts +1 -0
  70. package/src/generators/builders/P2WDAGenerator.ts +5 -1
  71. package/src/keypair/Address.ts +78 -38
  72. package/src/keypair/MessageSigner.ts +214 -15
  73. package/src/opnet.ts +2 -0
  74. package/src/transaction/TransactionFactory.ts +3 -0
  75. package/src/transaction/browser/Web3Provider.ts +64 -4
  76. package/src/transaction/browser/types/OPWallet.ts +6 -53
  77. package/src/transaction/builders/CustomScriptTransaction.ts +4 -0
  78. package/src/transaction/builders/DeploymentTransaction.ts +36 -8
  79. package/src/transaction/builders/InteractionTransaction.ts +17 -7
  80. package/src/transaction/builders/InteractionTransactionP2WDA.ts +17 -7
  81. package/src/transaction/builders/TransactionBuilder.ts +107 -0
  82. package/src/transaction/interfaces/ITransactionParameters.ts +12 -0
  83. package/src/transaction/shared/P2TR_MS.ts +1 -0
  84. package/src/transaction/shared/TweakedTransaction.ts +35 -0
  85. package/src/utxo/OPNetLimitedProvider.ts +19 -2
  86. package/test/address.test.ts +18 -20
  87. package/test/addressmap.test.ts +783 -0
  88. package/test/addressverificator-mldsa.test.ts +40 -16
  89. package/test/messagesigner-mldsa.test.ts +50 -50
  90. package/test/messagesigner-schnorr.test.ts +40 -40
  91. package/tsconfig.webpack.json +2 -6
  92. package/webpack.config.js +1 -1
  93. package/browser/src/_version.d.ts +0 -1
  94. package/browser/src/transaction/browser/types/OPWallet.d.ts +0 -14
  95. package/browser/test/address.test.d.ts +0 -1
  96. package/browser/test/addressverificator-mldsa.test.d.ts +0 -1
  97. package/browser/test/derivePath.test.d.ts +0 -1
  98. package/browser/test/fastmap-setall.test.d.ts +0 -1
  99. package/browser/test/fastmap.test.d.ts +0 -1
  100. package/browser/test/messagesigner-mldsa.test.d.ts +0 -1
  101. package/browser/test/messagesigner-schnorr.test.d.ts +0 -1
  102. package/browser/test/network-awareness.test.d.ts +0 -1
  103. package/browser/test/old/FastBigIntMap.d.ts +0 -18
  104. package/browser/test/oldfastmap.test.d.ts +0 -1
  105. /package/browser/{src/abi → abi}/ABICoder.d.ts +0 -0
  106. /package/browser/{src/buffer → buffer}/BinaryReader.d.ts +0 -0
  107. /package/browser/{src/buffer → buffer}/BinaryWriter.d.ts +0 -0
  108. /package/browser/{src/bytecode → bytecode}/Compressor.d.ts +0 -0
  109. /package/browser/{src/consensus → consensus}/Consensus.d.ts +0 -0
  110. /package/browser/{src/consensus → consensus}/ConsensusConfig.d.ts +0 -0
  111. /package/browser/{src/consensus → consensus}/metadata/RoswellConsensus.d.ts +0 -0
  112. /package/browser/{src/crypto → crypto}/crypto-browser.d.ts +0 -0
  113. /package/browser/{src/crypto → crypto}/crypto.d.ts +0 -0
  114. /package/browser/{src/deterministic → deterministic}/AddressMap.d.ts +0 -0
  115. /package/browser/{src/deterministic → deterministic}/AddressSet.d.ts +0 -0
  116. /package/browser/{src/deterministic → deterministic}/CustomMap.d.ts +0 -0
  117. /package/browser/{src/deterministic → deterministic}/DeterministicMap.d.ts +0 -0
  118. /package/browser/{src/deterministic → deterministic}/DeterministicSet.d.ts +0 -0
  119. /package/browser/{src/deterministic → deterministic}/FastMap.d.ts +0 -0
  120. /package/browser/{src/epoch → epoch}/ChallengeSolution.d.ts +0 -0
  121. /package/browser/{src/epoch → epoch}/validator/EpochValidator.d.ts +0 -0
  122. /package/browser/{src/event → event}/NetEvent.d.ts +0 -0
  123. /package/browser/{src/generators → generators}/AddressGenerator.d.ts +0 -0
  124. /package/browser/{src/generators → generators}/builders/CalldataGenerator.d.ts +0 -0
  125. /package/browser/{src/generators → generators}/builders/CustomGenerator.d.ts +0 -0
  126. /package/browser/{src/generators → generators}/builders/DeploymentGenerator.d.ts +0 -0
  127. /package/browser/{src/generators → generators}/builders/LegacyCalldataGenerator.d.ts +0 -0
  128. /package/browser/{src/generators → generators}/builders/MultiSignGenerator.d.ts +0 -0
  129. /package/browser/{src/generators → generators}/builders/P2WDAGenerator.d.ts +0 -0
  130. /package/browser/{src/index.d.ts → index.d.ts} +0 -0
  131. /package/browser/{src/keypair → keypair}/AddressVerificator.d.ts +0 -0
  132. /package/browser/{src/keypair → keypair}/EcKeyPair.d.ts +0 -0
  133. /package/browser/{src/keypair → keypair}/Secp256k1PointDeriver.d.ts +0 -0
  134. /package/browser/{src/keypair → keypair}/Wallet.d.ts +0 -0
  135. /package/browser/{src/keypair → keypair}/interfaces/IWallet.d.ts +0 -0
  136. /package/browser/{src/metadata → metadata}/ContractBaseMetadata.d.ts +0 -0
  137. /package/browser/{src/metadata → metadata}/tokens.d.ts +0 -0
  138. /package/browser/{src/mnemonic → mnemonic}/BIPStandard.d.ts +0 -0
  139. /package/browser/{src/mnemonic → mnemonic}/Mnemonic.d.ts +0 -0
  140. /package/browser/{src/mnemonic → mnemonic}/MnemonicStrength.d.ts +0 -0
  141. /package/browser/{src/network → network}/ChainId.d.ts +0 -0
  142. /package/browser/{src/p2wda → p2wda}/P2WDADetector.d.ts +0 -0
  143. /package/browser/{src/signer → signer}/SignerUtils.d.ts +0 -0
  144. /package/browser/{src/signer → signer}/TweakedSigner.d.ts +0 -0
  145. /package/browser/{src/transaction → transaction}/ContractAddress.d.ts +0 -0
  146. /package/browser/{src/transaction → transaction}/TransactionFactory.d.ts +0 -0
  147. /package/browser/{src/transaction → transaction}/browser/BrowserSignerBase.d.ts +0 -0
  148. /package/browser/{src/transaction → transaction}/browser/extensions/UnisatSigner.d.ts +0 -0
  149. /package/browser/{src/transaction → transaction}/browser/extensions/XverseSigner.d.ts +0 -0
  150. /package/browser/{src/transaction → transaction}/browser/types/Unisat.d.ts +0 -0
  151. /package/browser/{src/transaction → transaction}/browser/types/Xverse.d.ts +0 -0
  152. /package/browser/{src/transaction → transaction}/builders/CancelTransaction.d.ts +0 -0
  153. /package/browser/{src/transaction → transaction}/builders/ChallengeSolutionTransaction.d.ts +0 -0
  154. /package/browser/{src/transaction → transaction}/builders/FundingTransaction.d.ts +0 -0
  155. /package/browser/{src/transaction → transaction}/builders/InteractionTransaction.d.ts +0 -0
  156. /package/browser/{src/transaction → transaction}/builders/InteractionTransactionP2WDA.d.ts +0 -0
  157. /package/browser/{src/transaction → transaction}/builders/MultiSignTransaction.d.ts +0 -0
  158. /package/browser/{src/transaction → transaction}/builders/SharedInteractionTransaction.d.ts +0 -0
  159. /package/browser/{src/transaction → transaction}/enums/TransactionType.d.ts +0 -0
  160. /package/browser/{src/transaction → transaction}/interfaces/Tap.d.ts +0 -0
  161. /package/browser/{src/transaction → transaction}/mineable/IP2WSHAddress.d.ts +0 -0
  162. /package/browser/{src/transaction → transaction}/mineable/TimelockGenerator.d.ts +0 -0
  163. /package/browser/{src/transaction → transaction}/processor/PsbtTransaction.d.ts +0 -0
  164. /package/browser/{src/transaction → transaction}/psbt/PSBTTypes.d.ts +0 -0
  165. /package/browser/{src/transaction → transaction}/shared/P2TR_MS.d.ts +0 -0
  166. /package/browser/{src/utils → utils}/BitcoinUtils.d.ts +0 -0
  167. /package/browser/{src/utils → utils}/BufferHelper.d.ts +0 -0
  168. /package/browser/{src/utils → utils}/StringToBuffer.d.ts +0 -0
  169. /package/browser/{src/utils → utils}/lengths.d.ts +0 -0
  170. /package/browser/{src/utils → utils}/types.d.ts +0 -0
  171. /package/browser/{src/utxo → utxo}/interfaces/BroadcastResponse.d.ts +0 -0
  172. /package/browser/{src/utxo → utxo}/interfaces/IUTXO.d.ts +0 -0
  173. /package/browser/{src/verification → verification}/TapscriptVerificator.d.ts +0 -0
@@ -0,0 +1,783 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { Address, AddressMap } from '../src';
3
+
4
+ describe('AddressMap', () => {
5
+ // Store original fromBigInt to restore later
6
+ const originalFromBigInt = Address.fromBigInt.bind(Address);
7
+
8
+ // Helper to create mock addresses with predictable bigint values
9
+ const createMockAddress = (value: bigint): Address => {
10
+ return originalFromBigInt(value);
11
+ };
12
+
13
+ beforeEach(() => {
14
+ // Mock Address.fromBigInt to return a mock address
15
+ Address.fromBigInt = vi.fn((value: bigint) => createMockAddress(value));
16
+ });
17
+
18
+ afterEach(() => {
19
+ Address.fromBigInt = originalFromBigInt;
20
+ });
21
+
22
+ describe('constructor', () => {
23
+ it('should create an empty map with no arguments', () => {
24
+ const map = new AddressMap();
25
+ expect(map.size).toBe(0);
26
+ });
27
+
28
+ it('should create an empty map with null', () => {
29
+ const map = new AddressMap(null);
30
+ expect(map.size).toBe(0);
31
+ });
32
+
33
+ it('should create a map from iterable', () => {
34
+ const addr1 = createMockAddress(1n);
35
+ const addr2 = createMockAddress(2n);
36
+
37
+ const map = new AddressMap([
38
+ [addr1, 'value1'],
39
+ [addr2, 'value2'],
40
+ ]);
41
+
42
+ expect(map.size).toBe(2);
43
+ expect(map.get(addr1)).toBe('value1');
44
+ expect(map.get(addr2)).toBe('value2');
45
+ });
46
+
47
+ it('should handle empty iterable', () => {
48
+ const map = new AddressMap([]);
49
+ expect(map.size).toBe(0);
50
+ });
51
+ });
52
+
53
+ describe('size', () => {
54
+ it('should return 0 for empty map', () => {
55
+ const map = new AddressMap();
56
+ expect(map.size).toBe(0);
57
+ });
58
+
59
+ it('should return correct size after additions', () => {
60
+ const map = new AddressMap<string>();
61
+ map.set(createMockAddress(1n), 'a');
62
+ expect(map.size).toBe(1);
63
+ map.set(createMockAddress(2n), 'b');
64
+ expect(map.size).toBe(2);
65
+ map.set(createMockAddress(3n), 'c');
66
+ expect(map.size).toBe(3);
67
+ });
68
+
69
+ it('should not increase size when setting existing key', () => {
70
+ const map = new AddressMap<string>();
71
+ const addr = createMockAddress(1n);
72
+ map.set(addr, 'a');
73
+ expect(map.size).toBe(1);
74
+ map.set(addr, 'b');
75
+ expect(map.size).toBe(1);
76
+ });
77
+
78
+ it('should decrease size after deletion', () => {
79
+ const map = new AddressMap<string>();
80
+ const addr = createMockAddress(1n);
81
+ map.set(addr, 'a');
82
+ expect(map.size).toBe(1);
83
+ map.delete(addr);
84
+ expect(map.size).toBe(0);
85
+ });
86
+ });
87
+
88
+ describe('set', () => {
89
+ it('should add new key-value pair', () => {
90
+ const map = new AddressMap<string>();
91
+ const addr = createMockAddress(1n);
92
+
93
+ map.set(addr, 'test');
94
+
95
+ expect(map.has(addr)).toBe(true);
96
+ expect(map.get(addr)).toBe('test');
97
+ });
98
+
99
+ it('should update existing key', () => {
100
+ const map = new AddressMap<string>();
101
+ const addr = createMockAddress(1n);
102
+
103
+ map.set(addr, 'first');
104
+ map.set(addr, 'second');
105
+
106
+ expect(map.get(addr)).toBe('second');
107
+ expect(map.size).toBe(1);
108
+ });
109
+
110
+ it('should return this for chaining', () => {
111
+ const map = new AddressMap<string>();
112
+ const addr1 = createMockAddress(1n);
113
+ const addr2 = createMockAddress(2n);
114
+
115
+ const result = map.set(addr1, 'a').set(addr2, 'b');
116
+
117
+ expect(result).toBe(map);
118
+ expect(map.size).toBe(2);
119
+ });
120
+
121
+ it('should handle various value types', () => {
122
+ const map = new AddressMap<unknown>();
123
+ const addr1 = createMockAddress(1n);
124
+ const addr2 = createMockAddress(2n);
125
+ const addr3 = createMockAddress(3n);
126
+ const addr4 = createMockAddress(4n);
127
+ const addr5 = createMockAddress(5n);
128
+
129
+ map.set(addr1, null);
130
+ map.set(addr2, undefined);
131
+ map.set(addr3, { nested: 'object' });
132
+ map.set(addr4, [1, 2, 3]);
133
+ map.set(addr5, () => 'function');
134
+
135
+ expect(map.get(addr1)).toBe(null);
136
+ expect(map.get(addr2)).toBe(undefined);
137
+ expect(map.get(addr3)).toEqual({ nested: 'object' });
138
+ expect(map.get(addr4)).toEqual([1, 2, 3]);
139
+ expect(typeof map.get(addr5)).toBe('function');
140
+ });
141
+ });
142
+
143
+ describe('get', () => {
144
+ it('should return value for existing key', () => {
145
+ const map = new AddressMap<string>();
146
+ const addr = createMockAddress(1n);
147
+ map.set(addr, 'test');
148
+
149
+ expect(map.get(addr)).toBe('test');
150
+ });
151
+
152
+ it('should return undefined for non-existing key', () => {
153
+ const map = new AddressMap<string>();
154
+ const addr = createMockAddress(1n);
155
+
156
+ expect(map.get(addr)).toBeUndefined();
157
+ });
158
+
159
+ it('should return undefined after key is deleted', () => {
160
+ const map = new AddressMap<string>();
161
+ const addr = createMockAddress(1n);
162
+ map.set(addr, 'test');
163
+ map.delete(addr);
164
+
165
+ expect(map.get(addr)).toBeUndefined();
166
+ });
167
+
168
+ it('should distinguish between undefined value and missing key', () => {
169
+ const map = new AddressMap<string | undefined>();
170
+ const addr1 = createMockAddress(1n);
171
+ const addr2 = createMockAddress(2n);
172
+
173
+ map.set(addr1, undefined);
174
+
175
+ expect(map.get(addr1)).toBeUndefined();
176
+ expect(map.get(addr2)).toBeUndefined();
177
+ expect(map.has(addr1)).toBe(true);
178
+ expect(map.has(addr2)).toBe(false);
179
+ });
180
+ });
181
+
182
+ describe('has', () => {
183
+ it('should return true for existing key', () => {
184
+ const map = new AddressMap<string>();
185
+ const addr = createMockAddress(1n);
186
+ map.set(addr, 'test');
187
+
188
+ expect(map.has(addr)).toBe(true);
189
+ });
190
+
191
+ it('should return false for non-existing key', () => {
192
+ const map = new AddressMap<string>();
193
+ const addr = createMockAddress(1n);
194
+
195
+ expect(map.has(addr)).toBe(false);
196
+ });
197
+
198
+ it('should return false after key is deleted', () => {
199
+ const map = new AddressMap<string>();
200
+ const addr = createMockAddress(1n);
201
+ map.set(addr, 'test');
202
+ map.delete(addr);
203
+
204
+ expect(map.has(addr)).toBe(false);
205
+ });
206
+
207
+ it('should return true for key with undefined value', () => {
208
+ const map = new AddressMap<string | undefined>();
209
+ const addr = createMockAddress(1n);
210
+ map.set(addr, undefined);
211
+
212
+ expect(map.has(addr)).toBe(true);
213
+ });
214
+
215
+ it('should return true for key with null value', () => {
216
+ const map = new AddressMap<string | null>();
217
+ const addr = createMockAddress(1n);
218
+ map.set(addr, null);
219
+
220
+ expect(map.has(addr)).toBe(true);
221
+ });
222
+ });
223
+
224
+ describe('delete', () => {
225
+ it('should delete existing key and return true', () => {
226
+ const map = new AddressMap<string>();
227
+ const addr = createMockAddress(1n);
228
+ map.set(addr, 'test');
229
+
230
+ const result = map.delete(addr);
231
+
232
+ expect(result).toBe(true);
233
+ expect(map.has(addr)).toBe(false);
234
+ expect(map.size).toBe(0);
235
+ });
236
+
237
+ it('should return false for non-existing key', () => {
238
+ const map = new AddressMap<string>();
239
+ const addr = createMockAddress(1n);
240
+
241
+ const result = map.delete(addr);
242
+
243
+ expect(result).toBe(false);
244
+ });
245
+
246
+ it('should return false when deleting same key twice', () => {
247
+ const map = new AddressMap<string>();
248
+ const addr = createMockAddress(1n);
249
+ map.set(addr, 'test');
250
+
251
+ expect(map.delete(addr)).toBe(true);
252
+ expect(map.delete(addr)).toBe(false);
253
+ });
254
+
255
+ it('should not affect other keys', () => {
256
+ const map = new AddressMap<string>();
257
+ const addr1 = createMockAddress(1n);
258
+ const addr2 = createMockAddress(2n);
259
+ const addr3 = createMockAddress(3n);
260
+
261
+ map.set(addr1, 'a');
262
+ map.set(addr2, 'b');
263
+ map.set(addr3, 'c');
264
+
265
+ map.delete(addr2);
266
+
267
+ expect(map.has(addr1)).toBe(true);
268
+ expect(map.has(addr2)).toBe(false);
269
+ expect(map.has(addr3)).toBe(true);
270
+ expect(map.size).toBe(2);
271
+ });
272
+ });
273
+
274
+ describe('clear', () => {
275
+ it('should remove all entries', () => {
276
+ const map = new AddressMap<string>();
277
+ map.set(createMockAddress(1n), 'a');
278
+ map.set(createMockAddress(2n), 'b');
279
+ map.set(createMockAddress(3n), 'c');
280
+
281
+ map.clear();
282
+
283
+ expect(map.size).toBe(0);
284
+ });
285
+
286
+ it('should work on empty map', () => {
287
+ const map = new AddressMap<string>();
288
+
289
+ map.clear();
290
+
291
+ expect(map.size).toBe(0);
292
+ });
293
+
294
+ it('should allow adding after clear', () => {
295
+ const map = new AddressMap<string>();
296
+ const addr = createMockAddress(1n);
297
+ map.set(addr, 'before');
298
+ map.clear();
299
+ map.set(addr, 'after');
300
+
301
+ expect(map.get(addr)).toBe('after');
302
+ expect(map.size).toBe(1);
303
+ });
304
+ });
305
+
306
+ describe('indexOf', () => {
307
+ it('should return index of existing key', () => {
308
+ const map = new AddressMap<string>();
309
+ const addr1 = createMockAddress(1n);
310
+ const addr2 = createMockAddress(2n);
311
+ const addr3 = createMockAddress(3n);
312
+
313
+ map.set(addr1, 'a');
314
+ map.set(addr2, 'b');
315
+ map.set(addr3, 'c');
316
+
317
+ expect(map.indexOf(addr1)).toBe(0);
318
+ expect(map.indexOf(addr2)).toBe(1);
319
+ expect(map.indexOf(addr3)).toBe(2);
320
+ });
321
+
322
+ it('should return -1 for non-existing key', () => {
323
+ const map = new AddressMap<string>();
324
+ const addr = createMockAddress(1n);
325
+
326
+ expect(map.indexOf(addr)).toBe(-1);
327
+ });
328
+
329
+ it('should return -1 after key is deleted', () => {
330
+ const map = new AddressMap<string>();
331
+ const addr = createMockAddress(1n);
332
+ map.set(addr, 'test');
333
+ map.delete(addr);
334
+
335
+ expect(map.indexOf(addr)).toBe(-1);
336
+ });
337
+
338
+ it('should update indices after deletion', () => {
339
+ const map = new AddressMap<string>();
340
+ const addr1 = createMockAddress(1n);
341
+ const addr2 = createMockAddress(2n);
342
+ const addr3 = createMockAddress(3n);
343
+
344
+ map.set(addr1, 'a');
345
+ map.set(addr2, 'b');
346
+ map.set(addr3, 'c');
347
+
348
+ map.delete(addr1);
349
+
350
+ expect(map.indexOf(addr2)).toBe(0);
351
+ expect(map.indexOf(addr3)).toBe(1);
352
+ });
353
+ });
354
+
355
+ describe('entries', () => {
356
+ it('should yield all entries', () => {
357
+ const map = new AddressMap<string>();
358
+ map.set(createMockAddress(1n), 'a');
359
+ map.set(createMockAddress(2n), 'b');
360
+ map.set(createMockAddress(3n), 'c');
361
+
362
+ const entries = [...map.entries()];
363
+
364
+ expect(entries.length).toBe(3);
365
+ expect(entries[0][0].toBigInt()).toBe(1n);
366
+ expect(entries[0][1]).toBe('a');
367
+ expect(entries[1][0].toBigInt()).toBe(2n);
368
+ expect(entries[1][1]).toBe('b');
369
+ expect(entries[2][0].toBigInt()).toBe(3n);
370
+ expect(entries[2][1]).toBe('c');
371
+ });
372
+
373
+ it('should yield nothing for empty map', () => {
374
+ const map = new AddressMap<string>();
375
+
376
+ const entries = [...map.entries()];
377
+
378
+ expect(entries).toEqual([]);
379
+ });
380
+
381
+ it('should maintain insertion order', () => {
382
+ const map = new AddressMap<string>();
383
+ map.set(createMockAddress(3n), 'c');
384
+ map.set(createMockAddress(1n), 'a');
385
+ map.set(createMockAddress(2n), 'b');
386
+
387
+ const entries = [...map.entries()];
388
+
389
+ expect(entries[0][0].toBigInt()).toBe(3n);
390
+ expect(entries[1][0].toBigInt()).toBe(1n);
391
+ expect(entries[2][0].toBigInt()).toBe(2n);
392
+ });
393
+
394
+ it('should create new Address instances (not references)', () => {
395
+ const map = new AddressMap<string>();
396
+ map.set(createMockAddress(1n), 'a');
397
+
398
+ const entries1 = [...map.entries()];
399
+ const entries2 = [...map.entries()];
400
+
401
+ // Address.fromBigInt should be called for each iteration
402
+ expect(Address.fromBigInt).toHaveBeenCalledWith(1n);
403
+ });
404
+ });
405
+
406
+ describe('keys', () => {
407
+ it('should yield all keys', () => {
408
+ const map = new AddressMap<string>();
409
+ map.set(createMockAddress(1n), 'a');
410
+ map.set(createMockAddress(2n), 'b');
411
+ map.set(createMockAddress(3n), 'c');
412
+
413
+ const keys = [...map.keys()];
414
+
415
+ expect(keys.length).toBe(3);
416
+ expect(keys[0].toBigInt()).toBe(1n);
417
+ expect(keys[1].toBigInt()).toBe(2n);
418
+ expect(keys[2].toBigInt()).toBe(3n);
419
+ });
420
+
421
+ it('should yield nothing for empty map', () => {
422
+ const map = new AddressMap<string>();
423
+
424
+ const keys = [...map.keys()];
425
+
426
+ expect(keys).toEqual([]);
427
+ });
428
+
429
+ it('should maintain insertion order', () => {
430
+ const map = new AddressMap<string>();
431
+ map.set(createMockAddress(30n), 'c');
432
+ map.set(createMockAddress(10n), 'a');
433
+ map.set(createMockAddress(20n), 'b');
434
+
435
+ const keys = [...map.keys()];
436
+
437
+ expect(keys[0].toBigInt()).toBe(30n);
438
+ expect(keys[1].toBigInt()).toBe(10n);
439
+ expect(keys[2].toBigInt()).toBe(20n);
440
+ });
441
+ });
442
+
443
+ describe('values', () => {
444
+ it('should yield all values', () => {
445
+ const map = new AddressMap<string>();
446
+ map.set(createMockAddress(1n), 'a');
447
+ map.set(createMockAddress(2n), 'b');
448
+ map.set(createMockAddress(3n), 'c');
449
+
450
+ const values = [...map.values()];
451
+
452
+ expect(values).toEqual(['a', 'b', 'c']);
453
+ });
454
+
455
+ it('should yield nothing for empty map', () => {
456
+ const map = new AddressMap<string>();
457
+
458
+ const values = [...map.values()];
459
+
460
+ expect(values).toEqual([]);
461
+ });
462
+
463
+ it('should maintain insertion order', () => {
464
+ const map = new AddressMap<string>();
465
+ map.set(createMockAddress(3n), 'third');
466
+ map.set(createMockAddress(1n), 'first');
467
+ map.set(createMockAddress(2n), 'second');
468
+
469
+ const values = [...map.values()];
470
+
471
+ expect(values).toEqual(['third', 'first', 'second']);
472
+ });
473
+
474
+ it('should yield updated values', () => {
475
+ const map = new AddressMap<string>();
476
+ const addr = createMockAddress(1n);
477
+ map.set(addr, 'original');
478
+ map.set(addr, 'updated');
479
+
480
+ const values = [...map.values()];
481
+
482
+ expect(values).toEqual(['updated']);
483
+ });
484
+ });
485
+
486
+ describe('forEach', () => {
487
+ it('should call callback for each entry', () => {
488
+ const map = new AddressMap<string>();
489
+ map.set(createMockAddress(1n), 'a');
490
+ map.set(createMockAddress(2n), 'b');
491
+ map.set(createMockAddress(3n), 'c');
492
+
493
+ const callback = vi.fn();
494
+ map.forEach(callback);
495
+
496
+ expect(callback).toHaveBeenCalledTimes(3);
497
+ });
498
+
499
+ /*it('should pass value, key, and map to callback', () => {
500
+ const map = new AddressMap<string>();
501
+ map.set(createMockAddress(1n), 'test');
502
+
503
+ const callback = vi.fn();
504
+ map.forEach(callback);
505
+
506
+ expect(callback).toHaveBeenCalledWith(
507
+ 'test',
508
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
509
+ expect.objectContaining({ toBigInt: expect.any(Function) }),
510
+ map,
511
+ );
512
+ });*/
513
+
514
+ it('should iterate in insertion order', () => {
515
+ const map = new AddressMap<string>();
516
+ map.set(createMockAddress(3n), 'c');
517
+ map.set(createMockAddress(1n), 'a');
518
+ map.set(createMockAddress(2n), 'b');
519
+
520
+ const values: string[] = [];
521
+ map.forEach((value) => values.push(value));
522
+
523
+ expect(values).toEqual(['c', 'a', 'b']);
524
+ });
525
+
526
+ it('should not call callback for empty map', () => {
527
+ const map = new AddressMap<string>();
528
+
529
+ const callback = vi.fn();
530
+ map.forEach(callback);
531
+
532
+ expect(callback).not.toHaveBeenCalled();
533
+ });
534
+
535
+ it('should use thisArg as context', () => {
536
+ const map = new AddressMap<number>();
537
+ map.set(createMockAddress(1n), 10);
538
+ map.set(createMockAddress(2n), 20);
539
+ map.set(createMockAddress(3n), 30);
540
+
541
+ const collector = {
542
+ sum: 0,
543
+ add(value: number) {
544
+ this.sum += value;
545
+ },
546
+ };
547
+
548
+ map.forEach(function (this: typeof collector, value) {
549
+ this.add(value);
550
+ }, collector);
551
+
552
+ expect(collector.sum).toBe(60);
553
+ });
554
+
555
+ it('should work without thisArg', () => {
556
+ const map = new AddressMap<number>();
557
+ map.set(createMockAddress(1n), 1);
558
+
559
+ let sum = 0;
560
+ map.forEach((value) => {
561
+ sum += value;
562
+ });
563
+
564
+ expect(sum).toBe(1);
565
+ });
566
+ });
567
+
568
+ describe('Symbol.iterator', () => {
569
+ it('should be iterable with for...of', () => {
570
+ const map = new AddressMap<string>();
571
+ map.set(createMockAddress(1n), 'a');
572
+ map.set(createMockAddress(2n), 'b');
573
+
574
+ const entries: [Address, string][] = [];
575
+ for (const entry of map) {
576
+ entries.push(entry);
577
+ }
578
+
579
+ expect(entries.length).toBe(2);
580
+ expect(entries[0][0].toBigInt()).toBe(1n);
581
+ expect(entries[0][1]).toBe('a');
582
+ expect(entries[1][0].toBigInt()).toBe(2n);
583
+ expect(entries[1][1]).toBe('b');
584
+ });
585
+
586
+ it('should work with spread operator', () => {
587
+ const map = new AddressMap<string>();
588
+ map.set(createMockAddress(1n), 'a');
589
+ map.set(createMockAddress(2n), 'b');
590
+
591
+ const entries = [...map];
592
+
593
+ expect(entries.length).toBe(2);
594
+ });
595
+
596
+ it('should work with Array.from', () => {
597
+ const map = new AddressMap<string>();
598
+ map.set(createMockAddress(1n), 'a');
599
+
600
+ const entries = Array.from(map);
601
+
602
+ expect(entries.length).toBe(1);
603
+ });
604
+
605
+ it('should yield same as entries()', () => {
606
+ const map = new AddressMap<string>();
607
+ map.set(createMockAddress(1n), 'a');
608
+ map.set(createMockAddress(2n), 'b');
609
+
610
+ const fromIterator = [...map];
611
+ const fromEntries = [...map.entries()];
612
+
613
+ expect(fromIterator.length).toBe(fromEntries.length);
614
+ for (let i = 0; i < fromIterator.length; i++) {
615
+ expect(fromIterator[i][0].toBigInt()).toBe(fromEntries[i][0].toBigInt());
616
+ expect(fromIterator[i][1]).toBe(fromEntries[i][1]);
617
+ }
618
+ });
619
+ });
620
+
621
+ describe('edge cases', () => {
622
+ it('should handle large number of entries', () => {
623
+ const map = new AddressMap<number>();
624
+ const count = 10000;
625
+
626
+ for (let i = 0; i < count; i++) {
627
+ map.set(createMockAddress(BigInt(i)), i);
628
+ }
629
+
630
+ expect(map.size).toBe(count);
631
+ expect(map.get(createMockAddress(0n))).toBe(0);
632
+ expect(map.get(createMockAddress(BigInt(count - 1)))).toBe(count - 1);
633
+ });
634
+
635
+ it('should handle addresses with very large bigint values', () => {
636
+ const map = new AddressMap<string>();
637
+ const largeBigInt = 2n ** 256n - 1n;
638
+ const addr = createMockAddress(largeBigInt);
639
+
640
+ map.set(addr, 'large');
641
+
642
+ expect(map.get(addr)).toBe('large');
643
+ expect(map.has(addr)).toBe(true);
644
+ });
645
+
646
+ it('should handle zero bigint value', () => {
647
+ const map = new AddressMap<string>();
648
+ const addr = createMockAddress(0n);
649
+
650
+ map.set(addr, 'zero');
651
+
652
+ expect(map.get(addr)).toBe('zero');
653
+ expect(map.has(addr)).toBe(true);
654
+ });
655
+
656
+ it('should handle negative bigint values', () => {
657
+ const map = new AddressMap<string>();
658
+ const addr = createMockAddress(-1n);
659
+
660
+ map.set(addr, 'negative');
661
+
662
+ expect(map.get(addr)).toBe('negative');
663
+ expect(map.has(addr)).toBe(true);
664
+ });
665
+
666
+ it('should handle rapid set/delete cycles', () => {
667
+ const map = new AddressMap<number>();
668
+ const addr = createMockAddress(1n);
669
+
670
+ for (let i = 0; i < 1000; i++) {
671
+ map.set(addr, i);
672
+ if (i % 2 === 0) {
673
+ map.delete(addr);
674
+ }
675
+ }
676
+
677
+ // Last iteration: i=999, set to 999, 999 % 2 !== 0, so not deleted
678
+ expect(map.get(addr)).toBe(999);
679
+ });
680
+
681
+ it('should handle interleaved operations', () => {
682
+ const map = new AddressMap<string>();
683
+ const addr1 = createMockAddress(1n);
684
+ const addr2 = createMockAddress(2n);
685
+ const addr3 = createMockAddress(3n);
686
+
687
+ map.set(addr1, 'a');
688
+ map.set(addr2, 'b');
689
+ map.delete(addr1);
690
+ map.set(addr3, 'c');
691
+ map.set(addr1, 'a2');
692
+ map.delete(addr2);
693
+
694
+ expect(map.size).toBe(2);
695
+ expect(map.get(addr1)).toBe('a2');
696
+ expect(map.has(addr2)).toBe(false);
697
+ expect(map.get(addr3)).toBe('c');
698
+
699
+ // Check order: addr3 was added before addr1 was re-added
700
+ const keys = [...map.keys()];
701
+ expect(keys[0].toBigInt()).toBe(3n);
702
+ expect(keys[1].toBigInt()).toBe(1n);
703
+ });
704
+ });
705
+
706
+ describe('performance', () => {
707
+ it('should handle bulk insertions efficiently', () => {
708
+ const map = new AddressMap<number>();
709
+ const start = performance.now();
710
+
711
+ for (let i = 0; i < 50000; i++) {
712
+ map.set(createMockAddress(BigInt(i)), i);
713
+ }
714
+
715
+ const duration = performance.now() - start;
716
+
717
+ expect(map.size).toBe(50000);
718
+ // Should complete in reasonable time (adjust threshold as needed)
719
+ expect(duration).toBeLessThan(5000); // 5 seconds max
720
+ });
721
+
722
+ it('should handle bulk lookups efficiently', () => {
723
+ const map = new AddressMap<number>();
724
+ const count = 50000;
725
+
726
+ for (let i = 0; i < count; i++) {
727
+ map.set(createMockAddress(BigInt(i)), i);
728
+ }
729
+
730
+ const start = performance.now();
731
+
732
+ for (let i = 0; i < count; i++) {
733
+ map.get(createMockAddress(BigInt(i)));
734
+ }
735
+
736
+ const duration = performance.now() - start;
737
+
738
+ // Should complete in reasonable time
739
+ expect(duration).toBeLessThan(5000);
740
+ });
741
+
742
+ it('should handle bulk deletions efficiently', () => {
743
+ const map = new AddressMap<number>();
744
+ const count = 10000;
745
+
746
+ for (let i = 0; i < count; i++) {
747
+ map.set(createMockAddress(BigInt(i)), i);
748
+ }
749
+
750
+ const start = performance.now();
751
+
752
+ for (let i = 0; i < count; i++) {
753
+ map.delete(createMockAddress(BigInt(i)));
754
+ }
755
+
756
+ const duration = performance.now() - start;
757
+
758
+ expect(map.size).toBe(0);
759
+ expect(duration).toBeLessThan(5000);
760
+ });
761
+
762
+ it('should iterate efficiently over large map', () => {
763
+ const map = new AddressMap<number>();
764
+ const count = 50000;
765
+
766
+ for (let i = 0; i < count; i++) {
767
+ map.set(createMockAddress(BigInt(i)), i);
768
+ }
769
+
770
+ const start = performance.now();
771
+
772
+ let sum = 0;
773
+ for (const [, value] of map) {
774
+ sum += value;
775
+ }
776
+
777
+ const duration = performance.now() - start;
778
+
779
+ expect(sum).toBe((count * (count - 1)) / 2);
780
+ expect(duration).toBeLessThan(5000);
781
+ });
782
+ });
783
+ });