@sundaeswap/wallet-lite 0.0.102 → 0.0.104

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/dist/cjs/classes/WalletObserver.class.js +236 -172
  2. package/dist/cjs/classes/WalletObserver.class.js.map +1 -1
  3. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +35 -22
  4. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  5. package/dist/cjs/react-components/hooks/useWalletObserver.js +2 -1
  6. package/dist/cjs/react-components/hooks/useWalletObserver.js.map +1 -1
  7. package/dist/esm/classes/WalletObserver.class.js +49 -0
  8. package/dist/esm/classes/WalletObserver.class.js.map +1 -1
  9. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +4 -0
  10. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  11. package/dist/esm/react-components/hooks/useWalletObserver.js +2 -1
  12. package/dist/esm/react-components/hooks/useWalletObserver.js.map +1 -1
  13. package/dist/types/classes/WalletObserver.class.d.ts +11 -0
  14. package/dist/types/classes/WalletObserver.class.d.ts.map +1 -1
  15. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts +1 -0
  16. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts.map +1 -1
  17. package/dist/types/react-components/hooks/useWalletObserver.d.ts.map +1 -1
  18. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  19. package/package.json +1 -1
  20. package/src/classes/WalletObserver.class.ts +54 -0
  21. package/src/react-components/WalletObserverProvider/hooks/useWalletObserverState.ts +5 -0
  22. package/src/react-components/hooks/useWalletObserver.ts +2 -0
@@ -81,6 +81,8 @@ var WalletObserver = exports.WalletObserver = /*#__PURE__*/function (_WalletObse
81
81
  _defineProperty(_this, "_options", void 0);
82
82
  // Caching
83
83
  _defineProperty(_this, "_cachedMetadata", new Map());
84
+ // AbortController for cancelling in-flight metadata fetches when metadataResolver changes
85
+ _defineProperty(_this, "_metadataAbortController", null);
84
86
  /**
85
87
  * Synchronizes the wallet. This method handles syncing the class
86
88
  * against the currently selected active wallet. If the wallet has
@@ -286,11 +288,26 @@ var WalletObserver = exports.WalletObserver = /*#__PURE__*/function (_WalletObse
286
288
  });
287
289
  /**
288
290
  * Updates the wallet observer options. Merges the new options with the existing ones.
291
+ * If metadataResolver changes, cancels any in-flight metadata fetch, clears the cache,
292
+ * and triggers a new sync if there is an active connection.
289
293
  *
290
294
  * @param {Partial<TWalletObserverOptions<AssetMetadata>>} options - The new options to merge.
291
295
  */
292
296
  _defineProperty(_this, "updateOptions", function (options) {
297
+ var metadataResolverChanged = options.metadataResolver && options.metadataResolver !== _this._options.metadataResolver;
293
298
  _this._options = (0, _merge["default"])(_this._options, options);
299
+
300
+ // If metadataResolver changed, abort in-flight fetch, clear cache, and re-sync
301
+ if (metadataResolverChanged) {
302
+ var _this$_metadataAbortC;
303
+ (_this$_metadataAbortC = _this._metadataAbortController) === null || _this$_metadataAbortC === void 0 || _this$_metadataAbortC.abort();
304
+ _this._cachedMetadata = new Map();
305
+
306
+ // Trigger a new sync if there's an active connection
307
+ if (_this.hasActiveConnection() && !_this._performingSync) {
308
+ _this.sync();
309
+ }
310
+ }
294
311
  });
