@pushchain/core 6.0.4 → 6.0.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pushchain/core",
3
- "version": "6.0.4",
3
+ "version": "6.0.6",
4
4
  "homepage": "https://push.org",
5
5
  "keywords": [
6
6
  "pushchain",
@@ -1265,6 +1265,31 @@ function composeCascade(ctx, segments, ueaAddress, ueaBalance, ueaNonce) {
1265
1265
  // ============================================================================
1266
1266
  // createCascadedBuilder
1267
1267
  // ============================================================================
1268
+ function txHashFromProgressEvent(event) {
1269
+ var _a, _b, _c, _d;
1270
+ const response = event.response;
1271
+ return (_d = (_a = response === null || response === void 0 ? void 0 : response.txHash) !== null && _a !== void 0 ? _a : (_c = (_b = response === null || response === void 0 ? void 0 : response.response) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.hash) !== null && _d !== void 0 ? _d : '';
1272
+ }
1273
+ function withMultihopRootProgressMapping(ctx, run) {
1274
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
1275
+ const originalHook = ctx.progressHook;
1276
+ if (!originalHook)
1277
+ return run();
1278
+ ctx.progressHook = (event) => {
1279
+ if (event.id === progress_hook_types_1.PROGRESS_HOOK.SEND_TX_199_01) {
1280
+ originalHook(progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_199_99](txHashFromProgressEvent(event)));
1281
+ return;
1282
+ }
1283
+ originalHook(event);
1284
+ };
1285
+ try {
1286
+ return yield run();
1287
+ }
1288
+ finally {
1289
+ ctx.progressHook = originalHook;
1290
+ }
1291
+ });
1292
+ }
1268
1293
  function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1269
1294
  return {
1270
1295
  send: () => tslib_1.__awaiter(this, void 0, void 0, function* () {
@@ -1293,6 +1318,7 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1293
1318
  },
1294
1319
  ],
1295
1320
  hopCount: 1,
1321
+ finalTxHash: response.hash,
1296
1322
  waitForAll: () => tslib_1.__awaiter(this, void 0, void 0, function* () {
1297
1323
  return ({
1298
1324
  success: true,
@@ -1305,6 +1331,8 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1305
1331
  txHash: response.hash,
1306
1332
  },
1307
1333
  ],
1334
+ finalTxHash: response.hash,
1335
+ finalTxResponse: singleRoute1Result,
1308
1336
  });
1309
1337
  }),
1310
1338
  wait: (opts) => tslib_1.__awaiter(this, void 0, void 0, function* () { return singleRoute1Result.waitForAll(opts); }),
@@ -1328,6 +1356,7 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1328
1356
  },
1329
1357
  ],
1330
1358
  hopCount: 1,
1359
+ finalTxHash: response.hash,
1331
1360
  waitForAll: () => tslib_1.__awaiter(this, void 0, void 0, function* () {
1332
1361
  return ({
1333
1362
  success: true,
@@ -1340,6 +1369,8 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1340
1369
  txHash: response.hash,
1341
1370
  },
1342
1371
  ],
1372
+ finalTxHash: response.hash,
1373
+ finalTxResponse: singleRoute2Result,
1343
1374
  });
1344
1375
  }),
1345
1376
  wait: (opts) => tslib_1.__awaiter(this, void 0, void 0, function* () { return singleRoute2Result.waitForAll(opts); }),
@@ -1380,7 +1411,7 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1380
1411
  value: cascadeRequiredNativeValue,
1381
1412
  data: composedMulticalls,
1382
1413
  };
1383
- const response = yield callbacks.executeFn(executeParams);
1414
+ const response = yield withMultihopRootProgressMapping(ctx, () => callbacks.executeFn(executeParams));
1384
1415
  // Build hop info for tracking
1385
1416
  const hopInfos = hops.map((hop, index) => ({
1386
1417
  hopIndex: index,
@@ -1458,6 +1489,34 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1458
1489
  return;
1459
1490
  emitHopEvent(progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_999_03](failedIdx0 + 1, totalHops));
1460
1491
  };
1492
+ const emitRouteIntermediateComplete = (hop, txHash) => {
1493
+ var _a;
1494
+ if (!isMulti)
1495
+ return;
1496
+ const n = hop.hopIndex + 1;
1497
+ if (n >= totalHops)
1498
+ return; // final terminal is 999-01
1499
+ const resolvedTxHash = (_a = txHash !== null && txHash !== void 0 ? txHash : hop.txHash) !== null && _a !== void 0 ? _a : response.hash;
1500
+ if (hop.route === 'UOA_TO_PUSH') {
1501
+ emitHopEvent(progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_199_99](resolvedTxHash));
1502
+ return;
1503
+ }
1504
+ if (hop.route === 'UOA_TO_CEA') {
1505
+ emitHopEvent(progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_299_99](hop.executionChain, resolvedTxHash));
1506
+ return;
1507
+ }
1508
+ if (hop.route === 'CEA_TO_PUSH') {
1509
+ emitHopEvent(progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_399_99](hop.executionChain, resolvedTxHash));
1510
+ }
1511
+ };
1512
+ const buildCompletionResult = (success, failedAt) => {
1513
+ var _a, _b;
1514
+ const finalTxHash = (_b = (_a = [...hopInfos]
1515
+ .reverse()
1516
+ .find((hop) => hop.status === 'confirmed' && hop.txHash)) === null || _a === void 0 ? void 0 : _a.txHash) !== null && _b !== void 0 ? _b : response.hash;
1517
+ cascadeResponse.finalTxHash = finalTxHash;
1518
+ return Object.assign({ success, hops: hopInfos, finalTxHash, finalTxResponse: cascadeResponse }, (failedAt !== undefined ? { failedAt } : {}));
1519
+ };
1461
1520
  if (isMulti) {
1462
1521
  emitHopEvent(progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_001](totalHops, chainLabels));
