@btc-vision/bitcoin 7.0.0-alpha.1 → 7.0.0-alpha.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 (290) hide show
  1. package/README.md +455 -155
  2. package/browser/address.d.ts +5 -1
  3. package/browser/address.d.ts.map +1 -1
  4. package/browser/branded.d.ts +3 -14
  5. package/browser/branded.d.ts.map +1 -1
  6. package/browser/chunks/psbt-parallel-BBFlkmiv.js +10717 -0
  7. package/browser/ecc/context.d.ts +22 -21
  8. package/browser/ecc/context.d.ts.map +1 -1
  9. package/browser/ecc/index.d.ts +1 -1
  10. package/browser/ecc/index.d.ts.map +1 -1
  11. package/browser/ecc/types.d.ts +10 -123
  12. package/browser/ecc/types.d.ts.map +1 -1
  13. package/browser/env.d.ts +13 -0
  14. package/browser/env.d.ts.map +1 -0
  15. package/browser/index.d.ts +6 -6
  16. package/browser/index.d.ts.map +1 -1
  17. package/browser/index.js +2602 -11786
  18. package/browser/io/hex.d.ts.map +1 -1
  19. package/browser/io/index.d.ts +0 -1
  20. package/browser/io/index.d.ts.map +1 -1
  21. package/browser/opcodes.d.ts +11 -0
  22. package/browser/opcodes.d.ts.map +1 -1
  23. package/browser/payments/p2tr.d.ts.map +1 -1
  24. package/browser/psbt/PsbtCache.d.ts +54 -0
  25. package/browser/psbt/PsbtCache.d.ts.map +1 -0
  26. package/browser/psbt/PsbtFinalizer.d.ts +21 -0
  27. package/browser/psbt/PsbtFinalizer.d.ts.map +1 -0
  28. package/browser/psbt/PsbtSigner.d.ts +32 -0
  29. package/browser/psbt/PsbtSigner.d.ts.map +1 -0
  30. package/browser/psbt/PsbtTransaction.d.ts +25 -0
  31. package/browser/psbt/PsbtTransaction.d.ts.map +1 -0
  32. package/browser/psbt/types.d.ts +4 -70
  33. package/browser/psbt/types.d.ts.map +1 -1
  34. package/browser/psbt/validation.d.ts +1 -1
  35. package/browser/psbt/validation.d.ts.map +1 -1
  36. package/browser/psbt.d.ts +26 -40
  37. package/browser/psbt.d.ts.map +1 -1
  38. package/browser/script.d.ts.map +1 -1
  39. package/browser/transaction.d.ts +4 -4
  40. package/browser/transaction.d.ts.map +1 -1
  41. package/browser/types.d.ts +5 -3
  42. package/browser/types.d.ts.map +1 -1
  43. package/browser/workers/WorkerSigningPool.d.ts +7 -0
  44. package/browser/workers/WorkerSigningPool.d.ts.map +1 -1
  45. package/browser/workers/WorkerSigningPool.node.d.ts +7 -0
  46. package/browser/workers/WorkerSigningPool.node.d.ts.map +1 -1
  47. package/browser/workers/WorkerSigningPool.sequential.d.ts +67 -0
  48. package/browser/workers/WorkerSigningPool.sequential.d.ts.map +1 -0
  49. package/browser/workers/WorkerSigningPool.worklet.d.ts +64 -0
  50. package/browser/workers/WorkerSigningPool.worklet.d.ts.map +1 -0
  51. package/browser/workers/index.browser.d.ts +16 -0
  52. package/browser/workers/index.browser.d.ts.map +1 -0
  53. package/browser/workers/index.d.ts +4 -64
  54. package/browser/workers/index.d.ts.map +1 -1
  55. package/browser/workers/index.js +28 -0
  56. package/browser/workers/index.node.d.ts +17 -0
  57. package/browser/workers/index.node.d.ts.map +1 -0
  58. package/browser/workers/index.react-native.d.ts +28 -0
  59. package/browser/workers/index.react-native.d.ts.map +1 -0
  60. package/browser/workers/index.shared.d.ts +15 -0
  61. package/browser/workers/index.shared.d.ts.map +1 -0
  62. package/browser/workers/psbt-parallel.d.ts +2 -3
  63. package/browser/workers/psbt-parallel.d.ts.map +1 -1
  64. package/browser/workers/types.d.ts +17 -0
  65. package/browser/workers/types.d.ts.map +1 -1
  66. package/build/address.d.ts +5 -1
  67. package/build/address.d.ts.map +1 -1
  68. package/build/address.js +29 -17
  69. package/build/address.js.map +1 -1
  70. package/build/bech32utils.js.map +1 -1
  71. package/build/block.js.map +1 -1
  72. package/build/branded.d.ts +3 -14
  73. package/build/branded.d.ts.map +1 -1
  74. package/build/branded.js +0 -5
  75. package/build/branded.js.map +1 -1
  76. package/build/ecc/context.d.ts +22 -21
  77. package/build/ecc/context.d.ts.map +1 -1
  78. package/build/ecc/context.js +23 -95
  79. package/build/ecc/context.js.map +1 -1
  80. package/build/ecc/index.d.ts +1 -1
  81. package/build/ecc/index.d.ts.map +1 -1
  82. package/build/ecc/types.d.ts +7 -126
  83. package/build/ecc/types.d.ts.map +1 -1
  84. package/build/ecc/types.js +4 -1
  85. package/build/ecc/types.js.map +1 -1
  86. package/build/env.d.ts +13 -0
  87. package/build/env.d.ts.map +1 -0
  88. package/build/env.js +198 -0
  89. package/build/env.js.map +1 -0
  90. package/build/index.d.ts +7 -6
  91. package/build/index.d.ts.map +1 -1
  92. package/build/index.js +7 -5
  93. package/build/index.js.map +1 -1
  94. package/build/io/hex.d.ts.map +1 -1
  95. package/build/io/hex.js +2 -1
  96. package/build/io/hex.js.map +1 -1
  97. package/build/io/index.d.ts +0 -1
  98. package/build/io/index.d.ts.map +1 -1
  99. package/build/io/index.js +0 -2
  100. package/build/io/index.js.map +1 -1
  101. package/build/opcodes.d.ts +11 -0
  102. package/build/opcodes.d.ts.map +1 -1
  103. package/build/opcodes.js +19 -4
  104. package/build/opcodes.js.map +1 -1
  105. package/build/payments/bip341.js.map +1 -1
  106. package/build/payments/embed.js.map +1 -1
  107. package/build/payments/p2ms.js.map +1 -1
  108. package/build/payments/p2pk.js.map +1 -1
  109. package/build/payments/p2pkh.js.map +1 -1
  110. package/build/payments/p2sh.js.map +1 -1
  111. package/build/payments/p2tr.d.ts.map +1 -1
  112. package/build/payments/p2tr.js +2 -3
  113. package/build/payments/p2tr.js.map +1 -1
  114. package/build/payments/p2wpkh.js.map +1 -1
  115. package/build/payments/p2wsh.js.map +1 -1
  116. package/build/psbt/PsbtCache.d.ts +54 -0
  117. package/build/psbt/PsbtCache.d.ts.map +1 -0
  118. package/build/psbt/PsbtCache.js +249 -0
  119. package/build/psbt/PsbtCache.js.map +1 -0
  120. package/build/psbt/PsbtFinalizer.d.ts +21 -0
  121. package/build/psbt/PsbtFinalizer.d.ts.map +1 -0
  122. package/build/psbt/PsbtFinalizer.js +157 -0
  123. package/build/psbt/PsbtFinalizer.js.map +1 -0
  124. package/build/psbt/PsbtSigner.d.ts +32 -0
  125. package/build/psbt/PsbtSigner.d.ts.map +1 -0
  126. package/build/psbt/PsbtSigner.js +192 -0
  127. package/build/psbt/PsbtSigner.js.map +1 -0
  128. package/build/psbt/PsbtTransaction.d.ts +25 -0
  129. package/build/psbt/PsbtTransaction.d.ts.map +1 -0
  130. package/build/psbt/PsbtTransaction.js +61 -0
  131. package/build/psbt/PsbtTransaction.js.map +1 -0
  132. package/build/psbt/types.d.ts +4 -70
  133. package/build/psbt/types.d.ts.map +1 -1
  134. package/build/psbt/validation.d.ts +1 -1
  135. package/build/psbt/validation.d.ts.map +1 -1
  136. package/build/psbt.d.ts +26 -40
  137. package/build/psbt.d.ts.map +1 -1
  138. package/build/psbt.js +177 -799
  139. package/build/psbt.js.map +1 -1
  140. package/build/script.d.ts.map +1 -1
  141. package/build/script.js +2 -2
  142. package/build/script.js.map +1 -1
  143. package/build/transaction.d.ts +4 -4
  144. package/build/transaction.d.ts.map +1 -1
  145. package/build/transaction.js +5 -4
  146. package/build/transaction.js.map +1 -1
  147. package/build/tsconfig.build.tsbuildinfo +1 -1
  148. package/build/types.d.ts +5 -3
  149. package/build/types.d.ts.map +1 -1
  150. package/build/types.js +11 -16
  151. package/build/types.js.map +1 -1
  152. package/build/workers/WorkerSigningPool.d.ts +7 -0
  153. package/build/workers/WorkerSigningPool.d.ts.map +1 -1
  154. package/build/workers/WorkerSigningPool.js +12 -1
  155. package/build/workers/WorkerSigningPool.js.map +1 -1
  156. package/build/workers/WorkerSigningPool.node.d.ts +7 -0
  157. package/build/workers/WorkerSigningPool.node.d.ts.map +1 -1
  158. package/build/workers/WorkerSigningPool.node.js +37 -5
  159. package/build/workers/WorkerSigningPool.node.js.map +1 -1
  160. package/build/workers/WorkerSigningPool.sequential.d.ts +76 -0
  161. package/build/workers/WorkerSigningPool.sequential.d.ts.map +1 -0
  162. package/build/workers/WorkerSigningPool.sequential.js +160 -0
  163. package/build/workers/WorkerSigningPool.sequential.js.map +1 -0
  164. package/build/workers/WorkerSigningPool.worklet.d.ts +79 -0
  165. package/build/workers/WorkerSigningPool.worklet.d.ts.map +1 -0
  166. package/build/workers/WorkerSigningPool.worklet.js +390 -0
  167. package/build/workers/WorkerSigningPool.worklet.js.map +1 -0
  168. package/build/workers/index.browser.d.ts +24 -0
  169. package/build/workers/index.browser.d.ts.map +1 -0
  170. package/build/workers/index.browser.js +30 -0
  171. package/build/workers/index.browser.js.map +1 -0
  172. package/build/workers/index.d.ts +6 -18
  173. package/build/workers/index.d.ts.map +1 -1
  174. package/build/workers/index.js +12 -14
  175. package/build/workers/index.js.map +1 -1
  176. package/build/workers/index.node.d.ts +38 -0
  177. package/build/workers/index.node.d.ts.map +1 -0
  178. package/build/workers/index.node.js +45 -0
  179. package/build/workers/index.node.js.map +1 -0
  180. package/build/workers/index.react-native.d.ts +28 -0
  181. package/build/workers/index.react-native.d.ts.map +1 -0
  182. package/build/workers/index.react-native.js +67 -0
  183. package/build/workers/index.react-native.js.map +1 -0
  184. package/build/workers/index.shared.d.ts +15 -0
  185. package/build/workers/index.shared.d.ts.map +1 -0
  186. package/build/workers/index.shared.js +20 -0
  187. package/build/workers/index.shared.js.map +1 -0
  188. package/build/workers/psbt-parallel.d.ts +2 -3
  189. package/build/workers/psbt-parallel.d.ts.map +1 -1
  190. package/build/workers/psbt-parallel.js +4 -4
  191. package/build/workers/psbt-parallel.js.map +1 -1
  192. package/build/workers/types.d.ts +17 -0
  193. package/build/workers/types.d.ts.map +1 -1
  194. package/package.json +46 -8
  195. package/src/address.ts +41 -18
  196. package/src/bech32utils.ts +3 -3
  197. package/src/block.ts +2 -2
  198. package/src/branded.ts +15 -13
  199. package/src/ecc/context.ts +30 -133
  200. package/src/ecc/index.ts +2 -2
  201. package/src/ecc/types.ts +7 -138
  202. package/src/env.ts +239 -0
  203. package/src/index.ts +45 -9
  204. package/src/io/hex.ts +2 -1
  205. package/src/io/index.ts +0 -3
  206. package/src/opcodes.ts +21 -4
  207. package/src/payments/bip341.ts +3 -3
  208. package/src/payments/embed.ts +1 -1
  209. package/src/payments/p2ms.ts +2 -2
  210. package/src/payments/p2pk.ts +2 -2
  211. package/src/payments/p2pkh.ts +3 -3
  212. package/src/payments/p2sh.ts +4 -4
  213. package/src/payments/p2tr.ts +9 -9
  214. package/src/payments/p2wpkh.ts +5 -5
  215. package/src/payments/p2wsh.ts +2 -2
  216. package/src/psbt/PsbtCache.ts +325 -0
  217. package/src/psbt/PsbtFinalizer.ts +213 -0
  218. package/src/psbt/PsbtSigner.ts +302 -0
  219. package/src/psbt/PsbtTransaction.ts +82 -0
  220. package/src/psbt/types.ts +4 -86
  221. package/src/psbt/validation.ts +1 -1
  222. package/src/psbt.ts +349 -1198
  223. package/src/script.ts +2 -2
  224. package/src/transaction.ts +10 -9
  225. package/src/types.ts +18 -28
  226. package/src/workers/WorkerSigningPool.node.ts +41 -5
  227. package/src/workers/WorkerSigningPool.sequential.ts +191 -0
  228. package/src/workers/WorkerSigningPool.ts +14 -1
  229. package/src/workers/WorkerSigningPool.worklet.ts +522 -0
  230. package/src/workers/index.browser.ts +34 -0
  231. package/src/workers/index.node.ts +50 -0
  232. package/src/workers/index.react-native.ts +110 -0
  233. package/src/workers/index.shared.ts +58 -0
  234. package/src/workers/index.ts +14 -65
  235. package/src/workers/psbt-parallel.ts +7 -7
  236. package/src/workers/types.ts +21 -0
  237. package/test/address.spec.ts +2 -2
  238. package/test/bitcoin.core.spec.ts +5 -2
  239. package/test/browser/payments.spec.ts +151 -0
  240. package/test/browser/psbt.spec.ts +1510 -0
  241. package/test/browser/script.spec.ts +223 -0
  242. package/test/browser/setup.ts +13 -0
  243. package/test/browser/workers-signing.spec.ts +537 -0
  244. package/test/crypto.spec.ts +2 -2
  245. package/test/env.spec.ts +418 -0
  246. package/test/fixtures/core/base58_encode_decode.json +12 -48
  247. package/test/fixtures/core/base58_keys_invalid.json +50 -150
  248. package/test/fixtures/core/sighash.json +1 -3
  249. package/test/fixtures/core/tx_valid.json +133 -501
  250. package/test/fixtures/embed.json +3 -11
  251. package/test/fixtures/p2ms.json +21 -91
  252. package/test/fixtures/p2pk.json +5 -24
  253. package/test/fixtures/p2pkh.json +7 -36
  254. package/test/fixtures/p2sh.json +8 -54
  255. package/test/fixtures/p2tr.json +2 -6
  256. package/test/fixtures/p2wpkh.json +7 -36
  257. package/test/fixtures/p2wsh.json +14 -59
  258. package/test/fixtures/psbt.json +2 -6
  259. package/test/fixtures/script.json +12 -48
  260. package/test/integration/addresses.spec.ts +11 -5
  261. package/test/integration/bip32.spec.ts +1 -1
  262. package/test/integration/cltv.spec.ts +10 -6
  263. package/test/integration/csv.spec.ts +10 -9
  264. package/test/integration/payments.spec.ts +8 -4
  265. package/test/integration/taproot.spec.ts +26 -6
  266. package/test/integration/transactions.spec.ts +22 -8
  267. package/test/payments.spec.ts +1 -1
  268. package/test/payments.utils.ts +1 -1
  269. package/test/psbt.spec.ts +250 -64
  270. package/test/script_signature.spec.ts +1 -1
  271. package/test/transaction.spec.ts +18 -5
  272. package/test/tsconfig.json +6 -20
  273. package/test/workers-pool.spec.ts +65 -23
  274. package/test/workers-sequential.spec.ts +669 -0
  275. package/test/workers-signing.spec.ts +7 -3
  276. package/test/workers-worklet.spec.ts +500 -0
  277. package/test/workers.spec.ts +6 -7
  278. package/typedoc.json +11 -1
  279. package/vite.config.browser.ts +31 -6
  280. package/vitest.config.browser.ts +68 -0
  281. package/browser/ecpair.d.ts +0 -99
  282. package/browser/io/MemoryPool.d.ts +0 -220
  283. package/browser/io/MemoryPool.d.ts.map +0 -1
  284. package/build/io/MemoryPool.d.ts +0 -220
  285. package/build/io/MemoryPool.d.ts.map +0 -1
  286. package/build/io/MemoryPool.js +0 -309
  287. package/build/io/MemoryPool.js.map +0 -1
  288. package/src/ecpair.d.ts +0 -99
  289. package/src/io/MemoryPool.ts +0 -343
  290. package/test/taproot-cache.spec.ts +0 -694