295
312
  /**
296
313
  * Attempts to connect a wallet using the global window
@@ -427,6 +444,35 @@ var WalletObserver = exports.WalletObserver = /*#__PURE__*/function (_WalletObse
427
444
  _defineProperty(_this, "getCachedAssetMetadata", function () {
428
445
  return _this._cachedMetadata;
429
446
  });
447
+ /**
448
+ * Clears the cached metadata and triggers a fresh sync to re-fetch metadata.
449
+ * Useful when the client wants to manually refresh metadata without changing the resolver.
450
+ *
451
+ * @returns {Promise<void>}
452
+ */
453
+ _defineProperty(_this, "resyncMetadata", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
454
+ var _this$_metadataAbortC2;
455
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
456
+ while (1) switch (_context5.prev = _context5.next) {
457
+ case 0:
458
+ // Abort any in-flight fetch
459
+ (_this$_metadataAbortC2 = _this._metadataAbortController) === null || _this$_metadataAbortC2 === void 0 || _this$_metadataAbortC2.abort();
460
+ // Clear the cache
461
+ _this._cachedMetadata = new Map();
462
+
463
+ // Trigger a new sync if there's an active connection
464
+ if (!_this.hasActiveConnection()) {
465
+ _context5.next = 5;
466
+ break;
467
+ }
468
+ _context5.next = 5;
469
+ return _this.sync();
470
+ case 5:
471
+ case "end":
472
+ return _context5.stop();
473
+ }
474
+ }, _callee5);
475
+ })));
430
476
  /**
431
477
  * Helper function to restore the class instance to its initial state.
432
478
  *
@@ -443,93 +489,93 @@ var WalletObserver = exports.WalletObserver = /*#__PURE__*/function (_WalletObse
443
489
  *
444
490
  * @returns {Promise<string | Error>} The change address, or an error.
445
491
  */
446
- _defineProperty(_this, "getChangeAddress", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
492
+ _defineProperty(_this, "getChangeAddress", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
447
493
  var start, _yield$Promise$all3, _yield$Promise$all4, Cardano, typedHex, cbor, data, end;
448
- return _regeneratorRuntime().wrap(function _callee5$(_context5) {
449
- while (1) switch (_context5.prev = _context5.next) {
494
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
495
+ while (1) switch (_context6.prev = _context6.next) {
450
496
  case 0:
451
497
  if (_this.api) {
452
- _context5.next = 2;
498
+ _context6.next = 2;
453
499
  break;
454
500
  }
455
501
  throw new Error("Attempted to query change address without an API instance.");
456
502
  case 2:
457
503
  start = performance.now();
458
- _context5.next = 5;
504
+ _context6.next = 5;
459
505
  return Promise.all([(0, _getLibs.getCardanoCore)(), (0, _getLibs.getCardanoUtil)()]);
460
506
  case 5:
461
- _yield$Promise$all3 = _context5.sent;
507
+ _yield$Promise$all3 = _context6.sent;
462
508
  _yield$Promise$all4 = _slicedToArray(_yield$Promise$all3, 2);
463
509
  Cardano = _yield$Promise$all4[0].Cardano;
464
510
  typedHex = _yield$Promise$all4[1];
465
- _context5.prev = 9;
466
- _context5.next = 12;
511
+ _context6.prev = 9;
512
+ _context6.next = 12;
467
513
  return _this.api.getChangeAddress();
468
514
  case 12:
469
- cbor = _context5.sent;
470
- _context5.next = 18;
515
+ cbor = _context6.sent;
516
+ _context6.next = 18;
471
517
  break;
472
518
  case 15:
473
- _context5.prev = 15;
474
- _context5.t0 = _context5["catch"](9);
475
- return _context5.abrupt("return", _context5.t0);
519
+ _context6.prev = 15;
520
+ _context6.t0 = _context6["catch"](9);
521
+ return _context6.abrupt("return", _context6.t0);
476
522
  case 18:
477
523
  data = Cardano.Address.fromBytes(typedHex(cbor)).toBech32();
478
524
  end = performance.now();
479
525
  if (_this._options.debug) {
480
526
  console.log("getChangeAddress: ".concat(end - start, "ms"));
481
527
  }
482
- return _context5.abrupt("return", data);
528
+ return _context6.abrupt("return", data);
483
529
  case 22:
484
530
  case "end":
485
- return _context5.stop();
531
+ return _context6.stop();
486
532
  }
487
- }, _callee5, null, [[9, 15]]);
533
+ }, _callee6, null, [[9, 15]]);
488
534
  })));
489
535
  /**
490
536
  * Retrieves the balance of the wallet, including metadata for each asset.
491
537
  *
492
538
  * @returns {Promise<WalletBalanceMap<AssetMetadata>>} - A promise that resolves to a map of asset amounts keyed by asset IDs.
493
539
  */
