@totemsdk/core 1.0.8 → 1.0.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 (142) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -5
  3. package/dist/Streamable.js +54 -31
  4. package/dist/adapters/index.js +18 -8
  5. package/dist/adapters/types.js +19 -8
  6. package/dist/binio.js +5 -1
  7. package/dist/bip39.js +24 -14
  8. package/dist/derive.js +11 -7
  9. package/dist/index.js +130 -22
  10. package/dist/javaStreamables.js +49 -30
  11. package/dist/lease/LeaseMonitor.js +7 -3
  12. package/dist/lease/LeaseStore.js +7 -3
  13. package/dist/lease/WatermarkStore.js +7 -3
  14. package/dist/lease/index.js +13 -4
  15. package/dist/lease-client.js +8 -3
  16. package/dist/minima32.js +22 -13
  17. package/dist/minimaWireSerializer.js +20 -14
  18. package/dist/mmr.js +35 -23
  19. package/dist/mx.js +10 -1
  20. package/dist/params.js +9 -5
  21. package/dist/script.js +12 -7
  22. package/dist/scripts/contract-helpers.js +37 -26
  23. package/dist/scripts/dapp-types.js +11 -6
  24. package/dist/scripts/index.js +38 -4
  25. package/dist/scripts/types.js +26 -12
  26. package/dist/scripts/witness-serializer.js +48 -30
  27. package/dist/transaction.js +55 -46
  28. package/dist/treekey.js +74 -58
  29. package/dist/tx/TransactionLifecycle.js +11 -5
  30. package/dist/tx/TransactionReceiptStore.js +7 -3
  31. package/dist/tx/TransactionService.js +14 -10
  32. package/dist/tx/index.js +11 -3
  33. package/dist/tx/types.js +2 -1
  34. package/dist/util.js +5 -1
  35. package/dist/utils.js +12 -5
  36. package/dist/verify.js +36 -25
  37. package/dist/version.js +5 -2
  38. package/dist/wots.js +94 -64
  39. package/package.json +35 -6
  40. package/src/Streamable.d.ts +0 -265
  41. package/src/Streamable.js +0 -431
  42. package/src/Streamable.ts +0 -567
  43. package/src/__tests__/Streamable.parity.test.ts +0 -422
  44. package/src/__tests__/perAddressDerivation.parity.test.ts +0 -152
  45. package/src/__tests__/roottree-prepare.test.ts +0 -101
  46. package/src/__tests__/wots-parity.test.ts +0 -289
  47. package/src/adapters/index.d.ts +0 -190
  48. package/src/adapters/index.js +0 -117
  49. package/src/adapters/index.ts +0 -301
  50. package/src/adapters/types.ts +0 -235
  51. package/src/addr.oracle.test.ts +0 -25
  52. package/src/address.test.ts +0 -55
  53. package/src/binio.ts +0 -21
  54. package/src/bip39.d.ts +0 -91
  55. package/src/bip39.js +0 -427
  56. package/src/bip39.ts +0 -432
  57. package/src/derive.d.ts +0 -2
  58. package/src/derive.js +0 -13
  59. package/src/derive.ts +0 -11
  60. package/src/index.d.ts +0 -26
  61. package/src/index.js +0 -128
  62. package/src/index.test.ts +0 -5
  63. package/src/index.ts +0 -221
  64. package/src/javaStreamables.d.ts +0 -233
  65. package/src/javaStreamables.js +0 -328
  66. package/src/javaStreamables.ts +0 -403
  67. package/src/lease/LeaseMonitor.d.ts +0 -44
  68. package/src/lease/LeaseMonitor.js +0 -111
  69. package/src/lease/LeaseMonitor.ts +0 -157
  70. package/src/lease/LeaseStore.d.ts +0 -57
  71. package/src/lease/LeaseStore.js +0 -148
  72. package/src/lease/LeaseStore.ts +0 -203
  73. package/src/lease/WatermarkStore.d.ts +0 -61
  74. package/src/lease/WatermarkStore.js +0 -206
  75. package/src/lease/WatermarkStore.ts +0 -270
  76. package/src/lease/index.d.ts +0 -14
  77. package/src/lease/index.js +0 -22
  78. package/src/lease/index.ts +0 -41
  79. package/src/lease-client.d.ts +0 -31
  80. package/src/lease-client.js +0 -44
  81. package/src/lease-client.ts +0 -69
  82. package/src/minima32.d.ts +0 -10
  83. package/src/minima32.js +0 -113
  84. package/src/minima32.test.ts +0 -11
  85. package/src/minima32.ts +0 -127
  86. package/src/minimaWireSerializer.d.ts +0 -189
  87. package/src/minimaWireSerializer.js +0 -311
  88. package/src/minimaWireSerializer.test.ts +0 -466
  89. package/src/minimaWireSerializer.ts +0 -117
  90. package/src/mmr.d.ts +0 -159
  91. package/src/mmr.js +0 -352
  92. package/src/mmr.oracle.test.ts +0 -28
  93. package/src/mmr.ts +0 -429
  94. package/src/mx.test.ts +0 -25
  95. package/src/mx.ts +0 -1
  96. package/src/params.d.ts +0 -29
  97. package/src/params.d.ts.map +0 -1
  98. package/src/params.js +0 -20
  99. package/src/params.js.map +0 -1
  100. package/src/params.ts +0 -44
  101. package/src/script.d.ts +0 -7
  102. package/src/script.js +0 -27
  103. package/src/script.ts +0 -24
  104. package/src/scripts/contract-helpers.ts +0 -609
  105. package/src/scripts/dapp-types.ts +0 -240
  106. package/src/scripts/index.ts +0 -22
  107. package/src/scripts/types.ts +0 -247
  108. package/src/scripts/witness-serializer.ts +0 -384
  109. package/src/transaction.ts +0 -430
  110. package/src/treekey.d.ts +0 -383
  111. package/src/treekey.js +0 -774
  112. package/src/treekey.parity.test.ts +0 -459
  113. package/src/treekey.ts +0 -975
  114. package/src/tx/TransactionLifecycle.d.ts +0 -55
  115. package/src/tx/TransactionLifecycle.js +0 -188
  116. package/src/tx/TransactionLifecycle.ts +0 -280
  117. package/src/tx/TransactionReceiptStore.d.ts +0 -36
  118. package/src/tx/TransactionReceiptStore.js +0 -89
  119. package/src/tx/TransactionReceiptStore.ts +0 -112
  120. package/src/tx/TransactionService.d.ts +0 -31
  121. package/src/tx/TransactionService.js +0 -140
  122. package/src/tx/TransactionService.ts +0 -252
  123. package/src/tx/index.d.ts +0 -13
  124. package/src/tx/index.js +0 -20
  125. package/src/tx/index.ts +0 -44
  126. package/src/tx/types.d.ts +0 -80
  127. package/src/tx/types.js +0 -6
  128. package/src/tx/types.ts +0 -130
  129. package/src/util.d.ts +0 -1
  130. package/src/util.js +0 -5
  131. package/src/util.ts +0 -1
  132. package/src/utils.d.ts +0 -8
  133. package/src/utils.js +0 -42
  134. package/src/utils.ts +0 -38
  135. package/src/verify.ts +0 -210
  136. package/src/version.ts +0 -13
  137. package/src/wots.d.ts +0 -224
  138. package/src/wots.d.ts.map +0 -1
  139. package/src/wots.js +0 -565
  140. package/src/wots.js.map +0 -1
  141. package/src/wots.ts +0 -651
  142. package/test-vectors.json +0 -45