@@ -0,0 +1,418 @@
1
+ import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest';
2
+
3
+ describe('Runtime capability check — hard requirements', () => {
4
+ beforeEach(() => {
5
+ vi.resetModules();
6
+ });
7
+
8
+ afterEach(() => {
9
+ vi.unstubAllGlobals();
10
+ vi.restoreAllMocks();
11
+ });
12
+
13
+ it('should pass in a capable environment', async () => {
14
+ await expect(import('../src/env.js')).resolves.not.toThrow();
15
+ });
16
+
17
+ it('should throw when BigInt is missing', async () => {
18
+ vi.stubGlobal('BigInt', undefined);
19
+
20
+ await expect(import('../src/env.js')).rejects.toThrow('unsupported runtime');
21
+ await expect(import('../src/env.js')).rejects.toThrow('BigInt');
22
+ });
23
+
24
+ it('should throw when Uint8Array is missing', async () => {
25
+ vi.stubGlobal('Uint8Array', undefined);
26
+
27
+ await expect(import('../src/env.js')).rejects.toThrow('unsupported runtime');
28
+ await expect(import('../src/env.js')).rejects.toThrow('Uint8Array');
29
+ });
30
+
31
+ it('should throw when DataView.getBigInt64 is missing', async () => {
32
+ const orig = DataView.prototype.getBigInt64;
33
+ (DataView.prototype as Record<string, unknown>)['getBigInt64'] = undefined;
34
+
35
+ try {
36
+ await import('../src/env.js');
37
+ expect.unreachable('should have thrown');
38
+ } catch (err) {
39
+ expect((err as Error).message).toContain('getBigInt64');
40
+ } finally {
41
+ DataView.prototype.getBigInt64 = orig;
42
+ }
43
+ });
44
+
45
+ it('should report all missing capabilities at once', async () => {
46
+ vi.stubGlobal('BigInt', undefined);
47
+ vi.stubGlobal('Uint8Array', undefined);
48
+
49
+ try {
50
+ await import('../src/env.js');
51
+ expect.unreachable('should have thrown');
52
+ } catch (err) {
53
+ const msg = (err as Error).message;
54
+ expect(msg).toContain('BigInt');
55
+ expect(msg).toContain('Uint8Array');
56
+ expect(msg).toContain('cannot be polyfilled');
57
+ }
58
+ });
59
+ });
60
+
61
+ describe('Polyfill — TextEncoder / TextDecoder', () => {
62
+ beforeEach(() => {
63
+ vi.resetModules();
64
+ });
65
+
66
+ afterEach(() => {
67
+ vi.unstubAllGlobals();
68
+ vi.restoreAllMocks();
69
+ });
70
+
71
+ it('should polyfill TextEncoder when missing', async () => {
72
+ vi.stubGlobal('TextEncoder', undefined);
73
+
74
+ await import('../src/env.js');
75
+
76
+ const encoder = new globalThis.TextEncoder();
77
+ const result = encoder.encode('hello');
78
+ expect(result).toBeInstanceOf(Uint8Array);
79
+ expect(Array.from(result)).toEqual([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
80
+ });
81
+
82
+ it('should encode multi-byte UTF-8 correctly', async () => {
83
+ vi.stubGlobal('TextEncoder', undefined);
84
+
85
+ await import('../src/env.js');
86
+
87
+ const encoder = new globalThis.TextEncoder();
88
+ // 2-byte: é (U+00E9)
89
+ const twoB = encoder.encode('é');
90
+ expect(Array.from(twoB)).toEqual([0xc3, 0xa9]);
91
+
92
+ // 3-byte: € (U+20AC)
93
+ const threeB = encoder.encode('€');
94
+ expect(Array.from(threeB)).toEqual([0xe2, 0x82, 0xac]);
95
+ });
96
+
97
+ it('should encode surrogate pairs (4-byte UTF-8)', async () => {
98
+ vi.stubGlobal('TextEncoder', undefined);
99
+
100
+ await import('../src/env.js');
101
+
102
+ const encoder = new globalThis.TextEncoder();
103
+ // U+1F600 (😀) = F0 9F 98 80
104
+ const emoji = encoder.encode('😀');
105
+ expect(Array.from(emoji)).toEqual([0xf0, 0x9f, 0x98, 0x80]);
106
+ });
107
+
108
+ it('should polyfill TextDecoder when missing', async () => {
109
+ vi.stubGlobal('TextDecoder', undefined);
110
+
111
+ await import('../src/env.js');
112
+
113
+ const decoder = new globalThis.TextDecoder();
114
+ const result = decoder.decode(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x6f]));
115
+ expect(result).toBe('hello');
116
+ });
117
+
118
+ it('should decode multi-byte UTF-8 correctly', async () => {
119
+ vi.stubGlobal('TextDecoder', undefined);
120
+
121
+ await import('../src/env.js');
122
+
123
+ const decoder = new globalThis.TextDecoder();
124
+ expect(decoder.decode(new Uint8Array([0xc3, 0xa9]))).toBe('é');
125
+ expect(decoder.decode(new Uint8Array([0xe2, 0x82, 0xac]))).toBe('€');
126
+ });
127
+
128
+ it('should decode surrogate pairs (4-byte UTF-8)', async () => {
129
+ vi.stubGlobal('TextDecoder', undefined);
130
+
131
+ await import('../src/env.js');
132
+
133
+ const decoder = new globalThis.TextDecoder();
134
+ expect(decoder.decode(new Uint8Array([0xf0, 0x9f, 0x98, 0x80]))).toBe('😀');
135
+ });
136
+
137
+ it('should round-trip encode/decode', async () => {
138
+ vi.stubGlobal('TextEncoder', undefined);
139
+ vi.stubGlobal('TextDecoder', undefined);
140
+
141
+ await import('../src/env.js');
142
+
143
+ const input = 'Hello, 世界! 🚀';
144
+ const encoder = new globalThis.TextEncoder();
145
+ const decoder = new globalThis.TextDecoder();
146
+ expect(decoder.decode(encoder.encode(input))).toBe(input);
147
+ });
148
+
149
+ it('should not replace native TextEncoder', async () => {
150
+ const NativeTextEncoder = globalThis.TextEncoder;
151
+
152
+ await import('../src/env.js');
153
+
154
+ expect(globalThis.TextEncoder).toBe(NativeTextEncoder);
155
+ });
156
+ });
157
+
158
+ describe('Polyfill — Map', () => {
159
+ beforeEach(() => {
160
+ vi.resetModules();
161
+ });
162
+
163
+ afterEach(() => {
164
+ vi.unstubAllGlobals();
165
+ vi.restoreAllMocks();
166
+ });
167
+
168
+ it('should polyfill Map when missing', async () => {
169
+ vi.stubGlobal('Map', undefined);
170
+
171
+ await import('../src/env.js');
172
+
173
+ const map = new globalThis.Map<string, number>();
174
+ map.set('a', 1);
175
+ map.set('b', 2);
176
+ expect(map.size).toBe(2);
177
+ expect(map.get('a')).toBe(1);
178
+ expect(map.has('b')).toBe(true);
179
+ expect(map.has('c')).toBe(false);
180
+ });
181
+
182
+ it('should support delete and clear', async () => {
183
+ vi.stubGlobal('Map', undefined);
184
+
185
+ await import('../src/env.js');
186
+
187
+ const map = new globalThis.Map<string, number>();
188
+ map.set('x', 10);
189
+ map.set('y', 20);
190
+ expect(map.delete('x')).toBe(true);
191
+ expect(map.delete('x')).toBe(false);
192
+ expect(map.size).toBe(1);
193
+
194
+ map.clear();
195
+ expect(map.size).toBe(0);
196
+ });
197
+
198
+ it('should support iteration', async () => {
199
+ vi.stubGlobal('Map', undefined);
200
+
201
+ await import('../src/env.js');
202
+
203
+ const map = new globalThis.Map<string, number>([
204
+ ['a', 1],
205
+ ['b', 2],
206
+ ]);
207
+
208
+ const keys = [...map.keys()];
209
+ const values = [...map.values()];
210
+ const entries = [...map.entries()];
211
+
212
+ expect(keys).toEqual(['a', 'b']);
213
+ expect(values).toEqual([1, 2]);
214
+ expect(entries).toEqual([
215
+ ['a', 1],
216
+ ['b', 2],
217
+ ]);
218
+ });
219
+
220
+ it('should support forEach', async () => {
221
+ vi.stubGlobal('Map', undefined);
222
+
223
+ await import('../src/env.js');
224
+
225
+ const map = new globalThis.Map([['k', 'v']]);
226
+ const collected: string[] = [];
227
+ map.forEach((val, key) => collected.push(`${key}=${val}`));
228
+ expect(collected).toEqual(['k=v']);
229
+ });
230
+
231
+ it('should overwrite existing keys', async () => {
232
+ vi.stubGlobal('Map', undefined);
233
+
234
+ await import('../src/env.js');
235
+
236
+ const map = new globalThis.Map<string, number>();
237
+ map.set('a', 1);
238
+ map.set('a', 2);
239
+ expect(map.size).toBe(1);
240
+ expect(map.get('a')).toBe(2);
241
+ });
242
+
243
+ it('should not replace native Map', async () => {
244
+ const NativeMap = globalThis.Map;
245
+
246
+ await import('../src/env.js');
247
+
248
+ expect(globalThis.Map).toBe(NativeMap);
249
+ });
250
+ });
251
+
252
+ describe('Polyfill — Promise.allSettled', () => {
253
+ beforeEach(() => {
254
+ vi.resetModules();
255
+ });
256
+
257
+ afterEach(() => {
258
+ vi.unstubAllGlobals();
259
+ vi.restoreAllMocks();
260
+ });
261
+
262
+ it('should polyfill Promise.allSettled when missing', async () => {
263
+ const orig = Promise.allSettled;
264
+ (Promise as Record<string, unknown>)['allSettled'] = undefined;
265
+
266
+ try {
267
+ await import('../src/env.js');
268
+
269
+ const results = await Promise.allSettled([
270
+ Promise.resolve(1),
271
+ Promise.reject(new Error('fail')),
272
+ Promise.resolve(3),
273
+ ]);
274
+
275
+ expect(results).toHaveLength(3);
276
+ expect(results[0]).toEqual({ status: 'fulfilled', value: 1 });
277
+ expect(results[1]!.status).toBe('rejected');
278
+ expect((results[1] as PromiseRejectedResult).reason).toBeInstanceOf(Error);
279
+ expect(results[2]).toEqual({ status: 'fulfilled', value: 3 });
280
+ } finally {
281
+ Promise.allSettled = orig;
282
+ }
283
+ });
284
+
285
+ it('should not replace native Promise.allSettled', async () => {
286
+ const native = Promise.allSettled;
287
+
288
+ await import('../src/env.js');
289
+
290
+ expect(Promise.allSettled).toBe(native);
291
+ });
292
+ });
293
+
294
+ describe('Polyfill — structuredClone', () => {
295
+ beforeEach(() => {
296
+ vi.resetModules();
297
+ });
298
+
299
+ afterEach(() => {
300
+ vi.unstubAllGlobals();
301
+ vi.restoreAllMocks();
302
+ });
303
+
304
+ it('should polyfill structuredClone when missing', async () => {
305
+ vi.stubGlobal('structuredClone', undefined);
306
+
307
+ await import('../src/env.js');
308
+
309
+ const original = { a: 1, b: { c: 2 } };
310
+ const cloned = globalThis.structuredClone(original);
311
+
312
+ expect(cloned).toEqual(original);
313
+ expect(cloned).not.toBe(original);
314
+ expect(cloned.b).not.toBe(original.b);
315
+ });
316
+
317
+ it('should deep clone nested objects', async () => {
318
+ vi.stubGlobal('structuredClone', undefined);
319
+
320
+ await import('../src/env.js');
321
+
322
+ const original = { x: [1, 2, { y: 3 }] };
323
+ const cloned = globalThis.structuredClone(original);
324
+
325
+ cloned.x[0] = 99;
326
+ (cloned.x[2] as { y: number }).y = 99;
327
+
328
+ expect(original.x[0]).toBe(1);
329
+ expect((original.x[2] as { y: number }).y).toBe(3);
330
+ });
331
+
332
+ it('should handle primitives and null', async () => {
333
+ vi.stubGlobal('structuredClone', undefined);
334
+
335
+ await import('../src/env.js');
336
+
337
+ expect(globalThis.structuredClone(42)).toBe(42);
338
+ expect(globalThis.structuredClone('hello')).toBe('hello');
339
+ expect(globalThis.structuredClone(true)).toBe(true);
340
+ expect(globalThis.structuredClone(null)).toBe(null);
341
+ });
342
+
343
+ it('should not replace native structuredClone', async () => {
344
+ const native = globalThis.structuredClone;
345
+
346
+ await import('../src/env.js');
347
+
348
+ expect(globalThis.structuredClone).toBe(native);
349
+ });
350
+ });
351
+
352
+ describe('Polyfill — Symbol.dispose / Symbol.asyncDispose', () => {
353
+ beforeEach(() => {
354
+ vi.resetModules();
355
+ });
356
+
357
+ afterEach(() => {
358
+ vi.unstubAllGlobals();
359
+ vi.restoreAllMocks();
360
+ });
361
+
362
+ it('should ensure Symbol.dispose is defined after import', async () => {
363
+ await import('../src/env.js');
364
+ expect(typeof Symbol.dispose).toBe('symbol');
365
+ });
366
+
367
+ it('should ensure Symbol.asyncDispose is defined after import', async () => {
368
+ await import('../src/env.js');
369
+ expect(typeof Symbol.asyncDispose).toBe('symbol');
370
+ });
371
+
372
+ it('should polyfill dispose on a target that lacks it', () => {
373
+ const target: Record<string, symbol | undefined> = { dispose: undefined };
374
+ if (typeof target['dispose'] === 'undefined') {
375
+ target['dispose'] = Symbol.for('Symbol.dispose');
376
+ }
377
+ expect(target['dispose']).toBe(Symbol.for('Symbol.dispose'));
378
+ });
379
+
380
+ it('should polyfill asyncDispose on a target that lacks it', () => {
381
+ const target: Record<string, symbol | undefined> = { asyncDispose: undefined };
382
+ if (typeof target['asyncDispose'] === 'undefined') {
383
+ target['asyncDispose'] = Symbol.for('Symbol.asyncDispose');
384
+ }
385
+ expect(target['asyncDispose']).toBe(Symbol.for('Symbol.asyncDispose'));
386
+ });
387
+
388
+ it('should not overwrite an existing dispose symbol', () => {
389
+ const existing = Symbol('existing');
390
+ const target: Record<string, symbol> = { dispose: existing };
391
+ if (typeof target['dispose'] === 'undefined') {
392
+ target['dispose'] = Symbol.for('Symbol.dispose');
393
+ }
394
+ expect(target['dispose']).toBe(existing);
395
+ });
396
+
397
+ it('should not overwrite an existing asyncDispose symbol', () => {
398
+ const existing = Symbol('existing');
399
+ const target: Record<string, symbol> = { asyncDispose: existing };
400
+ if (typeof target['asyncDispose'] === 'undefined') {
401
+ target['asyncDispose'] = Symbol.for('Symbol.asyncDispose');
402
+ }
403
+ expect(target['asyncDispose']).toBe(existing);
404
+ });
405
+
406
+ it('should produce a usable symbol for async method dispatch', async () => {
407
+ const sym = Symbol.for('Symbol.asyncDispose');
408
+ const obj = {
409
+ disposed: false,
410
+ async [sym]() {
411
+ this.disposed = true;
412
+ },
413
+ };
414
+
415
+ await obj[sym]();
416
+ expect(obj.disposed).toBe(true);
417
+ });
418
+ });
@@ -1,50 +1,14 @@
1
1
  [
2
- [
3
- "",
4
- ""
5
- ],
6
- [
7
- "61",
8
- "2g"
9
- ],
10
- [
11
- "626262",
12
- "a3gV"
13
- ],
14
- [
15
- "636363",
16
- "aPEr"
17
- ],
18
- [
19
- "73696d706c792061206c6f6e6720737472696e67",
20
- "2cFupjhnEsSn59qHXstmK2ffpLv2"
21
- ],
22
- [
23
- "00eb15231dfceb60925886b67d065299925915aeb172c06647",
24
- "1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L"
25
- ],
26
- [
27
- "516b6fcd0f",
28
- "ABnLTmg"
29
- ],
30
- [
31
- "bf4f89001e670274dd",
32
- "3SEo3LWLoPntC"
33
- ],
34
- [
35
- "572e4794",
36
- "3EFU7m"
37
- ],
38
- [
39
- "ecac89cad93923c02321",
40
- "EJDM8drfXA6uyA"
41
- ],
42
- [
43
- "10c8511e",
44
- "Rt5zm"
45
- ],
46
- [
47
- "00000000000000000000",
48
- "1111111111"
49
- ]
2
+ ["", ""],
3
+ ["61", "2g"],
4
+ ["626262", "a3gV"],
5
+ ["636363", "aPEr"],
6
+ ["73696d706c792061206c6f6e6720737472696e67", "2cFupjhnEsSn59qHXstmK2ffpLv2"],
7
+ ["00eb15231dfceb60925886b67d065299925915aeb172c06647", "1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L"],
8
+ ["516b6fcd0f", "ABnLTmg"],
9
+ ["bf4f89001e670274dd", "3SEo3LWLoPntC"],
10
+ ["572e4794", "3EFU7m"],
11
+ ["ecac89cad93923c02321", "EJDM8drfXA6uyA"],
12
+ ["10c8511e", "Rt5zm"],
13
+ ["00000000000000000000", "1111111111"]
50
14
  ]