494
- _defineProperty(_this, "getBalanceMap", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
540
+ _defineProperty(_this, "getBalanceMap", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
495
541
  var _data$multiasset$keys, _data$multiasset, _data$multiasset$entr, _data$multiasset2;
496
542
  var start, _yield$Promise$all5, _yield$Promise$all6, Serialization, typedHex, cbor, data, multiassetKeys, metadata, balanceMap, multiassetEntries, _iterator, _step, _step$value, id, amount, end;
497
- return _regeneratorRuntime().wrap(function _callee6$(_context6) {
498
- while (1) switch (_context6.prev = _context6.next) {
543
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
544
+ while (1) switch (_context7.prev = _context7.next) {
499
545
  case 0:
500
546
  if (_this.api) {
501
- _context6.next = 2;
547
+ _context7.next = 2;
502
548
  break;
503
549
  }
504
550
  throw new Error("Attempted to query balance without an API instance.");
505
551
  case 2:
506
552
  start = performance.now();
507
553
  _this.dispatch(_events.EWalletObserverEvents.GET_BALANCE_MAP_START);
508
- _context6.next = 6;
554
+ _context7.next = 6;
509
555
  return Promise.all([(0, _getLibs.getCardanoCore)(), (0, _getLibs.getCardanoUtil)()]);
510
556
  case 6:
511
- _yield$Promise$all5 = _context6.sent;
557
+ _yield$Promise$all5 = _context7.sent;
512
558
  _yield$Promise$all6 = _slicedToArray(_yield$Promise$all5, 2);
513
559
  Serialization = _yield$Promise$all6[0].Serialization;
514
560
  typedHex = _yield$Promise$all6[1];
515
- _context6.prev = 10;
516
- _context6.next = 13;
561
+ _context7.prev = 10;
562
+ _context7.next = 13;
517
563
  return _this.api.getBalance();
518
564
  case 13:
519
- cbor = _context6.sent;
520
- _context6.next = 19;
565
+ cbor = _context7.sent;
566
+ _context7.next = 19;
521
567
  break;
522
568
  case 16:
523
- _context6.prev = 16;
524
- _context6.t0 = _context6["catch"](10);
525
- return _context6.abrupt("return", _context6.t0);
569
+ _context7.prev = 16;
570
+ _context7.t0 = _context7["catch"](10);
571
+ return _context7.abrupt("return", _context7.t0);
526
572
  case 19:
527
573
  data = Serialization.Value.fromCbor(typedHex(cbor));
528
574
  multiassetKeys = (_data$multiasset$keys = (_data$multiasset = data.multiasset()) === null || _data$multiasset === void 0 ? void 0 : _data$multiasset.keys()) !== null && _data$multiasset$keys !== void 0 ? _data$multiasset$keys : [];
529
- _context6.next = 23;
575
+ _context7.next = 23;
530
576
  return _this.__metadataResolverWithCache([_constants.ADA_ASSET_ID].concat(_toConsumableArray(multiassetKeys)));
531
577
  case 23:
532
- metadata = _context6.sent;
578
+ metadata = _context7.sent;
533
579
  balanceMap = new _WalletBalanceMapClass.WalletBalanceMap(_this);
534
580
  balanceMap.set(_constants.ADA_ASSET_ID, new _asset.AssetAmount(data.coin(), metadata.get(_constants.ADA_ASSET_ID)));
535
581
  multiassetEntries = (_data$multiasset$entr = (_data$multiasset2 = data.multiasset()) === null || _data$multiasset2 === void 0 ? void 0 : _data$multiasset2.entries()) !== null && _data$multiasset$entr !== void 0 ? _data$multiasset$entr : [];
@@ -553,89 +599,89 @@ var WalletObserver = exports.WalletObserver = /*#__PURE__*/function (_WalletObse
553
599
  if (_this._options.debug) {
554
600
  console.log("getBalanceMap: ".concat(end - start, "ms"));
555
601
  }
556
- return _context6.abrupt("return", balanceMap);
602
+ return _context7.abrupt("return", balanceMap);
557
603
  case 32:
558
604
  case "end":
559
- return _context6.stop();
605
+ return _context7.stop();
560
606
  }
561
- }, _callee6, null, [[10, 16]]);
607
+ }, _callee7, null, [[10, 16]]);
562
608
  })));
563
609
  /**
564
610
  * Gets the current network connection.
565
611
  *
566
612
  * @returns {Promise<number | Error>} The network ID or an Error from the wallet.
567
613
  */
568
- _defineProperty(_this, "getNetwork", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
614
+ _defineProperty(_this, "getNetwork", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
569
615
  var start, val, end;
570
- return _regeneratorRuntime().wrap(function _callee7$(_context7) {
571
- while (1) switch (_context7.prev = _context7.next) {
616
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
617
+ while (1) switch (_context8.prev = _context8.next) {
572
618
  case 0:
573
619
  if (_this.api) {
574
- _context7.next = 2;
620
+ _context8.next = 2;
575
621
  break;
576
622
  }
577
623
  throw new Error("Attempted to query network without an API instance.");
578
624
  case 2:
579
625
  start = performance.now();
580
- _context7.prev = 3;
581
- _context7.next = 6;
626
+ _context8.prev = 3;
627
+ _context8.next = 6;
582
628
  return _this.api.getNetworkId();
583
629
  case 6:
584
- val = _context7.sent;
585
- _context7.next = 12;
630
+ val = _context8.sent;
631
+ _context8.next = 12;
586
632
  break;
587
633
  case 9:
588
- _context7.prev = 9;
589
- _context7.t0 = _context7["catch"](3);
590
- return _context7.abrupt("return", _context7.t0);
634
+ _context8.prev = 9;
635
+ _context8.t0 = _context8["catch"](3);
636
+ return _context8.abrupt("return", _context8.t0);
591
637
  case 12:
592
638
  _this.network = val;
593
639
  end = performance.now();
594
640
  if (_this._options.debug) {
595
641
  console.log("getNetwork: ".concat(end - start, "ms"));
596
642
  }
597
- return _context7.abrupt("return", val);
643
+ return _context8.abrupt("return", val);
598
644
  case 16:
599
645
  case "end":
600
- return _context7.stop();
646
+ return _context8.stop();
601
647
  }
602
- }, _callee7, null, [[3, 9]]);
648
+ }, _callee8, null, [[3, 9]]);
603
649
  })));
604
650
  /**
605
651
  * Gets a list of used addresses, encoded as Bech32.
606
652
  *
607
653
  * @returns {Promise<string[]>} The list of addresses.
608
654
  */
