@totemsdk/core 1.0.0
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.
- package/dist/Streamable.d.ts +268 -0
- package/dist/Streamable.js +416 -0
- package/dist/adapters/index.d.ts +190 -0
- package/dist/adapters/index.js +107 -0
- package/dist/adapters/types.d.ts +149 -0
- package/dist/adapters/types.js +67 -0
- package/dist/binio.d.ts +9 -0
- package/dist/binio.js +30 -0
- package/dist/bip39.d.ts +91 -0
- package/dist/bip39.js +417 -0
- package/dist/derive.d.ts +2 -0
- package/dist/derive.js +9 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +53 -0
- package/dist/javaStreamables.d.ts +233 -0
- package/dist/javaStreamables.js +332 -0
- package/dist/lease/LeaseMonitor.d.ts +44 -0
- package/dist/lease/LeaseMonitor.js +107 -0
- package/dist/lease/LeaseStore.d.ts +57 -0
- package/dist/lease/LeaseStore.js +144 -0
- package/dist/lease/WatermarkStore.d.ts +61 -0
- package/dist/lease/WatermarkStore.js +202 -0
- package/dist/lease/index.d.ts +14 -0
- package/dist/lease/index.js +13 -0
- package/dist/lease-client.d.ts +31 -0
- package/dist/lease-client.js +39 -0
- package/dist/minima32.d.ts +18 -0
- package/dist/minima32.js +112 -0
- package/dist/minimaWireSerializer.d.ts +60 -0
- package/dist/minimaWireSerializer.js +71 -0
- package/dist/mmr.d.ts +156 -0
- package/dist/mmr.js +342 -0
- package/dist/mx.d.ts +1 -0
- package/dist/mx.js +1 -0
- package/dist/params.d.ts +29 -0
- package/dist/params.js +16 -0
- package/dist/script.d.ts +7 -0
- package/dist/script.js +22 -0
- package/dist/scripts/contract-helpers.d.ts +252 -0
- package/dist/scripts/contract-helpers.js +394 -0
- package/dist/scripts/dapp-types.d.ts +119 -0
- package/dist/scripts/dapp-types.js +72 -0
- package/dist/scripts/index.d.ts +4 -0
- package/dist/scripts/index.js +4 -0
- package/dist/scripts/types.d.ts +81 -0
- package/dist/scripts/types.js +145 -0
- package/dist/scripts/witness-serializer.d.ts +29 -0
- package/dist/scripts/witness-serializer.js +288 -0
- package/dist/transaction.d.ts +106 -0
- package/dist/transaction.js +284 -0
- package/dist/treekey.d.ts +383 -0
- package/dist/treekey.js +762 -0
- package/dist/tx/TransactionLifecycle.d.ts +55 -0
- package/dist/tx/TransactionLifecycle.js +189 -0
- package/dist/tx/TransactionReceiptStore.d.ts +36 -0
- package/dist/tx/TransactionReceiptStore.js +85 -0
- package/dist/tx/TransactionService.d.ts +50 -0
- package/dist/tx/TransactionService.js +178 -0
- package/dist/tx/index.d.ts +13 -0
- package/dist/tx/index.js +12 -0
- package/dist/tx/types.d.ts +114 -0
- package/dist/tx/types.js +5 -0
- package/dist/util.d.ts +1 -0
- package/dist/util.js +1 -0
- package/dist/utils.d.ts +8 -0
- package/dist/utils.js +35 -0
- package/dist/verify.d.ts +18 -0
- package/dist/verify.js +162 -0
- package/dist/version.d.ts +12 -0
- package/dist/version.js +12 -0
- package/dist/wots.d.ts +232 -0
- package/dist/wots.js +538 -0
- package/package.json +65 -0
- package/src/Streamable.d.ts +265 -0
- package/src/Streamable.js +431 -0
- package/src/Streamable.ts +567 -0
- package/src/__tests__/Streamable.parity.test.ts +422 -0
- package/src/__tests__/perAddressDerivation.parity.test.ts +152 -0
- package/src/__tests__/wots-parity.test.ts +289 -0
- package/src/adapters/index.d.ts +190 -0
- package/src/adapters/index.js +117 -0
- package/src/adapters/index.ts +301 -0
- package/src/adapters/types.ts +235 -0
- package/src/addr.oracle.test.ts +25 -0
- package/src/address.test.ts +55 -0
- package/src/binio.ts +21 -0
- package/src/bip39.d.ts +91 -0
- package/src/bip39.js +427 -0
- package/src/bip39.ts +432 -0
- package/src/derive.d.ts +2 -0
- package/src/derive.js +13 -0
- package/src/derive.ts +11 -0
- package/src/index.d.ts +26 -0
- package/src/index.js +128 -0
- package/src/index.test.ts +5 -0
- package/src/index.ts +206 -0
- package/src/javaStreamables.d.ts +233 -0
- package/src/javaStreamables.js +328 -0
- package/src/javaStreamables.ts +403 -0
- package/src/lease/LeaseMonitor.d.ts +44 -0
- package/src/lease/LeaseMonitor.js +111 -0
- package/src/lease/LeaseMonitor.ts +157 -0
- package/src/lease/LeaseStore.d.ts +57 -0
- package/src/lease/LeaseStore.js +148 -0
- package/src/lease/LeaseStore.ts +203 -0
- package/src/lease/WatermarkStore.d.ts +61 -0
- package/src/lease/WatermarkStore.js +206 -0
- package/src/lease/WatermarkStore.ts +270 -0
- package/src/lease/index.d.ts +14 -0
- package/src/lease/index.js +22 -0
- package/src/lease/index.ts +41 -0
- package/src/lease-client.d.ts +31 -0
- package/src/lease-client.js +44 -0
- package/src/lease-client.ts +69 -0
- package/src/minima32.d.ts +10 -0
- package/src/minima32.js +113 -0
- package/src/minima32.test.ts +11 -0
- package/src/minima32.ts +127 -0
- package/src/minimaWireSerializer.d.ts +189 -0
- package/src/minimaWireSerializer.js +311 -0
- package/src/minimaWireSerializer.test.ts +466 -0
- package/src/minimaWireSerializer.ts +117 -0
- package/src/mmr.d.ts +153 -0
- package/src/mmr.js +351 -0
- package/src/mmr.oracle.test.ts +28 -0
- package/src/mmr.ts +429 -0
- package/src/mx.test.ts +25 -0
- package/src/mx.ts +1 -0
- package/src/params.d.ts +29 -0
- package/src/params.d.ts.map +1 -0
- package/src/params.js +20 -0
- package/src/params.js.map +1 -0
- package/src/params.ts +44 -0
- package/src/script.d.ts +7 -0
- package/src/script.js +27 -0
- package/src/script.ts +24 -0
- package/src/scripts/contract-helpers.ts +609 -0
- package/src/scripts/dapp-types.ts +240 -0
- package/src/scripts/index.ts +22 -0
- package/src/scripts/types.ts +247 -0
- package/src/scripts/witness-serializer.ts +384 -0
- package/src/transaction.ts +430 -0
- package/src/treekey.d.ts +383 -0
- package/src/treekey.js +778 -0
- package/src/treekey.parity.test.ts +459 -0
- package/src/treekey.ts +979 -0
- package/src/tx/TransactionLifecycle.d.ts +55 -0
- package/src/tx/TransactionLifecycle.js +188 -0
- package/src/tx/TransactionLifecycle.ts +280 -0
- package/src/tx/TransactionReceiptStore.d.ts +36 -0
- package/src/tx/TransactionReceiptStore.js +89 -0
- package/src/tx/TransactionReceiptStore.ts +112 -0
- package/src/tx/TransactionService.d.ts +31 -0
- package/src/tx/TransactionService.js +140 -0
- package/src/tx/TransactionService.ts +250 -0
- package/src/tx/index.d.ts +13 -0
- package/src/tx/index.js +20 -0
- package/src/tx/index.ts +44 -0
- package/src/tx/types.d.ts +80 -0
- package/src/tx/types.js +6 -0
- package/src/tx/types.ts +127 -0
- package/src/util.d.ts +1 -0
- package/src/util.js +5 -0
- package/src/util.ts +1 -0
- package/src/utils.d.ts +8 -0
- package/src/utils.js +42 -0
- package/src/utils.ts +38 -0
- package/src/verify.ts +209 -0
- package/src/version.ts +13 -0
- package/src/wots.d.ts +224 -0
- package/src/wots.d.ts.map +1 -0
- package/src/wots.js +559 -0
- package/src/wots.js.map +1 -0
- package/src/wots.ts +636 -0
- package/test-vectors.json +45 -0
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Java-Compatible Serialization Helpers
|
|
4
|
+
*
|
|
5
|
+
* Matches Minima Java serialization exactly:
|
|
6
|
+
* - MiniNumber.java: writeDataStream / readDataStream
|
|
7
|
+
* - MiniData.java: writeDataStream / readDataStream
|
|
8
|
+
* - Crypto.java: hashAllObjects - serializes Streamables then SHA3-256
|
|
9
|
+
*
|
|
10
|
+
* These helpers are used for seed derivation to match TreeKeyNode.java:
|
|
11
|
+
* MiniData seed = Crypto.getInstance().hashAllObjects(new MiniNumber(i), zPrivateSeed);
|
|
12
|
+
*
|
|
13
|
+
* NOTE: This module provides number-based wrappers for backward compatibility.
|
|
14
|
+
* The canonical implementations are in Streamable.ts which uses bigint for precision.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.serializeMiniNumber = serializeMiniNumber;
|
|
18
|
+
exports.serializeMiniData = serializeMiniData;
|
|
19
|
+
exports.hashAllObjects = hashAllObjects;
|
|
20
|
+
exports.deriveChainSeedJava = deriveChainSeedJava;
|
|
21
|
+
exports.deriveChildTreeSeedJava = deriveChildTreeSeedJava;
|
|
22
|
+
exports.hashObject = hashObject;
|
|
23
|
+
exports.indexToMiniDataBytes = indexToMiniDataBytes;
|
|
24
|
+
exports.derivePerAddressSeed = derivePerAddressSeed;
|
|
25
|
+
exports.serializeMiniNumberZERO = serializeMiniNumberZERO;
|
|
26
|
+
exports.serializeMiniNumberONE = serializeMiniNumberONE;
|
|
27
|
+
exports.writeHashToStream = writeHashToStream;
|
|
28
|
+
exports.javaHashAllObjects = javaHashAllObjects;
|
|
29
|
+
exports.createMMREntryNumber = createMMREntryNumber;
|
|
30
|
+
exports.serializeMMREntryNumber = serializeMMREntryNumber;
|
|
31
|
+
exports.serializeMMRData = serializeMMRData;
|
|
32
|
+
exports.serializeMMREntry = serializeMMREntry;
|
|
33
|
+
exports.precomputeTransactionCoinID = precomputeTransactionCoinID;
|
|
34
|
+
const sha3_1 = require("@noble/hashes/sha3");
|
|
35
|
+
const Streamable_1 = require("./Streamable");
|
|
36
|
+
/**
|
|
37
|
+
* Serialize a number in MiniNumber format (Java compatible)
|
|
38
|
+
*
|
|
39
|
+
* Thin wrapper over Streamable.writeMiniNumber that accepts number for backward compatibility.
|
|
40
|
+
*
|
|
41
|
+
* @param n - Non-negative integer to serialize
|
|
42
|
+
* @returns Serialized bytes matching Java MiniNumber format
|
|
43
|
+
*/
|
|
44
|
+
function serializeMiniNumber(n) {
|
|
45
|
+
if (n < 0)
|
|
46
|
+
throw new Error('MiniNumber must be non-negative');
|
|
47
|
+
return (0, Streamable_1.writeMiniNumber)(BigInt(n));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Serialize bytes in MiniData format (Java compatible)
|
|
51
|
+
*
|
|
52
|
+
* Re-export of Streamable.writeMiniData for backward compatibility.
|
|
53
|
+
*
|
|
54
|
+
* @param data - Bytes to serialize
|
|
55
|
+
* @returns Serialized bytes matching Java MiniData format
|
|
56
|
+
*/
|
|
57
|
+
function serializeMiniData(data) {
|
|
58
|
+
return (0, Streamable_1.writeMiniData)(data);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Hash multiple Streamable objects (Java compatible)
|
|
62
|
+
*
|
|
63
|
+
* From Crypto.java hashAllObjects:
|
|
64
|
+
* 1. Write each object to DataOutputStream
|
|
65
|
+
* 2. SHA3-256 hash the combined bytes
|
|
66
|
+
*
|
|
67
|
+
* This matches TreeKeyNode.java seed derivation:
|
|
68
|
+
* Crypto.getInstance().hashAllObjects(new MiniNumber(i), zPrivateSeed)
|
|
69
|
+
*
|
|
70
|
+
* @param items - Array of serialized objects (use serializeMiniNumber/serializeMiniData)
|
|
71
|
+
* @returns 32-byte SHA3-256 hash
|
|
72
|
+
*/
|
|
73
|
+
function hashAllObjects(...items) {
|
|
74
|
+
// Concatenate all serialized items
|
|
75
|
+
const totalLength = items.reduce((sum, item) => sum + item.length, 0);
|
|
76
|
+
const combined = new Uint8Array(totalLength);
|
|
77
|
+
let offset = 0;
|
|
78
|
+
for (const item of items) {
|
|
79
|
+
combined.set(item, offset);
|
|
80
|
+
offset += item.length;
|
|
81
|
+
}
|
|
82
|
+
// SHA3-256 hash
|
|
83
|
+
return (0, sha3_1.sha3_256)(combined);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Derive per-chain seed matching Java TreeKeyNode.java exactly
|
|
87
|
+
*
|
|
88
|
+
* From TreeKeyNode.java constructor (line 43-44):
|
|
89
|
+
* MiniData seed = Crypto.getInstance().hashAllObjects(new MiniNumber(i), zPrivateSeed);
|
|
90
|
+
*
|
|
91
|
+
* @param privateSeed - 32-byte private seed
|
|
92
|
+
* @param index - Chain index (0-63)
|
|
93
|
+
* @returns 32-byte derived seed for this chain
|
|
94
|
+
*/
|
|
95
|
+
function deriveChainSeedJava(privateSeed, index) {
|
|
96
|
+
const indexSerialized = serializeMiniNumber(index);
|
|
97
|
+
const seedSerialized = serializeMiniData(privateSeed);
|
|
98
|
+
return hashAllObjects(indexSerialized, seedSerialized);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Derive child tree seed matching Java TreeKeyNode.java exactly
|
|
102
|
+
*
|
|
103
|
+
* From TreeKeyNode.java getChild (line 68):
|
|
104
|
+
* MiniData seed = Crypto.getInstance().hashAllObjects(new MiniNumber(zChild), mChildSeed);
|
|
105
|
+
*
|
|
106
|
+
* The child seed is derived from parent's private seed:
|
|
107
|
+
* mChildSeed = Crypto.getInstance().hashObject(zPrivateSeed); // line 30
|
|
108
|
+
*
|
|
109
|
+
* @param childSeed - 32-byte child seed (hash of parent's private seed)
|
|
110
|
+
* @param childIndex - Child index (0-63)
|
|
111
|
+
* @returns 32-byte derived seed for child tree
|
|
112
|
+
*/
|
|
113
|
+
function deriveChildTreeSeedJava(childSeed, childIndex) {
|
|
114
|
+
const indexSerialized = serializeMiniNumber(childIndex);
|
|
115
|
+
const seedSerialized = serializeMiniData(childSeed);
|
|
116
|
+
return hashAllObjects(indexSerialized, seedSerialized);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Hash a single object matching Java's Crypto.hashObject()
|
|
120
|
+
*
|
|
121
|
+
* From TreeKeyNode.java line 30:
|
|
122
|
+
* mChildSeed = Crypto.getInstance().hashObject(zPrivateSeed);
|
|
123
|
+
*
|
|
124
|
+
* This serializes the object as MiniData (length-prefixed) and hashes it.
|
|
125
|
+
*
|
|
126
|
+
* @param data - Raw bytes (will be serialized as MiniData)
|
|
127
|
+
* @returns 32-byte SHA3-256 hash
|
|
128
|
+
*/
|
|
129
|
+
function hashObject(data) {
|
|
130
|
+
const serialized = serializeMiniData(data);
|
|
131
|
+
return (0, sha3_1.sha3_256)(serialized);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Convert index to MiniData bytes matching Java's:
|
|
135
|
+
* new MiniData(new BigInteger(Integer.toString(index)))
|
|
136
|
+
*
|
|
137
|
+
* BigInteger uses minimum byte representation (no leading zeros).
|
|
138
|
+
* This is used for per-address key derivation in Wallet.java.
|
|
139
|
+
*
|
|
140
|
+
* @param index - Non-negative integer (0, 1, 2, ...)
|
|
141
|
+
* @returns Minimal byte representation of the index
|
|
142
|
+
*/
|
|
143
|
+
function indexToMiniDataBytes(index) {
|
|
144
|
+
if (index === 0) {
|
|
145
|
+
return new Uint8Array([0x00]);
|
|
146
|
+
}
|
|
147
|
+
// Convert to minimum byte representation (big-endian, no leading zeros)
|
|
148
|
+
const bytes = [];
|
|
149
|
+
let n = index;
|
|
150
|
+
while (n > 0) {
|
|
151
|
+
bytes.unshift(n & 0xff);
|
|
152
|
+
n = n >> 8;
|
|
153
|
+
}
|
|
154
|
+
return new Uint8Array(bytes);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Derive per-address private seed matching Minima Wallet.java exactly
|
|
158
|
+
*
|
|
159
|
+
* From Wallet.java createNewKey() (lines 498-503):
|
|
160
|
+
* MiniData modifier = new MiniData(new BigInteger(Integer.toString(numkeys)));
|
|
161
|
+
* MiniData privseed = Crypto.getInstance().hashObjects(new MiniData(mBaseSeed.getSeed()), modifier);
|
|
162
|
+
*
|
|
163
|
+
* CRITICAL: This is DIFFERENT from deriveChainSeedJava!
|
|
164
|
+
* - deriveChainSeedJava: hashAllObjects(MiniNumber(index), MiniData(seed)) - index first as MiniNumber
|
|
165
|
+
* - This function: hashObjects(MiniData(baseSeed), MiniData(modifier)) - baseSeed first, both as MiniData
|
|
166
|
+
*
|
|
167
|
+
* @param baseSeed - 32-byte base wallet seed (from mnemonic)
|
|
168
|
+
* @param addressIndex - Address index (0, 1, 2, ... 63)
|
|
169
|
+
* @returns 32-byte private seed for this address's TreeKey
|
|
170
|
+
*/
|
|
171
|
+
function derivePerAddressSeed(baseSeed, addressIndex) {
|
|
172
|
+
// Step 1: Create modifier bytes from BigInteger representation of index
|
|
173
|
+
const modifierBytes = indexToMiniDataBytes(addressIndex);
|
|
174
|
+
// Step 2: Serialize both as MiniData (4-byte length prefix each)
|
|
175
|
+
const baseSeedSerialized = serializeMiniData(baseSeed);
|
|
176
|
+
const modifierSerialized = serializeMiniData(modifierBytes);
|
|
177
|
+
// Step 3: Concatenate and hash (baseSeed FIRST, then modifier)
|
|
178
|
+
const combined = new Uint8Array(baseSeedSerialized.length + modifierSerialized.length);
|
|
179
|
+
combined.set(baseSeedSerialized, 0);
|
|
180
|
+
combined.set(modifierSerialized, baseSeedSerialized.length);
|
|
181
|
+
return (0, sha3_1.sha3_256)(combined);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Serialize MiniNumber.ZERO - cached for performance
|
|
185
|
+
* Returns: [0x00, 0x01, 0x00] = scale(0) + length(1) + value(0)
|
|
186
|
+
*/
|
|
187
|
+
function serializeMiniNumberZERO() {
|
|
188
|
+
return new Uint8Array([0x00, 0x01, 0x00]);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Serialize MiniNumber.ONE
|
|
192
|
+
* Returns: [0x00, 0x01, 0x01] = scale(0) + length(1) + value(1)
|
|
193
|
+
*/
|
|
194
|
+
function serializeMiniNumberONE() {
|
|
195
|
+
return new Uint8Array([0x00, 0x01, 0x01]);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Serialize hash in MiniData.writeHashToStream format (4-byte length prefix)
|
|
199
|
+
*
|
|
200
|
+
* Re-export of Streamable.writeHashToStream for backward compatibility.
|
|
201
|
+
*
|
|
202
|
+
* @param data - Hash bytes (max 64 bytes per MINIMA_MAX_HASH_LENGTH)
|
|
203
|
+
* @returns Serialized bytes with 4-byte length prefix
|
|
204
|
+
*/
|
|
205
|
+
function writeHashToStream(data) {
|
|
206
|
+
return (0, Streamable_1.writeHashToStream)(data);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Java hashAllObjects for MMRData hashing
|
|
210
|
+
* Used for MMRData.CreateMMRDataLeafNode and CreateMMRDataParentNode
|
|
211
|
+
*
|
|
212
|
+
* From Crypto.java hashAllObjects:
|
|
213
|
+
* Serializes each Streamable object and hashes the concatenation.
|
|
214
|
+
*
|
|
215
|
+
* For MMRData, the serialization is:
|
|
216
|
+
* - MiniNumber: [scale][len][data] (see serializeMiniNumber)
|
|
217
|
+
* - MiniData: [4-byte len][data] for writeDataStream
|
|
218
|
+
* - Hash: [4-byte len][data] for writeHashToStream (same as MiniData)
|
|
219
|
+
*
|
|
220
|
+
* CRITICAL: Java writeHashToStream uses writeInt (4-byte prefix),
|
|
221
|
+
* identical to writeDataStream. See MiniData.java lines 282-289.
|
|
222
|
+
*
|
|
223
|
+
* @param items - Pre-serialized items to concatenate and hash
|
|
224
|
+
* @returns 32-byte SHA3-256 hash
|
|
225
|
+
*/
|
|
226
|
+
function javaHashAllObjects(...items) {
|
|
227
|
+
const totalLength = items.reduce((sum, item) => sum + item.length, 0);
|
|
228
|
+
const combined = new Uint8Array(totalLength);
|
|
229
|
+
let offset = 0;
|
|
230
|
+
for (const item of items) {
|
|
231
|
+
combined.set(item, offset);
|
|
232
|
+
offset += item.length;
|
|
233
|
+
}
|
|
234
|
+
return (0, sha3_1.sha3_256)(combined);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Create MMREntryNumber from bigint (common case for integer positions)
|
|
238
|
+
*/
|
|
239
|
+
function createMMREntryNumber(value) {
|
|
240
|
+
return { scale: 0, unscaled: value };
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Serialize MMREntryNumber matching Java MMREntryNumber.writeDataStream()
|
|
244
|
+
*
|
|
245
|
+
* From MMREntryNumber.java:
|
|
246
|
+
* MiniNumber.WriteToStream(zOut, mNumber.scale());
|
|
247
|
+
* MiniData.WriteToStream(zOut, mNumber.unscaledValue().toByteArray());
|
|
248
|
+
*
|
|
249
|
+
* @param entry - MMREntryNumber to serialize
|
|
250
|
+
* @returns Serialized bytes: MiniNumber(scale) + MiniData(unscaled bytes)
|
|
251
|
+
*/
|
|
252
|
+
function serializeMMREntryNumber(entry) {
|
|
253
|
+
const scaleSerialized = serializeMiniNumber(entry.scale);
|
|
254
|
+
const unscaledBytes = bigintToSignedBytes(entry.unscaled);
|
|
255
|
+
const unscaledSerialized = serializeMiniData(unscaledBytes);
|
|
256
|
+
const result = new Uint8Array(scaleSerialized.length + unscaledSerialized.length);
|
|
257
|
+
result.set(scaleSerialized, 0);
|
|
258
|
+
result.set(unscaledSerialized, scaleSerialized.length);
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Convert bigint to Java BigInteger.toByteArray() format (big-endian, signed two's complement)
|
|
263
|
+
* Uses the canonical implementation from Streamable.ts
|
|
264
|
+
*/
|
|
265
|
+
function bigintToSignedBytes(n) {
|
|
266
|
+
return (0, Streamable_1.bigIntToByteArray)(n);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Serialize MMRData matching Java MMRData.writeDataStream()
|
|
270
|
+
*
|
|
271
|
+
* From MMRData.java:
|
|
272
|
+
* mData.writeHashToStream(zOut); // 4-byte length prefix + hash bytes
|
|
273
|
+
* mValue.writeDataStream(zOut); // MiniNumber format
|
|
274
|
+
*
|
|
275
|
+
* @param mmrData - MMRData to serialize
|
|
276
|
+
* @returns Serialized bytes: writeHashToStream(hash) + MiniNumber(value)
|
|
277
|
+
*/
|
|
278
|
+
function serializeMMRData(mmrData) {
|
|
279
|
+
const hashSerialized = writeHashToStream(mmrData.data);
|
|
280
|
+
const valueSerialized = serializeMiniNumber(Number(mmrData.value));
|
|
281
|
+
const result = new Uint8Array(hashSerialized.length + valueSerialized.length);
|
|
282
|
+
result.set(hashSerialized, 0);
|
|
283
|
+
result.set(valueSerialized, hashSerialized.length);
|
|
284
|
+
return result;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Serialize MMREntry matching Java MMREntry.writeDataStream()
|
|
288
|
+
*
|
|
289
|
+
* From MMREntry.java:
|
|
290
|
+
* MiniNumber row = new MiniNumber(mRow);
|
|
291
|
+
* row.writeDataStream(zOut);
|
|
292
|
+
* mEntryNumber.writeDataStream(zOut);
|
|
293
|
+
* mMMRData.writeDataStream(zOut);
|
|
294
|
+
*
|
|
295
|
+
* @param entry - MMREntry to serialize
|
|
296
|
+
* @returns Serialized bytes: MiniNumber(row) + MMREntryNumber + MMRData
|
|
297
|
+
*/
|
|
298
|
+
function serializeMMREntry(entry) {
|
|
299
|
+
const rowSerialized = serializeMiniNumber(entry.row);
|
|
300
|
+
const entryNumberSerialized = serializeMMREntryNumber(entry.entryNumber);
|
|
301
|
+
const mmrDataSerialized = serializeMMRData(entry.mmrData);
|
|
302
|
+
const totalLength = rowSerialized.length + entryNumberSerialized.length + mmrDataSerialized.length;
|
|
303
|
+
const result = new Uint8Array(totalLength);
|
|
304
|
+
let offset = 0;
|
|
305
|
+
result.set(rowSerialized, offset);
|
|
306
|
+
offset += rowSerialized.length;
|
|
307
|
+
result.set(entryNumberSerialized, offset);
|
|
308
|
+
offset += entryNumberSerialized.length;
|
|
309
|
+
result.set(mmrDataSerialized, offset);
|
|
310
|
+
return result;
|
|
311
|
+
}
|
|
312
|
+
function precomputeTransactionCoinID(inputs, outputs) {
|
|
313
|
+
if (inputs.length === 0)
|
|
314
|
+
return;
|
|
315
|
+
const baseCoinId = inputs[0].coinId;
|
|
316
|
+
if (baseCoinId.length < 2) {
|
|
317
|
+
throw new Error(`Cannot precompute output coinIDs: input[0].coinId is ${baseCoinId.length} byte(s) ` +
|
|
318
|
+
`(placeholder?). Real coinId from CoinProof required for signing.`);
|
|
319
|
+
}
|
|
320
|
+
for (let i = 0; i < outputs.length; i++) {
|
|
321
|
+
const baseCoinIdStream = (0, Streamable_1.writeMiniData)(baseCoinId);
|
|
322
|
+
const outputIndexStream = (0, Streamable_1.writeMiniNumber)(BigInt(i));
|
|
323
|
+
const combined = new Uint8Array(baseCoinIdStream.length + outputIndexStream.length);
|
|
324
|
+
combined.set(baseCoinIdStream, 0);
|
|
325
|
+
combined.set(outputIndexStream, baseCoinIdStream.length);
|
|
326
|
+
outputs[i].coinId = (0, sha3_1.sha3_256)(combined);
|
|
327
|
+
}
|
|
328
|
+
}
|