package/src/Streamable.js DELETED
@@ -1,431 +0,0 @@
1
- "use strict";
2
- /**
3
- * Streamable.ts - Canonical Java-Compatible Serialization Primitives
4
- *
5
- * This module provides byte-exact serialization functions matching
6
- * Minima's Java Streamable interface and its implementations.
7
- *
8
- * JAVA REFERENCE CLASSES:
9
- * - MiniData.writeDataStream(): 4-byte int length + raw bytes
10
- * - MiniNumber.writeDataStream(): 1-byte scale + 1-byte len + BigInteger bytes
11
- * - MiniString.writeDataStream(): delegates to MiniData(UTF-8 bytes)
12
- * - MiniByte.writeDataStream(): single byte
13
- * - Crypto.writeHashToStream(): 4-byte int length + hash bytes
14
- * - MMREntryNumber.writeDataStream(): 1-byte len + BigInteger bytes
15
- *
16
- * CRITICAL NOTES:
17
- * - MiniNumber uses 1-byte length, NOT 4-byte like MiniData
18
- * - BigInteger.toByteArray() uses two's complement (leading 0 if high bit set)
19
- * - Zero encodes as length=1, value=0x00
20
- *
21
- * Created: 2026-01-20
22
- * Purpose: Single source of truth for all Minima type serialization
23
- */
24
- Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.STATETYPE_BOOL = exports.STATETYPE_STRING = exports.STATETYPE_NUMBER = exports.STATETYPE_HEX = void 0;
26
- exports.hexToBytes = hexToBytes;
27
- exports.bytesToHex = bytesToHex;
28
- exports.concat = concat;
29
- exports.writeMiniByte = writeMiniByte;
30
- exports.writeMiniData = writeMiniData;
31
- exports.writeMiniString = writeMiniString;
32
- exports.bigIntToByteArray = bigIntToByteArray;
33
- exports.writeMiniNumber = writeMiniNumber;
34
- exports.writeHashToStream = writeHashToStream;
35
- exports.writeMMREntryNumber = writeMMREntryNumber;
36
- exports.normalizeHexString = normalizeHexString;
37
- exports.writeStateVariable = writeStateVariable;
38
- exports.writeMMRData = writeMMRData;
39
- exports.writeMMRProofChunk = writeMMRProofChunk;
40
- exports.writeMMRProof = writeMMRProof;
41
- exports.writeSignatureProof = writeSignatureProof;
42
- exports.writeSignature = writeSignature;
43
- exports.writeWitness = writeWitness;
44
- exports.writeHierarchicalWitness = writeHierarchicalWitness;
45
- exports.writeHierarchicalWitnessToHex = writeHierarchicalWitnessToHex;
46
- function hexToBytes(hex) {
47
- const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;
48
- if (cleanHex.length === 0) {
49
- return new Uint8Array(0);
50
- }
51
- if (cleanHex.length % 2 !== 0) {
52
- throw new Error(`Invalid hex string: odd length (${cleanHex.length})`);
53
- }
54
- const bytes = new Uint8Array(cleanHex.length / 2);
55
- for (let i = 0; i < cleanHex.length; i += 2) {
56
- bytes[i / 2] = parseInt(cleanHex.slice(i, i + 2), 16);
57
- }
58
- return bytes;
59
- }
60
- function bytesToHex(bytes) {
61
- return '0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');
62
- }
63
- function concat(...arrays) {
64
- const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);
65
- const result = new Uint8Array(totalLength);
66
- let offset = 0;
67
- for (const arr of arrays) {
68
- result.set(arr, offset);
69
- offset += arr.length;
70
- }
71
- return result;
72
- }
73
- /**
74
- * Encode a MiniByte per Java MiniByte.writeDataStream()
75
- *
76
- * Format: single byte (0-255)
77
- */
78
- function writeMiniByte(value) {
79
- if (typeof value === 'boolean') {
80
- return new Uint8Array([value ? 1 : 0]);
81
- }
82
- if (value < 0 || value > 255) {
83
- throw new Error(`MiniByte value must be 0-255, got ${value}`);
84
- }
85
- return new Uint8Array([value & 0xff]);
86
- }
87
- /**
88
- * Encode a MiniData per Java MiniData.writeDataStream()
89
- *
90
- * Format: 4-byte big-endian int length + raw bytes
91
- */
92
- function writeMiniData(data) {
93
- const length = data.length;
94
- const lengthBytes = new Uint8Array([
95
- (length >> 24) & 0xff,
96
- (length >> 16) & 0xff,
97
- (length >> 8) & 0xff,
98
- length & 0xff
99
- ]);
100
- return concat(lengthBytes, data);
101
- }
102
- /**
103
- * Encode a MiniString per Java MiniString.writeDataStream()
104
- *
105
- * Format: MiniData encoding of UTF-8 bytes
106
- * = 4-byte int length + UTF-8 bytes
107
- */
108
- function writeMiniString(str) {
109
- const utf8Bytes = new TextEncoder().encode(str);
110
- return writeMiniData(utf8Bytes);
111
- }
112
- /**
113
- * Convert a BigInt to Java BigInteger.toByteArray() format.
114
- *
115
- * Java BigInteger uses two's complement:
116
- * - Zero → [0x00]
117
- * - Positive with high bit set → leading 0x00 byte
118
- *
119
- * @param value - The BigInt value (must be non-negative)
120
- * @returns Uint8Array in two's complement format
121
- */
122
- function bigIntToByteArray(value) {
123
- if (value < 0n) {
124
- throw new Error(`bigIntToByteArray does not support negative values: ${value}`);
125
- }
126
- if (value === 0n) {
127
- return new Uint8Array([0]);
128
- }
129
- let hex = value.toString(16);
130
- if (hex.length % 2 !== 0) {
131
- hex = '0' + hex;
132
- }
133
- let bytes = hexToBytes('0x' + hex);
134
- if (bytes.length > 0 && (bytes[0] & 0x80) !== 0) {
135
- const withLeadingZero = new Uint8Array(bytes.length + 1);
136
- withLeadingZero[0] = 0x00;
137
- withLeadingZero.set(bytes, 1);
138
- bytes = withLeadingZero;
139
- }
140
- return bytes;
141
- }
142
- /**
143
- * Encode a MiniNumber per Java MiniNumber.writeDataStream()
144
- *
145
- * Format:
146
- * 1 byte: scale (number of decimal places, signed)
147
- * 1 byte: length of unscaled BigInteger data
148
- * N bytes: unscaled BigInteger in two's complement
149
- *
150
- * CRITICAL: Uses 1-byte length, NOT 4-byte like MiniData!
151
- *
152
- * @param value - The unscaled BigInt value
153
- * @param scale - The scale (decimal places), default 0
154
- */
155
- function writeMiniNumber(value, scale = 0) {
156
- if (typeof value !== 'bigint') {
157
- throw new Error(`writeMiniNumber requires bigint, got ${typeof value}`);
158
- }
159
- if (value < 0n) {
160
- throw new Error(`writeMiniNumber does not support negative values: ${value}`);
161
- }
162
- const unscaledBytes = bigIntToByteArray(value);
163
- const length = unscaledBytes.length;
164
- if (length > 255) {
165
- throw new Error(`MiniNumber data too large: ${length} bytes (max 255)`);
166
- }
167
- const result = new Uint8Array(1 + 1 + length);
168
- result[0] = scale & 0xff;
169
- result[1] = length & 0xff;
170
- result.set(unscaledBytes, 2);
171
- return result;
172
- }
173
- /**
174
- * Encode a hash per Java Crypto.writeHashToStream()
175
- *
176
- * Format: 4-byte big-endian int length + hash bytes
177
- * (Same as MiniData)
178
- */
179
- function writeHashToStream(hash) {
180
- return writeMiniData(hash);
181
- }
182
- /**
183
- * Encode an MMREntryNumber per Java MMREntryNumber.writeDataStream()
184
- *
185
- * Java source (MMREntryNumber.java):
186
- * MiniNumber.WriteToStream(zOut, mNumber.scale()); // scale as MiniNumber
187
- * MiniData.WriteToStream(zOut, mNumber.unscaledValue().toByteArray()); // unscaled as MiniData
188
- *
189
- * Format:
190
- * - MiniNumber for scale (always 0 for integer values)
191
- * - MiniData for unscaled BigInteger value
192
- *
193
- * For integer MMREntryNumber (scale=0), this encodes as:
194
- * [00 01 00] - MiniNumber: scale=0, len=1, data=0x00
195
- * [00 00 00 LL ...] - MiniData: 4-byte len + BigInteger bytes
196
- */
197
- function writeMMREntryNumber(value, scale = 0) {
198
- if (value < 0n) {
199
- throw new Error(`writeMMREntryNumber does not support negative values: ${value}`);
200
- }
201
- // Write scale as MiniNumber (scale of scale is always 0)
202
- const scaleBytes = writeMiniNumber(BigInt(scale), 0);
203
- // Write unscaled value as MiniData
204
- const unscaledBytes = bigIntToByteArray(value);
205
- const unscaledData = writeMiniData(unscaledBytes);
206
- return concat(scaleBytes, unscaledData);
207
- }
208
- /**
209
- * StateVariable type constants from Java StateVariable.java
210
- */
211
- exports.STATETYPE_HEX = 1;
212
- exports.STATETYPE_NUMBER = 2;
213
- exports.STATETYPE_STRING = 4;
214
- exports.STATETYPE_BOOL = 8;
215
- /**
216
- * Normalize hex/address string to 0x format.
217
- * Handles both Mx (Minima Base32) and 0x formats.
218
- * Matches Java's StateVariable constructor behavior.
219
- *
220
- * Note: For Mx conversion, caller should use mxToHex from minima-base32
221
- * This function handles 0x prefix normalization only.
222
- */
223
- function normalizeHexString(value) {
224
- if (!value) {
225
- return '0x00';
226
- }
227
- const trimmed = value.trim();
228
- return trimmed.startsWith('0x') ? trimmed : '0x' + trimmed;
229
- }
230
- /**
231
- * Serialize a StateVariable per Java StateVariable.writeDataStream()
232
- *
233
- * Format:
234
- * 1. port (MiniByte - 1 byte, 0-255)
235
- * 2. type (MiniByte - 1 byte: HEX=1, NUMBER=2, STRING=4, BOOL=8)
236
- * 3. data (format depends on type):
237
- * - BOOL: MiniByte (1 byte: 0 or 1)
238
- * - HEX: MiniData (4-byte length + hex bytes)
239
- * - NUMBER: MiniNumber (1-byte scale + 1-byte len + data)
240
- * - STRING: MiniString (4-byte length + UTF-8 with brackets)
241
- *
242
- * @param sv - StateVariable with high-level value
243
- * @param mxToHex - Optional function to convert Mx addresses to 0x hex
244
- */
245
- function writeStateVariable(sv, mxToHex) {
246
- if (sv.port < 0 || sv.port > 255) {
247
- throw new Error(`StateVariable port must be 0-255, got ${sv.port}`);
248
- }
249
- const portByte = writeMiniByte(sv.port);
250
- let typeByte;
251
- let dataBytes;
252
- switch (sv.type) {
253
- case 'bool':
254
- typeByte = writeMiniByte(exports.STATETYPE_BOOL);
255
- if (typeof sv.value === 'boolean') {
256
- dataBytes = writeMiniByte(sv.value);
257
- }
258
- else if (typeof sv.value === 'string') {
259
- dataBytes = writeMiniByte(sv.value.toUpperCase() === 'TRUE');
260
- }
261
- else {
262
- throw new Error(`Invalid bool StateVariable value: ${sv.value}`);
263
- }
264
- break;
265
- case 'number':
266
- typeByte = writeMiniByte(exports.STATETYPE_NUMBER);
267
- if (typeof sv.value === 'bigint') {
268
- dataBytes = writeMiniNumber(sv.value);
269
- }
270
- else if (typeof sv.value === 'string') {
271
- dataBytes = writeMiniNumber(BigInt(sv.value));
272
- }
273
- else {
274
- throw new Error(`Invalid number StateVariable value: ${sv.value}`);
275
- }
276
- break;
277
- case 'hex':
278
- typeByte = writeMiniByte(exports.STATETYPE_HEX);
279
- if (typeof sv.value === 'string') {
280
- let normalizedHex = sv.value;
281
- if (sv.value.toLowerCase().startsWith('mx') && mxToHex) {
282
- normalizedHex = mxToHex(sv.value);
283
- }
284
- else {
285
- normalizedHex = normalizeHexString(sv.value);
286
- }
287
- dataBytes = writeMiniData(hexToBytes(normalizedHex));
288
- }
289
- else if (sv.value instanceof Uint8Array) {
290
- dataBytes = writeMiniData(sv.value);
291
- }
292
- else {
293
- throw new Error(`Invalid hex StateVariable value: ${sv.value}`);
294
- }
295
- break;
296
- case 'string':
297
- typeByte = writeMiniByte(exports.STATETYPE_STRING);
298
- if (typeof sv.value === 'string') {
299
- let bracketedValue = sv.value;
300
- if (!sv.value.startsWith('[') || !sv.value.endsWith(']')) {
301
- bracketedValue = `[${sv.value}]`;
302
- }
303
- dataBytes = writeMiniString(bracketedValue);
304
- }
305
- else {
306
- throw new Error(`Invalid string StateVariable value: ${sv.value}`);
307
- }
308
- break;
309
- default:
310
- throw new Error(`Unknown StateVariable type: ${sv.type}`);
311
- }
312
- return concat(portByte, typeByte, dataBytes);
313
- }
314
- /**
315
- * Write MMRData per Java MMRData.writeDataStream()
316
- *
317
- * Java source (MMRData.java):
318
- * mData.writeHashToStream(zOut); // 4-byte len + hash
319
- * mValue.writeDataStream(zOut); // MiniNumber
320
- */
321
- function writeMMRData(mmrData) {
322
- const hashBytes = writeHashToStream(mmrData.data);
323
- const valueBytes = writeMiniNumber(mmrData.value, 0);
324
- return concat(hashBytes, valueBytes);
325
- }
326
- /**
327
- * Write MMRProofChunk per Java MMRProofChunk.writeDataStream()
328
- *
329
- * Java source (MMRProof.java inner class):
330
- * mLeft.writeDataStream(zOut); // MiniByte (1 byte)
331
- * mMMRData.writeDataStream(zOut); // MMRData
332
- */
333
- function writeMMRProofChunk(chunk) {
334
- const leftByte = writeMiniByte(chunk.isLeft);
335
- const dataBytes = writeMMRData(chunk.mmrData);
336
- return concat(leftByte, dataBytes);
337
- }
338
- /**
339
- * Write MMRProof per Java MMRProof.writeDataStream()
340
- *
341
- * Java source (MMRProof.java):
342
- * mBlockTime.writeDataStream(zOut); // MiniNumber
343
- * MiniNumber.WriteToStream(zOut, len); // Array length as MiniNumber
344
- * for each chunk: chunk.writeDataStream(zOut);
345
- */
346
- function writeMMRProof(proof) {
347
- const blockTimeBytes = writeMiniNumber(proof.blockTime, 0);
348
- const lengthBytes = writeMiniNumber(BigInt(proof.chunks.length), 0);
349
- const parts = [blockTimeBytes, lengthBytes];
350
- for (const chunk of proof.chunks) {
351
- parts.push(writeMMRProofChunk(chunk));
352
- }
353
- return concat(...parts);
354
- }
355
- /**
356
- * Write SignatureProof per Java SignatureProof.writeDataStream()
357
- *
358
- * Java source (SignatureProof.java):
359
- * mPublicKey.writeDataStream(zOut); // MiniData
360
- * mSignature.writeDataStream(zOut); // MiniData
361
- * mProof.writeDataStream(zOut); // MMRProof
362
- */
363
- function writeSignatureProof(sigProof) {
364
- const pubKeyBytes = writeMiniData(sigProof.leafPubkey);
365
- const sigBytes = writeMiniData(sigProof.signature);
366
- const proofBytes = writeMMRProof(sigProof.mmrProof);
367
- return concat(pubKeyBytes, sigBytes, proofBytes);
368
- }
369
- /**
370
- * Write Signature per Java Signature.writeDataStream()
371
- *
372
- * Java source (Signature.java):
373
- * MiniNumber.WriteToStream(zOut, mSignatures.size());
374
- * for each sig: sig.writeDataStream(zOut);
375
- */
376
- function writeSignature(sig) {
377
- const lengthBytes = writeMiniNumber(BigInt(sig.proofs.length), 0);
378
- const parts = [lengthBytes];
379
- for (const proof of sig.proofs) {
380
- parts.push(writeSignatureProof(proof));
381
- }
382
- return concat(...parts);
383
- }
384
- /**
385
- * Write Witness per Java Witness.writeDataStream()
386
- *
387
- * Java source (Witness.java):
388
- * MiniNumber.WriteToStream(zOut, mSignatureProofs.size());
389
- * for each sp: sp.writeDataStream(zOut);
390
- * MiniNumber.WriteToStream(zOut, mCoinProofs.size());
391
- * for each cp: cp.writeDataStream(zOut);
392
- * MiniNumber.WriteToStream(zOut, mScriptProofs.size());
393
- * for each sp: sp.writeDataStream(zOut);
394
- */
395
- function writeWitness(witness) {
396
- const parts = [];
397
- // Signatures
398
- parts.push(writeMiniNumber(BigInt(witness.signatures.length), 0));
399
- for (const sig of witness.signatures) {
400
- parts.push(writeSignature(sig));
401
- }
402
- // Coin proofs
403
- parts.push(writeMiniNumber(BigInt(witness.coinProofs.length), 0));
404
- for (const cp of witness.coinProofs) {
405
- parts.push(cp.data);
406
- }
407
- // Script proofs
408
- parts.push(writeMiniNumber(BigInt(witness.scriptProofs.length), 0));
409
- for (const sp of witness.scriptProofs) {
410
- parts.push(sp.data);
411
- }
412
- return concat(...parts);
413
- }
414
- /**
415
- * Write a simplified hierarchical witness (signatures only)
416
- * Used for WOTS transaction signing flow
417
- */
418
- function writeHierarchicalWitness(bundle) {
419
- const lengthBytes = writeMiniNumber(BigInt(bundle.signatures.length), 0);
420
- const parts = [lengthBytes];
421
- for (const sig of bundle.signatures) {
422
- parts.push(writeSignature(sig));
423
- }
424
- return concat(...parts);
425
- }
426
- /**
427
- * Write hierarchical witness and return as hex string
428
- */
429
- function writeHierarchicalWitnessToHex(bundle) {
430
- return bytesToHex(writeHierarchicalWitness(bundle));
431
- }