1463
1522
  }
@@ -1500,11 +1559,7 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1500
1559
  });
1501
1560
  emitHopEvent(hopHooks.timeout(hop.executionChain, Date.now() - startTime));
1502
1561
  emitCascadeTimeout(hop.hopIndex);
1503
- return {
1504
- success: false,
1505
- hops: hopInfos,
1506
- failedAt: hop.hopIndex,
1507
- };
1562
+ return buildCompletionResult(false, hop.hopIndex);
1508
1563
  }
1509
1564
  emitHopStart(hop.hopIndex);
1510
1565
  emitHopEvent(hopHooks.awaiting(hop.executionChain));
@@ -1545,7 +1600,12 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1545
1600
  hop.status = 'confirmed';
1546
1601
  hop.txHash = displayTxHash;
1547
1602
  hop.outboundDetails = userFacingOutboundDetails;
1548
- emitHopEvent(hopHooks.success(userFacingOutboundDetails));
1603
+ if (isMulti) {
1604
+ emitRouteIntermediateComplete(hop, displayTxHash);
1605
+ }
1606
+ else {
1607
+ emitHopEvent(hopHooks.success(userFacingOutboundDetails));
1608
+ }
1549
1609
  emitHopComplete(hop.hopIndex);
1550
1610
  cascadeProgressHook === null || cascadeProgressHook === void 0 ? void 0 : cascadeProgressHook({
1551
1611
  hopIndex: hop.hopIndex,
@@ -1576,11 +1636,7 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1576
1636
  status: 'failed',
1577
1637
  elapsed: Date.now() - startTime,
1578
1638
  });
1579
- return {
1580
- success: false,
1581
- hops: hopInfos,
1582
- failedAt: hop.hopIndex,
1583
- };
1639
+ return buildCompletionResult(false, hop.hopIndex);
1584
1640
  }
1585
1641
  }
1586
1642
  else {
@@ -1622,7 +1678,12 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1622
1678
  // guard above, so we only reach here with full details.
1623
1679
  if (matchedHop === null || matchedHop === void 0 ? void 0 : matchedHop.outboundDetails) {
1624
1680
  confirmedHops.add(event.hopIndex);
1625
- emitHopEvent(eventHooks.success(matchedHop.outboundDetails));
1681
+ if (isMulti) {
1682
+ emitRouteIntermediateComplete(matchedHop, event.txHash);
1683
+ }
1684
+ else {
1685
+ emitHopEvent(eventHooks.success(matchedHop.outboundDetails));
1686
+ }
1626
1687
  emitHopComplete(event.hopIndex);
1627
1688
  }
1628
1689
  }
@@ -1636,11 +1697,7 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1636
1697
  : `Outbound cascade failed at hop ${failedIdx}`;
1637
1698
  emitHopEvent((0, progress_route_hooks_1.pickWaitHooks)(failedHop === null || failedHop === void 0 ? void 0 : failedHop.route).failed((_d = failedHop === null || failedHop === void 0 ? void 0 : failedHop.executionChain) !== null && _d !== void 0 ? _d : '', failMsg));
1638
1699
  emitCascadeFailed(failedIdx, failMsg);
1639
- return {
1640
- success: false,
1641
- hops: hopInfos,
1642
- failedAt: failedIdx,
1643
- };
1700
+ return buildCompletionResult(false, failedIdx);
1644
1701
  }
1645
1702
  }
1646
1703
  return null;
@@ -1695,11 +1752,7 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1695
1752
  inboundHop.status = 'failed';
1696
1753
  emitHopEvent(hopHooks.timeout(inboundHop.executionChain, Date.now() - startTime));
1697
1754
  emitCascadeTimeout(inboundHop.hopIndex);
1698
- return {
1699
- success: false,
1700
- hops: hopInfos,
1701
- failedAt: inboundHop.hopIndex,
1702
- };
1755
+ return buildCompletionResult(false, inboundHop.hopIndex);
1703
1756
  }
1704
1757
  emitHopStart(inboundHop.hopIndex);
1705
1758
  emitHopEvent(hopHooks.awaiting(inboundHop.executionChain));
@@ -1758,11 +1811,7 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1758
1811
  txHash: failedDisplayTxHash,
1759
1812
  elapsed: Date.now() - startTime,
1760
1813
  });
1761
- return {
1762
- success: false,
1763
- hops: hopInfos,
1764
- failedAt: inboundHop.hopIndex,
1765
- };
1814
+ return buildCompletionResult(false, inboundHop.hopIndex);
1766
1815
  }
1767
1816
  const displayExternalTxHash = (_f = (0, helpers_1.toExternalTxHashDisplay)(sourceOutboundDetails.destinationChain, sourceOutboundDetails.externalTxHash)) !== null && _f !== void 0 ? _f : sourceOutboundDetails.externalTxHash;
1768
1817
  inboundHop.outboundDetails = Object.assign(Object.assign({}, sourceOutboundDetails), { externalTxHash: displayExternalTxHash });
@@ -1803,11 +1852,7 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1803
1852
  status: 'failed',
1804
1853
  elapsed: Date.now() - startTime,
1805
1854
  });
1806
- return {
1807
- success: false,
1808
- hops: hopInfos,
1809
- failedAt: inboundHop.hopIndex,
1810
- };
1855
+ return buildCompletionResult(false, inboundHop.hopIndex);
1811
1856
  }
1812
1857
  if (childInbound.status !== 'confirmed') {
1813
1858
  const failMsg = (_h = childInbound.errorMessage) !== null && _h !== void 0 ? _h : 'inbound execution failed on Push Chain';
@@ -1824,16 +1869,17 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1824
1869
  txHash: inboundHop.txHash,
1825
1870
  elapsed: Date.now() - startTime,
1826
1871
  });
1827
- return {
1828
- success: false,
1829
- hops: hopInfos,
1830
- failedAt: inboundHop.hopIndex,
1831
- };
1872
+ return buildCompletionResult(false, inboundHop.hopIndex);
1832
1873
  }
