@totemsdk/core 1.0.9 → 1.0.11

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 (145) 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.d.ts +2 -2
  39. package/dist/wots.js +94 -64
  40. package/package.json +50 -6
  41. package/src/Streamable.d.ts +0 -268
  42. package/src/Streamable.js +0 -416
  43. package/src/Streamable.ts +0 -567
  44. package/src/__tests__/Streamable.parity.test.ts +0 -422
  45. package/src/__tests__/perAddressDerivation.parity.test.ts +0 -152
  46. package/src/__tests__/roottree-prepare.test.ts +0 -101
  47. package/src/__tests__/wots-parity.test.ts +0 -289
  48. package/src/adapters/index.d.ts +0 -190
  49. package/src/adapters/index.js +0 -117
  50. package/src/adapters/index.ts +0 -301
  51. package/src/adapters/types.ts +0 -235
  52. package/src/addr.oracle.test.ts +0 -25
  53. package/src/address.test.ts +0 -55
  54. package/src/binio.ts +0 -21
  55. package/src/bip39.d.ts +0 -91
  56. package/src/bip39.js +0 -427
  57. package/src/bip39.ts +0 -432
  58. package/src/derive.d.ts +0 -2
  59. package/src/derive.js +0 -13
  60. package/src/derive.ts +0 -11
  61. package/src/index.d.ts +0 -26
  62. package/src/index.js +0 -128
  63. package/src/index.test.ts +0 -5
  64. package/src/index.ts +0 -221
  65. package/src/javaStreamables.d.ts +0 -233
  66. package/src/javaStreamables.js +0 -332
  67. package/src/javaStreamables.ts +0 -403
  68. package/src/lease/LeaseMonitor.d.ts +0 -44
  69. package/src/lease/LeaseMonitor.js +0 -111
  70. package/src/lease/LeaseMonitor.ts +0 -157
  71. package/src/lease/LeaseStore.d.ts +0 -57
  72. package/src/lease/LeaseStore.js +0 -148
  73. package/src/lease/LeaseStore.ts +0 -203
  74. package/src/lease/WatermarkStore.d.ts +0 -61
  75. package/src/lease/WatermarkStore.js +0 -206
  76. package/src/lease/WatermarkStore.ts +0 -270
  77. package/src/lease/index.d.ts +0 -14
  78. package/src/lease/index.js +0 -22
  79. package/src/lease/index.ts +0 -41
  80. package/src/lease-client.d.ts +0 -31
  81. package/src/lease-client.js +0 -44
  82. package/src/lease-client.ts +0 -69
  83. package/src/minima32.d.ts +0 -10
  84. package/src/minima32.js +0 -113
  85. package/src/minima32.test.ts +0 -11
  86. package/src/minima32.ts +0 -127
  87. package/src/minimaWireSerializer.d.ts +0 -189
  88. package/src/minimaWireSerializer.js +0 -311
  89. package/src/minimaWireSerializer.test.ts +0 -466
  90. package/src/minimaWireSerializer.ts +0 -117
  91. package/src/mmr.d.ts +0 -157
  92. package/src/mmr.js +0 -340
  93. package/src/mmr.oracle.test.ts +0 -28
  94. package/src/mmr.ts +0 -429
  95. package/src/mx.test.ts +0 -25
  96. package/src/mx.ts +0 -1
  97. package/src/params.d.ts +0 -29
  98. package/src/params.d.ts.map +0 -1
  99. package/src/params.js +0 -20
  100. package/src/params.js.map +0 -1
  101. package/src/params.ts +0 -44
  102. package/src/script.d.ts +0 -7
  103. package/src/script.js +0 -27
  104. package/src/script.ts +0 -24
  105. package/src/scripts/contract-helpers.ts +0 -609
  106. package/src/scripts/dapp-types.ts +0 -240
  107. package/src/scripts/index.ts +0 -22
  108. package/src/scripts/types.d.ts +0 -81
  109. package/src/scripts/types.js +0 -145
  110. package/src/scripts/types.ts +0 -247
  111. package/src/scripts/witness-serializer.ts +0 -384
  112. package/src/transaction.ts +0 -430
  113. package/src/treekey.d.ts +0 -383
  114. package/src/treekey.js +0 -774
  115. package/src/treekey.parity.test.ts +0 -459
  116. package/src/treekey.ts +0 -975
  117. package/src/tx/TransactionLifecycle.d.ts +0 -55
  118. package/src/tx/TransactionLifecycle.js +0 -188
  119. package/src/tx/TransactionLifecycle.ts +0 -280
  120. package/src/tx/TransactionReceiptStore.d.ts +0 -36
  121. package/src/tx/TransactionReceiptStore.js +0 -89
  122. package/src/tx/TransactionReceiptStore.ts +0 -112
  123. package/src/tx/TransactionService.d.ts +0 -31
  124. package/src/tx/TransactionService.js +0 -140
  125. package/src/tx/TransactionService.ts +0 -252
  126. package/src/tx/index.d.ts +0 -13
  127. package/src/tx/index.js +0 -20
  128. package/src/tx/index.ts +0 -44
  129. package/src/tx/types.d.ts +0 -80
  130. package/src/tx/types.js +0 -6
  131. package/src/tx/types.ts +0 -130
  132. package/src/util.d.ts +0 -1
  133. package/src/util.js +0 -5
  134. package/src/util.ts +0 -1
  135. package/src/utils.d.ts +0 -8
  136. package/src/utils.js +0 -42
  137. package/src/utils.ts +0 -38
  138. package/src/verify.ts +0 -210
  139. package/src/version.ts +0 -13
  140. package/src/wots.d.ts +0 -224
  141. package/src/wots.d.ts.map +0 -1
  142. package/src/wots.js +0 -565
  143. package/src/wots.js.map +0 -1
  144. package/src/wots.ts +0 -651
  145. package/test-vectors.json +0 -45