@@ -1,152 +1,52 @@
1
1
  [
2
- [
3
- ""
4
- ],
5
- [
6
- "x"
7
- ],
8
- [
9
- "37qgekLpCCHrQuSjvX3fs496FWTGsHFHizjJAs6NPcR47aefnnCWECAhHV6E3g4YN7u7Yuwod5Y"
10
- ],
11
- [
12
- "dzb7VV1Ui55BARxv7ATxAtCUeJsANKovDGWFVgpTbhq9gvPqP3yv"
13
- ],
14
- [
15
- "MuNu7ZAEDFiHthiunm7dPjwKqrVNCM3mAz6rP9zFveQu14YA8CxExSJTHcVP9DErn6u84E6Ej7S"
16
- ],
17
- [
18
- "rPpQpYknyNQ5AEHuY6H8ijJJrYc2nDKKk9jjmKEXsWzyAQcFGpDLU2Zvsmoi8JLR7hAwoy3RQWf"
19
- ],
20
- [
21
- "4Uc3FmN6NQ6zLBK5QQBXRBUREaaHwCZYsGCueHauuDmJpZKn6jkEskMB2Zi2CNgtb5r6epWEFfUJq"
22
- ],
23
- [
24
- "7aQgR5DFQ25vyXmqZAWmnVCjL3PkBcdVkBUpjrjMTcghHx3E8wb"
25
- ],
26
- [
27
- "17QpPprjeg69fW1DV8DcYYCKvWjYhXvWkov6MJ1iTTvMFj6weAqW7wybZeH57WTNxXVCRH4veVs"
28
- ],
29
- [
30
- "KxuACDviz8Xvpn1xAh9MfopySZNuyajYMZWz16Dv2mHHryznWUp3"
31
- ],
32
- [
33
- "7nK3GSmqdXJQtdohvGfJ7KsSmn3TmGqExug49583bDAL91pVSGq5xS9SHoAYL3Wv3ijKTit65th"
34
- ],
35
- [
36
- "cTivdBmq7bay3RFGEBBuNfMh2P1pDCgRYN2Wbxmgwr4ki3jNUL2va"
37
- ],
38
- [
39
- "gjMV4vjNjyMrna4fsAr8bWxAbwtmMUBXJS3zL4NJt5qjozpbQLmAfK1uA3CquSqsZQMpoD1g2nk"
40
- ],
41
- [
42
- "emXm1naBMoVzPjbk7xpeTVMFy4oDEe25UmoyGgKEB1gGWsK8kRGs"
43
- ],
44
- [
45
- "7VThQnNRj1o3Zyvc7XHPRrjDf8j2oivPTeDXnRPYWeYGE4pXeRJDZgf28ppti5hsHWXS2GSobdqyo"
46
- ],
47
- [
48
- "1G9u6oCVCPh2o8m3t55ACiYvG1y5BHewUkDSdiQarDcYXXhFHYdzMdYfUAhfxn5vNZBwpgUNpso"
49
- ],
50
- [
51
- "31QQ7ZMLkScDiB4VyZjuptr7AEc9j1SjstF7pRoLhHTGkW4Q2y9XELobQmhhWxeRvqcukGd1XCq"
52
- ],
53
- [
54
- "DHqKSnpxa8ZdQyH8keAhvLTrfkyBMQxqngcQA5N8LQ9KVt25kmGN"
55
- ],
56
- [
57
- "2LUHcJPbwLCy9GLH1qXmfmAwvadWw4bp4PCpDfduLqV17s6iDcy1imUwhQJhAoNoN1XNmweiJP4i"
58
- ],
59
- [
60
- "7USRzBXAnmck8fX9HmW7RAb4qt92VFX6soCnts9s74wxm4gguVhtG5of8fZGbNPJA83irHVY6bCos"
61
- ],
62
- [
63
- "1DGezo7BfVebZxAbNT3XGujdeHyNNBF3vnficYoTSp4PfK2QaML9bHzAMxke3wdKdHYWmsMTJVu"
64
- ],
65
- [
66
- "2D12DqDZKwCxxkzs1ZATJWvgJGhQ4cFi3WrizQ5zLAyhN5HxuAJ1yMYaJp8GuYsTLLxTAz6otCfb"
67
- ],
68
- [
69
- "8AFJzuTujXjw1Z6M3fWhQ1ujDW7zsV4ePeVjVo7D1egERqSW9nZ"
70
- ],
71
- [
72
- "163Q17qLbTCue8YY3AvjpUhotuaodLm2uqMhpYirsKjVqnxJRWTEoywMVY3NbBAHuhAJ2cF9GAZ"
73
- ],
74
- [
75
- "2MnmgiRH4eGLyLc9eAqStzk7dFgBjFtUCtu"
76
- ],
77
- [
78
- "461QQ2sYWxU7H2PV4oBwJGNch8XVTYYbZxU"
79
- ],
80
- [
81
- "2UCtv53VttmQYkVU4VMtXB31REvQg4ABzs41AEKZ8UcB7DAfVzdkV9JDErwGwyj5AUHLkmgZeobs"
82
- ],
83
- [
84
- "cSNjAsnhgtiFMi6MtfvgscMB2Cbhn2v1FUYfviJ1CdjfidvmeW6mn"
85
- ],
86
- [
87
- "gmsow2Y6EWAFDFE1CE4Hd3Tpu2BvfmBfG1SXsuRARbnt1WjkZnFh1qGTiptWWbjsq2Q6qvpgJVj"
88
- ],
89
- [
90
- "nksUKSkzS76v8EsSgozXGMoQFiCoCHzCVajFKAXqzK5on9ZJYVHMD5CKwgmX3S3c7M1U3xabUny"
91
- ],
92
- [
93
- "L3favK1UzFGgdzYBF2oBT5tbayCo4vtVBLJhg2iYuMeePxWG8SQc"
94
- ],
95
- [
96
- "7VxLxGGtYT6N99GdEfi6xz56xdQ8nP2dG1CavuXx7Rf2PrvNMTBNevjkfgs9JmkcGm6EXpj8ipyPZ"
97
- ],
98
- [
99
- "2mbZwFXF6cxShaCo2czTRB62WTx9LxhTtpP"
100
- ],
101
- [
102
- "dB7cwYdcPSgiyAwKWL3JwCVwSk6epU2txw"
103
- ],
104
- [
105
- "HPhFUhUAh8ZQQisH8QQWafAxtQYju3SFTX"
106
- ],
107
- [
108
- "4ctAH6AkHzq5ioiM1m9T3E2hiYEev5mTsB"
109
- ],
110
- [
111
- "Hn1uFi4dNexWrqARpjMqgT6cX1UsNPuV3cHdGg9ExyXw8HTKadbktRDtdeVmY3M1BxJStiL4vjJ"
112
- ],
113
- [
114
- "Sq3fDbvutABmnAHHExJDgPLQn44KnNC7UsXuT7KZecpaYDMU9Txs"
115
- ],
116
- [
117
- "6TqWyrqdgUEYDQU1aChMuFMMEimHX44qHFzCUgGfqxGgZNMUVWJ"
118
- ],
119
- [
120
- "giqJo7oWqFxNKWyrgcBxAVHXnjJ1t6cGoEffce5Y1y7u649Noj5wJ4mmiUAKEVVrYAGg2KPB3Y4"
121
- ],
122
- [
123
- "cNzHY5e8vcmM3QVJUcjCyiKMYfeYvyueq5qCMV3kqcySoLyGLYUK"
124
- ],
125
- [
126
- "37uTe568EYc9WLoHEd9jXEvUiWbq5LFLscNyqvAzLU5vBArUJA6eydkLmnMwJDjkL5kXc2VK7ig"
127
- ],
128
- [
129
- "EsYbG4tWWWY45G31nox838qNdzksbPySWc"
130
- ],
131
- [
132
- "nbuzhfwMoNzA3PaFnyLcRxE9bTJPDkjZ6Rf6Y6o2ckXZfzZzXBT"
133
- ],
134
- [
135
- "cQN9PoxZeCWK1x56xnz6QYAsvR11XAce3Ehp3gMUdfSQ53Y2mPzx"
136
- ],
137
- [
138
- "1Gm3N3rkef6iMbx4voBzaxtXcmmiMTqZPhcuAepRzYUJQW4qRpEnHvMojzof42hjFRf8PE2jPde"
139
- ],
140
- [
141
- "2TAq2tuN6x6m233bpT7yqdYQPELdTDJn1eU"
142
- ],
143
- [
144
- "ntEtnnGhqPii4joABvBtSEJG6BxjT2tUZqE8PcVYgk3RHpgxgHDCQxNbLJf7ardf1dDk2oCQ7Cf"
145
- ],
146
- [
147
- "Ky1YjoZNgQ196HJV3HpdkecfhRBmRZdMJk89Hi5KGfpfPwS2bUbfd"
148
- ],
149
- [
150
- "2A1q1YsMZowabbvta7kTy2Fd6qN4r5ZCeG3qLpvZBMzCixMUdkN2Y4dHB1wPsZAeVXUGD83MfRED"
151
- ]
2
+ [""],
3
+ ["x"],
4
+ ["37qgekLpCCHrQuSjvX3fs496FWTGsHFHizjJAs6NPcR47aefnnCWECAhHV6E3g4YN7u7Yuwod5Y"],
5
+ ["dzb7VV1Ui55BARxv7ATxAtCUeJsANKovDGWFVgpTbhq9gvPqP3yv"],
6
+ ["MuNu7ZAEDFiHthiunm7dPjwKqrVNCM3mAz6rP9zFveQu14YA8CxExSJTHcVP9DErn6u84E6Ej7S"],
7
+ ["rPpQpYknyNQ5AEHuY6H8ijJJrYc2nDKKk9jjmKEXsWzyAQcFGpDLU2Zvsmoi8JLR7hAwoy3RQWf"],
8
+ ["4Uc3FmN6NQ6zLBK5QQBXRBUREaaHwCZYsGCueHauuDmJpZKn6jkEskMB2Zi2CNgtb5r6epWEFfUJq"],
9
+ ["7aQgR5DFQ25vyXmqZAWmnVCjL3PkBcdVkBUpjrjMTcghHx3E8wb"],
10
+ ["17QpPprjeg69fW1DV8DcYYCKvWjYhXvWkov6MJ1iTTvMFj6weAqW7wybZeH57WTNxXVCRH4veVs"],
11
+ ["KxuACDviz8Xvpn1xAh9MfopySZNuyajYMZWz16Dv2mHHryznWUp3"],
12
+ ["7nK3GSmqdXJQtdohvGfJ7KsSmn3TmGqExug49583bDAL91pVSGq5xS9SHoAYL3Wv3ijKTit65th"],
13
+ ["cTivdBmq7bay3RFGEBBuNfMh2P1pDCgRYN2Wbxmgwr4ki3jNUL2va"],
14
+ ["gjMV4vjNjyMrna4fsAr8bWxAbwtmMUBXJS3zL4NJt5qjozpbQLmAfK1uA3CquSqsZQMpoD1g2nk"],
15
+ ["emXm1naBMoVzPjbk7xpeTVMFy4oDEe25UmoyGgKEB1gGWsK8kRGs"],
16
+ ["7VThQnNRj1o3Zyvc7XHPRrjDf8j2oivPTeDXnRPYWeYGE4pXeRJDZgf28ppti5hsHWXS2GSobdqyo"],
17
+ ["1G9u6oCVCPh2o8m3t55ACiYvG1y5BHewUkDSdiQarDcYXXhFHYdzMdYfUAhfxn5vNZBwpgUNpso"],
18
+ ["31QQ7ZMLkScDiB4VyZjuptr7AEc9j1SjstF7pRoLhHTGkW4Q2y9XELobQmhhWxeRvqcukGd1XCq"],
19
+ ["DHqKSnpxa8ZdQyH8keAhvLTrfkyBMQxqngcQA5N8LQ9KVt25kmGN"],
20
+ ["2LUHcJPbwLCy9GLH1qXmfmAwvadWw4bp4PCpDfduLqV17s6iDcy1imUwhQJhAoNoN1XNmweiJP4i"],
21
+ ["7USRzBXAnmck8fX9HmW7RAb4qt92VFX6soCnts9s74wxm4gguVhtG5of8fZGbNPJA83irHVY6bCos"],
22
+ ["1DGezo7BfVebZxAbNT3XGujdeHyNNBF3vnficYoTSp4PfK2QaML9bHzAMxke3wdKdHYWmsMTJVu"],
23
+ ["2D12DqDZKwCxxkzs1ZATJWvgJGhQ4cFi3WrizQ5zLAyhN5HxuAJ1yMYaJp8GuYsTLLxTAz6otCfb"],
24
+ ["8AFJzuTujXjw1Z6M3fWhQ1ujDW7zsV4ePeVjVo7D1egERqSW9nZ"],
25
+ ["163Q17qLbTCue8YY3AvjpUhotuaodLm2uqMhpYirsKjVqnxJRWTEoywMVY3NbBAHuhAJ2cF9GAZ"],
26
+ ["2MnmgiRH4eGLyLc9eAqStzk7dFgBjFtUCtu"],
27
+ ["461QQ2sYWxU7H2PV4oBwJGNch8XVTYYbZxU"],
28
+ ["2UCtv53VttmQYkVU4VMtXB31REvQg4ABzs41AEKZ8UcB7DAfVzdkV9JDErwGwyj5AUHLkmgZeobs"],
29
+ ["cSNjAsnhgtiFMi6MtfvgscMB2Cbhn2v1FUYfviJ1CdjfidvmeW6mn"],
30
+ ["gmsow2Y6EWAFDFE1CE4Hd3Tpu2BvfmBfG1SXsuRARbnt1WjkZnFh1qGTiptWWbjsq2Q6qvpgJVj"],
31
+ ["nksUKSkzS76v8EsSgozXGMoQFiCoCHzCVajFKAXqzK5on9ZJYVHMD5CKwgmX3S3c7M1U3xabUny"],
32
+ ["L3favK1UzFGgdzYBF2oBT5tbayCo4vtVBLJhg2iYuMeePxWG8SQc"],
33
+ ["7VxLxGGtYT6N99GdEfi6xz56xdQ8nP2dG1CavuXx7Rf2PrvNMTBNevjkfgs9JmkcGm6EXpj8ipyPZ"],
34
+ ["2mbZwFXF6cxShaCo2czTRB62WTx9LxhTtpP"],
35
+ ["dB7cwYdcPSgiyAwKWL3JwCVwSk6epU2txw"],
36
+ ["HPhFUhUAh8ZQQisH8QQWafAxtQYju3SFTX"],
37
+ ["4ctAH6AkHzq5ioiM1m9T3E2hiYEev5mTsB"],
38
+ ["Hn1uFi4dNexWrqARpjMqgT6cX1UsNPuV3cHdGg9ExyXw8HTKadbktRDtdeVmY3M1BxJStiL4vjJ"],
39
+ ["Sq3fDbvutABmnAHHExJDgPLQn44KnNC7UsXuT7KZecpaYDMU9Txs"],
40
+ ["6TqWyrqdgUEYDQU1aChMuFMMEimHX44qHFzCUgGfqxGgZNMUVWJ"],
41
+ ["giqJo7oWqFxNKWyrgcBxAVHXnjJ1t6cGoEffce5Y1y7u649Noj5wJ4mmiUAKEVVrYAGg2KPB3Y4"],
42
+ ["cNzHY5e8vcmM3QVJUcjCyiKMYfeYvyueq5qCMV3kqcySoLyGLYUK"],
43
+ ["37uTe568EYc9WLoHEd9jXEvUiWbq5LFLscNyqvAzLU5vBArUJA6eydkLmnMwJDjkL5kXc2VK7ig"],
44
+ ["EsYbG4tWWWY45G31nox838qNdzksbPySWc"],
45
+ ["nbuzhfwMoNzA3PaFnyLcRxE9bTJPDkjZ6Rf6Y6o2ckXZfzZzXBT"],
46
+ ["cQN9PoxZeCWK1x56xnz6QYAsvR11XAce3Ehp3gMUdfSQ53Y2mPzx"],
47
+ ["1Gm3N3rkef6iMbx4voBzaxtXcmmiMTqZPhcuAepRzYUJQW4qRpEnHvMojzof42hjFRf8PE2jPde"],
48
+ ["2TAq2tuN6x6m233bpT7yqdYQPELdTDJn1eU"],
49
+ ["ntEtnnGhqPii4joABvBtSEJG6BxjT2tUZqE8PcVYgk3RHpgxgHDCQxNbLJf7ardf1dDk2oCQ7Cf"],
50
+ ["Ky1YjoZNgQ196HJV3HpdkecfhRBmRZdMJk89Hi5KGfpfPwS2bUbfd"],
51
+ ["2A1q1YsMZowabbvta7kTy2Fd6qN4r5ZCeG3qLpvZBMzCixMUdkN2Y4dHB1wPsZAeVXUGD83MfRED"]
152
52
  ]
@@ -1,7 +1,5 @@
1
1
  [
2
- [
3
- "raw_transaction, script, input_index, hashType, signature_hash (result)"
4
- ],
2
+ ["raw_transaction, script, input_index, hashType, signature_hash (result)"],
5
3
  [
6
4
  "907c2bc503ade11cc3b04eb2918b6f547b0630ab569273824748c87ea14b0696526c66ba740200000004ab65ababfd1f9bdd4ef073c7afc4ae00da8a66f429c917a0081ad1e1dabce28d373eab81d8628de802000000096aab5253ab52000052ad042b5f25efb33beec9f3364e8a9139e8439d9d7e26529c3c30b6c3fd89f8684cfd68ea0200000009ab53526500636a52ab599ac2fe02a526ed040000000008535300516352515164370e010000000003006300ab2ec229",
7
5
  "",