@dynamic-labs-wallet/midnight 1.0.39 → 1.0.41
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/index.cjs.js +206 -40
- package/index.esm.js +206 -40
- package/package.json +9 -8
- package/src/client/client.d.ts +26 -1
- package/src/client/client.d.ts.map +1 -1
- package/src/client/walletStateStorage.d.ts.map +1 -1
package/index.cjs.js
CHANGED
|
@@ -6,6 +6,7 @@ var walletSdkAddressFormat = require('@midnight-ntwrk/wallet-sdk-address-format'
|
|
|
6
6
|
var walletSdkDustWallet = require('@midnight-ntwrk/wallet-sdk-dust-wallet');
|
|
7
7
|
var walletSdkFacade = require('@midnight-ntwrk/wallet-sdk-facade');
|
|
8
8
|
var walletSdkShielded = require('@midnight-ntwrk/wallet-sdk-shielded');
|
|
9
|
+
var walletSdkAbstractions = require('@midnight-ntwrk/wallet-sdk-abstractions');
|
|
9
10
|
var walletSdkUnshieldedWallet = require('@midnight-ntwrk/wallet-sdk-unshielded-wallet');
|
|
10
11
|
var bip32 = require('@scure/bip32');
|
|
11
12
|
var bs58 = require('bs58');
|
|
@@ -232,7 +233,12 @@ function _ts_generator$1(thisArg, body) {
|
|
|
232
233
|
}
|
|
233
234
|
}
|
|
234
235
|
var DB_NAME = 'dynamic-midnight-wallet-state';
|
|
235
|
-
|
|
236
|
+
// Open WITHOUT a fixed version. Passing a version LOWER than the one already in
|
|
237
|
+
// the browser throws `VersionError` (IndexedDB forbids downgrades) — which is
|
|
238
|
+
// exactly what broke the cache after an earlier `DB_VERSION = 2` experiment was
|
|
239
|
+
// reverted to 1: dev browsers still had v2, every open failed, and the wallet
|
|
240
|
+
// cold-synced on every load. Opening with no version adopts whatever version
|
|
241
|
+
// exists (or creates the DB fresh), so a downgrade error is impossible.
|
|
236
242
|
var STORE_NAME = 'state';
|
|
237
243
|
// Normalizes a DOMException | unknown into an Error so promise rejections
|
|
238
244
|
// always carry an Error instance. Object-shaped errors (DOMException, plain
|
|
@@ -262,8 +268,10 @@ function openDb() {
|
|
|
262
268
|
// the session (private-browsing bootup, transient quota errors, etc).
|
|
263
269
|
// Re-throw so the original caller still sees the rejection.
|
|
264
270
|
dbPromise = new Promise(function(resolve, reject) {
|
|
265
|
-
var req = indexedDB.open(DB_NAME
|
|
271
|
+
var req = indexedDB.open(DB_NAME);
|
|
266
272
|
req.onupgradeneeded = function() {
|
|
273
|
+
// Fires only when the DB is first created (or an existing DB lacks the
|
|
274
|
+
// store). Create the store if absent; never destructive.
|
|
267
275
|
var db = req.result;
|
|
268
276
|
if (!db.objectStoreNames.contains(STORE_NAME)) {
|
|
269
277
|
db.createObjectStore(STORE_NAME, {
|
|
@@ -322,7 +330,7 @@ function getWalletState(accountAddress) {
|
|
|
322
330
|
}
|
|
323
331
|
function _getWalletState() {
|
|
324
332
|
_getWalletState = _async_to_generator$1(function(accountAddress) {
|
|
325
|
-
var result;
|
|
333
|
+
var result, err;
|
|
326
334
|
return _ts_generator$1(this, function(_state) {
|
|
327
335
|
switch(_state.label){
|
|
328
336
|
case 0:
|
|
@@ -345,8 +353,13 @@ function _getWalletState() {
|
|
|
345
353
|
result !== null && result !== void 0 ? result : null
|
|
346
354
|
];
|
|
347
355
|
case 2:
|
|
348
|
-
_state.sent();
|
|
349
|
-
// IndexedDB unavailable (private mode,
|
|
356
|
+
err = _state.sent();
|
|
357
|
+
// IndexedDB unavailable (private mode, third-party storage partitioning,
|
|
358
|
+
// corrupt DB, etc.) — behave as if empty. Surface to the console so a
|
|
359
|
+
// blocked/partitioned store (which would force a cold sync every load)
|
|
360
|
+
// is visible instead of silently swallowed.
|
|
361
|
+
// eslint-disable-next-line no-console
|
|
362
|
+
console.warn('[Midnight] CACHE read FAILED (IndexedDB unavailable) — treating as empty:', err);
|
|
350
363
|
return [
|
|
351
364
|
2,
|
|
352
365
|
null
|
|
@@ -365,7 +378,7 @@ function putWalletState(accountAddress, state) {
|
|
|
365
378
|
}
|
|
366
379
|
function _putWalletState() {
|
|
367
380
|
_putWalletState = _async_to_generator$1(function(accountAddress, state) {
|
|
368
|
-
var record;
|
|
381
|
+
var record, err;
|
|
369
382
|
return _ts_generator$1(this, function(_state) {
|
|
370
383
|
switch(_state.label){
|
|
371
384
|
case 0:
|
|
@@ -391,12 +404,19 @@ function _putWalletState() {
|
|
|
391
404
|
];
|
|
392
405
|
case 2:
|
|
393
406
|
_state.sent();
|
|
407
|
+
// eslint-disable-next-line no-console
|
|
408
|
+
console.info("[Midnight] CACHE write OK — checkpoint saved (shielded=".concat(record.shielded.length, "B dust=").concat(record.dust.length, "B)"));
|
|
394
409
|
return [
|
|
395
410
|
3,
|
|
396
411
|
4
|
|
397
412
|
];
|
|
398
413
|
case 3:
|
|
399
|
-
_state.sent();
|
|
414
|
+
err = _state.sent();
|
|
415
|
+
// Persist is best-effort. A failure just means next init will cold-sync —
|
|
416
|
+
// but surface it so a blocked/partitioned IndexedDB (third-party iframe)
|
|
417
|
+
// is visible rather than silently swallowed.
|
|
418
|
+
// eslint-disable-next-line no-console
|
|
419
|
+
console.warn('[Midnight] CACHE write FAILED (IndexedDB unavailable):', err);
|
|
400
420
|
return [
|
|
401
421
|
3,
|
|
402
422
|
4
|
|
@@ -763,6 +783,22 @@ function _ts_values(o) {
|
|
|
763
783
|
};
|
|
764
784
|
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
765
785
|
}
|
|
786
|
+
/** Whether a sub-wallet side has finished syncing. `highestRelevantIndex`
|
|
787
|
+
* is 0 during sync, so `isStrictlyComplete()` is the authoritative signal. */ var isSideSynced = function(side) {
|
|
788
|
+
var _side_state;
|
|
789
|
+
var _side_progress;
|
|
790
|
+
var p = (_side_progress = side === null || side === void 0 ? void 0 : side.progress) !== null && _side_progress !== void 0 ? _side_progress : side === null || side === void 0 ? void 0 : (_side_state = side.state) === null || _side_state === void 0 ? void 0 : _side_state.progress;
|
|
791
|
+
if (!p) return false;
|
|
792
|
+
if (typeof p.isStrictlyComplete === 'function') return p.isStrictlyComplete();
|
|
793
|
+
var _p_appliedIndex;
|
|
794
|
+
var applied = BigInt((_p_appliedIndex = p.appliedIndex) !== null && _p_appliedIndex !== void 0 ? _p_appliedIndex : 0n);
|
|
795
|
+
var _p_highestRelevantIndex;
|
|
796
|
+
var highestRelevant = BigInt((_p_highestRelevantIndex = p.highestRelevantIndex) !== null && _p_highestRelevantIndex !== void 0 ? _p_highestRelevantIndex : 0n);
|
|
797
|
+
return highestRelevant > 0n && applied >= highestRelevant;
|
|
798
|
+
};
|
|
799
|
+
/** Resolve predicate for the sync wait, per mode. */ var isSyncResolved = function(s, mode) {
|
|
800
|
+
return mode === 'full' ? Boolean(s.isSynced) : isSideSynced(s.shielded) && isSideSynced(s.unshielded);
|
|
801
|
+
};
|
|
766
802
|
var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
767
803
|
_inherits(DynamicMidnightWalletClient, DynamicWalletClient);
|
|
768
804
|
function DynamicMidnightWalletClient() {
|
|
@@ -852,6 +888,10 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
852
888
|
isDirty = pendingTxCount > 0 || unshieldedPending > 0 || shieldedPending > 0 || dustPending > 0;
|
|
853
889
|
if (isDirty) {
|
|
854
890
|
_this.logger.debug("[Midnight] persist skipped — state is dirty \xb7 " + "pendingTxs=".concat(pendingTxCount, " \xb7 unshieldedPending=").concat(unshieldedPending, " \xb7 ") + "shieldedPending=".concat(shieldedPending, " \xb7 dustPending=").concat(dustPending, ". ") + "IndexedDB retains last clean snapshot.");
|
|
891
|
+
// console.* because this.logger is a NoopLogger in the iframe — cache
|
|
892
|
+
// diagnostics must be visible in the browser console.
|
|
893
|
+
// eslint-disable-next-line no-console
|
|
894
|
+
console.info("[Midnight] CACHE persist SKIPPED (state dirty) \xb7 pendingTxs=".concat(pendingTxCount, " ") + "unshieldedPending=".concat(unshieldedPending, " shieldedPending=").concat(shieldedPending, " dustPending=").concat(dustPending, " — no checkpoint saved, next load cold-syncs"));
|
|
855
895
|
return [
|
|
856
896
|
2
|
|
857
897
|
];
|
|
@@ -895,6 +935,8 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
895
935
|
case 5:
|
|
896
936
|
err = _state.sent();
|
|
897
937
|
_this.logger.warn('[Midnight] Failed to persist wallet state:', err);
|
|
938
|
+
// eslint-disable-next-line no-console
|
|
939
|
+
console.warn('[Midnight] CACHE persist FAILED (write/serialize threw):', err);
|
|
898
940
|
return [
|
|
899
941
|
3,
|
|
900
942
|
6
|
|
@@ -1661,6 +1703,7 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1661
1703
|
{
|
|
1662
1704
|
key: "initMidnightWallet",
|
|
1663
1705
|
value: function initMidnightWallet(label, mpcParams) {
|
|
1706
|
+
var mode = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'full';
|
|
1664
1707
|
var _this = this;
|
|
1665
1708
|
return _async_to_generator(function() {
|
|
1666
1709
|
var accountAddress, inFlight, initPromise;
|
|
@@ -1669,7 +1712,9 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1669
1712
|
case 0:
|
|
1670
1713
|
accountAddress = mpcParams.accountAddress;
|
|
1671
1714
|
// If another init for this same account is in flight, return its promise
|
|
1672
|
-
// instead of kicking off a second, redundant WalletFacade.init.
|
|
1715
|
+
// instead of kicking off a second, redundant WalletFacade.init. The first
|
|
1716
|
+
// caller's `mode` wins; that's fine — the wallet is created/cached once and
|
|
1717
|
+
// keeps syncing dust in the background regardless of who waited for what.
|
|
1673
1718
|
inFlight = _this.pendingInits.get(accountAddress);
|
|
1674
1719
|
if (inFlight) {
|
|
1675
1720
|
_this.logger.info("[Midnight] ".concat(label, ": joining in-flight init for ").concat(accountAddress));
|
|
@@ -1678,7 +1723,7 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1678
1723
|
inFlight
|
|
1679
1724
|
];
|
|
1680
1725
|
}
|
|
1681
|
-
initPromise = _this.runMidnightWalletInit(label, mpcParams);
|
|
1726
|
+
initPromise = _this.runMidnightWalletInit(label, mpcParams, mode);
|
|
1682
1727
|
_this.pendingInits.set(accountAddress, initPromise);
|
|
1683
1728
|
_state.label = 1;
|
|
1684
1729
|
case 1:
|
|
@@ -1714,9 +1759,10 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1714
1759
|
{
|
|
1715
1760
|
key: "runMidnightWalletInit",
|
|
1716
1761
|
value: function runMidnightWalletInit(label, mpcParams) {
|
|
1762
|
+
var mode = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'full';
|
|
1717
1763
|
var _this = this;
|
|
1718
1764
|
return _async_to_generator(function() {
|
|
1719
|
-
var _this_cachedWallet, roleKeys, accountAddress, state, _this_cachedWallet_diagnosticSub, shieldedSecretKeys, dustSecretKey, unshieldedKeystore, config, savedState, wallet, syncStart, lastLogTime, fmtSide, state1, err, lastPendingCount, lastPendingSig, diagnosticSub;
|
|
1765
|
+
var _this_cachedWallet, roleKeys, accountAddress, state, _this_cachedWallet_diagnosticSub, shieldedSecretKeys, dustSecretKey, unshieldedKeystore, config, savedState, _savedState_shielded, _savedState_dust, _savedState_shielded_length, _savedState_dust_length, wallet, syncStart, lastLogTime, SIDE_NAMES, lastApplied, sideDoneAtMs, readProgress, fmtSide, state1, err, lastPendingCount, lastPendingSig, lastDustLogTime, dustDoneLogged, diagnosticSub;
|
|
1720
1766
|
return _ts_generator(this, function(_state) {
|
|
1721
1767
|
switch(_state.label){
|
|
1722
1768
|
case 0:
|
|
@@ -1747,7 +1793,7 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1747
1793
|
reject(new Error('Wallet re-sync timeout'));
|
|
1748
1794
|
}, 30000);
|
|
1749
1795
|
sub = _this.cachedWallet.wallet.state().subscribe(function(s) {
|
|
1750
|
-
if (s
|
|
1796
|
+
if (isSyncResolved(s, mode)) {
|
|
1751
1797
|
clearTimeout(tid);
|
|
1752
1798
|
// Defer to a microtask so `sub` is definitely assigned whether the
|
|
1753
1799
|
// emission is synchronous or async.
|
|
@@ -1820,7 +1866,14 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1820
1866
|
indexerHttpUrl: 'https://indexer.preview.midnight.network/api/v4/graphql',
|
|
1821
1867
|
indexerWsUrl: 'wss://indexer.preview.midnight.network/api/v4/graphql/ws'
|
|
1822
1868
|
},
|
|
1823
|
-
|
|
1869
|
+
// v4 sync batching. `size` = updates fetched per indexer round-trip.
|
|
1870
|
+
// Measured: 2000 vs 10000 gave the same ~750 entries/sec (≈130s dust cold
|
|
1871
|
+
// sync), so dust is apply-bound (per-entry WASM compute), not fetch-bound
|
|
1872
|
+
// — batch size doesn't move the total. Kept at 2000.
|
|
1873
|
+
batchUpdates: {
|
|
1874
|
+
size: 2000
|
|
1875
|
+
},
|
|
1876
|
+
txHistoryStorage: new walletSdkAbstractions.NoOpTransactionHistoryStorage()
|
|
1824
1877
|
};
|
|
1825
1878
|
return [
|
|
1826
1879
|
4,
|
|
@@ -1830,8 +1883,13 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1830
1883
|
savedState = _state.sent();
|
|
1831
1884
|
if (savedState) {
|
|
1832
1885
|
_this.logger.info("[Midnight] ".concat(label, ": found persisted state — resuming sync from checkpoint"));
|
|
1886
|
+
// console.* because this.logger is a NoopLogger in the iframe.
|
|
1887
|
+
// eslint-disable-next-line no-console
|
|
1888
|
+
console.info("[Midnight] ".concat(label, ": CACHE HIT — restoring from IndexedDB checkpoint ") + "(updatedAt=".concat(savedState.updatedAt ? new Date(savedState.updatedAt).toISOString() : 'n/a', " ") + "shielded=".concat((_savedState_shielded_length = (_savedState_shielded = savedState.shielded) === null || _savedState_shielded === void 0 ? void 0 : _savedState_shielded.length) !== null && _savedState_shielded_length !== void 0 ? _savedState_shielded_length : 0, "B dust=").concat((_savedState_dust_length = (_savedState_dust = savedState.dust) === null || _savedState_dust === void 0 ? void 0 : _savedState_dust.length) !== null && _savedState_dust_length !== void 0 ? _savedState_dust_length : 0, "B)"));
|
|
1833
1889
|
} else {
|
|
1834
1890
|
_this.logger.info("[Midnight] ".concat(label, ": no persisted state — cold sync from genesis"));
|
|
1891
|
+
// eslint-disable-next-line no-console
|
|
1892
|
+
console.info("[Midnight] ".concat(label, ": CACHE MISS — no IndexedDB checkpoint for this account, cold sync from genesis"));
|
|
1835
1893
|
}
|
|
1836
1894
|
_this.logger.info("[Midnight] ".concat(label, ": initializing wallet..."));
|
|
1837
1895
|
return [
|
|
@@ -1860,31 +1918,56 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1860
1918
|
_this.logger.debug("[Midnight] ".concat(label, ": syncing..."));
|
|
1861
1919
|
syncStart = Date.now();
|
|
1862
1920
|
lastLogTime = 0;
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
//
|
|
1869
|
-
|
|
1921
|
+
SIDE_NAMES = [
|
|
1922
|
+
'shielded',
|
|
1923
|
+
'unshielded',
|
|
1924
|
+
'dust'
|
|
1925
|
+
];
|
|
1926
|
+
// Per-tick throughput tracking: appliedIndex per side at the previous log,
|
|
1927
|
+
// so each periodic line shows how many chunks were applied in the interval
|
|
1928
|
+
// (a non-zero delta = still actively polling/applying index chunks). And
|
|
1929
|
+
// the wall-clock at which each side individually completed, so we can see
|
|
1930
|
+
// which dimension is the slow one.
|
|
1931
|
+
lastApplied = {};
|
|
1932
|
+
sideDoneAtMs = {};
|
|
1933
|
+
// In v4 every WalletState (shielded/unshielded/dust) exposes the full
|
|
1934
|
+
// SyncProgress via the `progress` getter (appliedIndex, highestRelevantIndex,
|
|
1935
|
+
// highestIndex). Read that FIRST — `side.state.progress` is the inner
|
|
1936
|
+
// CoreWallet's partial progress (has appliedIndex but leaves the highest*
|
|
1937
|
+
// fields at 0, which is why `gap`/`tip` showed 0 before).
|
|
1938
|
+
readProgress = function(side) {
|
|
1870
1939
|
var _side_state;
|
|
1871
|
-
var
|
|
1872
|
-
var p = (
|
|
1873
|
-
if (!p) return
|
|
1940
|
+
var _side_progress;
|
|
1941
|
+
var p = (_side_progress = side === null || side === void 0 ? void 0 : side.progress) !== null && _side_progress !== void 0 ? _side_progress : side === null || side === void 0 ? void 0 : (_side_state = side.state) === null || _side_state === void 0 ? void 0 : _side_state.progress;
|
|
1942
|
+
if (!p) return undefined;
|
|
1874
1943
|
var _p_appliedIndex;
|
|
1875
|
-
var applied = (_p_appliedIndex = p.appliedIndex) !== null && _p_appliedIndex !== void 0 ? _p_appliedIndex : 0n;
|
|
1944
|
+
var applied = BigInt((_p_appliedIndex = p.appliedIndex) !== null && _p_appliedIndex !== void 0 ? _p_appliedIndex : 0n);
|
|
1876
1945
|
var _p_highestRelevantIndex;
|
|
1877
|
-
var highestRelevant = (_p_highestRelevantIndex = p.highestRelevantIndex) !== null && _p_highestRelevantIndex !== void 0 ? _p_highestRelevantIndex : 0n;
|
|
1878
|
-
var _p_highestRelevantWalletIndex;
|
|
1879
|
-
var highestRelevantWallet = (_p_highestRelevantWalletIndex = p.highestRelevantWalletIndex) !== null && _p_highestRelevantWalletIndex !== void 0 ? _p_highestRelevantWalletIndex : 0n;
|
|
1946
|
+
var highestRelevant = BigInt((_p_highestRelevantIndex = p.highestRelevantIndex) !== null && _p_highestRelevantIndex !== void 0 ? _p_highestRelevantIndex : 0n);
|
|
1880
1947
|
var _p_highestIndex;
|
|
1881
|
-
var highest = (_p_highestIndex = p.highestIndex) !== null && _p_highestIndex !== void 0 ? _p_highestIndex : 0n;
|
|
1882
|
-
var
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1948
|
+
var highest = BigInt((_p_highestIndex = p.highestIndex) !== null && _p_highestIndex !== void 0 ? _p_highestIndex : 0n);
|
|
1949
|
+
var done = typeof p.isStrictlyComplete === 'function' ? p.isStrictlyComplete() : highestRelevant > 0n && applied >= highestRelevant;
|
|
1950
|
+
return {
|
|
1951
|
+
applied: applied,
|
|
1952
|
+
connected: Boolean(p.isConnected),
|
|
1953
|
+
done: done,
|
|
1954
|
+
highest: highest,
|
|
1955
|
+
highestRelevant: highestRelevant
|
|
1956
|
+
};
|
|
1957
|
+
};
|
|
1958
|
+
// `remaining` = updates still to apply to reach the latest relevant index
|
|
1959
|
+
// (the target for isSynced — not the chain tip). `+N` = entries applied
|
|
1960
|
+
// since the previous periodic log. `pct` = applied / highestRelevant.
|
|
1961
|
+
fmtSide = function(name, side) {
|
|
1962
|
+
var p = readProgress(side);
|
|
1963
|
+
if (!p) return "".concat(name, "=n/a");
|
|
1964
|
+
var _lastApplied_name;
|
|
1965
|
+
var prev = (_lastApplied_name = lastApplied[name]) !== null && _lastApplied_name !== void 0 ? _lastApplied_name : p.applied;
|
|
1966
|
+
var delta = p.applied - prev;
|
|
1967
|
+
lastApplied[name] = p.applied;
|
|
1968
|
+
var remaining = p.highestRelevant > p.applied ? p.highestRelevant - p.applied : 0n;
|
|
1969
|
+
var pct = p.highestRelevant > 0n ? "".concat((Number(p.applied) / Number(p.highestRelevant) * 100).toFixed(1), "%") : 'n/a';
|
|
1970
|
+
return "".concat(name, "[done=").concat(p.done ? '✓' : '✗', " ").concat(p.applied, "/").concat(p.highestRelevant, " (").concat(pct, ", +").concat(delta, ") remaining=").concat(remaining, " tip=").concat(p.highest, " ws=").concat(p.connected ? '✓' : '✗', "]");
|
|
1888
1971
|
};
|
|
1889
1972
|
_state.label = 12;
|
|
1890
1973
|
case 12:
|
|
@@ -1909,16 +1992,54 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1909
1992
|
}, 300000);
|
|
1910
1993
|
sub = wallet.state().subscribe(function(s) {
|
|
1911
1994
|
var now = Date.now();
|
|
1995
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1996
|
+
try {
|
|
1997
|
+
// Record the moment each side individually completes (checked every
|
|
1998
|
+
// tick so the timestamp is precise, not rounded to the 5s log).
|
|
1999
|
+
for(var _iterator = SIDE_NAMES[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
2000
|
+
var name = _step.value;
|
|
2001
|
+
var _readProgress;
|
|
2002
|
+
if (sideDoneAtMs[name] === undefined && ((_readProgress = readProgress(s[name])) === null || _readProgress === void 0 ? void 0 : _readProgress.done)) {
|
|
2003
|
+
sideDoneAtMs[name] = now;
|
|
2004
|
+
// console.* (not this.logger, which is a NoopLogger / remote
|
|
2005
|
+
// shipper here) so these sync-timing diagnostics are visible in
|
|
2006
|
+
// the browser console.
|
|
2007
|
+
// eslint-disable-next-line no-console
|
|
2008
|
+
console.info("[Midnight] ".concat(label, ": ").concat(name, " side synced in ").concat(((now - syncStart) / 1000).toFixed(1), "s"));
|
|
2009
|
+
}
|
|
2010
|
+
}
|
|
2011
|
+
} catch (err) {
|
|
2012
|
+
_didIteratorError = true;
|
|
2013
|
+
_iteratorError = err;
|
|
2014
|
+
} finally{
|
|
2015
|
+
try {
|
|
2016
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
2017
|
+
_iterator.return();
|
|
2018
|
+
}
|
|
2019
|
+
} finally{
|
|
2020
|
+
if (_didIteratorError) {
|
|
2021
|
+
throw _iteratorError;
|
|
2022
|
+
}
|
|
2023
|
+
}
|
|
2024
|
+
}
|
|
1912
2025
|
if (now - lastLogTime > 5000) {
|
|
1913
2026
|
lastLogTime = now;
|
|
1914
|
-
|
|
2027
|
+
// eslint-disable-next-line no-console
|
|
2028
|
+
console.info("[Midnight] ".concat(label, ": sync @ ").concat(((now - syncStart) / 1000).toFixed(1), "s \xb7 ") + "isSynced=".concat(s.isSynced, " \xb7 ") + "".concat(fmtSide('shielded', s.shielded), " \xb7 ") + "".concat(fmtSide('unshielded', s.unshielded), " \xb7 ") + "".concat(fmtSide('dust', s.dust)));
|
|
1915
2029
|
}
|
|
1916
|
-
if (s
|
|
2030
|
+
if (isSyncResolved(s, mode)) {
|
|
1917
2031
|
clearTimeout(timeoutId);
|
|
1918
2032
|
queueMicrotask(function() {
|
|
1919
2033
|
return sub === null || sub === void 0 ? void 0 : sub.unsubscribe();
|
|
1920
2034
|
});
|
|
1921
|
-
|
|
2035
|
+
var elapsed = (Date.now() - syncStart) / 1000;
|
|
2036
|
+
var perSide = SIDE_NAMES.map(function(name) {
|
|
2037
|
+
var at = sideDoneAtMs[name];
|
|
2038
|
+
var when = at === undefined ? 'n/a' : "".concat(((at - syncStart) / 1000).toFixed(1), "s");
|
|
2039
|
+
return "".concat(name, "=").concat(when);
|
|
2040
|
+
}).join(' · ');
|
|
2041
|
+
// eslint-disable-next-line no-console
|
|
2042
|
+
console.info("[Midnight] ".concat(label, ": fully synced in ").concat(elapsed.toFixed(1), "s \xb7 per-side: ").concat(perSide));
|
|
1922
2043
|
resolve(s);
|
|
1923
2044
|
}
|
|
1924
2045
|
});
|
|
@@ -1967,8 +2088,28 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1967
2088
|
// full log-format state for the lifetime of the client.
|
|
1968
2089
|
lastPendingCount = -1;
|
|
1969
2090
|
lastPendingSig = '';
|
|
2091
|
+
// Dust telemetry. The foreground sync logger (above) unsubscribes the
|
|
2092
|
+
// instant shielded + unshielded resolve, so this long-lived subscription is
|
|
2093
|
+
// the ONLY window into the background dust fold. Log dust progress every
|
|
2094
|
+
// ~5s while it's still folding (so we can see `applied` climbing vs frozen),
|
|
2095
|
+
// and once when it finally reports strictly-complete (or never, which is
|
|
2096
|
+
// itself the answer). Reuses fmtSide for a format consistent with the
|
|
2097
|
+
// foreground log.
|
|
2098
|
+
lastDustLogTime = 0;
|
|
2099
|
+
dustDoneLogged = false;
|
|
1970
2100
|
diagnosticSub = wallet.state().subscribe(function(s) {
|
|
1971
2101
|
var _s_pending;
|
|
2102
|
+
var dustNow = Date.now();
|
|
2103
|
+
var dustDone = isSideSynced(s.dust);
|
|
2104
|
+
if (dustDone && !dustDoneLogged) {
|
|
2105
|
+
dustDoneLogged = true;
|
|
2106
|
+
// eslint-disable-next-line no-console
|
|
2107
|
+
console.info("[Midnight] ".concat(label, ": dust fully synced in ").concat(((dustNow - syncStart) / 1000).toFixed(1), "s \xb7 ").concat(fmtSide('dust', s.dust)));
|
|
2108
|
+
} else if (!dustDone && dustNow - lastDustLogTime > 5000) {
|
|
2109
|
+
lastDustLogTime = dustNow;
|
|
2110
|
+
// eslint-disable-next-line no-console
|
|
2111
|
+
console.info("[Midnight] ".concat(label, ": dust @ ").concat(((dustNow - syncStart) / 1000).toFixed(1), "s \xb7 ").concat(fmtSide('dust', s.dust)));
|
|
2112
|
+
}
|
|
1972
2113
|
var _s_pending_all;
|
|
1973
2114
|
var pending = (_s_pending_all = s === null || s === void 0 ? void 0 : (_s_pending = s.pending) === null || _s_pending === void 0 ? void 0 : _s_pending.all) !== null && _s_pending_all !== void 0 ? _s_pending_all : [];
|
|
1974
2115
|
var sig = JSON.stringify(pending.map(function(p) {
|
|
@@ -2110,7 +2251,7 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
2110
2251
|
var accountAddress = param.accountAddress, password = param.password, signedSessionId = param.signedSessionId, mfaToken = param.mfaToken, elevatedAccessToken = param.elevatedAccessToken;
|
|
2111
2252
|
var _this = this;
|
|
2112
2253
|
return _async_to_generator(function() {
|
|
2113
|
-
var _state_unshielded, _state_shielded, _state_dust_balance, _state_dust, _ref, state, addr, unshieldedByToken, _state_unshielded_balances, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _step_value, tokenType, value, shieldedByToken, _state_shielded_balances, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, _step_value1, tokenType1, value1, _state_dust_balance1, result;
|
|
2254
|
+
var _state_unshielded, _state_shielded, _state_dust_balance, _state_dust, _state_dust1, _ref, state, addr, unshieldedByToken, _state_unshielded_balances, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _step_value, tokenType, value, shieldedByToken, _state_shielded_balances, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, _step_value1, tokenType1, value1, now, _state_dust_balance1, dustBalance, _state_dust_totalCoins, dustCap, result;
|
|
2114
2255
|
return _ts_generator(this, function(_state) {
|
|
2115
2256
|
switch(_state.label){
|
|
2116
2257
|
case 0:
|
|
@@ -2122,7 +2263,10 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
2122
2263
|
signedSessionId: signedSessionId,
|
|
2123
2264
|
mfaToken: mfaToken,
|
|
2124
2265
|
elevatedAccessToken: elevatedAccessToken
|
|
2125
|
-
}
|
|
2266
|
+
}, // Resolve once shielded + unshielded are ready; let dust finish in the
|
|
2267
|
+
// background so the public/shielded balance shows without the ~130s
|
|
2268
|
+
// dust cold-sync.
|
|
2269
|
+
'shielded-unshielded')
|
|
2126
2270
|
];
|
|
2127
2271
|
case 1:
|
|
2128
2272
|
_ref = _state.sent(), state = _ref.state, addr = _ref.accountAddress;
|
|
@@ -2168,10 +2312,22 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
2168
2312
|
}
|
|
2169
2313
|
}
|
|
2170
2314
|
}
|
|
2315
|
+
// v4 exposes the dust generation cap per coin (DustFullInfo.maxCap). The
|
|
2316
|
+
// wallet-level cap is the sum across the wallet's dust coins.
|
|
2317
|
+
now = new Date();
|
|
2318
|
+
dustBalance = (_state_dust_balance1 = (_state_dust = state.dust) === null || _state_dust === void 0 ? void 0 : (_state_dust_balance = _state_dust.balance) === null || _state_dust_balance === void 0 ? void 0 : _state_dust_balance.call(_state_dust, now)) !== null && _state_dust_balance1 !== void 0 ? _state_dust_balance1 : 0n;
|
|
2319
|
+
dustCap = ((_state_dust_totalCoins = (_state_dust1 = state.dust) === null || _state_dust1 === void 0 ? void 0 : _state_dust1.totalCoins) !== null && _state_dust_totalCoins !== void 0 ? _state_dust_totalCoins : []).reduce(function(sum, coin) {
|
|
2320
|
+
var _coin_maxCap;
|
|
2321
|
+
return sum + ((_coin_maxCap = coin.maxCap) !== null && _coin_maxCap !== void 0 ? _coin_maxCap : 0n);
|
|
2322
|
+
}, 0n);
|
|
2171
2323
|
result = {
|
|
2172
2324
|
unshielded: unshieldedByToken,
|
|
2173
2325
|
shielded: shieldedByToken,
|
|
2174
|
-
dust:
|
|
2326
|
+
dust: {
|
|
2327
|
+
balance: dustBalance.toString(),
|
|
2328
|
+
cap: dustCap.toString()
|
|
2329
|
+
},
|
|
2330
|
+
dustSynced: isSideSynced(state.dust),
|
|
2175
2331
|
address: addr
|
|
2176
2332
|
};
|
|
2177
2333
|
// Fire-and-forget snapshot so the next init resumes from here instead
|
|
@@ -2460,7 +2616,7 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
2460
2616
|
var accountAddress = param.accountAddress, transaction = param.transaction, _param_waitForBalance = param.waitForBalance, waitForBalance = _param_waitForBalance === void 0 ? false : _param_waitForBalance, tokenType = param.tokenType, balanceBefore = param.balanceBefore, password = param.password, signedSessionId = param.signedSessionId, mfaToken = param.mfaToken, elevatedAccessToken = param.elevatedAccessToken;
|
|
2461
2617
|
var _this = this;
|
|
2462
2618
|
return _async_to_generator(function() {
|
|
2463
|
-
var _updatedState_unshielded_balances, _updatedState_unshielded, wallet, txBytes, finalized, txIdentifier, txHash, balanceBeforeBig, updatedState, _updatedState_unshielded_balances_tokenType, balanceAfter;
|
|
2619
|
+
var _updatedState_unshielded_balances, _updatedState_unshielded, wallet, txBytes, finalized, txIdentifier, txHash, canonicalHash, balanceBeforeBig, updatedState, _updatedState_unshielded_balances_tokenType, balanceAfter;
|
|
2464
2620
|
return _ts_generator(this, function(_state) {
|
|
2465
2621
|
switch(_state.label){
|
|
2466
2622
|
case 0:
|
|
@@ -2485,7 +2641,17 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
2485
2641
|
];
|
|
2486
2642
|
case 2:
|
|
2487
2643
|
txIdentifier = _state.sent();
|
|
2644
|
+
// The facade returns the submission *identifier* (used to watch for the tx),
|
|
2645
|
+
// but the block explorer indexes by the canonical transaction hash. Derive
|
|
2646
|
+
// that hash from the finalized ledger transaction so explorer links resolve;
|
|
2647
|
+
// fall back to the identifier if the hash can't be computed.
|
|
2488
2648
|
txHash = DynamicMidnightWalletClient.toTxHashString(txIdentifier);
|
|
2649
|
+
try {
|
|
2650
|
+
canonicalHash = DynamicMidnightWalletClient.toTxHashString(finalized.transactionHash());
|
|
2651
|
+
if (canonicalHash) txHash = canonicalHash;
|
|
2652
|
+
} catch (err) {
|
|
2653
|
+
_this.logger.warn('[Midnight] submitTransaction: could not derive canonical tx hash, using submission identifier', err);
|
|
2654
|
+
}
|
|
2489
2655
|
_this.logger.info('[Midnight] submitTransaction: broadcast, txHash=', txHash);
|
|
2490
2656
|
if (!waitForBalance) {
|
|
2491
2657
|
void _this.persistCachedWalletState();
|
package/index.esm.js
CHANGED
|
@@ -4,7 +4,8 @@ import { ShieldedAddress, ShieldedCoinPublicKey, ShieldedEncryptionPublicKey, Mi
|
|
|
4
4
|
import { DustWallet } from '@midnight-ntwrk/wallet-sdk-dust-wallet';
|
|
5
5
|
import { WalletFacade } from '@midnight-ntwrk/wallet-sdk-facade';
|
|
6
6
|
import { ShieldedWallet } from '@midnight-ntwrk/wallet-sdk-shielded';
|
|
7
|
-
import {
|
|
7
|
+
import { NoOpTransactionHistoryStorage } from '@midnight-ntwrk/wallet-sdk-abstractions';
|
|
8
|
+
import { UnshieldedWallet, PublicKey, createKeystore } from '@midnight-ntwrk/wallet-sdk-unshielded-wallet';
|
|
8
9
|
import { HDKey } from '@scure/bip32';
|
|
9
10
|
import bs58 from 'bs58';
|
|
10
11
|
import { bech32m } from 'bech32';
|
|
@@ -211,7 +212,12 @@ function _ts_generator$1(thisArg, body) {
|
|
|
211
212
|
}
|
|
212
213
|
}
|
|
213
214
|
var DB_NAME = 'dynamic-midnight-wallet-state';
|
|
214
|
-
|
|
215
|
+
// Open WITHOUT a fixed version. Passing a version LOWER than the one already in
|
|
216
|
+
// the browser throws `VersionError` (IndexedDB forbids downgrades) — which is
|
|
217
|
+
// exactly what broke the cache after an earlier `DB_VERSION = 2` experiment was
|
|
218
|
+
// reverted to 1: dev browsers still had v2, every open failed, and the wallet
|
|
219
|
+
// cold-synced on every load. Opening with no version adopts whatever version
|
|
220
|
+
// exists (or creates the DB fresh), so a downgrade error is impossible.
|
|
215
221
|
var STORE_NAME = 'state';
|
|
216
222
|
// Normalizes a DOMException | unknown into an Error so promise rejections
|
|
217
223
|
// always carry an Error instance. Object-shaped errors (DOMException, plain
|
|
@@ -241,8 +247,10 @@ function openDb() {
|
|
|
241
247
|
// the session (private-browsing bootup, transient quota errors, etc).
|
|
242
248
|
// Re-throw so the original caller still sees the rejection.
|
|
243
249
|
dbPromise = new Promise(function(resolve, reject) {
|
|
244
|
-
var req = indexedDB.open(DB_NAME
|
|
250
|
+
var req = indexedDB.open(DB_NAME);
|
|
245
251
|
req.onupgradeneeded = function() {
|
|
252
|
+
// Fires only when the DB is first created (or an existing DB lacks the
|
|
253
|
+
// store). Create the store if absent; never destructive.
|
|
246
254
|
var db = req.result;
|
|
247
255
|
if (!db.objectStoreNames.contains(STORE_NAME)) {
|
|
248
256
|
db.createObjectStore(STORE_NAME, {
|
|
@@ -301,7 +309,7 @@ function getWalletState(accountAddress) {
|
|
|
301
309
|
}
|
|
302
310
|
function _getWalletState() {
|
|
303
311
|
_getWalletState = _async_to_generator$1(function(accountAddress) {
|
|
304
|
-
var result;
|
|
312
|
+
var result, err;
|
|
305
313
|
return _ts_generator$1(this, function(_state) {
|
|
306
314
|
switch(_state.label){
|
|
307
315
|
case 0:
|
|
@@ -324,8 +332,13 @@ function _getWalletState() {
|
|
|
324
332
|
result !== null && result !== void 0 ? result : null
|
|
325
333
|
];
|
|
326
334
|
case 2:
|
|
327
|
-
_state.sent();
|
|
328
|
-
// IndexedDB unavailable (private mode,
|
|
335
|
+
err = _state.sent();
|
|
336
|
+
// IndexedDB unavailable (private mode, third-party storage partitioning,
|
|
337
|
+
// corrupt DB, etc.) — behave as if empty. Surface to the console so a
|
|
338
|
+
// blocked/partitioned store (which would force a cold sync every load)
|
|
339
|
+
// is visible instead of silently swallowed.
|
|
340
|
+
// eslint-disable-next-line no-console
|
|
341
|
+
console.warn('[Midnight] CACHE read FAILED (IndexedDB unavailable) — treating as empty:', err);
|
|
329
342
|
return [
|
|
330
343
|
2,
|
|
331
344
|
null
|
|
@@ -344,7 +357,7 @@ function putWalletState(accountAddress, state) {
|
|
|
344
357
|
}
|
|
345
358
|
function _putWalletState() {
|
|
346
359
|
_putWalletState = _async_to_generator$1(function(accountAddress, state) {
|
|
347
|
-
var record;
|
|
360
|
+
var record, err;
|
|
348
361
|
return _ts_generator$1(this, function(_state) {
|
|
349
362
|
switch(_state.label){
|
|
350
363
|
case 0:
|
|
@@ -370,12 +383,19 @@ function _putWalletState() {
|
|
|
370
383
|
];
|
|
371
384
|
case 2:
|
|
372
385
|
_state.sent();
|
|
386
|
+
// eslint-disable-next-line no-console
|
|
387
|
+
console.info("[Midnight] CACHE write OK — checkpoint saved (shielded=".concat(record.shielded.length, "B dust=").concat(record.dust.length, "B)"));
|
|
373
388
|
return [
|
|
374
389
|
3,
|
|
375
390
|
4
|
|
376
391
|
];
|
|
377
392
|
case 3:
|
|
378
|
-
_state.sent();
|
|
393
|
+
err = _state.sent();
|
|
394
|
+
// Persist is best-effort. A failure just means next init will cold-sync —
|
|
395
|
+
// but surface it so a blocked/partitioned IndexedDB (third-party iframe)
|
|
396
|
+
// is visible rather than silently swallowed.
|
|
397
|
+
// eslint-disable-next-line no-console
|
|
398
|
+
console.warn('[Midnight] CACHE write FAILED (IndexedDB unavailable):', err);
|
|
379
399
|
return [
|
|
380
400
|
3,
|
|
381
401
|
4
|
|
@@ -742,6 +762,22 @@ function _ts_values(o) {
|
|
|
742
762
|
};
|
|
743
763
|
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
744
764
|
}
|
|
765
|
+
/** Whether a sub-wallet side has finished syncing. `highestRelevantIndex`
|
|
766
|
+
* is 0 during sync, so `isStrictlyComplete()` is the authoritative signal. */ var isSideSynced = function(side) {
|
|
767
|
+
var _side_state;
|
|
768
|
+
var _side_progress;
|
|
769
|
+
var p = (_side_progress = side === null || side === void 0 ? void 0 : side.progress) !== null && _side_progress !== void 0 ? _side_progress : side === null || side === void 0 ? void 0 : (_side_state = side.state) === null || _side_state === void 0 ? void 0 : _side_state.progress;
|
|
770
|
+
if (!p) return false;
|
|
771
|
+
if (typeof p.isStrictlyComplete === 'function') return p.isStrictlyComplete();
|
|
772
|
+
var _p_appliedIndex;
|
|
773
|
+
var applied = BigInt((_p_appliedIndex = p.appliedIndex) !== null && _p_appliedIndex !== void 0 ? _p_appliedIndex : 0n);
|
|
774
|
+
var _p_highestRelevantIndex;
|
|
775
|
+
var highestRelevant = BigInt((_p_highestRelevantIndex = p.highestRelevantIndex) !== null && _p_highestRelevantIndex !== void 0 ? _p_highestRelevantIndex : 0n);
|
|
776
|
+
return highestRelevant > 0n && applied >= highestRelevant;
|
|
777
|
+
};
|
|
778
|
+
/** Resolve predicate for the sync wait, per mode. */ var isSyncResolved = function(s, mode) {
|
|
779
|
+
return mode === 'full' ? Boolean(s.isSynced) : isSideSynced(s.shielded) && isSideSynced(s.unshielded);
|
|
780
|
+
};
|
|
745
781
|
var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
746
782
|
_inherits(DynamicMidnightWalletClient, DynamicWalletClient);
|
|
747
783
|
function DynamicMidnightWalletClient() {
|
|
@@ -831,6 +867,10 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
831
867
|
isDirty = pendingTxCount > 0 || unshieldedPending > 0 || shieldedPending > 0 || dustPending > 0;
|
|
832
868
|
if (isDirty) {
|
|
833
869
|
_this.logger.debug("[Midnight] persist skipped — state is dirty \xb7 " + "pendingTxs=".concat(pendingTxCount, " \xb7 unshieldedPending=").concat(unshieldedPending, " \xb7 ") + "shieldedPending=".concat(shieldedPending, " \xb7 dustPending=").concat(dustPending, ". ") + "IndexedDB retains last clean snapshot.");
|
|
870
|
+
// console.* because this.logger is a NoopLogger in the iframe — cache
|
|
871
|
+
// diagnostics must be visible in the browser console.
|
|
872
|
+
// eslint-disable-next-line no-console
|
|
873
|
+
console.info("[Midnight] CACHE persist SKIPPED (state dirty) \xb7 pendingTxs=".concat(pendingTxCount, " ") + "unshieldedPending=".concat(unshieldedPending, " shieldedPending=").concat(shieldedPending, " dustPending=").concat(dustPending, " — no checkpoint saved, next load cold-syncs"));
|
|
834
874
|
return [
|
|
835
875
|
2
|
|
836
876
|
];
|
|
@@ -874,6 +914,8 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
874
914
|
case 5:
|
|
875
915
|
err = _state.sent();
|
|
876
916
|
_this.logger.warn('[Midnight] Failed to persist wallet state:', err);
|
|
917
|
+
// eslint-disable-next-line no-console
|
|
918
|
+
console.warn('[Midnight] CACHE persist FAILED (write/serialize threw):', err);
|
|
877
919
|
return [
|
|
878
920
|
3,
|
|
879
921
|
6
|
|
@@ -1640,6 +1682,7 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1640
1682
|
{
|
|
1641
1683
|
key: "initMidnightWallet",
|
|
1642
1684
|
value: function initMidnightWallet(label, mpcParams) {
|
|
1685
|
+
var mode = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'full';
|
|
1643
1686
|
var _this = this;
|
|
1644
1687
|
return _async_to_generator(function() {
|
|
1645
1688
|
var accountAddress, inFlight, initPromise;
|
|
@@ -1648,7 +1691,9 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1648
1691
|
case 0:
|
|
1649
1692
|
accountAddress = mpcParams.accountAddress;
|
|
1650
1693
|
// If another init for this same account is in flight, return its promise
|
|
1651
|
-
// instead of kicking off a second, redundant WalletFacade.init.
|
|
1694
|
+
// instead of kicking off a second, redundant WalletFacade.init. The first
|
|
1695
|
+
// caller's `mode` wins; that's fine — the wallet is created/cached once and
|
|
1696
|
+
// keeps syncing dust in the background regardless of who waited for what.
|
|
1652
1697
|
inFlight = _this.pendingInits.get(accountAddress);
|
|
1653
1698
|
if (inFlight) {
|
|
1654
1699
|
_this.logger.info("[Midnight] ".concat(label, ": joining in-flight init for ").concat(accountAddress));
|
|
@@ -1657,7 +1702,7 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1657
1702
|
inFlight
|
|
1658
1703
|
];
|
|
1659
1704
|
}
|
|
1660
|
-
initPromise = _this.runMidnightWalletInit(label, mpcParams);
|
|
1705
|
+
initPromise = _this.runMidnightWalletInit(label, mpcParams, mode);
|
|
1661
1706
|
_this.pendingInits.set(accountAddress, initPromise);
|
|
1662
1707
|
_state.label = 1;
|
|
1663
1708
|
case 1:
|
|
@@ -1693,9 +1738,10 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1693
1738
|
{
|
|
1694
1739
|
key: "runMidnightWalletInit",
|
|
1695
1740
|
value: function runMidnightWalletInit(label, mpcParams) {
|
|
1741
|
+
var mode = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 'full';
|
|
1696
1742
|
var _this = this;
|
|
1697
1743
|
return _async_to_generator(function() {
|
|
1698
|
-
var _this_cachedWallet, roleKeys, accountAddress, state, _this_cachedWallet_diagnosticSub, shieldedSecretKeys, dustSecretKey, unshieldedKeystore, config, savedState, wallet, syncStart, lastLogTime, fmtSide, state1, err, lastPendingCount, lastPendingSig, diagnosticSub;
|
|
1744
|
+
var _this_cachedWallet, roleKeys, accountAddress, state, _this_cachedWallet_diagnosticSub, shieldedSecretKeys, dustSecretKey, unshieldedKeystore, config, savedState, _savedState_shielded, _savedState_dust, _savedState_shielded_length, _savedState_dust_length, wallet, syncStart, lastLogTime, SIDE_NAMES, lastApplied, sideDoneAtMs, readProgress, fmtSide, state1, err, lastPendingCount, lastPendingSig, lastDustLogTime, dustDoneLogged, diagnosticSub;
|
|
1699
1745
|
return _ts_generator(this, function(_state) {
|
|
1700
1746
|
switch(_state.label){
|
|
1701
1747
|
case 0:
|
|
@@ -1726,7 +1772,7 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1726
1772
|
reject(new Error('Wallet re-sync timeout'));
|
|
1727
1773
|
}, 30000);
|
|
1728
1774
|
sub = _this.cachedWallet.wallet.state().subscribe(function(s) {
|
|
1729
|
-
if (s
|
|
1775
|
+
if (isSyncResolved(s, mode)) {
|
|
1730
1776
|
clearTimeout(tid);
|
|
1731
1777
|
// Defer to a microtask so `sub` is definitely assigned whether the
|
|
1732
1778
|
// emission is synchronous or async.
|
|
@@ -1799,6 +1845,13 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1799
1845
|
indexerHttpUrl: 'https://indexer.preview.midnight.network/api/v4/graphql',
|
|
1800
1846
|
indexerWsUrl: 'wss://indexer.preview.midnight.network/api/v4/graphql/ws'
|
|
1801
1847
|
},
|
|
1848
|
+
// v4 sync batching. `size` = updates fetched per indexer round-trip.
|
|
1849
|
+
// Measured: 2000 vs 10000 gave the same ~750 entries/sec (≈130s dust cold
|
|
1850
|
+
// sync), so dust is apply-bound (per-entry WASM compute), not fetch-bound
|
|
1851
|
+
// — batch size doesn't move the total. Kept at 2000.
|
|
1852
|
+
batchUpdates: {
|
|
1853
|
+
size: 2000
|
|
1854
|
+
},
|
|
1802
1855
|
txHistoryStorage: new NoOpTransactionHistoryStorage()
|
|
1803
1856
|
};
|
|
1804
1857
|
return [
|
|
@@ -1809,8 +1862,13 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1809
1862
|
savedState = _state.sent();
|
|
1810
1863
|
if (savedState) {
|
|
1811
1864
|
_this.logger.info("[Midnight] ".concat(label, ": found persisted state — resuming sync from checkpoint"));
|
|
1865
|
+
// console.* because this.logger is a NoopLogger in the iframe.
|
|
1866
|
+
// eslint-disable-next-line no-console
|
|
1867
|
+
console.info("[Midnight] ".concat(label, ": CACHE HIT — restoring from IndexedDB checkpoint ") + "(updatedAt=".concat(savedState.updatedAt ? new Date(savedState.updatedAt).toISOString() : 'n/a', " ") + "shielded=".concat((_savedState_shielded_length = (_savedState_shielded = savedState.shielded) === null || _savedState_shielded === void 0 ? void 0 : _savedState_shielded.length) !== null && _savedState_shielded_length !== void 0 ? _savedState_shielded_length : 0, "B dust=").concat((_savedState_dust_length = (_savedState_dust = savedState.dust) === null || _savedState_dust === void 0 ? void 0 : _savedState_dust.length) !== null && _savedState_dust_length !== void 0 ? _savedState_dust_length : 0, "B)"));
|
|
1812
1868
|
} else {
|
|
1813
1869
|
_this.logger.info("[Midnight] ".concat(label, ": no persisted state — cold sync from genesis"));
|
|
1870
|
+
// eslint-disable-next-line no-console
|
|
1871
|
+
console.info("[Midnight] ".concat(label, ": CACHE MISS — no IndexedDB checkpoint for this account, cold sync from genesis"));
|
|
1814
1872
|
}
|
|
1815
1873
|
_this.logger.info("[Midnight] ".concat(label, ": initializing wallet..."));
|
|
1816
1874
|
return [
|
|
@@ -1839,31 +1897,56 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1839
1897
|
_this.logger.debug("[Midnight] ".concat(label, ": syncing..."));
|
|
1840
1898
|
syncStart = Date.now();
|
|
1841
1899
|
lastLogTime = 0;
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
//
|
|
1848
|
-
|
|
1900
|
+
SIDE_NAMES = [
|
|
1901
|
+
'shielded',
|
|
1902
|
+
'unshielded',
|
|
1903
|
+
'dust'
|
|
1904
|
+
];
|
|
1905
|
+
// Per-tick throughput tracking: appliedIndex per side at the previous log,
|
|
1906
|
+
// so each periodic line shows how many chunks were applied in the interval
|
|
1907
|
+
// (a non-zero delta = still actively polling/applying index chunks). And
|
|
1908
|
+
// the wall-clock at which each side individually completed, so we can see
|
|
1909
|
+
// which dimension is the slow one.
|
|
1910
|
+
lastApplied = {};
|
|
1911
|
+
sideDoneAtMs = {};
|
|
1912
|
+
// In v4 every WalletState (shielded/unshielded/dust) exposes the full
|
|
1913
|
+
// SyncProgress via the `progress` getter (appliedIndex, highestRelevantIndex,
|
|
1914
|
+
// highestIndex). Read that FIRST — `side.state.progress` is the inner
|
|
1915
|
+
// CoreWallet's partial progress (has appliedIndex but leaves the highest*
|
|
1916
|
+
// fields at 0, which is why `gap`/`tip` showed 0 before).
|
|
1917
|
+
readProgress = function(side) {
|
|
1849
1918
|
var _side_state;
|
|
1850
|
-
var
|
|
1851
|
-
var p = (
|
|
1852
|
-
if (!p) return
|
|
1919
|
+
var _side_progress;
|
|
1920
|
+
var p = (_side_progress = side === null || side === void 0 ? void 0 : side.progress) !== null && _side_progress !== void 0 ? _side_progress : side === null || side === void 0 ? void 0 : (_side_state = side.state) === null || _side_state === void 0 ? void 0 : _side_state.progress;
|
|
1921
|
+
if (!p) return undefined;
|
|
1853
1922
|
var _p_appliedIndex;
|
|
1854
|
-
var applied = (_p_appliedIndex = p.appliedIndex) !== null && _p_appliedIndex !== void 0 ? _p_appliedIndex : 0n;
|
|
1923
|
+
var applied = BigInt((_p_appliedIndex = p.appliedIndex) !== null && _p_appliedIndex !== void 0 ? _p_appliedIndex : 0n);
|
|
1855
1924
|
var _p_highestRelevantIndex;
|
|
1856
|
-
var highestRelevant = (_p_highestRelevantIndex = p.highestRelevantIndex) !== null && _p_highestRelevantIndex !== void 0 ? _p_highestRelevantIndex : 0n;
|
|
1857
|
-
var _p_highestRelevantWalletIndex;
|
|
1858
|
-
var highestRelevantWallet = (_p_highestRelevantWalletIndex = p.highestRelevantWalletIndex) !== null && _p_highestRelevantWalletIndex !== void 0 ? _p_highestRelevantWalletIndex : 0n;
|
|
1925
|
+
var highestRelevant = BigInt((_p_highestRelevantIndex = p.highestRelevantIndex) !== null && _p_highestRelevantIndex !== void 0 ? _p_highestRelevantIndex : 0n);
|
|
1859
1926
|
var _p_highestIndex;
|
|
1860
|
-
var highest = (_p_highestIndex = p.highestIndex) !== null && _p_highestIndex !== void 0 ? _p_highestIndex : 0n;
|
|
1861
|
-
var
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1927
|
+
var highest = BigInt((_p_highestIndex = p.highestIndex) !== null && _p_highestIndex !== void 0 ? _p_highestIndex : 0n);
|
|
1928
|
+
var done = typeof p.isStrictlyComplete === 'function' ? p.isStrictlyComplete() : highestRelevant > 0n && applied >= highestRelevant;
|
|
1929
|
+
return {
|
|
1930
|
+
applied: applied,
|
|
1931
|
+
connected: Boolean(p.isConnected),
|
|
1932
|
+
done: done,
|
|
1933
|
+
highest: highest,
|
|
1934
|
+
highestRelevant: highestRelevant
|
|
1935
|
+
};
|
|
1936
|
+
};
|
|
1937
|
+
// `remaining` = updates still to apply to reach the latest relevant index
|
|
1938
|
+
// (the target for isSynced — not the chain tip). `+N` = entries applied
|
|
1939
|
+
// since the previous periodic log. `pct` = applied / highestRelevant.
|
|
1940
|
+
fmtSide = function(name, side) {
|
|
1941
|
+
var p = readProgress(side);
|
|
1942
|
+
if (!p) return "".concat(name, "=n/a");
|
|
1943
|
+
var _lastApplied_name;
|
|
1944
|
+
var prev = (_lastApplied_name = lastApplied[name]) !== null && _lastApplied_name !== void 0 ? _lastApplied_name : p.applied;
|
|
1945
|
+
var delta = p.applied - prev;
|
|
1946
|
+
lastApplied[name] = p.applied;
|
|
1947
|
+
var remaining = p.highestRelevant > p.applied ? p.highestRelevant - p.applied : 0n;
|
|
1948
|
+
var pct = p.highestRelevant > 0n ? "".concat((Number(p.applied) / Number(p.highestRelevant) * 100).toFixed(1), "%") : 'n/a';
|
|
1949
|
+
return "".concat(name, "[done=").concat(p.done ? '✓' : '✗', " ").concat(p.applied, "/").concat(p.highestRelevant, " (").concat(pct, ", +").concat(delta, ") remaining=").concat(remaining, " tip=").concat(p.highest, " ws=").concat(p.connected ? '✓' : '✗', "]");
|
|
1867
1950
|
};
|
|
1868
1951
|
_state.label = 12;
|
|
1869
1952
|
case 12:
|
|
@@ -1888,16 +1971,54 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1888
1971
|
}, 300000);
|
|
1889
1972
|
sub = wallet.state().subscribe(function(s) {
|
|
1890
1973
|
var now = Date.now();
|
|
1974
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1975
|
+
try {
|
|
1976
|
+
// Record the moment each side individually completes (checked every
|
|
1977
|
+
// tick so the timestamp is precise, not rounded to the 5s log).
|
|
1978
|
+
for(var _iterator = SIDE_NAMES[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1979
|
+
var name = _step.value;
|
|
1980
|
+
var _readProgress;
|
|
1981
|
+
if (sideDoneAtMs[name] === undefined && ((_readProgress = readProgress(s[name])) === null || _readProgress === void 0 ? void 0 : _readProgress.done)) {
|
|
1982
|
+
sideDoneAtMs[name] = now;
|
|
1983
|
+
// console.* (not this.logger, which is a NoopLogger / remote
|
|
1984
|
+
// shipper here) so these sync-timing diagnostics are visible in
|
|
1985
|
+
// the browser console.
|
|
1986
|
+
// eslint-disable-next-line no-console
|
|
1987
|
+
console.info("[Midnight] ".concat(label, ": ").concat(name, " side synced in ").concat(((now - syncStart) / 1000).toFixed(1), "s"));
|
|
1988
|
+
}
|
|
1989
|
+
}
|
|
1990
|
+
} catch (err) {
|
|
1991
|
+
_didIteratorError = true;
|
|
1992
|
+
_iteratorError = err;
|
|
1993
|
+
} finally{
|
|
1994
|
+
try {
|
|
1995
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1996
|
+
_iterator.return();
|
|
1997
|
+
}
|
|
1998
|
+
} finally{
|
|
1999
|
+
if (_didIteratorError) {
|
|
2000
|
+
throw _iteratorError;
|
|
2001
|
+
}
|
|
2002
|
+
}
|
|
2003
|
+
}
|
|
1891
2004
|
if (now - lastLogTime > 5000) {
|
|
1892
2005
|
lastLogTime = now;
|
|
1893
|
-
|
|
2006
|
+
// eslint-disable-next-line no-console
|
|
2007
|
+
console.info("[Midnight] ".concat(label, ": sync @ ").concat(((now - syncStart) / 1000).toFixed(1), "s \xb7 ") + "isSynced=".concat(s.isSynced, " \xb7 ") + "".concat(fmtSide('shielded', s.shielded), " \xb7 ") + "".concat(fmtSide('unshielded', s.unshielded), " \xb7 ") + "".concat(fmtSide('dust', s.dust)));
|
|
1894
2008
|
}
|
|
1895
|
-
if (s
|
|
2009
|
+
if (isSyncResolved(s, mode)) {
|
|
1896
2010
|
clearTimeout(timeoutId);
|
|
1897
2011
|
queueMicrotask(function() {
|
|
1898
2012
|
return sub === null || sub === void 0 ? void 0 : sub.unsubscribe();
|
|
1899
2013
|
});
|
|
1900
|
-
|
|
2014
|
+
var elapsed = (Date.now() - syncStart) / 1000;
|
|
2015
|
+
var perSide = SIDE_NAMES.map(function(name) {
|
|
2016
|
+
var at = sideDoneAtMs[name];
|
|
2017
|
+
var when = at === undefined ? 'n/a' : "".concat(((at - syncStart) / 1000).toFixed(1), "s");
|
|
2018
|
+
return "".concat(name, "=").concat(when);
|
|
2019
|
+
}).join(' · ');
|
|
2020
|
+
// eslint-disable-next-line no-console
|
|
2021
|
+
console.info("[Midnight] ".concat(label, ": fully synced in ").concat(elapsed.toFixed(1), "s \xb7 per-side: ").concat(perSide));
|
|
1901
2022
|
resolve(s);
|
|
1902
2023
|
}
|
|
1903
2024
|
});
|
|
@@ -1946,8 +2067,28 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
1946
2067
|
// full log-format state for the lifetime of the client.
|
|
1947
2068
|
lastPendingCount = -1;
|
|
1948
2069
|
lastPendingSig = '';
|
|
2070
|
+
// Dust telemetry. The foreground sync logger (above) unsubscribes the
|
|
2071
|
+
// instant shielded + unshielded resolve, so this long-lived subscription is
|
|
2072
|
+
// the ONLY window into the background dust fold. Log dust progress every
|
|
2073
|
+
// ~5s while it's still folding (so we can see `applied` climbing vs frozen),
|
|
2074
|
+
// and once when it finally reports strictly-complete (or never, which is
|
|
2075
|
+
// itself the answer). Reuses fmtSide for a format consistent with the
|
|
2076
|
+
// foreground log.
|
|
2077
|
+
lastDustLogTime = 0;
|
|
2078
|
+
dustDoneLogged = false;
|
|
1949
2079
|
diagnosticSub = wallet.state().subscribe(function(s) {
|
|
1950
2080
|
var _s_pending;
|
|
2081
|
+
var dustNow = Date.now();
|
|
2082
|
+
var dustDone = isSideSynced(s.dust);
|
|
2083
|
+
if (dustDone && !dustDoneLogged) {
|
|
2084
|
+
dustDoneLogged = true;
|
|
2085
|
+
// eslint-disable-next-line no-console
|
|
2086
|
+
console.info("[Midnight] ".concat(label, ": dust fully synced in ").concat(((dustNow - syncStart) / 1000).toFixed(1), "s \xb7 ").concat(fmtSide('dust', s.dust)));
|
|
2087
|
+
} else if (!dustDone && dustNow - lastDustLogTime > 5000) {
|
|
2088
|
+
lastDustLogTime = dustNow;
|
|
2089
|
+
// eslint-disable-next-line no-console
|
|
2090
|
+
console.info("[Midnight] ".concat(label, ": dust @ ").concat(((dustNow - syncStart) / 1000).toFixed(1), "s \xb7 ").concat(fmtSide('dust', s.dust)));
|
|
2091
|
+
}
|
|
1951
2092
|
var _s_pending_all;
|
|
1952
2093
|
var pending = (_s_pending_all = s === null || s === void 0 ? void 0 : (_s_pending = s.pending) === null || _s_pending === void 0 ? void 0 : _s_pending.all) !== null && _s_pending_all !== void 0 ? _s_pending_all : [];
|
|
1953
2094
|
var sig = JSON.stringify(pending.map(function(p) {
|
|
@@ -2089,7 +2230,7 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
2089
2230
|
var accountAddress = param.accountAddress, password = param.password, signedSessionId = param.signedSessionId, mfaToken = param.mfaToken, elevatedAccessToken = param.elevatedAccessToken;
|
|
2090
2231
|
var _this = this;
|
|
2091
2232
|
return _async_to_generator(function() {
|
|
2092
|
-
var _state_unshielded, _state_shielded, _state_dust_balance, _state_dust, _ref, state, addr, unshieldedByToken, _state_unshielded_balances, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _step_value, tokenType, value, shieldedByToken, _state_shielded_balances, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, _step_value1, tokenType1, value1, _state_dust_balance1, result;
|
|
2233
|
+
var _state_unshielded, _state_shielded, _state_dust_balance, _state_dust, _state_dust1, _ref, state, addr, unshieldedByToken, _state_unshielded_balances, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _step_value, tokenType, value, shieldedByToken, _state_shielded_balances, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, _step_value1, tokenType1, value1, now, _state_dust_balance1, dustBalance, _state_dust_totalCoins, dustCap, result;
|
|
2093
2234
|
return _ts_generator(this, function(_state) {
|
|
2094
2235
|
switch(_state.label){
|
|
2095
2236
|
case 0:
|
|
@@ -2101,7 +2242,10 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
2101
2242
|
signedSessionId: signedSessionId,
|
|
2102
2243
|
mfaToken: mfaToken,
|
|
2103
2244
|
elevatedAccessToken: elevatedAccessToken
|
|
2104
|
-
}
|
|
2245
|
+
}, // Resolve once shielded + unshielded are ready; let dust finish in the
|
|
2246
|
+
// background so the public/shielded balance shows without the ~130s
|
|
2247
|
+
// dust cold-sync.
|
|
2248
|
+
'shielded-unshielded')
|
|
2105
2249
|
];
|
|
2106
2250
|
case 1:
|
|
2107
2251
|
_ref = _state.sent(), state = _ref.state, addr = _ref.accountAddress;
|
|
@@ -2147,10 +2291,22 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
2147
2291
|
}
|
|
2148
2292
|
}
|
|
2149
2293
|
}
|
|
2294
|
+
// v4 exposes the dust generation cap per coin (DustFullInfo.maxCap). The
|
|
2295
|
+
// wallet-level cap is the sum across the wallet's dust coins.
|
|
2296
|
+
now = new Date();
|
|
2297
|
+
dustBalance = (_state_dust_balance1 = (_state_dust = state.dust) === null || _state_dust === void 0 ? void 0 : (_state_dust_balance = _state_dust.balance) === null || _state_dust_balance === void 0 ? void 0 : _state_dust_balance.call(_state_dust, now)) !== null && _state_dust_balance1 !== void 0 ? _state_dust_balance1 : 0n;
|
|
2298
|
+
dustCap = ((_state_dust_totalCoins = (_state_dust1 = state.dust) === null || _state_dust1 === void 0 ? void 0 : _state_dust1.totalCoins) !== null && _state_dust_totalCoins !== void 0 ? _state_dust_totalCoins : []).reduce(function(sum, coin) {
|
|
2299
|
+
var _coin_maxCap;
|
|
2300
|
+
return sum + ((_coin_maxCap = coin.maxCap) !== null && _coin_maxCap !== void 0 ? _coin_maxCap : 0n);
|
|
2301
|
+
}, 0n);
|
|
2150
2302
|
result = {
|
|
2151
2303
|
unshielded: unshieldedByToken,
|
|
2152
2304
|
shielded: shieldedByToken,
|
|
2153
|
-
dust:
|
|
2305
|
+
dust: {
|
|
2306
|
+
balance: dustBalance.toString(),
|
|
2307
|
+
cap: dustCap.toString()
|
|
2308
|
+
},
|
|
2309
|
+
dustSynced: isSideSynced(state.dust),
|
|
2154
2310
|
address: addr
|
|
2155
2311
|
};
|
|
2156
2312
|
// Fire-and-forget snapshot so the next init resumes from here instead
|
|
@@ -2439,7 +2595,7 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
2439
2595
|
var accountAddress = param.accountAddress, transaction = param.transaction, _param_waitForBalance = param.waitForBalance, waitForBalance = _param_waitForBalance === void 0 ? false : _param_waitForBalance, tokenType = param.tokenType, balanceBefore = param.balanceBefore, password = param.password, signedSessionId = param.signedSessionId, mfaToken = param.mfaToken, elevatedAccessToken = param.elevatedAccessToken;
|
|
2440
2596
|
var _this = this;
|
|
2441
2597
|
return _async_to_generator(function() {
|
|
2442
|
-
var _updatedState_unshielded_balances, _updatedState_unshielded, wallet, txBytes, finalized, txIdentifier, txHash, balanceBeforeBig, updatedState, _updatedState_unshielded_balances_tokenType, balanceAfter;
|
|
2598
|
+
var _updatedState_unshielded_balances, _updatedState_unshielded, wallet, txBytes, finalized, txIdentifier, txHash, canonicalHash, balanceBeforeBig, updatedState, _updatedState_unshielded_balances_tokenType, balanceAfter;
|
|
2443
2599
|
return _ts_generator(this, function(_state) {
|
|
2444
2600
|
switch(_state.label){
|
|
2445
2601
|
case 0:
|
|
@@ -2464,7 +2620,17 @@ var DynamicMidnightWalletClient = /*#__PURE__*/ function(DynamicWalletClient) {
|
|
|
2464
2620
|
];
|
|
2465
2621
|
case 2:
|
|
2466
2622
|
txIdentifier = _state.sent();
|
|
2623
|
+
// The facade returns the submission *identifier* (used to watch for the tx),
|
|
2624
|
+
// but the block explorer indexes by the canonical transaction hash. Derive
|
|
2625
|
+
// that hash from the finalized ledger transaction so explorer links resolve;
|
|
2626
|
+
// fall back to the identifier if the hash can't be computed.
|
|
2467
2627
|
txHash = DynamicMidnightWalletClient.toTxHashString(txIdentifier);
|
|
2628
|
+
try {
|
|
2629
|
+
canonicalHash = DynamicMidnightWalletClient.toTxHashString(finalized.transactionHash());
|
|
2630
|
+
if (canonicalHash) txHash = canonicalHash;
|
|
2631
|
+
} catch (err) {
|
|
2632
|
+
_this.logger.warn('[Midnight] submitTransaction: could not derive canonical tx hash, using submission identifier', err);
|
|
2633
|
+
}
|
|
2468
2634
|
_this.logger.info('[Midnight] submitTransaction: broadcast, txHash=', txHash);
|
|
2469
2635
|
if (!waitForBalance) {
|
|
2470
2636
|
void _this.persistCachedWalletState();
|
package/package.json
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs-wallet/midnight",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.41",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@dynamic-labs-wallet/browser": "1.0.
|
|
7
|
+
"@dynamic-labs-wallet/browser": "1.0.41",
|
|
8
8
|
"@dynamic-labs/sdk-api-core": "^0.0.984",
|
|
9
|
-
"@midnight-ntwrk/ledger-v8": "8.0
|
|
10
|
-
"@midnight-ntwrk/wallet-sdk-
|
|
9
|
+
"@midnight-ntwrk/ledger-v8": "^8.1.0",
|
|
10
|
+
"@midnight-ntwrk/wallet-sdk-abstractions": "2.1.0",
|
|
11
|
+
"@midnight-ntwrk/wallet-sdk-address-format": "3.1.1",
|
|
11
12
|
"@scure/bip32": "^2.0.1",
|
|
12
13
|
"bs58": "^6.0.0",
|
|
13
|
-
"@midnight-ntwrk/wallet-sdk-facade": "
|
|
14
|
-
"@midnight-ntwrk/wallet-sdk-shielded": "
|
|
15
|
-
"@midnight-ntwrk/wallet-sdk-unshielded-wallet": "
|
|
16
|
-
"@midnight-ntwrk/wallet-sdk-dust-wallet": "
|
|
14
|
+
"@midnight-ntwrk/wallet-sdk-facade": "4.0.0",
|
|
15
|
+
"@midnight-ntwrk/wallet-sdk-shielded": "3.0.0",
|
|
16
|
+
"@midnight-ntwrk/wallet-sdk-unshielded-wallet": "3.0.0",
|
|
17
|
+
"@midnight-ntwrk/wallet-sdk-dust-wallet": "4.0.0",
|
|
17
18
|
"bech32": "^2.0.0"
|
|
18
19
|
},
|
|
19
20
|
"publishConfig": {
|
package/src/client/client.d.ts
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
import { DynamicWalletClient, type ClientKeyShare, type ThresholdSignatureScheme, type RequestWithElevatedAccessToken } from '@dynamic-labs-wallet/browser';
|
|
2
2
|
import type { SignMessageContext } from '@dynamic-labs/sdk-api-core';
|
|
3
|
+
/**
|
|
4
|
+
* Sync wait mode for `initMidnightWallet`:
|
|
5
|
+
* - `full`: wait for all three sub-wallets (incl. dust) — the default, used by
|
|
6
|
+
* transaction/dust operations that need the complete state.
|
|
7
|
+
* - `shielded-unshielded`: resolve as soon as shielded + unshielded are synced,
|
|
8
|
+
* leaving dust to finish in the background. Used by balance reads so the
|
|
9
|
+
* public/shielded balance shows in ~seconds instead of waiting on the ~130s
|
|
10
|
+
* dust cold-sync. Embedded (WaaS) wallets only — external/injected wallets
|
|
11
|
+
* never use this client.
|
|
12
|
+
*/
|
|
13
|
+
type WalletSyncMode = 'full' | 'shielded-unshielded';
|
|
14
|
+
/** Whether a sub-wallet side has finished syncing. `highestRelevantIndex`
|
|
15
|
+
* is 0 during sync, so `isStrictlyComplete()` is the authoritative signal. */
|
|
16
|
+
export declare const isSideSynced: (side: any) => boolean;
|
|
17
|
+
/** Resolve predicate for the sync wait, per mode. */
|
|
18
|
+
export declare const isSyncResolved: (s: any, mode: WalletSyncMode) => boolean;
|
|
3
19
|
export declare class DynamicMidnightWalletClient extends DynamicWalletClient {
|
|
4
20
|
readonly chainName = "MIDNIGHT";
|
|
5
21
|
private cachedWallet;
|
|
@@ -110,8 +126,16 @@ export declare class DynamicMidnightWalletClient extends DynamicWalletClient {
|
|
|
110
126
|
}): Promise<{
|
|
111
127
|
unshielded: Record<string, string>;
|
|
112
128
|
shielded: Record<string, string>;
|
|
113
|
-
dust:
|
|
129
|
+
dust: {
|
|
130
|
+
balance: string;
|
|
131
|
+
cap: string;
|
|
132
|
+
};
|
|
114
133
|
address: string;
|
|
134
|
+
/** False while dust is still syncing in the background. Balance reads
|
|
135
|
+
* resolve as soon as shielded + unshielded are synced (mode
|
|
136
|
+
* 'shielded-unshielded'), so dust may not be complete yet — consumers
|
|
137
|
+
* can show a "dust loading" state and poll until this is true. */
|
|
138
|
+
dustSynced: boolean;
|
|
115
139
|
}>;
|
|
116
140
|
registerDust({ accountAddress, password, signedSessionId, mfaToken, elevatedAccessToken, }: {
|
|
117
141
|
accountAddress: string;
|
|
@@ -250,4 +274,5 @@ export declare class DynamicMidnightWalletClient extends DynamicWalletClient {
|
|
|
250
274
|
dustSecretKey: any;
|
|
251
275
|
}>;
|
|
252
276
|
}
|
|
277
|
+
export {};
|
|
253
278
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAKnB,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACpC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walletStateStorage.d.ts","sourceRoot":"","sources":["../../src/client/walletStateStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"walletStateStorage.d.ts","sourceRoot":"","sources":["../../src/client/walletStateStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAWH,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAOF,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,GAAG,KAAK,CAcpE;AAwCD,wBAAsB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAejG;AAED,wBAAsB,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBrH;AAED,wBAAsB,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7E"}
|