1833
1874
  inboundHop.status = 'confirmed';
1834
1875
  inboundHop.txHash =
1835
1876
  childInbound.pushTxHash || displayExternalTxHash;
1836
- emitHopEvent(progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_399_01](inboundHop.executionChain, childInbound.pushTxHash));
1877
+ if (isMulti) {
1878
+ emitRouteIntermediateComplete(inboundHop, inboundHop.txHash);
1879
+ }
1880
+ else {
1881
+ emitHopEvent(progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_399_01](inboundHop.executionChain, childInbound.pushTxHash));
1882
+ }
1837
1883
  emitHopComplete(inboundHop.hopIndex);
1838
1884
  cascadeProgressHook === null || cascadeProgressHook === void 0 ? void 0 : cascadeProgressHook({
1839
1885
  hopIndex: inboundHop.hopIndex,
@@ -1859,6 +1905,7 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1859
1905
  txHash: childInbound.pushTxHash,
1860
1906
  elapsed: Date.now() - startTime,
1861
1907
  });
1908
+ emitRouteIntermediateComplete(hop, childInbound.pushTxHash);
1862
1909
  emitHopComplete(hop.hopIndex);
1863
1910
  }
1864
1911
  }
@@ -1868,7 +1915,7 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1868
1915
  return childOutboundFailure;
1869
1916
  }
1870
1917
  emitCascadeSuccess();
1871
- return { success: true, hops: hopInfos };
1918
+ return buildCompletionResult(true);
1872
1919
  }
1873
1920
  catch (err) {
1874
1921
  const failedIdx = hopInfos.findIndex((h) => h.status !== 'confirmed');
@@ -1881,11 +1928,7 @@ function createCascadedBuilder(ctx, preparedTxs, callbacks, defaultEventHook) {
1881
1928
  else {
1882
1929
  emitCascadeFailed(failedAt, errMsg);
1883
1930
  }
1884
- return {
1885
- success: false,
1886
- hops: hopInfos,
1887
- failedAt,
1888
- };
1931
+ return buildCompletionResult(false, failedAt);
1889
1932
  }
1890
1933
  }),
1891
1934
  wait: (opts) => tslib_1.__awaiter(this, void 0, void 0, function* () { return cascadeResponse.waitForAll(opts); }),