@@ -1,403 +0,0 @@
1
- /**
2
- * Java-Compatible Serialization Helpers
3
- *
4
- * Matches Minima Java serialization exactly:
5
- * - MiniNumber.java: writeDataStream / readDataStream
6
- * - MiniData.java: writeDataStream / readDataStream
7
- * - Crypto.java: hashAllObjects - serializes Streamables then SHA3-256
8
- *
9
- * These helpers are used for seed derivation to match TreeKeyNode.java:
10
- * MiniData seed = Crypto.getInstance().hashAllObjects(new MiniNumber(i), zPrivateSeed);
11
- *
12
- * NOTE: This module provides number-based wrappers for backward compatibility.
13
- * The canonical implementations are in Streamable.ts which uses bigint for precision.
14
- */
15
-
16
- import { sha3_256 } from '@noble/hashes/sha3.js';
17
- import {
18
- writeMiniNumber as streamableWriteMiniNumber,
19
- writeMiniData as streamableWriteMiniData,
20
- writeHashToStream as streamableWriteHashToStream,
21
- bigIntToByteArray
22
- } from './Streamable.js';
23
-
24
- /**
25
- * Serialize a number in MiniNumber format (Java compatible)
26
- *
27
- * Thin wrapper over Streamable.writeMiniNumber that accepts number for backward compatibility.
28
- *
29
- * @param n - Non-negative integer to serialize
30
- * @returns Serialized bytes matching Java MiniNumber format
31
- */
32
- export function serializeMiniNumber(n: number): Uint8Array {
33
- if (n < 0) throw new Error('MiniNumber must be non-negative');
34
- return streamableWriteMiniNumber(BigInt(n));
35
- }
36
-
37
- /**
38
- * Serialize bytes in MiniData format (Java compatible)
39
- *
40
- * Re-export of Streamable.writeMiniData for backward compatibility.
41
- *
42
- * @param data - Bytes to serialize
43
- * @returns Serialized bytes matching Java MiniData format
44
- */
45
- export function serializeMiniData(data: Uint8Array): Uint8Array {
46
- return streamableWriteMiniData(data);
47
- }
48
-
49
- /**
50
- * Hash multiple Streamable objects (Java compatible)
51
- *
52
- * From Crypto.java hashAllObjects:
53
- * 1. Write each object to DataOutputStream
54
- * 2. SHA3-256 hash the combined bytes
55
- *
56
- * This matches TreeKeyNode.java seed derivation:
57
- * Crypto.getInstance().hashAllObjects(new MiniNumber(i), zPrivateSeed)
58
- *
59
- * @param items - Array of serialized objects (use serializeMiniNumber/serializeMiniData)
60
- * @returns 32-byte SHA3-256 hash
61
- */
62
- export function hashAllObjects(...items: Uint8Array[]): Uint8Array {
63
- // Concatenate all serialized items
64
- const totalLength = items.reduce((sum, item) => sum + item.length, 0);
65
- const combined = new Uint8Array(totalLength);
66
- let offset = 0;
67
- for (const item of items) {
68
- combined.set(item, offset);
69
- offset += item.length;
70
- }
71
-
72
- // SHA3-256 hash
73
- return sha3_256(combined);
74
- }
75
-
76
- /**
77
- * Derive per-chain seed matching Java TreeKeyNode.java exactly
78
- *
79
- * From TreeKeyNode.java constructor (line 43-44):
80
- * MiniData seed = Crypto.getInstance().hashAllObjects(new MiniNumber(i), zPrivateSeed);
81
- *
82
- * @param privateSeed - 32-byte private seed
83
- * @param index - Chain index (0-63)
84
- * @returns 32-byte derived seed for this chain
85
- */
86
- export function deriveChainSeedJava(privateSeed: Uint8Array, index: number): Uint8Array {
87
- const indexSerialized = serializeMiniNumber(index);
88
- const seedSerialized = serializeMiniData(privateSeed);
89
- return hashAllObjects(indexSerialized, seedSerialized);
90
- }
91
-
92
- /**
93
- * Derive child tree seed matching Java TreeKeyNode.java exactly
94
- *
95
- * From TreeKeyNode.java getChild (line 68):
96
- * MiniData seed = Crypto.getInstance().hashAllObjects(new MiniNumber(zChild), mChildSeed);
97
- *
98
- * The child seed is derived from parent's private seed:
99
- * mChildSeed = Crypto.getInstance().hashObject(zPrivateSeed); // line 30
100
- *
101
- * @param childSeed - 32-byte child seed (hash of parent's private seed)
102
- * @param childIndex - Child index (0-63)
103
- * @returns 32-byte derived seed for child tree
104
- */
105
- export function deriveChildTreeSeedJava(childSeed: Uint8Array, childIndex: number): Uint8Array {
106
- const indexSerialized = serializeMiniNumber(childIndex);
107
- const seedSerialized = serializeMiniData(childSeed);
108
- return hashAllObjects(indexSerialized, seedSerialized);
109
- }
110
-
111
- /**
112
- * Hash a single object matching Java's Crypto.hashObject()
113
- *
114
- * From TreeKeyNode.java line 30:
115
- * mChildSeed = Crypto.getInstance().hashObject(zPrivateSeed);
116
- *
117
- * This serializes the object as MiniData (length-prefixed) and hashes it.
118
- *
119
- * @param data - Raw bytes (will be serialized as MiniData)
120
- * @returns 32-byte SHA3-256 hash
121
- */
122
- export function hashObject(data: Uint8Array): Uint8Array {
123
- const serialized = serializeMiniData(data);
124
- return sha3_256(serialized);
125
- }
126
-
127
- /**
128
- * Convert index to MiniData bytes matching Java's:
129
- * new MiniData(new BigInteger(Integer.toString(index)))
130
- *
131
- * BigInteger uses minimum byte representation (no leading zeros).
132
- * This is used for per-address key derivation in Wallet.java.
133
- *
134
- * @param index - Non-negative integer (0, 1, 2, ...)
135
- * @returns Minimal byte representation of the index
136
- */
137
- export function indexToMiniDataBytes(index: number): Uint8Array {
138
- if (index === 0) {
139
- return new Uint8Array([0x00]);
140
- }
141
-
142
- // Convert to minimum byte representation (big-endian, no leading zeros)
143
- const bytes: number[] = [];
144
- let n = index;
145
- while (n > 0) {
146
- bytes.unshift(n & 0xff);
147
- n = n >> 8;
148
- }
149
-
150
- return new Uint8Array(bytes);
151
- }
152
-
153
- /**
154
- * Derive per-address private seed matching Minima Wallet.java exactly
155
- *
156
- * From Wallet.java createNewKey() (lines 498-503):
157
- * MiniData modifier = new MiniData(new BigInteger(Integer.toString(numkeys)));
158
- * MiniData privseed = Crypto.getInstance().hashObjects(new MiniData(mBaseSeed.getSeed()), modifier);
159
- *
160
- * CRITICAL: This is DIFFERENT from deriveChainSeedJava!
161
- * - deriveChainSeedJava: hashAllObjects(MiniNumber(index), MiniData(seed)) - index first as MiniNumber
162
- * - This function: hashObjects(MiniData(baseSeed), MiniData(modifier)) - baseSeed first, both as MiniData
163
- *
164
- * @param baseSeed - 32-byte base wallet seed (from mnemonic)
165
- * @param addressIndex - Address index (0, 1, 2, ... 63)
166
- * @returns 32-byte private seed for this address's TreeKey
167
- */
168
- export function derivePerAddressSeed(baseSeed: Uint8Array, addressIndex: number): Uint8Array {
169
- // Step 1: Create modifier bytes from BigInteger representation of index
170
- const modifierBytes = indexToMiniDataBytes(addressIndex);
171
-
172
- // Step 2: Serialize both as MiniData (4-byte length prefix each)
173
- const baseSeedSerialized = serializeMiniData(baseSeed);
174
- const modifierSerialized = serializeMiniData(modifierBytes);
175
-
176
- // Step 3: Concatenate and hash (baseSeed FIRST, then modifier)
177
- const combined = new Uint8Array(baseSeedSerialized.length + modifierSerialized.length);
178
- combined.set(baseSeedSerialized, 0);
179
- combined.set(modifierSerialized, baseSeedSerialized.length);
180
-
181
- const result = sha3_256(combined);
182
-
183
- // DIAGNOSTIC: Log first 8 bytes to detect bundle duplication or implementation differences
184
- // Enable via: globalThis.TOTEM_SEED_DEBUG = true
185
- if (typeof console !== 'undefined' && (globalThis as any).TOTEM_SEED_DEBUG) {
186
- const toHex = (b: Uint8Array) => Array.from(b.slice(0, 8)).map(x => x.toString(16).padStart(2, '0')).join('');
187
- console.log(`[derivePerAddressSeed] idx=${addressIndex} baseSeed[0:8]=${toHex(baseSeed)} -> result[0:8]=${toHex(result)}`);
188
- }
189
-
190
- return result;
191
- }
192
-
193
- /**
194
- * Serialize MiniNumber.ZERO - cached for performance
195
- * Returns: [0x00, 0x01, 0x00] = scale(0) + length(1) + value(0)
196
- */
197
- export function serializeMiniNumberZERO(): Uint8Array {
198
- return new Uint8Array([0x00, 0x01, 0x00]);
199
- }
200
-
201
- /**
202
- * Serialize MiniNumber.ONE
203
- * Returns: [0x00, 0x01, 0x01] = scale(0) + length(1) + value(1)
204
- */
205
- export function serializeMiniNumberONE(): Uint8Array {
206
- return new Uint8Array([0x00, 0x01, 0x01]);
207
- }
208
-
209
- /**
210
- * Serialize hash in MiniData.writeHashToStream format (4-byte length prefix)
211
- *
212
- * Re-export of Streamable.writeHashToStream for backward compatibility.
213
- *
214
- * @param data - Hash bytes (max 64 bytes per MINIMA_MAX_HASH_LENGTH)
215
- * @returns Serialized bytes with 4-byte length prefix
216
- */
217
- export function writeHashToStream(data: Uint8Array): Uint8Array {
218
- return streamableWriteHashToStream(data);
219
- }
220
-
221
- /**
222
- * Java hashAllObjects for MMRData hashing
223
- * Used for MMRData.CreateMMRDataLeafNode and CreateMMRDataParentNode
224
- *
225
- * From Crypto.java hashAllObjects:
226
- * Serializes each Streamable object and hashes the concatenation.
227
- *
228
- * For MMRData, the serialization is:
229
- * - MiniNumber: [scale][len][data] (see serializeMiniNumber)
230
- * - MiniData: [4-byte len][data] for writeDataStream
231
- * - Hash: [4-byte len][data] for writeHashToStream (same as MiniData)
232
- *
233
- * CRITICAL: Java writeHashToStream uses writeInt (4-byte prefix),
234
- * identical to writeDataStream. See MiniData.java lines 282-289.
235
- *
236
- * @param items - Pre-serialized items to concatenate and hash
237
- * @returns 32-byte SHA3-256 hash
238
- */
239
- export function javaHashAllObjects(...items: Uint8Array[]): Uint8Array {
240
- const totalLength = items.reduce((sum, item) => sum + item.length, 0);
241
- const combined = new Uint8Array(totalLength);
242
- let offset = 0;
243
- for (const item of items) {
244
- combined.set(item, offset);
245
- offset += item.length;
246
- }
247
- return sha3_256(combined);
248
- }
249
-
250
- /**
251
- * MMREntryNumber interface matching Minima's MMREntryNumber.java
252
- * Represents a BigDecimal position in the MMR tree
253
- */
254
- export interface MMREntryNumber {
255
- scale: number; // BigDecimal scale (typically 0 for integer positions)
256
- unscaled: bigint; // BigDecimal unscaled value
257
- }
258
-
259
- /**
260
- * Create MMREntryNumber from bigint (common case for integer positions)
261
- */
262
- export function createMMREntryNumber(value: bigint): MMREntryNumber {
263
- return { scale: 0, unscaled: value };
264
- }
265
-
266
- /**
267
- * Serialize MMREntryNumber matching Java MMREntryNumber.writeDataStream()
268
- *
269
- * From MMREntryNumber.java:
270
- * MiniNumber.WriteToStream(zOut, mNumber.scale());
271
- * MiniData.WriteToStream(zOut, mNumber.unscaledValue().toByteArray());
272
- *
273
- * @param entry - MMREntryNumber to serialize
274
- * @returns Serialized bytes: MiniNumber(scale) + MiniData(unscaled bytes)
275
- */
276
- export function serializeMMREntryNumber(entry: MMREntryNumber): Uint8Array {
277
- const scaleSerialized = serializeMiniNumber(entry.scale);
278
- const unscaledBytes = bigintToSignedBytes(entry.unscaled);
279
- const unscaledSerialized = serializeMiniData(unscaledBytes);
280
-
281
- const result = new Uint8Array(scaleSerialized.length + unscaledSerialized.length);
282
- result.set(scaleSerialized, 0);
283
- result.set(unscaledSerialized, scaleSerialized.length);
284
- return result;
285
- }
286
-
287
- /**
288
- * Convert bigint to Java BigInteger.toByteArray() format (big-endian, signed two's complement)
289
- * Uses the canonical implementation from Streamable.ts
290
- */
291
- function bigintToSignedBytes(n: bigint): Uint8Array {
292
- return bigIntToByteArray(n);
293
- }
294
-
295
- /**
296
- * MMRData interface for serialization purposes
297
- * Matches Minima's MMRData.java
298
- */
299
- export interface MMRData {
300
- data: Uint8Array; // 32-byte hash
301
- value: bigint; // Sum value (typically 0n for TreeKey)
302
- }
303
-
304
- /**
305
- * Serialize MMRData matching Java MMRData.writeDataStream()
306
- *
307
- * From MMRData.java:
308
- * mData.writeHashToStream(zOut); // 4-byte length prefix + hash bytes
309
- * mValue.writeDataStream(zOut); // MiniNumber format
310
- *
311
- * @param mmrData - MMRData to serialize
312
- * @returns Serialized bytes: writeHashToStream(hash) + MiniNumber(value)
313
- */
314
- export function serializeMMRData(mmrData: MMRData): Uint8Array {
315
- const hashSerialized = writeHashToStream(mmrData.data);
316
- const valueSerialized = serializeMiniNumber(Number(mmrData.value));
317
-
318
- const result = new Uint8Array(hashSerialized.length + valueSerialized.length);
319
- result.set(hashSerialized, 0);
320
- result.set(valueSerialized, hashSerialized.length);
321
- return result;
322
- }
323
-
324
- /**
325
- * MMREntry interface for serialization purposes
326
- * Matches Minima's MMREntry.java
327
- */
328
- export interface MMREntry {
329
- row: number;
330
- entryNumber: MMREntryNumber;
331
- mmrData: MMRData;
332
- }
333
-
334
- /**
335
- * Serialize MMREntry matching Java MMREntry.writeDataStream()
336
- *
337
- * From MMREntry.java:
338
- * MiniNumber row = new MiniNumber(mRow);
339
- * row.writeDataStream(zOut);
340
- * mEntryNumber.writeDataStream(zOut);
341
- * mMMRData.writeDataStream(zOut);
342
- *
343
- * @param entry - MMREntry to serialize
344
- * @returns Serialized bytes: MiniNumber(row) + MMREntryNumber + MMRData
345
- */
346
- export function serializeMMREntry(entry: MMREntry): Uint8Array {
347
- const rowSerialized = serializeMiniNumber(entry.row);
348
- const entryNumberSerialized = serializeMMREntryNumber(entry.entryNumber);
349
- const mmrDataSerialized = serializeMMRData(entry.mmrData);
350
-
351
- const totalLength = rowSerialized.length + entryNumberSerialized.length + mmrDataSerialized.length;
352
- const result = new Uint8Array(totalLength);
353
-
354
- let offset = 0;
355
- result.set(rowSerialized, offset);
356
- offset += rowSerialized.length;
357
- result.set(entryNumberSerialized, offset);
358
- offset += entryNumberSerialized.length;
359
- result.set(mmrDataSerialized, offset);
360
-
361
- return result;
362
- }
363
-
364
- /**
365
- * Precompute output coin IDs before computing the transaction digest.
366
- *
367
- * CRITICAL: Java's txnsign command calls TxPoWGenerator.precomputeTransactionCoinID(txn)
368
- * BEFORE calculateTransactionID(). This means the transaction digest that gets signed
369
- * includes the PRECOMPUTED output coin IDs, not the placeholder 0x00.
370
- *
371
- * Formula: outputCoinID = SHA3-256( writeMiniData(input[0].coinID) || writeMiniNumber(outputIndex) )
372
- * This matches Java's Crypto.hashObjects(baseCoinID, new MiniNumber(outputNum))
373
- *
374
- * Without this, the wallet signs a different digest than what the node verifies against,
375
- * causing allsignaturesvalid=false on every transaction.
376
- *
377
- * @param inputs - Transaction inputs array, each must have a coinId (Uint8Array)
378
- * @param outputs - Transaction outputs array, each will have its coinId mutated in-place
379
- */
380
- export function precomputeTransactionCoinID(
381
- inputs: { coinId: Uint8Array }[],
382
- outputs: { coinId: Uint8Array }[]
383
- ): void {
384
- if (inputs.length === 0) return;
385
-
386
- const baseCoinId = inputs[0].coinId;
387
-
388
- if (baseCoinId.length < 2) {
389
- throw new Error(
390
- `Cannot precompute output coinIDs: input[0].coinId is ${baseCoinId.length} byte(s) ` +
391
- `(placeholder?). Real coinId from CoinProof required for signing.`
392
- );
393
- }
394
-
395
- for (let i = 0; i < outputs.length; i++) {
396
- const baseCoinIdStream = streamableWriteMiniData(baseCoinId);
397
- const outputIndexStream = streamableWriteMiniNumber(BigInt(i));
398
- const combined = new Uint8Array(baseCoinIdStream.length + outputIndexStream.length);
399
- combined.set(baseCoinIdStream, 0);
400
- combined.set(outputIndexStream, baseCoinIdStream.length);
401
- outputs[i].coinId = sha3_256(combined);
402
- }
403
- }
@@ -1,44 +0,0 @@
1
- /**
2
- * @module LeaseMonitor
3
- * Monitors lease expiry and triggers renewal/cleanup actions
4
- *
5
- * Features:
6
- * - Automatic expiry detection with configurable thresholds
7
- * - Event-based notifications for expiring leases
8
- * - Adaptive monitoring interval based on shortest TTL
9
- */
10
- import type { TimerAdapter, LoggerAdapter } from '../adapters';
11
- import type { LeaseStore, StoredLease } from './LeaseStore';
12
- export interface LeaseExpiryEvent {
13
- leaseId: string;
14
- expiresAt: number;
15
- remainingMs: number;
16
- lease: StoredLease;
17
- }
18
- export type LeaseExpiryCallback = (event: LeaseExpiryEvent) => void;
19
- export interface LeaseMonitorConfig {
20
- defaultIntervalMs?: number;
21
- expiryThresholdMs?: number;
22
- minIntervalMs?: number;
23
- maxIntervalMs?: number;
24
- }
25
- export declare class LeaseMonitor {
26
- private readonly leaseStore;
27
- private readonly timer;
28
- private readonly logger;
29
- private readonly config;
30
- private timerHandle;
31
- private isRunning;
32
- private expiryCallbacks;
33
- constructor(leaseStore: LeaseStore, timer?: TimerAdapter, logger?: LoggerAdapter, config?: LeaseMonitorConfig);
34
- start(): void;
35
- stop(): void;
36
- isActive(): boolean;
37
- onExpirySoon(callback: LeaseExpiryCallback): () => void;
38
- removeAllListeners(): void;
39
- checkNow(): Promise<LeaseExpiryEvent[]>;
40
- private scheduleNextCheck;
41
- private runCheck;
42
- private calculateInterval;
43
- private notifyExpirySoon;
44
- }
@@ -1,111 +0,0 @@
1
- "use strict";
2
- /**
3
- * @module LeaseMonitor
4
- * Monitors lease expiry and triggers renewal/cleanup actions
5
- *
6
- * Features:
7
- * - Automatic expiry detection with configurable thresholds
8
- * - Event-based notifications for expiring leases
9
- * - Adaptive monitoring interval based on shortest TTL
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.LeaseMonitor = void 0;
13
- const adapters_1 = require("../adapters");
14
- const DEFAULT_CONFIG = {
15
- defaultIntervalMs: 5000,
16
- expiryThresholdMs: 5000,
17
- minIntervalMs: 1000,
18
- maxIntervalMs: 30000,
19
- };
20
- class LeaseMonitor {
21
- constructor(leaseStore, timer = new adapters_1.DefaultTimerAdapter(), logger = new adapters_1.NoopLogger(), config = {}) {
22
- this.timerHandle = null;
23
- this.isRunning = false;
24
- this.expiryCallbacks = new Set();
25
- this.leaseStore = leaseStore;
26
- this.timer = timer;
27
- this.logger = logger;
28
- this.config = { ...DEFAULT_CONFIG, ...config };
29
- }
30
- start() {
31
- if (this.isRunning) {
32
- this.logger.debug('LeaseMonitor already running');
33
- return;
34
- }
35
- this.isRunning = true;
36
- this.scheduleNextCheck();
37
- this.logger.debug('LeaseMonitor started');
38
- }
39
- stop() {
40
- if (!this.isRunning)
41
- return;
42
- this.isRunning = false;
43
- if (this.timerHandle !== null) {
44
- this.timer.clearTimeout(this.timerHandle);
45
- this.timerHandle = null;
46
- }
47
- this.logger.debug('LeaseMonitor stopped');
48
- }
49
- isActive() {
50
- return this.isRunning;
51
- }
52
- onExpirySoon(callback) {
53
- this.expiryCallbacks.add(callback);
54
- return () => this.expiryCallbacks.delete(callback);
55
- }
56
- removeAllListeners() {
57
- this.expiryCallbacks.clear();
58
- }
59
- async checkNow() {
60
- const now = this.timer.now();
61
- const expiringSoon = this.leaseStore.getExpiringSoon(this.config.expiryThresholdMs);
62
- const events = expiringSoon.map(lease => ({
63
- leaseId: lease.leaseId,
64
- expiresAt: lease.expiresAt,
65
- remainingMs: Math.max(0, lease.expiresAt - now),
66
- lease,
67
- }));
68
- for (const event of events) {
69
- this.notifyExpirySoon(event);
70
- }
71
- await this.leaseStore.cleanupExpired();
72
- return events;
73
- }
74
- scheduleNextCheck() {
75
- if (!this.isRunning)
76
- return;
77
- const interval = this.calculateInterval();
78
- this.timerHandle = this.timer.setTimeout(() => {
79
- this.runCheck();
80
- }, interval);
81
- this.logger.debug(`Next lease check scheduled in ${interval}ms`);
82
- }
83
- async runCheck() {
84
- if (!this.isRunning)
85
- return;
86
- try {
87
- await this.checkNow();
88
- }
89
- catch (error) {
90
- this.logger.error('Error during lease check:', error);
91
- }
92
- this.scheduleNextCheck();
93
- }
94
- calculateInterval() {
95
- const storeInterval = this.leaseStore.calculateMonitoringInterval();
96
- const interval = Math.max(this.config.minIntervalMs, Math.min(storeInterval, this.config.maxIntervalMs));
97
- return interval;
98
- }
99
- notifyExpirySoon(event) {
100
- this.logger.debug(`Lease expiring soon: ${event.leaseId}, remaining: ${event.remainingMs}ms`);
101
- this.expiryCallbacks.forEach(callback => {
102
- try {
103
- callback(event);
104
- }
105
- catch (error) {
106
- this.logger.error('Error in expiry callback:', error);
107
- }
108
- });
109
- }
110
- }
111
- exports.LeaseMonitor = LeaseMonitor;