609
- _defineProperty(_this, "getUsedAddresses", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
655
+ _defineProperty(_this, "getUsedAddresses", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
610
656
  var start, _yield$Promise$all7, _yield$Promise$all8, Cardano, typedHex, cbor, data, end;
611
- return _regeneratorRuntime().wrap(function _callee8$(_context8) {
612
- while (1) switch (_context8.prev = _context8.next) {
657
+ return _regeneratorRuntime().wrap(function _callee9$(_context9) {
658
+ while (1) switch (_context9.prev = _context9.next) {
613
659
  case 0:
614
660
  if (_this.api) {
615
- _context8.next = 2;
661
+ _context9.next = 2;
616
662
  break;
617
663
  }
618
664
  throw new Error("Attempted to query used addresses without an API instance.");
619
665
  case 2:
620
666
  start = performance.now();
621
- _context8.next = 5;
667
+ _context9.next = 5;
622
668
  return Promise.all([(0, _getLibs.getCardanoCore)(), (0, _getLibs.getCardanoUtil)()]);
623
669
  case 5:
624
- _yield$Promise$all7 = _context8.sent;
670
+ _yield$Promise$all7 = _context9.sent;
625
671
  _yield$Promise$all8 = _slicedToArray(_yield$Promise$all7, 2);
626
672
  Cardano = _yield$Promise$all8[0].Cardano;
627
673
  typedHex = _yield$Promise$all8[1];
628
- _context8.prev = 9;
629
- _context8.next = 12;
674
+ _context9.prev = 9;
675
+ _context9.next = 12;
630
676
  return _this.api.getUsedAddresses();
631
677
  case 12:
632
- cbor = _context8.sent;
633
- _context8.next = 18;
678
+ cbor = _context9.sent;
679
+ _context9.next = 18;
634
680
  break;
635
681
  case 15:
636
- _context8.prev = 15;
637
- _context8.t0 = _context8["catch"](9);
638
- return _context8.abrupt("return", _context8.t0);
682
+ _context9.prev = 15;
683
+ _context9.t0 = _context9["catch"](9);
684
+ return _context9.abrupt("return", _context9.t0);
639
685
  case 18:
640
686
  data = cbor.map(function (val) {
641
687
  return Cardano.Address.fromBytes(typedHex(val)).toBech32();
@@ -644,48 +690,48 @@ var WalletObserver = exports.WalletObserver = /*#__PURE__*/function (_WalletObse
644
690
  if (_this._options.debug) {
645
691
  console.log("getUsedAddresses: ".concat(end - start, "ms"));
646
692
  }
647
- return _context8.abrupt("return", data);
693
+ return _context9.abrupt("return", data);
648
694
  case 22:
649
695
  case "end":
650
- return _context8.stop();
696
+ return _context9.stop();
651
697
  }
652
- }, _callee8, null, [[9, 15]]);
698
+ }, _callee9, null, [[9, 15]]);
653
699
  })));
654
700
  /**
655
701
  * Gets a list of unused addresses, encoded as Bech32.
656
702
  *
657
703
  * @returns {Promise<string[] | Error>} The list of addresses or an Error returned by the wallet.
658
704
  */
659
- _defineProperty(_this, "getUnusedAddresses", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
705
+ _defineProperty(_this, "getUnusedAddresses", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
660
706
  var start, _yield$Promise$all9, _yield$Promise$all10, Cardano, typedHex, cbor, data, end;
661
- return _regeneratorRuntime().wrap(function _callee9$(_context9) {
662
- while (1) switch (_context9.prev = _context9.next) {
707
+ return _regeneratorRuntime().wrap(function _callee10$(_context10) {
708
+ while (1) switch (_context10.prev = _context10.next) {
663
709
  case 0:
664
710
  if (_this.api) {
665
- _context9.next = 2;
711
+ _context10.next = 2;
666
712
  break;
667
713
  }
668
714
  throw new Error("Attempted to query unused addresses without an API instance.");
669
715
  case 2:
670
716
  start = performance.now();
671
- _context9.next = 5;
717
+ _context10.next = 5;
672
718
  return Promise.all([(0, _getLibs.getCardanoCore)(), (0, _getLibs.getCardanoUtil)()]);
673
719
  case 5:
674
- _yield$Promise$all9 = _context9.sent;
720
+ _yield$Promise$all9 = _context10.sent;
675
721
  _yield$Promise$all10 = _slicedToArray(_yield$Promise$all9, 2);
676
722
  Cardano = _yield$Promise$all10[0].Cardano;
677
723
  typedHex = _yield$Promise$all10[1];
678
- _context9.prev = 9;
679
- _context9.next = 12;
724
+ _context10.prev = 9;
725
+ _context10.next = 12;
680
726
  return _this.api.getUnusedAddresses();
681
727
  case 12:
682
- cbor = _context9.sent;
683
- _context9.next = 18;
728
+ cbor = _context10.sent;
729
+ _context10.next = 18;
684
730
  break;
685
731
  case 15:
686
- _context9.prev = 15;
687
- _context9.t0 = _context9["catch"](9);
688
- return _context9.abrupt("return", _context9.t0);
732
+ _context10.prev = 15;
733
+ _context10.t0 = _context10["catch"](9);
734
+ return _context10.abrupt("return", _context10.t0);
689
735
  case 18:
690
736
  data = cbor.map(function (val) {
691
737
  return Cardano.Address.fromBytes(typedHex(val)).toBech32();
@@ -694,49 +740,49 @@ var WalletObserver = exports.WalletObserver = /*#__PURE__*/function (_WalletObse
694
740
  if (_this._options.debug) {
695
741
  console.log("getUnusedAddresses: ".concat(end - start, "ms"));
696
742
  }
697
- return _context9.abrupt("return", data);
743
+ return _context10.abrupt("return", data);
698
744
  case 22:
699
745
  case "end":
700
- return _context9.stop();
746
+ return _context10.stop();
701
747
  }
702
- }, _callee9, null, [[9, 15]]);
748
+ }, _callee10, null, [[9, 15]]);
703
749
  })));
704
750
  /**
705
751
  * Gets a list of wallet UTXOs.
706
752
  *
707
753
  * @returns {Promise<TransactionUnspentOutput[]>} The list of TransactionUnspentOutputs.
708
754
  */
709
- _defineProperty(_this, "getUtxos", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
755
+ _defineProperty(_this, "getUtxos", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11() {
710
756
  var _cbor;
711
757
  var start, _yield$Promise$all11, _yield$Promise$all12, Serialization, typedHex, cbor, data, end;
712
- return _regeneratorRuntime().wrap(function _callee10$(_context10) {
713
- while (1) switch (_context10.prev = _context10.next) {
758
+ return _regeneratorRuntime().wrap(function _callee11$(_context11) {
759
+ while (1) switch (_context11.prev = _context11.next) {
714
760
  case 0:
715
761
  if (_this.api) {
716
- _context10.next = 2;
762
+ _context11.next = 2;
717
763
  break;
718
764
  }
719
765
  throw new Error("Attempted to query UTXOs without an API instance.");
720
766
  case 2:
721
767
  start = performance.now();
722
- _context10.next = 5;
768
+ _context11.next = 5;
723
769
  return Promise.all([(0, _getLibs.getCardanoCore)(), (0, _getLibs.getCardanoUtil)()]);
724
770
  case 5:
725
- _yield$Promise$all11 = _context10.sent;
771
+ _yield$Promise$all11 = _context11.sent;
726
772
  _yield$Promise$all12 = _slicedToArray(_yield$Promise$all11, 2);
727
773
  Serialization = _yield$Promise$all12[0].Serialization;
728
774
  typedHex = _yield$Promise$all12[1];
729
- _context10.prev = 9;
730
- _context10.next = 12;
775
+ _context11.prev = 9;
776
+ _context11.next = 12;
731
777
  return _this.api.getUtxos();
732
778
  case 12:
733
- cbor = _context10.sent;
734
- _context10.next = 18;
779
+ cbor = _context11.sent;
780
+ _context11.next = 18;
735
781
  break;
736
782
  case 15:
737
- _context10.prev = 15;
738
- _context10.t0 = _context10["catch"](9);
739
- return _context10.abrupt("return", _context10.t0);
783
+ _context11.prev = 15;
784
+ _context11.t0 = _context11["catch"](9);
785
+ return _context11.abrupt("return", _context11.t0);
740
786
  case 18:
741
787
  data = (_cbor = cbor) === null || _cbor === void 0 ? void 0 : _cbor.map(function (val) {
742
788
  var txOutput = Serialization.TransactionUnspentOutput.fromCbor(typedHex(val));
@@ -750,93 +796,93 @@ var WalletObserver = exports.WalletObserver = /*#__PURE__*/function (_WalletObse
750
796
  if (_this._options.debug) {
751
797
  console.log("getUtxos: ".concat(end - start, "ms"));
752
798
  }
753
- return _context10.abrupt("return", data);
799
+ return _context11.abrupt("return", data);
754
800
  case 22:
755
801
  case "end":
756
- return _context10.stop();
802
+ return _context11.stop();
757
803
  }
758
- }, _callee10, null, [[9, 15]]);
804
+ }, _callee11, null, [[9, 15]]);
759
805
  })));
760
806
  /**
761
807
  * Gets the fee address set by the wallet, if available.
762
808
  *
763
809
  * @returns {Promise<string | Error | undefined>} The fee address or an Error.
764
810
  */
765
- _defineProperty(_this, "getFeeAddress", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11() {
811
+ _defineProperty(_this, "getFeeAddress", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12() {
766
812
  var start, _window$cardano3, address, end;
767
- return _regeneratorRuntime().wrap(function _callee11$(_context11) {
768
- while (1) switch (_context11.prev = _context11.next) {
813
+ return _regeneratorRuntime().wrap(function _callee12$(_context12) {
814
+ while (1) switch (_context12.prev = _context12.next) {
769
815
  case 0:
770
816
  if (_this.api) {
771
- _context11.next = 2;
817
+ _context12.next = 2;
772
818
  break;
773
819
  }
774
820
  throw new Error("Attempted to query fee address without an API instance.");
775
821
  case 2:
776
822
  start = performance.now();
777
- _context11.prev = 3;
823
+ _context12.prev = 3;
778
824
  address = (_window$cardano3 = window.cardano) === null || _window$cardano3 === void 0 || (_window$cardano3 = _window$cardano3[_this.activeWallet]) === null || _window$cardano3 === void 0 || (_window$cardano3 = _window$cardano3.experimental) === null || _window$cardano3 === void 0 ? void 0 : _window$cardano3.feeAddress;
779
825
  end = performance.now();
780
826
  if (_this._options.debug) {
781
827
  console.log("getFeeAddress: ".concat(end - start, "ms"));
782
828
  }
783
- return _context11.abrupt("return", address);
829
+ return _context12.abrupt("return", address);
784
830
  case 10:
785
- _context11.prev = 10;
786
- _context11.t0 = _context11["catch"](3);
787
- return _context11.abrupt("return", _context11.t0);
831
+ _context12.prev = 10;
832
+ _context12.t0 = _context12["catch"](3);
833
+ return _context12.abrupt("return", _context12.t0);
788
834
  case 13:
789
835
  case "end":
790
- return _context11.stop();
836
+ return _context12.stop();
791
837
  }
792
- }, _callee11, null, [[3, 10]]);
838
+ }, _callee12, null, [[3, 10]]);
793
839
  })));
794
840
  /**
795
841
  * Gets a list of wallet UTXOs suitable for collateral.
796
842
  *
797
843
  * @returns {Promise<TransactionUnspentOutput[] | Error | undefined>} The list of TransactionUnspentOutputs, if there are any, or an Error.
798
844
  */
799
- _defineProperty(_this, "getCollateral", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12() {
845
+ _defineProperty(_this, "getCollateral", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee13() {
800
846
  var _cbor2;
801
847
  var start, _yield$Promise$all13, _yield$Promise$all14, Serialization, typedHex, cbor, _this$api, _this$api2, funcCall, data, end;
802
- return _regeneratorRuntime().wrap(function _callee12$(_context12) {
803
- while (1) switch (_context12.prev = _context12.next) {
848
+ return _regeneratorRuntime().wrap(function _callee13$(_context13) {
849
+ while (1) switch (_context13.prev = _context13.next) {
804
850
  case 0:
805
851
  if (_this.api) {
806
- _context12.next = 2;
852
+ _context13.next = 2;
807
853
  break;
808
854
  }
809
855
  throw new Error("Attempted to query UTXOs without an API instance.");
810
856
  case 2:
811
857
  start = performance.now();
812
- _context12.next = 5;
858
+ _context13.next = 5;
813
859
  return Promise.all([(0, _getLibs.getCardanoCore)(), (0, _getLibs.getCardanoUtil)()]);
814
860
  case 5:
815
- _yield$Promise$all13 = _context12.sent;
861
+ _yield$Promise$all13 = _context13.sent;
816
862
  _yield$Promise$all14 = _slicedToArray(_yield$Promise$all13, 2);
817
863
  Serialization = _yield$Promise$all14[0].Serialization;
818
864
  typedHex = _yield$Promise$all14[1];
819
- _context12.prev = 9;
865
+ _context13.prev = 9;
820
866
  funcCall = ((_this$api = _this.api) === null || _this$api === void 0 ? void 0 : _this$api.getCollateral) || ((_this$api2 = _this.api) === null || _this$api2 === void 0 ? void 0 : _this$api2.experimental.getCollateral);
821
867
  if (!(typeof funcCall !== "function")) {
822
- _context12.next = 15;
868
+ _context13.next = 15;
823
869
  break;
824
870
  }
825
871
  cbor = [];
826
- _context12.next = 18;
872
+ _context13.next = 18;
827
873
  break;
828
874
  case 15:
829
- _context12.next = 17;
875
+ _context13.next = 17;
830
876
  return funcCall();
831
877
  case 17:
832
- cbor = _context12.sent;
878
+ cbor = _context13.sent;
833
879
  case 18:
834
- _context12.next = 23;
880
+ _context13.next = 23;
835
881
  break;
836
882
  case 20:
837
- _context12.prev = 20;
838
- _context12.t0 = _context12["catch"](9);
839
- return _context12.abrupt("return", _context12.t0);
883
+ _context13.prev = 20;
884
+ _context13.t0 = _context13["catch"](9);
885
+ return _context13.abrupt("return", _context13.t0);
840
886
  case 23:
841
887
  data = (_cbor2 = cbor) === null || _cbor2 === void 0 ? void 0 : _cbor2.map(function (val) {
842
888
  var txOutput = Serialization.TransactionUnspentOutput.fromCbor(typedHex(val));
@@ -850,29 +896,31 @@ var WalletObserver = exports.WalletObserver = /*#__PURE__*/function (_WalletObse
850
896
  if (_this._options.debug) {
851
897
  console.log("getCollateral: ".concat(end - start, "ms"));
852
898
  }
853
- return _context12.abrupt("return", data);
899
+ return _context13.abrupt("return", data);
854
900
  case 27:
855
901
  case "end":
856
- return _context12.stop();
902
+ return _context13.stop();
857
903
  }
858
- }, _callee12, null, [[9, 20]]);
904
+ }, _callee13, null, [[9, 20]]);
859
905
  })));
860
906
  /**
861
907
  * Resolves metadata for the given asset IDs, using a cached version if available.
908
+ * Aborts any in-flight fetch when called, ensuring only the latest request completes.
862
909
  *
863
910
  * @private
864
911
  * @param {string[]} assetIds - The IDs of the assets to resolve metadata for.
865
912
  * @returns {Promise<Map<string, AssetMetadata>>} - A promise that resolves to a map of asset metadata.
866
913
  */
867
914
  _defineProperty(_this, "__metadataResolverWithCache", /*#__PURE__*/function () {
868
- var _ref13 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee13(assetIds) {
869
- var start, cachedKeys, inputKeys, _end, attempts, newMetadata, end;
870
- return _regeneratorRuntime().wrap(function _callee13$(_context13) {
871
- while (1) switch (_context13.prev = _context13.next) {
915
+ var _ref14 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee14(assetIds) {
916
+ var _this$_metadataAbortC3;
917
+ var start, cachedKeys, inputKeys, _end, currentController, attempts, newMetadata, end;
918
+ return _regeneratorRuntime().wrap(function _callee14$(_context14) {
919
+ while (1) switch (_context14.prev = _context14.next) {
872
920
  case 0:
873
921
  start = performance.now();
874
922
  if (!_this._cachedMetadata) {
875
- _context13.next = 8;
923
+ _context14.next = 8;
876
924
  break;
877
925
  }
878
926
  cachedKeys = new Set(_this._cachedMetadata.keys());
@@ -880,67 +928,83 @@ var WalletObserver = exports.WalletObserver = /*#__PURE__*/function (_WalletObse
880
928
  if (!(cachedKeys.size === inputKeys.size && _toConsumableArray(cachedKeys).every(function (key) {
881
929
  return inputKeys.has(key);
882
930
  }))) {
883
- _context13.next = 8;
931
+ _context14.next = 8;
884
932
  break;
885
933
  }
886
934
  _end = performance.now();
887
935
  if (_this._options.debug) {
888
936
  console.log("metadataResolver (cached): ".concat(_end - start, "ms"));
889
937
  }
890
- return _context13.abrupt("return", _this._cachedMetadata);
938
+ return _context14.abrupt("return", _this._cachedMetadata);
891
939
  case 8:
940
+ // Abort any in-flight metadata fetch
941
+ (_this$_metadataAbortC3 = _this._metadataAbortController) === null || _this$_metadataAbortC3 === void 0 || _this$_metadataAbortC3.abort();
942
+ _this._metadataAbortController = new AbortController();
943
+ currentController = _this._metadataAbortController;
892
944
  attempts = 0;
893
- case 9:
945
+ case 12:
894
946
  if (!(attempts <= 3 && !newMetadata)) {
895
- _context13.next = 21;
947
+ _context14.next = 24;
896
948
  break;
897
949
  }
898
- _context13.prev = 10;
899
- _context13.next = 13;
950
+ _context14.prev = 13;
951
+ _context14.next = 16;
900
952
  return _this._options.metadataResolver({
901
953
  assetIds: assetIds.map(_assets.normalizeAssetIdWithDot),
902
954
  normalizeAssetId: _assets.normalizeAssetIdWithDot,
903
955
  isAdaAsset: _assets.isAdaAsset
904
956
  });
905
- case 13:
906
- newMetadata = _context13.sent;
907
- _context13.next = 19;
908
- break;
909
957
  case 16:
910
- _context13.prev = 16;
911
- _context13.t0 = _context13["catch"](10);
912
- attempts++;
958
+ newMetadata = _context14.sent;
959
+ _context14.next = 22;
960
+ break;
913
961
  case 19:
914
- _context13.next = 9;
962
+ _context14.prev = 19;
963
+ _context14.t0 = _context14["catch"](13);
964
+ attempts++;
965
+ case 22:
966
+ _context14.next = 12;
915
967
  break;
916
- case 21:
968
+ case 24:
969
+ if (!currentController.signal.aborted) {
970
+ _context14.next = 26;
971
+ break;
972
+ }
973
+ return _context14.abrupt("return", _this._cachedMetadata);
974
+ case 26:
917
975
  if (newMetadata) {
918
- _context13.next = 25;
976
+ _context14.next = 30;
919
977
  break;
920
978
  }
921
- _context13.next = 24;
979
+ _context14.next = 29;
922
980
  return _this.fallbackMetadataResolver({
923
981
  assetIds: assetIds.map(_assets.normalizeAssetIdWithDot),
924
982
  normalizeAssetId: _assets.normalizeAssetIdWithDot,
925
983
  isAdaAsset: _assets.isAdaAsset
926
984
  });
927
- case 24:
928
- newMetadata = _context13.sent;
929
- case 25:
985
+ case 29:
986
+ newMetadata = _context14.sent;
987
+ case 30:
988
+ if (!currentController.signal.aborted) {
989
+ _context14.next = 32;
990
+ break;
991
+ }
992
+ return _context14.abrupt("return", _this._cachedMetadata);
993
+ case 32:
930
994
  _this._cachedMetadata = newMetadata;
931
995
  end = performance.now();
932
996
  if (_this._options.debug) {
933
997
  console.log("metadataResolver: ".concat(end - start, "ms"));
934
998
  }
935
- return _context13.abrupt("return", newMetadata);
936
- case 29:
999
+ return _context14.abrupt("return", newMetadata);
1000
+ case 36:
937
1001
  case "end":
938
- return _context13.stop();
1002
+ return _context14.stop();
939
1003
  }
940
- }, _callee13, null, [[10, 16]]);
1004
+ }, _callee14, null, [[13, 19]]);
941
1005
  }));
942
1006
  return function (_x3) {
943
- return _ref13.apply(this, arguments);
1007
+ return _ref14.apply(this, arguments);
944
1008
  };
945
1009
  }());
946
1010
  /**
@@ -949,12 +1013,12 @@ var WalletObserver = exports.WalletObserver = /*#__PURE__*/function (_WalletObse
949
1013
  * @type {TMetadataResolverFunc<AssetMetadata>}
950
1014
  */
951
1015
  _defineProperty(_this, "fallbackMetadataResolver", /*#__PURE__*/function () {
952
- var _ref15 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee14(_ref14) {
1016
+ var _ref16 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee15(_ref15) {
953
1017
  var assetIds, map;
954
- return _regeneratorRuntime().wrap(function _callee14$(_context14) {
955
- while (1) switch (_context14.prev = _context14.next) {
1018
+ return _regeneratorRuntime().wrap(function _callee15$(_context15) {
1019
+ while (1) switch (_context15.prev = _context15.next) {
956
1020
  case 0:
957
- assetIds = _ref14.assetIds;
1021
+ assetIds = _ref15.assetIds;
958
1022
  map = new Map();
959
1023
  assetIds.forEach(function (id) {
960
1024
  return map.set((0, _assets.normalizeAssetIdWithDot)(id), {
@@ -962,15 +1026,15 @@ var WalletObserver = exports.WalletObserver = /*#__PURE__*/function (_WalletObse
962
1026
  decimals: 6
963
1027
  });
964
1028
  });
965
- return _context14.abrupt("return", map);
1029
+ return _context15.abrupt("return", map);
966
1030
  case 4:
967
1031
  case "end":
968
- return _context14.stop();
1032
+ return _context15.stop();
969
1033
  }
970
- }, _callee14);
1034
+ }, _callee15);
971
1035
  }));
972
1036
  return function (_x4) {
973
- return _ref15.apply(this, arguments);
1037
+ return _ref16.apply(this, arguments);
974
1038
  };
975
1039
  }());
976
1040
  _this._options = (0, _merge["default"])({
@@ -1040,25 +1104,25 @@ var WalletObserver = exports.WalletObserver = /*#__PURE__*/function (_WalletObse
1040
1104
  * @returns {Promise<WalletObserverUtils>} Resolves to a WalletObserverUtils class.
1041
1105
  */
1042
1106
  function () {
1043
- var _getUtils = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee15() {
1044
- return _regeneratorRuntime().wrap(function _callee15$(_context15) {
1045
- while (1) switch (_context15.prev = _context15.next) {
1107
+ var _getUtils = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee16() {
1108
+ return _regeneratorRuntime().wrap(function _callee16$(_context16) {
1109
+ while (1) switch (_context16.prev = _context16.next) {
1046
1110
  case 0:
1047
1111
  if (this.utils) {
1048
- _context15.next = 4;
1112
+ _context16.next = 4;
1049
1113
  break;
1050
1114
  }
1051
- _context15.next = 3;
1115
+ _context16.next = 3;
1052
1116
  return _WalletObserverUtilsClass.WalletObserverUtils["new"](this.network);
1053
1117
  case 3:
1054
- this.utils = _context15.sent;
1118
+ this.utils = _context16.sent;
1055
1119
  case 4:
1056
- return _context15.abrupt("return", this.utils);
1120
+ return _context16.abrupt("return", this.utils);
1057
1121
  case 5:
1058
1122
  case "end":
1059
- return _context15.stop();
1123
+ return _context16.stop();
1060
1124
  }
1061
- }, _callee15, this);
1125
+ }, _callee16, this);
1062
1126
  }));
1063
1127
  function getUtils() {
1064
1128
  return _getUtils.apply(this, arguments);