@@ -48,9 +48,8 @@ function printLog(ctx, msg) {
48
48
  * Exceptions kept in the stream regardless of route:
49
49
  * - All UEA migration hooks.
50
50
  *
51
- * Separately, the intermediate Push-success markers 199-99-99 (R3) and
52
- * 299-99 (R2) are suppressed at `fanOut` in response-builder.ts — they're
53
- * internal transition signals, not consumer-facing spec events.
51
+ * Multihop-only intermediate success markers (199-99 / 299-99 / 399-99)
52
+ * are emitted by cascade tracking, not by the single-route wait path.
54
53
  */
55
54
  const R1_SUPPRESSED_IN_NON_R1 = new Set([
56
55
  progress_hook_types_1.PROGRESS_HOOK.SEND_TX_101,
@@ -10,7 +10,6 @@ import type { OutboundTxDetails } from '../orchestrator.types';
10
10
  import type { ProgressEvent } from '../../progress-hook/progress-hook.types';
11
11
  import { TransactionRoute } from '../route-detector';
12
12
  export type WaitHookSet = {
13
- intermediatePushOk?: (chain: string, pushTxHash: string) => ProgressEvent;
14
13
  awaiting: (chain: string) => ProgressEvent;
15
14
  polling: (chain: string, elapsedMs: number) => ProgressEvent;
16
15
  success: (details: OutboundTxDetails) => ProgressEvent;
@@ -17,7 +17,6 @@ const route_detector_1 = require("../route-detector");
17
17
  function pickWaitHooks(route) {
18
18
  if (route === route_detector_1.TransactionRoute.UOA_TO_CEA) {
19
19
  return {
20
- intermediatePushOk: (chain, txHash) => progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_299_99](chain, txHash),
21
20
  awaiting: (chain) => progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_209_01](chain),
22
21
  polling: (chain, elapsed) => progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_209_02](chain, elapsed),
23
22
  success: (details) => progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_299_01](details),
@@ -27,7 +26,6 @@ function pickWaitHooks(route) {
27
26
  }
28
27
  if (route === route_detector_1.TransactionRoute.CEA_TO_PUSH) {
29
28
  return {
30
- intermediatePushOk: (_chain, txHash) => progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_199_99_99](txHash),
31
29
  awaiting: (chain) => progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_309_01](chain),
32
30
  polling: (chain, elapsed) => progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_309_02](chain, elapsed),
33
31
  // For R3, the outbound-poll "success" is the source-chain CEA executing
@@ -29,30 +29,14 @@ const inbound_tracker_1 = require("./inbound-tracker");
29
29
  const tx_transformer_1 = require("./tx-transformer");
30
30
  const progress_route_hooks_1 = require("./progress-route-hooks");
31
31
  const outbound_sync_1 = require("./outbound-sync");
32
- /**
33
- * Intermediate Push-success markers (199-99-99 for R3, 299-99 for R2) are
34
- * internal transition signals — they tell response-builder's wait-phase
35
- * branch that the Push leg has settled so it can skip re-emitting the
36
- * intermediate marker on top of a reconstructed stream. They are not part
37
- * of the published 1XX/2XX/3XX/4XX spec and are suppressed at the consumer
38
- * dispatch boundary. `printLog` still fires for these so internal traces
39
- * retain the transition record.
40
- */
41
- const INTERMEDIATE_INTERNAL_IDS = new Set([
42
- progress_hook_types_1.PROGRESS_HOOK.SEND_TX_199_99_99,
43
- progress_hook_types_1.PROGRESS_HOOK.SEND_TX_299_99,
44
- ]);
45
32
  /**
46
33
  * Fan out a progress event to one or two registered callbacks, deduping
47
34
  * when both slots hold the same reference. Keeps the emission policy in a
48
35
  * single place shared by `emitProgress` (execute phase) and `emit` (wait
49
36
  * phase) — so consumers that wire the same callback at multiple levels
50
- * never see double-invocation. Intermediate internal markers are dropped
51
- * here so they never reach the consumer.
37
+ * never see double-invocation.
52
38
  */
53
39
  function fanOut(event, primary, secondary) {
54
- if (INTERMEDIATE_INTERNAL_IDS.has(event.id))
55
- return;
56
40
  if (primary)
57
41
  primary(event);
58
42
  if (secondary && secondary !== primary)
@@ -549,13 +533,6 @@ function transformToUniversalTxResponse(ctx_1, tx_1) {
549
533
  const inboundInitialWaitMs = isReplay
550
534
  ? 0
551
535
  : callbacks.inboundConstants.initialWaitMs;
552
- // Track whether reconstruction already emitted the route's
553
- // intermediate Push-success marker (299-99 / 199-99-99). When it has,
554
- // skip re-emitting from the outbound branch below to avoid duplicates.
555
- // This flag is only true when `this` response was created by
556
- // trackTransaction() and the reconstructed stream already fired.
557
- const alreadyReconstructed = universalTxResponse._eventsReconstructed === true;
558
- let intermediateAlreadyEmitted = alreadyReconstructed;
559
536
  // Build the base receipt directly from this response. Any per-call
560
537
  // `tx.progressHook(cb)` already replayed buffered execute-phase events
561
538
  // to `cb` via the progressHook setter — re-running trackTransaction
@@ -580,15 +557,6 @@ function transformToUniversalTxResponse(ctx_1, tx_1) {
580
557
  return;
581
558
  fanOut(event, registeredProgressHook, ctx.progressHook);
582
559
  };
583
- // Intermediate INFO marker — Push Chain tx confirmed, external/inbound
584
- // leg still pending. Per spec, R1 keeps 199-01 as terminal; R2/R3
585
- // reclassify Push success as intermediate. Skip when trackTransaction
586
- // (called above) already reconstructed the same marker via
587
- // reconstructR2/R3, otherwise the consumer sees 299-99 / 199-99-99
588
- // twice in their stream.
589
- if (hooks.intermediatePushOk && !intermediateAlreadyEmitted) {
590
- emit(hooks.intermediatePushOk(targetChain, tx.hash));
591
- }
592
560
  // Awaiting relay
593
561
  emit(hooks.awaiting(targetChain));
594
562
  let lastEmittedStatus;
@@ -160,11 +160,6 @@ function reconstructR2(universalTxResponse, universalTxData, isFailed, errorMsg)
160
160
  if (isFailed) {
161
161
  events.push(progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_299_02](errorMsg));
162
162
  }
163
- else {
164
- // Push Chain success is intermediate for R2 — the wait() outbound poll
165
- // appends the real terminal (299-01/02/03) once the external leg resolves.
166
- events.push(progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_299_99](targetChain, universalTxResponse.hash));
167
- }
168
163
  return events;
169
164
  }
170
165
  function reconstructR3(universalTxResponse, universalTxData, isFailed, errorMsg) {
@@ -190,11 +185,6 @@ function reconstructR3(universalTxResponse, universalTxData, isFailed, errorMsg)
190
185
  // "Push Chain Tx Failed" rather than the inbound copy.
191
186
  events.push(progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_399_02](errorMsg, 'push'));
192
187
  }
193
- else {
194
- // Push Chain success is intermediate for R3 — wait() drives the source-chain
195
- // CEA poll (309-xx) and the inbound-to-Push poll (310-xx / 399-xx) on top.
196
- events.push(progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_199_99_99](universalTxResponse.hash));
197
- }
198
188
  return events;
199
189
  }
200
190
  // ============================================================================
