@totemsdk/core 1.2.10 → 1.3.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/README.md +58 -0
- package/dist/address-derivation.d.ts +36 -0
- package/dist/address-derivation.js +54 -0
- package/dist/bip39.js +1 -1
- package/dist/bytes.d.ts +11 -0
- package/dist/bytes.js +39 -0
- package/dist/canonical-hash.d.ts +1 -0
- package/dist/canonical-hash.js +12 -0
- package/dist/canonical.d.ts +6 -1
- package/dist/canonical.js +6 -5
- package/dist/cjs/address-derivation.d.ts +36 -0
- package/dist/cjs/address-derivation.js +60 -0
- package/dist/cjs/bytes.d.ts +11 -0
- package/dist/cjs/bytes.js +44 -0
- package/dist/cjs/canonical-hash.d.ts +1 -0
- package/dist/cjs/canonical-hash.js +15 -0
- package/dist/cjs/canonical.d.ts +6 -1
- package/dist/cjs/canonical.js +6 -6
- package/dist/cjs/index.d.ts +9 -6
- package/dist/cjs/index.js +73 -53
- package/dist/cjs/lease/LeaseStore.d.ts +8 -1
- package/dist/cjs/lease/LeaseStore.js +92 -22
- package/dist/cjs/lease/WatermarkStore.js +6 -12
- package/dist/cjs/legacy.d.ts +15 -6
- package/dist/cjs/legacy.js +15 -6
- package/dist/cjs/scripts/contract-helpers.js +3 -3
- package/dist/cjs/scripts/witness-serializer.d.ts +1 -1
- package/dist/cjs/scripts/witness-serializer.js +28 -5
- package/dist/cjs/transaction.d.ts +22 -0
- package/dist/cjs/transaction.js +157 -6
- package/dist/cjs/tx/TransactionReceiptStore.js +30 -21
- package/dist/cjs/wasm-sync.d.ts +3 -3
- package/dist/cjs/wasm-sync.js +10 -3
- package/dist/index.d.ts +9 -6
- package/dist/index.js +21 -15
- package/dist/javaStreamables.js +1 -1
- package/dist/lease/LeaseStore.d.ts +8 -1
- package/dist/lease/LeaseStore.js +92 -22
- package/dist/lease/WatermarkStore.js +6 -12
- package/dist/legacy.d.ts +15 -6
- package/dist/legacy.js +15 -6
- package/dist/minima32.js +1 -1
- package/dist/mmr.js +1 -1
- package/dist/scripts/contract-helpers.js +4 -4
- package/dist/scripts/witness-serializer.d.ts +1 -1
- package/dist/scripts/witness-serializer.js +29 -6
- package/dist/transaction.d.ts +22 -0
- package/dist/transaction.js +155 -7
- package/dist/tx/TransactionReceiptStore.js +30 -21
- package/dist/verify.js +1 -1
- package/dist/wasm-async.d.ts +81 -0
- package/dist/wasm-async.js +91 -0
- package/dist/wasm-sync.d.ts +3 -3
- package/dist/wasm-sync.js +7 -2
- package/dist/wots.js +1 -1
- package/package.json +47 -3
package/dist/cjs/index.js
CHANGED
|
@@ -21,9 +21,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
21
21
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
22
|
};
|
|
23
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
-
exports.
|
|
25
|
-
exports.
|
|
26
|
-
exports.MINIMA_CONSTANTS = exports.bytesToUtf8 = exports.utf8ToBytes = exports.hashCanonical = exports.canonicalJson = exports.toHex = exports.wotsSignLegacy = exports.baseWWithChecksum = exports.toWinternitzDigits = exports.prfChainSeed = exports.h = exports.assert32 = exports.u32be = exports.u16be = exports.fromHex = void 0;
|
|
24
|
+
exports.createChallenge = exports.timingSafeEqual = exports.deserializeTransaction = exports.computeTransactionDigest = exports.serializeTransaction = exports.wotsAddressFromKeypair = exports.parseMxAddress = exports.makeMxAddress = exports.cleanSeedPhrase = exports.validatePhrase = exports.generateWordList = exports.phraseToSeed = exports.verifyMMRProof = exports.mmrRootFromPublicKeys = exports.verifyTreeSignature = exports.deriveUnifiedAddressPublicKey = exports.createUnifiedRootTreeKey = exports.createUnifiedChildTreeKey = exports.precomputeTransactionCoinID = exports.writeMiniString = exports.writeMiniData = exports.writeMiniNumber = exports.deriveRootPrivSeed = exports.derivePerAddressSeed = exports.deriveChainSeedJava = exports.wotsKeypairFromSeed = exports.wotsPublicKeyFromSeed = exports.wotsPkFromSig = exports.wotsVerifyDigest = exports.wotsVerify = exports.wotsSign = exports.deriveFullPublicKey = exports.derivePKdigest = exports.hashChain = exports.expandPrivateKey = exports.sha3_256 = exports.concatBytes = exports.hexToBytes = exports.bytesToHex = exports.TransactionReceiptStore = exports.WatermarkExhaustedError = exports.TransactionLifecycleError = exports.TransactionLifecycle = exports.TransactionService = exports.flatIndexFromLanes = exports.finalizeLease = exports.prepareLease = exports.LeaseMonitor = exports.WatermarkStore = exports.LeaseStore = void 0;
|
|
25
|
+
exports.TreeKeyNode = exports.TreeKey = exports.serializeMMREntry = exports.serializeMMRData = exports.serializeMMREntryNumber = exports.createMMREntryNumber = exports.deriveUnifiedChildSeed = exports.indexToMiniDataBytes = exports.javaHashAllObjects = exports.writeHashToStream = exports.serializeMiniNumberONE = exports.serializeMiniNumberZERO = exports.hashObject = exports.deriveChildTreeSeedJava = exports.hashAllObjects = exports.serializeMiniData = exports.serializeMiniNumber = exports.bigIntToByteArray = exports.concat = exports.writeSignatureProof = exports.writeSignature = exports.writeMMREntryNumber = exports.writeMiniByte = exports.verifyDeterministicAddress = exports.deriveAddress = exports.deriveUnifiedAddress = exports.deriveDeterministicAddress = exports.normalizeHex = exports.deriveAddressFromPublicKey = exports.verifyTreeSignatureDetailed = exports.verifySignatureDetailed = exports.verifySignature = exports.buildMinimaCoin = exports.createDefaultTransaction = exports.serializeTokenDescriptor = exports.computeTokenId = exports.serializeTransactionObject = exports.serializeCoin = exports.parseDecimalToMiniNumber = exports.MiniNumber = exports.generateSeedPhrase = exports.convertWordListToSeed = exports.convertStringToSeed = exports.WORD_LIST = exports.addressToRoot = exports.scriptToAddress = exports.decodeMx = exports.encodeMx = exports.scriptFromWotsPk = exports.validateChallenge = void 0;
|
|
26
|
+
exports.MINIMA_CONSTANTS = exports.bytesToUtf8 = exports.utf8ToBytes = exports.hashCanonical = exports.canonicalJson = exports.toHex = exports.wotsSignLegacy = exports.baseWWithChecksum = exports.toWinternitzDigits = exports.prfChainSeed = exports.h = exports.assert32 = exports.u32be = exports.u16be = exports.disableWotsLogger = exports.setWotsLogger = exports.fromHex = exports.hex = exports.F = exports.disableTreeKeyLogger = exports.setTreeKeyLogger = exports.createPerAddressTreeKeyAsync = exports.createPerAddressTreeKey = exports.createUnifiedChildTreeKeyAsync = exports.DEFAULT_LEVELS = exports.DEFAULT_KEYS_PER_LEVEL = exports.getRootPublicKey = exports.deserializeTreeSignature = exports.serializeTreeSignature = void 0;
|
|
27
27
|
exports.mxToHex = mxToHex;
|
|
28
28
|
// Version information for bundle duplication detection
|
|
29
29
|
__exportStar(require("./version.js"), exports);
|
|
@@ -48,37 +48,38 @@ Object.defineProperty(exports, "TransactionReceiptStore", { enumerable: true, ge
|
|
|
48
48
|
// Cryptographic primitives — backed by Rust/WASM (@totemsdk/core-wasm)
|
|
49
49
|
// ---------------------------------------------------------------------------
|
|
50
50
|
// Utilities
|
|
51
|
-
var
|
|
52
|
-
Object.defineProperty(exports, "bytesToHex", { enumerable: true, get: function () { return
|
|
53
|
-
Object.defineProperty(exports, "hexToBytes", { enumerable: true, get: function () { return
|
|
54
|
-
Object.defineProperty(exports, "concatBytes", { enumerable: true, get: function () { return
|
|
55
|
-
const
|
|
51
|
+
var bytes_js_1 = require("./bytes.js");
|
|
52
|
+
Object.defineProperty(exports, "bytesToHex", { enumerable: true, get: function () { return bytes_js_1.bytesToHex; } });
|
|
53
|
+
Object.defineProperty(exports, "hexToBytes", { enumerable: true, get: function () { return bytes_js_1.hexToBytes; } });
|
|
54
|
+
Object.defineProperty(exports, "concatBytes", { enumerable: true, get: function () { return bytes_js_1.concatBytes; } });
|
|
55
|
+
const bytes_js_2 = require("./bytes.js");
|
|
56
|
+
const wasm_sync_js_1 = require("./wasm-sync.js");
|
|
56
57
|
// SHA3-256
|
|
57
|
-
var
|
|
58
|
-
Object.defineProperty(exports, "sha3_256", { enumerable: true, get: function () { return
|
|
58
|
+
var wasm_sync_js_2 = require("./wasm-sync.js");
|
|
59
|
+
Object.defineProperty(exports, "sha3_256", { enumerable: true, get: function () { return wasm_sync_js_2.sha3_256; } });
|
|
59
60
|
// WOTS Signatures
|
|
60
|
-
var
|
|
61
|
-
Object.defineProperty(exports, "expandPrivateKey", { enumerable: true, get: function () { return
|
|
62
|
-
Object.defineProperty(exports, "hashChain", { enumerable: true, get: function () { return
|
|
63
|
-
Object.defineProperty(exports, "derivePKdigest", { enumerable: true, get: function () { return
|
|
64
|
-
Object.defineProperty(exports, "deriveFullPublicKey", { enumerable: true, get: function () { return
|
|
65
|
-
Object.defineProperty(exports, "wotsSign", { enumerable: true, get: function () { return
|
|
66
|
-
Object.defineProperty(exports, "wotsVerify", { enumerable: true, get: function () { return
|
|
67
|
-
Object.defineProperty(exports, "wotsVerifyDigest", { enumerable: true, get: function () { return
|
|
68
|
-
Object.defineProperty(exports, "wotsPkFromSig", { enumerable: true, get: function () { return
|
|
69
|
-
Object.defineProperty(exports, "wotsPublicKeyFromSeed", { enumerable: true, get: function () { return
|
|
70
|
-
Object.defineProperty(exports, "wotsKeypairFromSeed", { enumerable: true, get: function () { return
|
|
61
|
+
var wasm_sync_js_3 = require("./wasm-sync.js");
|
|
62
|
+
Object.defineProperty(exports, "expandPrivateKey", { enumerable: true, get: function () { return wasm_sync_js_3.expandPrivateKey; } });
|
|
63
|
+
Object.defineProperty(exports, "hashChain", { enumerable: true, get: function () { return wasm_sync_js_3.hashChain; } });
|
|
64
|
+
Object.defineProperty(exports, "derivePKdigest", { enumerable: true, get: function () { return wasm_sync_js_3.derivePKdigest; } });
|
|
65
|
+
Object.defineProperty(exports, "deriveFullPublicKey", { enumerable: true, get: function () { return wasm_sync_js_3.deriveFullPublicKey; } });
|
|
66
|
+
Object.defineProperty(exports, "wotsSign", { enumerable: true, get: function () { return wasm_sync_js_3.wotsSign; } });
|
|
67
|
+
Object.defineProperty(exports, "wotsVerify", { enumerable: true, get: function () { return wasm_sync_js_3.wotsVerify; } });
|
|
68
|
+
Object.defineProperty(exports, "wotsVerifyDigest", { enumerable: true, get: function () { return wasm_sync_js_3.wotsVerifyDigest; } });
|
|
69
|
+
Object.defineProperty(exports, "wotsPkFromSig", { enumerable: true, get: function () { return wasm_sync_js_3.wotsPkFromSig; } });
|
|
70
|
+
Object.defineProperty(exports, "wotsPublicKeyFromSeed", { enumerable: true, get: function () { return wasm_sync_js_3.wotsPublicKeyFromSeed; } });
|
|
71
|
+
Object.defineProperty(exports, "wotsKeypairFromSeed", { enumerable: true, get: function () { return wasm_sync_js_3.wotsKeypairFromSeed; } });
|
|
71
72
|
// WOTS Params (from params.ts — constants, no crypto)
|
|
72
73
|
__exportStar(require("./params.js"), exports);
|
|
73
74
|
// Java-Compatible Serialization
|
|
74
|
-
var
|
|
75
|
-
Object.defineProperty(exports, "deriveChainSeedJava", { enumerable: true, get: function () { return
|
|
76
|
-
Object.defineProperty(exports, "derivePerAddressSeed", { enumerable: true, get: function () { return
|
|
77
|
-
Object.defineProperty(exports, "deriveRootPrivSeed", { enumerable: true, get: function () { return
|
|
78
|
-
Object.defineProperty(exports, "writeMiniNumber", { enumerable: true, get: function () { return
|
|
79
|
-
Object.defineProperty(exports, "writeMiniData", { enumerable: true, get: function () { return
|
|
80
|
-
Object.defineProperty(exports, "writeMiniString", { enumerable: true, get: function () { return
|
|
81
|
-
Object.defineProperty(exports, "precomputeTransactionCoinID", { enumerable: true, get: function () { return
|
|
75
|
+
var wasm_sync_js_4 = require("./wasm-sync.js");
|
|
76
|
+
Object.defineProperty(exports, "deriveChainSeedJava", { enumerable: true, get: function () { return wasm_sync_js_4.deriveChainSeedJava; } });
|
|
77
|
+
Object.defineProperty(exports, "derivePerAddressSeed", { enumerable: true, get: function () { return wasm_sync_js_4.derivePerAddressSeed; } });
|
|
78
|
+
Object.defineProperty(exports, "deriveRootPrivSeed", { enumerable: true, get: function () { return wasm_sync_js_4.deriveRootPrivSeed; } });
|
|
79
|
+
Object.defineProperty(exports, "writeMiniNumber", { enumerable: true, get: function () { return wasm_sync_js_4.writeMiniNumber; } });
|
|
80
|
+
Object.defineProperty(exports, "writeMiniData", { enumerable: true, get: function () { return wasm_sync_js_4.writeMiniData; } });
|
|
81
|
+
Object.defineProperty(exports, "writeMiniString", { enumerable: true, get: function () { return wasm_sync_js_4.writeMiniString; } });
|
|
82
|
+
Object.defineProperty(exports, "precomputeTransactionCoinID", { enumerable: true, get: function () { return wasm_sync_js_4.precomputeTransactionCoinID; } });
|
|
82
83
|
// TreeKey/TreeKeyNode — WASM-backed
|
|
83
84
|
// createUnifiedChildTreeKey / createUnifiedRootTreeKey come from the TS
|
|
84
85
|
// implementation (returning a full TreeKey object with setUses/sign/getPublicKey)
|
|
@@ -89,9 +90,9 @@ Object.defineProperty(exports, "createUnifiedChildTreeKey", { enumerable: true,
|
|
|
89
90
|
Object.defineProperty(exports, "createUnifiedRootTreeKey", { enumerable: true, get: function () { return treekey_js_1.createUnifiedRootTreeKey; } });
|
|
90
91
|
Object.defineProperty(exports, "deriveUnifiedAddressPublicKey", { enumerable: true, get: function () { return treekey_js_1.deriveUnifiedAddressPublicKey; } });
|
|
91
92
|
Object.defineProperty(exports, "verifyTreeSignature", { enumerable: true, get: function () { return treekey_js_1.verifyTreeSignature; } });
|
|
92
|
-
var
|
|
93
|
-
Object.defineProperty(exports, "mmrRootFromPublicKeys", { enumerable: true, get: function () { return
|
|
94
|
-
Object.defineProperty(exports, "verifyMMRProof", { enumerable: true, get: function () { return
|
|
93
|
+
var wasm_sync_js_5 = require("./wasm-sync.js");
|
|
94
|
+
Object.defineProperty(exports, "mmrRootFromPublicKeys", { enumerable: true, get: function () { return wasm_sync_js_5.mmrRootFromPublicKeys; } });
|
|
95
|
+
Object.defineProperty(exports, "verifyMMRProof", { enumerable: true, get: function () { return wasm_sync_js_5.verifyMMRProof; } });
|
|
95
96
|
// BIP39 Seed Phrase Handling
|
|
96
97
|
// The WASM binding (wasm-sync.ts) shares the canonical 2048-word BIP39 list
|
|
97
98
|
// and Minima-compatible uppercase canonicalization with the TS implementation
|
|
@@ -104,19 +105,22 @@ Object.defineProperty(exports, "generateWordList", { enumerable: true, get: func
|
|
|
104
105
|
Object.defineProperty(exports, "validatePhrase", { enumerable: true, get: function () { return bip39_js_1.validatePhrase; } });
|
|
105
106
|
Object.defineProperty(exports, "cleanSeedPhrase", { enumerable: true, get: function () { return bip39_js_1.cleanSeedPhrase; } });
|
|
106
107
|
// Address Derivation
|
|
107
|
-
var
|
|
108
|
-
Object.defineProperty(exports, "makeMxAddress", { enumerable: true, get: function () { return
|
|
109
|
-
Object.defineProperty(exports, "parseMxAddress", { enumerable: true, get: function () { return
|
|
110
|
-
Object.defineProperty(exports, "wotsAddressFromKeypair", { enumerable: true, get: function () { return
|
|
108
|
+
var wasm_sync_js_6 = require("./wasm-sync.js");
|
|
109
|
+
Object.defineProperty(exports, "makeMxAddress", { enumerable: true, get: function () { return wasm_sync_js_6.makeMxAddress; } });
|
|
110
|
+
Object.defineProperty(exports, "parseMxAddress", { enumerable: true, get: function () { return wasm_sync_js_6.parseMxAddress; } });
|
|
111
|
+
Object.defineProperty(exports, "wotsAddressFromKeypair", { enumerable: true, get: function () { return wasm_sync_js_6.wotsAddressFromKeypair; } });
|
|
111
112
|
// Transaction Serialization & Digest
|
|
112
|
-
var
|
|
113
|
-
Object.defineProperty(exports, "serializeTransaction", { enumerable: true, get: function () { return
|
|
114
|
-
Object.defineProperty(exports, "computeTransactionDigest", { enumerable: true, get: function () { return
|
|
113
|
+
var wasm_sync_js_7 = require("./wasm-sync.js");
|
|
114
|
+
Object.defineProperty(exports, "serializeTransaction", { enumerable: true, get: function () { return wasm_sync_js_7.serializeTransaction; } });
|
|
115
|
+
Object.defineProperty(exports, "computeTransactionDigest", { enumerable: true, get: function () { return wasm_sync_js_7.computeTransactionDigest; } });
|
|
116
|
+
// Transaction deserialization (byte-exact inverse of the TS serializer)
|
|
117
|
+
var transaction_js_1 = require("./transaction.js");
|
|
118
|
+
Object.defineProperty(exports, "deserializeTransaction", { enumerable: true, get: function () { return transaction_js_1.deserializeTransaction; } });
|
|
115
119
|
// Verification
|
|
116
|
-
var
|
|
117
|
-
Object.defineProperty(exports, "timingSafeEqual", { enumerable: true, get: function () { return
|
|
118
|
-
Object.defineProperty(exports, "createChallenge", { enumerable: true, get: function () { return
|
|
119
|
-
Object.defineProperty(exports, "validateChallenge", { enumerable: true, get: function () { return
|
|
120
|
+
var wasm_sync_js_8 = require("./wasm-sync.js");
|
|
121
|
+
Object.defineProperty(exports, "timingSafeEqual", { enumerable: true, get: function () { return wasm_sync_js_8.timingSafeEqual; } });
|
|
122
|
+
Object.defineProperty(exports, "createChallenge", { enumerable: true, get: function () { return wasm_sync_js_8.createChallenge; } });
|
|
123
|
+
Object.defineProperty(exports, "validateChallenge", { enumerable: true, get: function () { return wasm_sync_js_8.validateChallenge; } });
|
|
120
124
|
// ---------------------------------------------------------------------------
|
|
121
125
|
// TypeScript-only modules (no crypto — keep as-is)
|
|
122
126
|
// ---------------------------------------------------------------------------
|
|
@@ -124,14 +128,14 @@ Object.defineProperty(exports, "validateChallenge", { enumerable: true, get: fun
|
|
|
124
128
|
var script_js_1 = require("./script.js");
|
|
125
129
|
Object.defineProperty(exports, "scriptFromWotsPk", { enumerable: true, get: function () { return script_js_1.scriptFromWotsPk; } });
|
|
126
130
|
// Base32 Encoding (Minima-compatible) — re-export from WASM
|
|
127
|
-
var
|
|
128
|
-
Object.defineProperty(exports, "encodeMx", { enumerable: true, get: function () { return
|
|
129
|
-
Object.defineProperty(exports, "decodeMx", { enumerable: true, get: function () { return
|
|
131
|
+
var wasm_sync_js_9 = require("./wasm-sync.js");
|
|
132
|
+
Object.defineProperty(exports, "encodeMx", { enumerable: true, get: function () { return wasm_sync_js_9.makeMxAddress; } });
|
|
133
|
+
Object.defineProperty(exports, "decodeMx", { enumerable: true, get: function () { return wasm_sync_js_9.parseMxAddress; } });
|
|
130
134
|
/** Convert an Mx (radix-32) or hex Minima address to lowercase hex. */
|
|
131
135
|
function mxToHex(address) {
|
|
132
136
|
const upper = address.startsWith('0x') || address.startsWith('0X') ? address.slice(2) : address;
|
|
133
137
|
return upper.toUpperCase().startsWith('MX')
|
|
134
|
-
? (0,
|
|
138
|
+
? (0, bytes_js_2.bytesToHex)((0, wasm_sync_js_1.parseMxAddress)(address))
|
|
135
139
|
: upper.replace(/^0x/i, '');
|
|
136
140
|
}
|
|
137
141
|
// Merkle Mountain Range (original JS — types and helpers)
|
|
@@ -152,11 +156,14 @@ Object.defineProperty(exports, "generateSeedPhrase", { enumerable: true, get: fu
|
|
|
152
156
|
var MiniNumber_js_1 = require("./MiniNumber.js");
|
|
153
157
|
Object.defineProperty(exports, "MiniNumber", { enumerable: true, get: function () { return MiniNumber_js_1.MiniNumber; } });
|
|
154
158
|
// Transaction types (from JS)
|
|
155
|
-
var
|
|
156
|
-
Object.defineProperty(exports, "parseDecimalToMiniNumber", { enumerable: true, get: function () { return
|
|
157
|
-
Object.defineProperty(exports, "serializeCoin", { enumerable: true, get: function () { return
|
|
158
|
-
Object.defineProperty(exports, "
|
|
159
|
-
Object.defineProperty(exports, "
|
|
159
|
+
var transaction_js_2 = require("./transaction.js");
|
|
160
|
+
Object.defineProperty(exports, "parseDecimalToMiniNumber", { enumerable: true, get: function () { return transaction_js_2.parseDecimalToMiniNumber; } });
|
|
161
|
+
Object.defineProperty(exports, "serializeCoin", { enumerable: true, get: function () { return transaction_js_2.serializeCoin; } });
|
|
162
|
+
Object.defineProperty(exports, "serializeTransactionObject", { enumerable: true, get: function () { return transaction_js_2.serializeTransaction; } });
|
|
163
|
+
Object.defineProperty(exports, "computeTokenId", { enumerable: true, get: function () { return transaction_js_2.computeTokenId; } });
|
|
164
|
+
Object.defineProperty(exports, "serializeTokenDescriptor", { enumerable: true, get: function () { return transaction_js_2.serializeTokenDescriptor; } });
|
|
165
|
+
Object.defineProperty(exports, "createDefaultTransaction", { enumerable: true, get: function () { return transaction_js_2.createDefaultTransaction; } });
|
|
166
|
+
Object.defineProperty(exports, "buildMinimaCoin", { enumerable: true, get: function () { return transaction_js_2.buildMinimaCoin; } });
|
|
160
167
|
// High-level Verification API (convenience functions for integrators)
|
|
161
168
|
var verify_js_1 = require("./verify.js");
|
|
162
169
|
Object.defineProperty(exports, "verifySignature", { enumerable: true, get: function () { return verify_js_1.verifySignature; } });
|
|
@@ -164,10 +171,18 @@ Object.defineProperty(exports, "verifySignatureDetailed", { enumerable: true, ge
|
|
|
164
171
|
Object.defineProperty(exports, "verifyTreeSignatureDetailed", { enumerable: true, get: function () { return verify_js_1.verifyTreeSignatureDetailed; } });
|
|
165
172
|
Object.defineProperty(exports, "deriveAddressFromPublicKey", { enumerable: true, get: function () { return verify_js_1.deriveAddressFromPublicKey; } });
|
|
166
173
|
Object.defineProperty(exports, "normalizeHex", { enumerable: true, get: function () { return verify_js_1.normalizeHex; } });
|
|
174
|
+
// Deterministic address derivation (CAN-005)
|
|
175
|
+
var address_derivation_js_1 = require("./address-derivation.js");
|
|
176
|
+
Object.defineProperty(exports, "deriveDeterministicAddress", { enumerable: true, get: function () { return address_derivation_js_1.deriveDeterministicAddress; } });
|
|
177
|
+
Object.defineProperty(exports, "deriveUnifiedAddress", { enumerable: true, get: function () { return address_derivation_js_1.deriveUnifiedAddress; } });
|
|
178
|
+
Object.defineProperty(exports, "deriveAddress", { enumerable: true, get: function () { return address_derivation_js_1.deriveAddress; } });
|
|
179
|
+
Object.defineProperty(exports, "verifyDeterministicAddress", { enumerable: true, get: function () { return address_derivation_js_1.verifyDeterministicAddress; } });
|
|
167
180
|
// Streamable primitives (low-level serialization building blocks)
|
|
168
181
|
var Streamable_js_1 = require("./Streamable.js");
|
|
169
182
|
Object.defineProperty(exports, "writeMiniByte", { enumerable: true, get: function () { return Streamable_js_1.writeMiniByte; } });
|
|
170
183
|
Object.defineProperty(exports, "writeMMREntryNumber", { enumerable: true, get: function () { return Streamable_js_1.writeMMREntryNumber; } });
|
|
184
|
+
Object.defineProperty(exports, "writeSignature", { enumerable: true, get: function () { return Streamable_js_1.writeSignature; } });
|
|
185
|
+
Object.defineProperty(exports, "writeSignatureProof", { enumerable: true, get: function () { return Streamable_js_1.writeSignatureProof; } });
|
|
171
186
|
Object.defineProperty(exports, "concat", { enumerable: true, get: function () { return Streamable_js_1.concat; } });
|
|
172
187
|
Object.defineProperty(exports, "bigIntToByteArray", { enumerable: true, get: function () { return Streamable_js_1.bigIntToByteArray; } });
|
|
173
188
|
// Java-Compatible Serialization Helpers (non-crypto)
|
|
@@ -199,10 +214,14 @@ Object.defineProperty(exports, "DEFAULT_LEVELS", { enumerable: true, get: functi
|
|
|
199
214
|
Object.defineProperty(exports, "createUnifiedChildTreeKeyAsync", { enumerable: true, get: function () { return treekey_js_2.createUnifiedChildTreeKeyAsync; } });
|
|
200
215
|
Object.defineProperty(exports, "createPerAddressTreeKey", { enumerable: true, get: function () { return treekey_js_2.createPerAddressTreeKey; } });
|
|
201
216
|
Object.defineProperty(exports, "createPerAddressTreeKeyAsync", { enumerable: true, get: function () { return treekey_js_2.createPerAddressTreeKeyAsync; } });
|
|
217
|
+
Object.defineProperty(exports, "setTreeKeyLogger", { enumerable: true, get: function () { return treekey_js_2.setTreeKeyLogger; } });
|
|
218
|
+
Object.defineProperty(exports, "disableTreeKeyLogger", { enumerable: true, get: function () { return treekey_js_2.disableTreeKeyLogger; } });
|
|
202
219
|
var wots_js_1 = require("./wots.js");
|
|
203
220
|
Object.defineProperty(exports, "F", { enumerable: true, get: function () { return wots_js_1.F; } });
|
|
204
221
|
Object.defineProperty(exports, "hex", { enumerable: true, get: function () { return wots_js_1.hex; } });
|
|
205
222
|
Object.defineProperty(exports, "fromHex", { enumerable: true, get: function () { return wots_js_1.fromHex; } });
|
|
223
|
+
Object.defineProperty(exports, "setWotsLogger", { enumerable: true, get: function () { return wots_js_1.setWotsLogger; } });
|
|
224
|
+
Object.defineProperty(exports, "disableWotsLogger", { enumerable: true, get: function () { return wots_js_1.disableWotsLogger; } });
|
|
206
225
|
Object.defineProperty(exports, "u16be", { enumerable: true, get: function () { return wots_js_1.u16be; } });
|
|
207
226
|
Object.defineProperty(exports, "u32be", { enumerable: true, get: function () { return wots_js_1.u32be; } });
|
|
208
227
|
Object.defineProperty(exports, "assert32", { enumerable: true, get: function () { return wots_js_1.assert32; } });
|
|
@@ -215,7 +234,8 @@ Object.defineProperty(exports, "wotsSignLegacy", { enumerable: true, get: functi
|
|
|
215
234
|
var canonical_js_1 = require("./canonical.js");
|
|
216
235
|
Object.defineProperty(exports, "toHex", { enumerable: true, get: function () { return canonical_js_1.toHex; } });
|
|
217
236
|
Object.defineProperty(exports, "canonicalJson", { enumerable: true, get: function () { return canonical_js_1.canonicalJson; } });
|
|
218
|
-
|
|
237
|
+
var canonical_hash_js_1 = require("./canonical-hash.js");
|
|
238
|
+
Object.defineProperty(exports, "hashCanonical", { enumerable: true, get: function () { return canonical_hash_js_1.hashCanonical; } });
|
|
219
239
|
// Byte/string utilities
|
|
220
240
|
var utils_js_1 = require("./utils.js");
|
|
221
241
|
Object.defineProperty(exports, "utf8ToBytes", { enumerable: true, get: function () { return utils_js_1.utf8ToBytes; } });
|
|
@@ -33,6 +33,7 @@ export interface LeaseStoreConfig {
|
|
|
33
33
|
export declare class LeaseStore {
|
|
34
34
|
private leases;
|
|
35
35
|
private _initialized;
|
|
36
|
+
private mutationTail;
|
|
36
37
|
private readonly storageKey;
|
|
37
38
|
private readonly storage;
|
|
38
39
|
private readonly logger;
|
|
@@ -42,16 +43,22 @@ export declare class LeaseStore {
|
|
|
42
43
|
private load;
|
|
43
44
|
private persist;
|
|
44
45
|
save(lease: StoredLease): Promise<void>;
|
|
46
|
+
private saveUnlocked;
|
|
47
|
+
delete(leaseId: string): Promise<boolean>;
|
|
48
|
+
private deleteUnlocked;
|
|
45
49
|
get(leaseId: string): StoredLease | undefined;
|
|
46
50
|
getByToken(leaseToken: string): StoredLease | undefined;
|
|
47
51
|
getAll(): StoredLease[];
|
|
48
52
|
getActive(): StoredLease[];
|
|
49
53
|
getExpiringSoon(thresholdMs?: number): StoredLease[];
|
|
50
|
-
delete(leaseId: string): Promise<boolean>;
|
|
51
54
|
deleteByToken(leaseToken: string): Promise<boolean>;
|
|
52
55
|
updateStatus(leaseId: string, status: LeaseStatus): Promise<void>;
|
|
56
|
+
private updateStatusUnlocked;
|
|
53
57
|
cleanupExpired(): Promise<number>;
|
|
58
|
+
private cleanupExpiredUnlocked;
|
|
54
59
|
clear(): Promise<void>;
|
|
60
|
+
private clearUnlocked;
|
|
61
|
+
private mutate;
|
|
55
62
|
getMinimumTTL(): number | null;
|
|
56
63
|
calculateMonitoringInterval(): number;
|
|
57
64
|
private flattenIndex;
|
|
@@ -14,9 +14,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
exports.LeaseStore = void 0;
|
|
15
15
|
const index_js_1 = require("../adapters/index.js");
|
|
16
16
|
const DEFAULT_STORAGE_KEY = 'totem_wots_leases';
|
|
17
|
+
/** Drop fields whose value is `undefined` (strict adapters reject `undefined`). */
|
|
18
|
+
function stripUndefined(value) {
|
|
19
|
+
const out = {};
|
|
20
|
+
for (const [k, v] of Object.entries(value)) {
|
|
21
|
+
if (v !== undefined)
|
|
22
|
+
out[k] = v;
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
17
26
|
class LeaseStore {
|
|
18
27
|
leases = new Map();
|
|
19
28
|
_initialized = false;
|
|
29
|
+
mutationTail = Promise.resolve();
|
|
20
30
|
storageKey;
|
|
21
31
|
storage;
|
|
22
32
|
logger;
|
|
@@ -45,11 +55,12 @@ class LeaseStore {
|
|
|
45
55
|
}
|
|
46
56
|
catch (error) {
|
|
47
57
|
this.logger.error('Failed to load leases:', error);
|
|
58
|
+
throw error;
|
|
48
59
|
}
|
|
49
60
|
}
|
|
50
61
|
async persist() {
|
|
51
62
|
try {
|
|
52
|
-
const leasesArray = Array.from(this.leases.values());
|
|
63
|
+
const leasesArray = Array.from(this.leases.values()).map((lease) => stripUndefined(lease));
|
|
53
64
|
await this.storage.set(this.storageKey, leasesArray);
|
|
54
65
|
}
|
|
55
66
|
catch (error) {
|
|
@@ -58,12 +69,45 @@ class LeaseStore {
|
|
|
58
69
|
}
|
|
59
70
|
}
|
|
60
71
|
async save(lease) {
|
|
72
|
+
return this.mutate(() => this.saveUnlocked(lease));
|
|
73
|
+
}
|
|
74
|
+
async saveUnlocked(lease) {
|
|
61
75
|
const flatIndex = this.flattenIndex(lease.indices);
|
|
62
76
|
this.logger.debug(`Storing lease: ${lease.leaseId}`);
|
|
63
77
|
this.logger.debug(` indices: (addressIndex=${lease.indices.addressIndex}, l1=${lease.indices.l1}, l2=${lease.indices.l2}) [${flatIndex}/262,144]`);
|
|
64
78
|
this.logger.debug(` status: ${lease.status}, TTL: ${lease.leaseTTL}ms`);
|
|
79
|
+
const previous = this.leases.get(lease.leaseId);
|
|
65
80
|
this.leases.set(lease.leaseId, lease);
|
|
66
|
-
|
|
81
|
+
try {
|
|
82
|
+
await this.persist();
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (previous)
|
|
86
|
+
this.leases.set(lease.leaseId, previous);
|
|
87
|
+
else
|
|
88
|
+
this.leases.delete(lease.leaseId);
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async delete(leaseId) {
|
|
93
|
+
return this.mutate(() => this.deleteUnlocked(leaseId));
|
|
94
|
+
}
|
|
95
|
+
async deleteUnlocked(leaseId) {
|
|
96
|
+
const lease = this.leases.get(leaseId);
|
|
97
|
+
if (lease) {
|
|
98
|
+
this.logger.debug(`Deleting lease: ${leaseId}, final status: ${lease.status}`);
|
|
99
|
+
}
|
|
100
|
+
const existed = this.leases.delete(leaseId);
|
|
101
|
+
if (existed) {
|
|
102
|
+
try {
|
|
103
|
+
await this.persist();
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
this.leases.set(leaseId, lease);
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return existed;
|
|
67
111
|
}
|
|
68
112
|
get(leaseId) {
|
|
69
113
|
return this.leases.get(leaseId);
|
|
@@ -84,17 +128,6 @@ class LeaseStore {
|
|
|
84
128
|
lease.expiresAt > now &&
|
|
85
129
|
lease.expiresAt <= now + thresholdMs);
|
|
86
130
|
}
|
|
87
|
-
async delete(leaseId) {
|
|
88
|
-
const lease = this.leases.get(leaseId);
|
|
89
|
-
if (lease) {
|
|
90
|
-
this.logger.debug(`Deleting lease: ${leaseId}, final status: ${lease.status}`);
|
|
91
|
-
}
|
|
92
|
-
const existed = this.leases.delete(leaseId);
|
|
93
|
-
if (existed) {
|
|
94
|
-
await this.persist();
|
|
95
|
-
}
|
|
96
|
-
return existed;
|
|
97
|
-
}
|
|
98
131
|
async deleteByToken(leaseToken) {
|
|
99
132
|
const lease = this.getByToken(leaseToken);
|
|
100
133
|
if (lease) {
|
|
@@ -103,34 +136,71 @@ class LeaseStore {
|
|
|
103
136
|
return false;
|
|
104
137
|
}
|
|
105
138
|
async updateStatus(leaseId, status) {
|
|
139
|
+
return this.mutate(() => this.updateStatusUnlocked(leaseId, status));
|
|
140
|
+
}
|
|
141
|
+
async updateStatusUnlocked(leaseId, status) {
|
|
106
142
|
const lease = this.leases.get(leaseId);
|
|
107
143
|
if (lease) {
|
|
108
144
|
const oldStatus = lease.status;
|
|
109
145
|
this.logger.debug(`Lease status change: ${leaseId} ${oldStatus} → ${status}`);
|
|
110
146
|
lease.status = status;
|
|
111
|
-
|
|
147
|
+
try {
|
|
148
|
+
await this.persist();
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
lease.status = oldStatus;
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
112
154
|
}
|
|
113
155
|
}
|
|
114
156
|
async cleanupExpired() {
|
|
157
|
+
return this.mutate(() => this.cleanupExpiredUnlocked());
|
|
158
|
+
}
|
|
159
|
+
async cleanupExpiredUnlocked() {
|
|
115
160
|
const now = Date.now();
|
|
116
|
-
const
|
|
161
|
+
const expiredLeases = [];
|
|
117
162
|
for (const [leaseId, lease] of this.leases.entries()) {
|
|
118
|
-
if (lease.expiresAt <= now && lease.status
|
|
163
|
+
if (lease.expiresAt <= now && (lease.status === 'active' || lease.status === 'pending')) {
|
|
164
|
+
expiredLeases.push({ leaseId, status: lease.status });
|
|
119
165
|
lease.status = 'expired';
|
|
120
|
-
expiredLeaseIds.push(leaseId);
|
|
121
166
|
}
|
|
122
167
|
}
|
|
123
|
-
if (
|
|
124
|
-
this.logger.debug(`Marked ${
|
|
125
|
-
|
|
168
|
+
if (expiredLeases.length > 0) {
|
|
169
|
+
this.logger.debug(`Marked ${expiredLeases.length} leases as expired`);
|
|
170
|
+
try {
|
|
171
|
+
await this.persist();
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
for (const { leaseId, status } of expiredLeases)
|
|
175
|
+
this.leases.get(leaseId).status = status;
|
|
176
|
+
throw error;
|
|
177
|
+
}
|
|
126
178
|
}
|
|
127
|
-
return
|
|
179
|
+
return expiredLeases.length;
|
|
128
180
|
}
|
|
129
181
|
async clear() {
|
|
182
|
+
await this.mutate(() => this.clearUnlocked());
|
|
183
|
+
}
|
|
184
|
+
async clearUnlocked() {
|
|
185
|
+
const previous = new Map(this.leases);
|
|
130
186
|
this.leases.clear();
|
|
131
|
-
|
|
187
|
+
try {
|
|
188
|
+
await this.storage.remove(this.storageKey);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
this.leases = previous;
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
132
194
|
this.logger.debug('Cleared all leases');
|
|
133
195
|
}
|
|
196
|
+
mutate(operation) {
|
|
197
|
+
const prior = this.mutationTail;
|
|
198
|
+
let release;
|
|
199
|
+
const gate = new Promise((resolve) => { release = resolve; });
|
|
200
|
+
const run = prior.then(() => operation()).finally(() => release());
|
|
201
|
+
this.mutationTail = run.then(() => undefined, () => undefined);
|
|
202
|
+
return run;
|
|
203
|
+
}
|
|
134
204
|
getMinimumTTL() {
|
|
135
205
|
const activeLeases = this.getActive();
|
|
136
206
|
if (activeLeases.length === 0)
|
|
@@ -50,19 +50,13 @@ class WatermarkStore {
|
|
|
50
50
|
return this._initialized;
|
|
51
51
|
}
|
|
52
52
|
async load() {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return this.state;
|
|
59
|
-
}
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
this.logger.error('Failed to load watermark:', error);
|
|
64
|
-
return null;
|
|
53
|
+
const watermark = await this.storage.get(this.storageKey);
|
|
54
|
+
if (watermark) {
|
|
55
|
+
this.state = watermark;
|
|
56
|
+
this.logger.debug('Loaded watermark from storage');
|
|
57
|
+
return this.state;
|
|
65
58
|
}
|
|
59
|
+
return null;
|
|
66
60
|
}
|
|
67
61
|
async save(watermark) {
|
|
68
62
|
try {
|
package/dist/cjs/legacy.d.ts
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Legacy JS
|
|
2
|
+
* Legacy JS crypto kernels — **deprecated (RFC-031 P4), frozen**.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* @deprecated The pure-JS kernels are scheduled for removal (RFC-031 P5). Use
|
|
5
|
+
* the WASM surface instead:
|
|
6
|
+
* - `@totemsdk/core` / `@totemsdk/core/wasm` — synchronous WASM (bundler loader required)
|
|
7
|
+
* - `@totemsdk/core/wasm-async` — async-init WASM (portable to edge/Workers)
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
9
|
+
* This entry stays only as a migration bridge for environments that cannot run
|
|
10
|
+
* WASM yet; it is **frozen** (no new kernels are added here) and will be deleted
|
|
11
|
+
* in a major release. Exports are `legacy`-prefixed where they collide with the
|
|
12
|
+
* WASM names (`legacyWotsSign`, …).
|
|
13
|
+
*
|
|
14
|
+
* // before
|
|
15
|
+
* import { legacyWotsSign } from '@totemsdk/core/legacy';
|
|
16
|
+
* // after
|
|
17
|
+
* import { init, wotsSign } from '@totemsdk/core/wasm-async';
|
|
18
|
+
* await init();
|
|
10
19
|
*/
|
|
11
20
|
export { F, hex, fromHex, u16be, u32be, assert32, h, prfChainSeed, toWinternitzDigits, baseWWithChecksum, derivePKdigest as legacyDerivePKdigest, wotsKeypairFromSeed as legacyWotsKeypairFromSeed, wotsSign as legacyWotsSign, wotsSignLegacy, wotsPkFromSig as legacyWotsPkFromSig, wotsVerify as legacyWotsVerify, wotsVerifyDigest as legacyWotsVerifyDigest, wotsPublicKeyFromSeed as legacyWotsPublicKeyFromSeed, type WotsKeypair, type WotsSignature, } from './wots.js';
|
|
12
21
|
export { TreeKey, TreeKeyNode, verifyTreeSignature as legacyVerifyTreeSignature, serializeTreeSignature, deserializeTreeSignature, getRootPublicKey, DEFAULT_KEYS_PER_LEVEL, DEFAULT_LEVELS, createUnifiedChildTreeKey as legacyCreateUnifiedChildTreeKey, createUnifiedChildTreeKeyAsync, createUnifiedRootTreeKey as legacyCreateUnifiedRootTreeKey, deriveUnifiedAddressPublicKey as legacyDeriveUnifiedAddressPublicKey, createPerAddressTreeKey, createPerAddressTreeKeyAsync, type KeyGenProgress, type ProgressCallback, type SignatureProof, type TreeSignature, } from './treekey.js';
|
package/dist/cjs/legacy.js
CHANGED
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Legacy JS
|
|
3
|
+
* Legacy JS crypto kernels — **deprecated (RFC-031 P4), frozen**.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* @deprecated The pure-JS kernels are scheduled for removal (RFC-031 P5). Use
|
|
6
|
+
* the WASM surface instead:
|
|
7
|
+
* - `@totemsdk/core` / `@totemsdk/core/wasm` — synchronous WASM (bundler loader required)
|
|
8
|
+
* - `@totemsdk/core/wasm-async` — async-init WASM (portable to edge/Workers)
|
|
8
9
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
10
|
+
* This entry stays only as a migration bridge for environments that cannot run
|
|
11
|
+
* WASM yet; it is **frozen** (no new kernels are added here) and will be deleted
|
|
12
|
+
* in a major release. Exports are `legacy`-prefixed where they collide with the
|
|
13
|
+
* WASM names (`legacyWotsSign`, …).
|
|
14
|
+
*
|
|
15
|
+
* // before
|
|
16
|
+
* import { legacyWotsSign } from '@totemsdk/core/legacy';
|
|
17
|
+
* // after
|
|
18
|
+
* import { init, wotsSign } from '@totemsdk/core/wasm-async';
|
|
19
|
+
* await init();
|
|
11
20
|
*/
|
|
12
21
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
22
|
if (k2 === undefined) k2 = k;
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.StatefulGameHelper = exports.SlowCashHelper = exports.FlashCashHelper = exports.VaultHelper = exports.ExchangeHelper = exports.MASTHelper = exports.HTLCHelper = exports.TimelockHelper = void 0;
|
|
19
19
|
const wasm_sync_js_1 = require("../wasm-sync.js");
|
|
20
|
-
const
|
|
20
|
+
const sha256_js_1 = require("@noble/hashes/sha256.js");
|
|
21
21
|
function sha256(data) {
|
|
22
|
-
return
|
|
22
|
+
return (0, sha256_js_1.sha256)(data);
|
|
23
23
|
}
|
|
24
24
|
const types_js_1 = require("./types.js");
|
|
25
25
|
function kissHex(hex) {
|
|
@@ -83,7 +83,7 @@ class HTLCHelper {
|
|
|
83
83
|
* Generate a random preimage and its hash.
|
|
84
84
|
*/
|
|
85
85
|
static generateSecret() {
|
|
86
|
-
const preimageBytes = (
|
|
86
|
+
const preimageBytes = globalThis.crypto.getRandomValues(new Uint8Array(32));
|
|
87
87
|
const preimage = bytesToHex(preimageBytes);
|
|
88
88
|
const hashBytes = (0, wasm_sync_js_1.sha3_256)(preimageBytes);
|
|
89
89
|
const hash = bytesToHex(hashBytes);
|
|
@@ -23,7 +23,7 @@ export declare function serializeExtraScripts(extraScripts: Map<string, string>)
|
|
|
23
23
|
export declare function aggregateSignatures(totemSignature: {
|
|
24
24
|
publicKey: Uint8Array;
|
|
25
25
|
signature: Uint8Array;
|
|
26
|
-
}, externalSignatures: ExternalSignature[]): Uint8Array[];
|
|
26
|
+
}, externalSignatures: ExternalSignature[], transactionDigest: Uint8Array): Uint8Array[];
|
|
27
27
|
export declare function validateExternalSignature(signature: ExternalSignature, transactionDigest: Uint8Array): boolean;
|
|
28
28
|
export declare function computeScriptAddress(script: string): string;
|
|
29
29
|
export { concat };
|
|
@@ -18,6 +18,7 @@ exports.validateExternalSignature = validateExternalSignature;
|
|
|
18
18
|
exports.computeScriptAddress = computeScriptAddress;
|
|
19
19
|
exports.concat = concat;
|
|
20
20
|
const wasm_sync_js_1 = require("../wasm-sync.js");
|
|
21
|
+
const wots_js_1 = require("../wots.js");
|
|
21
22
|
const mmr_js_1 = require("../mmr.js");
|
|
22
23
|
const minima32_js_1 = require("../minima32.js");
|
|
23
24
|
function hexToBytes(hex) {
|
|
@@ -271,12 +272,26 @@ function serializeExtraScripts(extraScripts) {
|
|
|
271
272
|
}
|
|
272
273
|
return concat(...parts);
|
|
273
274
|
}
|
|
274
|
-
function aggregateSignatures(totemSignature, externalSignatures) {
|
|
275
|
+
function aggregateSignatures(totemSignature, externalSignatures, transactionDigest) {
|
|
276
|
+
// RFC-020 C5: the aggregate must never include an unverified signature.
|
|
277
|
+
// The totem signature is verified against the transaction digest; external
|
|
278
|
+
// signatures are verified here as well as gated on their `validated` flag.
|
|
279
|
+
const totemValid = (() => {
|
|
280
|
+
try {
|
|
281
|
+
return (0, wots_js_1.wotsVerifyDigest)(totemSignature.signature, transactionDigest, totemSignature.publicKey);
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
})();
|
|
287
|
+
if (!totemValid) {
|
|
288
|
+
throw new Error('aggregateSignatures: the totem signature is invalid over the transaction digest');
|
|
289
|
+
}
|
|
275
290
|
const allSigProofs = [];
|
|
276
291
|
allSigProofs.push(serializeSignatureProof(totemSignature.publicKey, totemSignature.signature, { chunks: [] }));
|
|
277
292
|
for (const extSig of externalSignatures) {
|
|
278
|
-
if (!extSig.validated) {
|
|
279
|
-
console.warn(`[AggregateSignatures] Skipping
|
|
293
|
+
if (!extSig.validated || !validateExternalSignature(extSig, transactionDigest)) {
|
|
294
|
+
console.warn(`[AggregateSignatures] Skipping unverified signature from ${extSig.publicKey}`);
|
|
280
295
|
continue;
|
|
281
296
|
}
|
|
282
297
|
const proof = extSig.proof || { chunks: [] };
|
|
@@ -295,8 +310,16 @@ function validateExternalSignature(signature, transactionDigest) {
|
|
|
295
310
|
if (!signature.publicKey || !signature.signature) {
|
|
296
311
|
return false;
|
|
297
312
|
}
|
|
298
|
-
|
|
299
|
-
|
|
313
|
+
// RFC-020 C5: real WOTS verification (was an unconditional `true` stub).
|
|
314
|
+
if (signature.signatureType && signature.signatureType !== 'wots') {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
try {
|
|
318
|
+
return (0, wots_js_1.wotsVerifyDigest)(hexToBytes(signature.signature), transactionDigest, hexToBytes(signature.publicKey));
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
300
323
|
}
|
|
301
324
|
function computeScriptAddress(script) {
|
|
302
325
|
const cleanScript = script.trim().toUpperCase();
|