@@ -315,7 +305,7 @@ function reconstructMultichain(universalTxResponse, universalTxData, isFailed, e
315
305
  let failedAt = null;
316
306
  let failureMsg = errorMsg;
317
307
  outbounds.forEach((ob, i) => {
318
- var _a;
308
+ var _a, _b;
319
309
  const hopNum = i + 1;
320
310
  const fromChain = i === 0 ? sourceChain : outbounds[i - 1].destinationChain;
321
311
  const toChain = ob.destinationChain;
@@ -336,6 +326,12 @@ function reconstructMultichain(universalTxResponse, universalTxData, isFailed, e
336
326
  events.push(...reconstructR2(legResponse, legData, legFailed, legError));
337
327
  }
338
328
  if (!legFailed) {
329
+ if (hopNum < hopCount) {
330
+ const txHash = ((_b = ob.observedTx) === null || _b === void 0 ? void 0 : _b.txHash) || legResponse.hash;
331
+ events.push(isR3Leg
332
+ ? progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_399_99](toChain, txHash)
333
+ : progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_299_99](toChain, txHash));
334
+ }
339
335
  events.push(progress_hook_1.default[progress_hook_types_1.PROGRESS_HOOK.SEND_TX_002_99_99](hopNum, hopCount));
340
336
  }
341
337
  else if (failedAt === null) {
@@ -639,6 +639,8 @@ export interface CascadedTxResponse {
639
639
  hops: CascadeHopInfo[];
640
640
  /** Total number of hops in the cascade */
641
641
  hopCount: number;
642
+ /** Final tx hash resolved by waitForAll()/wait(), when available */
643
+ finalTxHash?: string;
642
644
  /** Wait for ALL hops to complete across all chains */
643
645
  waitForAll: (opts?: CascadeTrackOptions) => Promise<CascadeCompletionResult>;
644
646
  /** Convenience alias for waitForAll() */
@@ -713,6 +715,10 @@ export interface CascadeCompletionResult {
713
715
  success: boolean;
714
716
  /** Final state of all hops */
715
717
  hops: CascadeHopInfo[];
718
+ /** Final tx hash for the last confirmed hop, when available */
719
+ finalTxHash?: string;
720
+ /** Original cascaded response object for consumers that need the full context */
721
+ finalTxResponse?: CascadedTxResponse;
716
722
  /** Index of first failed hop (if any) */
717
723
  failedAt?: number;
718
724
  }
@@ -35,6 +35,7 @@ function preflightSuffix(sufficient, pathTag, enforceGasCheck) {
35
35
  ? `INSUFFICIENT (${pathTag}); warning only, proceeding`
36
36
  : `INSUFFICIENT (${pathTag})`;
37
37
  }
38
+ const displayPathTag = (pathTag) => pathTag === 'CASCADE' ? 'MULTICHAIN' : pathTag;
38
39
  /**
39
40
  * Classify a sign-time error as either a true wallet user-decline
40
41
  * (viem `UserRejectedRequestError`, ethers `ACTION_REJECTED`, EIP-1193 4001,
@@ -273,6 +274,20 @@ const RAW_HOOKS_R1 = {
273
274
  level: 'ERROR',
274
275
  };
275
276
  },
277
+ [progress_hook_types_1.PROGRESS_HOOK.SEND_TX_199_03]: (targetChain, elapsedMs) => ({
278
+ id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_199_03,
279
+ title: 'Syncing State with Push Chain Timeout',
280
+ message: 'Timed out waiting for relay to Push Chain',
281
+ response: { error: 'relay timeout', chain: targetChain, elapsedMs },
282
+ level: 'ERROR',
283
+ }),
284
+ [progress_hook_types_1.PROGRESS_HOOK.SEND_TX_199_99]: (txHash) => ({
285
+ id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_199_99,
286
+ title: 'Intermediate Push Chain Tx Completed',
287
+ message: `Intermediate Push Chain tx confirmed: ${txHash}, progressing to next phase`,
288
+ response: { txHash },
289
+ level: 'INFO',
290
+ }),
276
291
  };
277
292
  // =============================================================================
278
293
  // Route 2 — UEA → UGPC → CEA on target chain (201–299, signature-only)
@@ -326,7 +341,7 @@ const RAW_HOOKS_R2 = {
326
341
  const enforceGasCheck = extra === null || extra === void 0 ? void 0 : extra.enforceGasCheck;
327
342
  return {
328
343
  id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_203_03,
329
- title: 'Pre-flight Balance Check',
344
+ title: 'Checking Balance Requirements',
330
345
  message: `UEA balance: ${availableStr}; required: ${requiredStr}; ` +
331
346
  preflightSuffix(sufficient, pathTag, enforceGasCheck),
332
347
  response: {
@@ -457,7 +472,7 @@ const RAW_HOOKS_R2 = {
457
472
  }),
458
473
  [progress_hook_types_1.PROGRESS_HOOK.SEND_TX_299_99]: (targetChain, txHash) => ({
459
474
  id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_299_99,
460
- title: `${friendlyChain(targetChain)} Tx Completed`,
475
+ title: `Intermediate ${friendlyChain(targetChain)} Tx Completed`,
461
476
  message: `Intermediate ${friendlyChain(targetChain)} tx confirmed: ${txHash}, progressing to next phase`,
462
477
  response: { chain: targetChain, txHash },
463
478
  level: 'INFO',
@@ -467,13 +482,6 @@ const RAW_HOOKS_R2 = {
467
482
  // Route 3 — UEA → UGPC → CEA → sendUniversalTxToUEA → Push Chain (301–399)
468
483
  // =============================================================================
469
484
  const RAW_HOOKS_R3 = {
470
- [progress_hook_types_1.PROGRESS_HOOK.SEND_TX_199_99_99]: (txHash) => ({
471
- id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_199_99_99,
472
- title: 'Push Chain Tx Completed',
473
- message: `Intermediate Push Chain tx confirmed: ${txHash}, progressing to next phase`,
474
- response: { txHash },
475
- level: 'INFO',
476
- }),
477
485
  [progress_hook_types_1.PROGRESS_HOOK.SEND_TX_301]: (sourceChain, ceaAddress) => ({
478
486
  id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_301,
479
487
  title: `${friendlyChain(sourceChain)}'s Executor Account Detected`,
@@ -544,7 +552,7 @@ const RAW_HOOKS_R3 = {
544
552
  const enforceGasCheck = extra === null || extra === void 0 ? void 0 : extra.enforceGasCheck;
545
553
  return {
546
554
  id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_303_04,
547
- title: 'Pre-flight Balance Check',
555
+ title: 'Checking Balance Requirements',
548
556
  message: `UEA balance: ${availableStr}; required: ${requiredStr}; ` +
549
557
  preflightSuffix(sufficient, pathTag, enforceGasCheck),
550
558
  response: {
@@ -705,11 +713,7 @@ const RAW_HOOKS_R3 = {
705
713
  },
706
714
  [progress_hook_types_1.PROGRESS_HOOK.SEND_TX_399_03]: (sourceChain, elapsedMs, phase = 'inbound') => ({
707
715
  id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_399_03,
708
- title: phase === 'outbound'
709
- ? `Syncing State with ${friendlyChain(sourceChain)} Timeout`
710
- : phase === 'push'
711
- ? 'Push Chain Tx Timeout'
712
- : 'Push Chain Inbound Timeout',
716
+ title: 'Push Chain Inbound Tx Timeout',
713
717
  message: phase === 'outbound'
714
718
  ? `Timed out waiting for ${friendlyChain(sourceChain)} relay`
715
719
  : phase === 'push'
@@ -727,6 +731,13 @@ const RAW_HOOKS_R3 = {
727
731
  },
728
732
  level: 'ERROR',
729
733
  }),
734
+ [progress_hook_types_1.PROGRESS_HOOK.SEND_TX_399_99]: (sourceChain, txHash) => ({
735
+ id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_399_99,
736
+ title: `Intermediate ${friendlyChain(sourceChain)} to Push Tx Completed`,
737
+ message: `Intermediate ${friendlyChain(sourceChain)} to Push tx confirmed: ${txHash}, progressing to next phase`,
738
+ response: { chain: sourceChain, txHash },
739
+ level: 'INFO',
740
+ }),
730
741
  };
731
742
  // =============================================================================
732
743
  // UEA Migration hooks (unchanged)
@@ -810,11 +821,12 @@ const RAW_HOOKS_MULTICHAIN = {
810
821
  const availableStr = kind === 'PRC20' ? `${available} units` : (0, formatters_1.formatPc)(available, 4);
811
822
  const requiredStr = kind === 'PRC20' ? `${required} units` : (0, formatters_1.formatPc)(required, 4);
812
823
  const enforceGasCheck = extra === null || extra === void 0 ? void 0 : extra.enforceGasCheck;
824
+ const visiblePathTag = displayPathTag(pathTag);
813
825
  return {
814
826
  id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_003_03,
815
- title: 'Cascade Pre-flight Balance Check',
827
+ title: 'Checking Balance Requirements',
816
828
  message: `UEA balance: ${availableStr}; required: ${requiredStr}; ` +
817
- preflightSuffix(sufficient, pathTag, enforceGasCheck),
829
+ preflightSuffix(sufficient, visiblePathTag, enforceGasCheck),
818
830
  response: {
819
831
  required,
820
832
  available,
@@ -835,13 +847,14 @@ const RAW_HOOKS_MULTICHAIN = {
835
847
  var _a, _b, _c, _d;
836
848
  const kind = (_a = extra === null || extra === void 0 ? void 0 : extra.kind) !== null && _a !== void 0 ? _a : 'NATIVE';
837
849
  const shortfallStr = kind === 'PRC20' ? `${shortfall} units` : (0, formatters_1.formatPc)(shortfall, 4);
850
+ const visiblePathTag = displayPathTag(pathTag);
838
851
  const remediation = kind === 'PRC20'
839
852
  ? `Bridge the burn token (${(_b = extra === null || extra === void 0 ? void 0 : extra.burnToken) !== null && _b !== void 0 ? _b : 'PRC-20'}) to UEA ${ueaAddress} before retrying.`
840
853
  : `Bridge >=${shortfallStr} to UEA ${ueaAddress} before retrying.`;
841
854
  return {
842
855
  id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_003_04,
843
- title: 'Cascade Insufficient UEA Balance',
844
- message: `Shortfall ${shortfallStr} on ${pathTag}. ${remediation}`,
856
+ title: 'Multichain Insufficient UEA Balance',
857
+ message: `Shortfall ${shortfallStr} on ${visiblePathTag}. ${remediation}`,
845
858
  response: {
846
859
  required,
847
860
  available,
@@ -857,9 +870,9 @@ const RAW_HOOKS_MULTICHAIN = {
857
870
  },
858
871
  [progress_hook_types_1.PROGRESS_HOOK.SEND_TX_003_05]: (quoted, threshold, gasToken, pathTag) => ({
859
872
  id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_003_05,
860
- title: 'Cascade SVM Native-Value Warn Threshold',
873
+ title: 'Multichain SVM Native-Value Warn Threshold',
861
874
  message: `Buffered pool quote ${(0, formatters_1.formatPc)(quoted, 4)} exceeds warn threshold ${(0, formatters_1.formatPc)(threshold, 4)} ` +
862
- `for ${gasToken} (${pathTag}). Pool may be skewed or quote is unusually large. ` +
875
+ `for ${gasToken} (${displayPathTag(pathTag)}). Pool may be skewed or quote is unusually large. ` +
863
876
  `No action taken — pre-flight will determine if balance covers it.`,
864
877
  response: { quoted, threshold, gasToken, pathTag },
865
878
  level: 'INFO',
@@ -874,15 +887,15 @@ const RAW_HOOKS_MULTICHAIN = {
874
887
  [progress_hook_types_1.PROGRESS_HOOK.SEND_TX_999_02]: (failedAt, total, errorMessage) => ({
875
888
  id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_999_02,
876
889
  title: 'Multichain Transactions Failed',
877
- message: `Cascade failed at hop ${failedAt} of ${total}: ${errorMessage}`,
890
+ message: `Multichain failed at hop ${failedAt} of ${total}: ${errorMessage}`,
878
891
  response: { failedAt, total, error: errorMessage },
879
892
  level: 'ERROR',
880
893
  }),
881
894
  [progress_hook_types_1.PROGRESS_HOOK.SEND_TX_999_03]: (failedAt, total) => ({
882
895
  id: progress_hook_types_1.PROGRESS_HOOK.SEND_TX_999_03,
883
896
  title: 'Multichain Transactions Timeout',
884
- message: `Cascade timed out at hop ${failedAt} of ${total}`,
885
- response: { failedAt, total, error: 'cascade timeout' },
897
+ message: `Multichain timed out at hop ${failedAt} of ${total}`,
898
+ response: { failedAt, total, error: 'multichain timeout' },
886
899
  level: 'ERROR',
887
900
  }),
888
901
  };
@@ -40,7 +40,8 @@ export declare enum PROGRESS_HOOK {
40
40
  SEND_TX_107 = "SEND-TX-107",
41
41
  SEND_TX_199_01 = "SEND-TX-199-01",// R1 terminal Push success
42
42
  SEND_TX_199_02 = "SEND-TX-199-02",// R1 terminal Push failure
43
- SEND_TX_199_99_99 = "SEND-TX-199-99-99",// R3 intermediate Push success
43
+ SEND_TX_199_03 = "SEND-TX-199-03",
44
+ SEND_TX_199_99 = "SEND-TX-199-99",// R1 multihop intermediate Push success
44
45
  SEND_TX_201 = "SEND-TX-201",
45
46
  SEND_TX_202_01 = "SEND-TX-202-01",
46
47
  SEND_TX_202_02 = "SEND-TX-202-02",
@@ -84,6 +85,7 @@ export declare enum PROGRESS_HOOK {
84
85
  SEND_TX_399_01 = "SEND-TX-399-01",
85
86
  SEND_TX_399_02 = "SEND-TX-399-02",
86
87
  SEND_TX_399_03 = "SEND-TX-399-03",
88
+ SEND_TX_399_99 = "SEND-TX-399-99",// R3 multihop intermediate round-trip success
87
89
  SEND_TX_001 = "SEND-TX-001",
88
90
  SEND_TX_002_01 = "SEND-TX-002-01",
89
91
  SEND_TX_002_99_99 = "SEND-TX-002-99-99",
@@ -100,9 +102,9 @@ export declare enum PROGRESS_HOOK {
100
102
  UEA_MIG_9902 = "UEA-MIG-9902",
101
103
  UEA_MIG_9903 = "UEA-MIG-9903"
102
104
  }
103
- export type PROGRESS_HOOK_R1 = PROGRESS_HOOK.SEND_TX_101 | PROGRESS_HOOK.SEND_TX_102_01 | PROGRESS_HOOK.SEND_TX_103_01 | PROGRESS_HOOK.SEND_TX_103_02 | PROGRESS_HOOK.SEND_TX_103_03 | PROGRESS_HOOK.SEND_TX_103_03_01 | PROGRESS_HOOK.SEND_TX_103_03_02 | PROGRESS_HOOK.SEND_TX_103_03_03 | PROGRESS_HOOK.SEND_TX_103_03_04 | PROGRESS_HOOK.SEND_TX_104_01 | PROGRESS_HOOK.SEND_TX_104_02 | PROGRESS_HOOK.SEND_TX_104_03 | PROGRESS_HOOK.SEND_TX_104_04 | PROGRESS_HOOK.SEND_TX_105_01 | PROGRESS_HOOK.SEND_TX_105_02 | PROGRESS_HOOK.SEND_TX_106_01 | PROGRESS_HOOK.SEND_TX_106_02 | PROGRESS_HOOK.SEND_TX_106_03 | PROGRESS_HOOK.SEND_TX_106_03_01 | PROGRESS_HOOK.SEND_TX_106_03_02 | PROGRESS_HOOK.SEND_TX_106_04 | PROGRESS_HOOK.SEND_TX_106_05 | PROGRESS_HOOK.SEND_TX_106_06 | PROGRESS_HOOK.SEND_TX_107 | PROGRESS_HOOK.SEND_TX_199_01 | PROGRESS_HOOK.SEND_TX_199_02;
105
+ export type PROGRESS_HOOK_R1 = PROGRESS_HOOK.SEND_TX_101 | PROGRESS_HOOK.SEND_TX_102_01 | PROGRESS_HOOK.SEND_TX_103_01 | PROGRESS_HOOK.SEND_TX_103_02 | PROGRESS_HOOK.SEND_TX_103_03 | PROGRESS_HOOK.SEND_TX_103_03_01 | PROGRESS_HOOK.SEND_TX_103_03_02 | PROGRESS_HOOK.SEND_TX_103_03_03 | PROGRESS_HOOK.SEND_TX_103_03_04 | PROGRESS_HOOK.SEND_TX_104_01 | PROGRESS_HOOK.SEND_TX_104_02 | PROGRESS_HOOK.SEND_TX_104_03 | PROGRESS_HOOK.SEND_TX_104_04 | PROGRESS_HOOK.SEND_TX_105_01 | PROGRESS_HOOK.SEND_TX_105_02 | PROGRESS_HOOK.SEND_TX_106_01 | PROGRESS_HOOK.SEND_TX_106_02 | PROGRESS_HOOK.SEND_TX_106_03 | PROGRESS_HOOK.SEND_TX_106_03_01 | PROGRESS_HOOK.SEND_TX_106_03_02 | PROGRESS_HOOK.SEND_TX_106_04 | PROGRESS_HOOK.SEND_TX_106_05 | PROGRESS_HOOK.SEND_TX_106_06 | PROGRESS_HOOK.SEND_TX_107 | PROGRESS_HOOK.SEND_TX_199_01 | PROGRESS_HOOK.SEND_TX_199_02 | PROGRESS_HOOK.SEND_TX_199_03 | PROGRESS_HOOK.SEND_TX_199_99;
104
106
  export type PROGRESS_HOOK_R2 = PROGRESS_HOOK.SEND_TX_201 | PROGRESS_HOOK.SEND_TX_202_01 | PROGRESS_HOOK.SEND_TX_202_02 | PROGRESS_HOOK.SEND_TX_203_01 | PROGRESS_HOOK.SEND_TX_203_02 | PROGRESS_HOOK.SEND_TX_203_03 | PROGRESS_HOOK.SEND_TX_203_04 | PROGRESS_HOOK.SEND_TX_203_05 | PROGRESS_HOOK.SEND_TX_204_01 | PROGRESS_HOOK.SEND_TX_204_02 | PROGRESS_HOOK.SEND_TX_204_03 | PROGRESS_HOOK.SEND_TX_204_04 | PROGRESS_HOOK.SEND_TX_207 | PROGRESS_HOOK.SEND_TX_209_01 | PROGRESS_HOOK.SEND_TX_209_02 | PROGRESS_HOOK.SEND_TX_299_01 | PROGRESS_HOOK.SEND_TX_299_02 | PROGRESS_HOOK.SEND_TX_299_03 | PROGRESS_HOOK.SEND_TX_299_99;
105
- export type PROGRESS_HOOK_R3 = PROGRESS_HOOK.SEND_TX_199_99_99 | PROGRESS_HOOK.SEND_TX_301 | PROGRESS_HOOK.SEND_TX_302_01 | PROGRESS_HOOK.SEND_TX_302_02 | PROGRESS_HOOK.SEND_TX_303_01 | PROGRESS_HOOK.SEND_TX_303_02 | PROGRESS_HOOK.SEND_TX_303_03_01 | PROGRESS_HOOK.SEND_TX_303_03_02 | PROGRESS_HOOK.SEND_TX_303_03_03 | PROGRESS_HOOK.SEND_TX_303_04 | PROGRESS_HOOK.SEND_TX_303_05 | PROGRESS_HOOK.SEND_TX_303_06 | PROGRESS_HOOK.SEND_TX_304_01 | PROGRESS_HOOK.SEND_TX_304_02 | PROGRESS_HOOK.SEND_TX_304_03 | PROGRESS_HOOK.SEND_TX_304_04 | PROGRESS_HOOK.SEND_TX_307 | PROGRESS_HOOK.SEND_TX_309_01 | PROGRESS_HOOK.SEND_TX_309_02 | PROGRESS_HOOK.SEND_TX_309_03 | PROGRESS_HOOK.SEND_TX_310_01 | PROGRESS_HOOK.SEND_TX_310_02 | PROGRESS_HOOK.SEND_TX_399_01 | PROGRESS_HOOK.SEND_TX_399_02 | PROGRESS_HOOK.SEND_TX_399_03;
107
+ export type PROGRESS_HOOK_R3 = PROGRESS_HOOK.SEND_TX_301 | PROGRESS_HOOK.SEND_TX_302_01 | PROGRESS_HOOK.SEND_TX_302_02 | PROGRESS_HOOK.SEND_TX_303_01 | PROGRESS_HOOK.SEND_TX_303_02 | PROGRESS_HOOK.SEND_TX_303_03_01 | PROGRESS_HOOK.SEND_TX_303_03_02 | PROGRESS_HOOK.SEND_TX_303_03_03 | PROGRESS_HOOK.SEND_TX_303_04 | PROGRESS_HOOK.SEND_TX_303_05 | PROGRESS_HOOK.SEND_TX_303_06 | PROGRESS_HOOK.SEND_TX_304_01 | PROGRESS_HOOK.SEND_TX_304_02 | PROGRESS_HOOK.SEND_TX_304_03 | PROGRESS_HOOK.SEND_TX_304_04 | PROGRESS_HOOK.SEND_TX_307 | PROGRESS_HOOK.SEND_TX_309_01 | PROGRESS_HOOK.SEND_TX_309_02 | PROGRESS_HOOK.SEND_TX_309_03 | PROGRESS_HOOK.SEND_TX_310_01 | PROGRESS_HOOK.SEND_TX_310_02 | PROGRESS_HOOK.SEND_TX_399_01 | PROGRESS_HOOK.SEND_TX_399_02 | PROGRESS_HOOK.SEND_TX_399_03 | PROGRESS_HOOK.SEND_TX_399_99;
106
108
  export type PROGRESS_HOOK_MULTICHAIN = PROGRESS_HOOK.SEND_TX_001 | PROGRESS_HOOK.SEND_TX_002_01 | PROGRESS_HOOK.SEND_TX_002_99_99 | PROGRESS_HOOK.SEND_TX_003_03 | PROGRESS_HOOK.SEND_TX_003_04 | PROGRESS_HOOK.SEND_TX_003_05 | PROGRESS_HOOK.SEND_TX_999_01 | PROGRESS_HOOK.SEND_TX_999_02 | PROGRESS_HOOK.SEND_TX_999_03;
107
109
  export type PROGRESS_HOOK_MIG = PROGRESS_HOOK.UEA_MIG_01 | PROGRESS_HOOK.UEA_MIG_02 | PROGRESS_HOOK.UEA_MIG_03 | PROGRESS_HOOK.UEA_MIG_9901 | PROGRESS_HOOK.UEA_MIG_9902 | PROGRESS_HOOK.UEA_MIG_9903;
108
110
  export {};
@@ -30,7 +30,8 @@ var PROGRESS_HOOK;
30
30
  PROGRESS_HOOK["SEND_TX_107"] = "SEND-TX-107";
31
31
  PROGRESS_HOOK["SEND_TX_199_01"] = "SEND-TX-199-01";
32
32
  PROGRESS_HOOK["SEND_TX_199_02"] = "SEND-TX-199-02";
33
- PROGRESS_HOOK["SEND_TX_199_99_99"] = "SEND-TX-199-99-99";
33
+ PROGRESS_HOOK["SEND_TX_199_03"] = "SEND-TX-199-03";
34
+ PROGRESS_HOOK["SEND_TX_199_99"] = "SEND-TX-199-99";
34
35
  // Route 2: UEA → UGPC → CEA on target chain (201–299)
35
36
  PROGRESS_HOOK["SEND_TX_201"] = "SEND-TX-201";
36
37
  PROGRESS_HOOK["SEND_TX_202_01"] = "SEND-TX-202-01";
@@ -86,6 +87,7 @@ var PROGRESS_HOOK;
86
87
  PROGRESS_HOOK["SEND_TX_399_01"] = "SEND-TX-399-01";
87
88
  PROGRESS_HOOK["SEND_TX_399_02"] = "SEND-TX-399-02";
88
89
  PROGRESS_HOOK["SEND_TX_399_03"] = "SEND-TX-399-03";
90
+ PROGRESS_HOOK["SEND_TX_399_99"] = "SEND-TX-399-99";
89
91
  // Multichain (multi-hop) cascade markers
90
92
  PROGRESS_HOOK["SEND_TX_001"] = "SEND-TX-001";
91
93
  PROGRESS_HOOK["SEND_TX_002_01"] = "SEND-TX-002-01";