@pioneer-platform/blockbook 8.7.1 → 8.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @pioneer-platform/blockbook
2
2
 
3
+ ## 8.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Automated minor version bump for all packages
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @pioneer-platform/loggerdog@8.8.0
13
+ - @pioneer-platform/nodes@8.8.0
14
+ - @pioneer-platform/pioneer-caip@9.7.0
15
+
3
16
  ## 8.7.1
4
17
 
5
18
  ### Patch Changes
package/lib/index.d.ts CHANGED
@@ -38,7 +38,17 @@ declare let get_info_by_pubkey: (coin: string, pubkey: string, page?: string | u
38
38
  declare let get_txids_by_address: (coin: string, address: string, page?: number) => Promise<any>;
39
39
  declare let get_info_by_address: (coin: string, address: string, filter?: string) => Promise<any>;
40
40
  declare let get_txs_by_xpub: (coin: string, xpub: string) => Promise<any>;
41
- declare let broadcast_transaction: (coin: string, hex: string) => Promise<any>;
41
+ declare let broadcast_transaction: (coin: string, hex: string) => Promise<{
42
+ success: boolean;
43
+ txid: any;
44
+ error?: undefined;
45
+ statusCode?: undefined;
46
+ } | {
47
+ success: boolean;
48
+ error: string;
49
+ statusCode: number;
50
+ txid?: undefined;
51
+ }>;
42
52
  declare let get_transaction: (coin: string, txid: string) => Promise<any>;
43
53
  declare let get_utxos_by_xpub: (coin: string, xpub: string) => Promise<any>;
44
54
  declare let update_node_performance: (coin: string, url: string, success: boolean, responseTime: number) => void;
package/lib/index.js CHANGED
@@ -494,7 +494,7 @@ var get_txs_by_xpub = function (coin, xpub) {
494
494
  };
495
495
  var broadcast_transaction = function (coin, hex) {
496
496
  return __awaiter(this, void 0, void 0, function () {
497
- var tag, url, data, body, output, resp, e_7, errorMessage, statusCode, e_8;
497
+ var tag, symbol, nodes_2, activeNodes, MAX_RETRIES, RETRY_DELAY_MS_1, allErrors, retry, i, node, startTime, url, body, resp, responseTime, txid, error_1, responseTime, errorMessage, statusCode, attemptInfo, errorSummary, e_7;
498
498
  var _a, _b;
499
499
  return __generator(this, function (_c) {
500
500
  switch (_c.label) {
@@ -502,9 +502,36 @@ var broadcast_transaction = function (coin, hex) {
502
502
  tag = TAG + " | broadcast_transaction | ";
503
503
  _c.label = 1;
504
504
  case 1:
505
- _c.trys.push([1, 6, , 7]);
506
- url = BLOCKBOOK_URLS[coin.toUpperCase()] + "/api/v2/sendtx/";
507
- data = hex;
505
+ _c.trys.push([1, 12, , 13]);
506
+ symbol = coin.toUpperCase();
507
+ nodes_2 = BLOCKBOOK_NODES[symbol];
508
+ if (!nodes_2 || nodes_2.length === 0) {
509
+ throw new Error("No nodes configured for ".concat(symbol));
510
+ }
511
+ activeNodes = nodes_2.filter(function (n) { return n.isActive; }).sort(function (a, b) { return a.priority - b.priority; });
512
+ if (activeNodes.length === 0) {
513
+ throw new Error("No active nodes available for ".concat(symbol));
514
+ }
515
+ log.info(tag, "Attempting broadcast for ".concat(symbol, " with ").concat(activeNodes.length, " nodes available"));
516
+ MAX_RETRIES = 3;
517
+ RETRY_DELAY_MS_1 = 1000;
518
+ allErrors = [];
519
+ retry = 0;
520
+ _c.label = 2;
521
+ case 2:
522
+ if (!(retry < MAX_RETRIES)) return [3 /*break*/, 11];
523
+ log.info(tag, "Broadcast attempt ".concat(retry + 1, "/").concat(MAX_RETRIES));
524
+ i = 0;
525
+ _c.label = 3;
526
+ case 3:
527
+ if (!(i < activeNodes.length)) return [3 /*break*/, 8];
528
+ node = activeNodes[i];
529
+ startTime = Date.now();
530
+ _c.label = 4;
531
+ case 4:
532
+ _c.trys.push([4, 6, , 7]);
533
+ log.info(tag, "Trying node ".concat(i + 1, "/").concat(activeNodes.length, ": ").concat(node.url, " (priority: ").concat(node.priority, ") [attempt ").concat(retry + 1, "]"));
534
+ url = node.url + "/api/v2/sendtx/";
508
535
  body = {
509
536
  url: url,
510
537
  headers: {
@@ -512,75 +539,94 @@ var broadcast_transaction = function (coin, hex) {
512
539
  'User-Agent': fakeUa()
513
540
  },
514
541
  method: 'POST',
515
- data: data,
516
- };
517
- output = {
518
- success: false
542
+ data: hex,
543
+ timeout: 15000 // 15s timeout per node
519
544
  };
520
- resp = void 0;
521
- _c.label = 2;
522
- case 2:
523
- _c.trys.push([2, 4, , 5]);
524
- return [4 /*yield*/, axios(body)
525
- // Only store serializable data, not the full axios response
526
- ];
527
- case 3:
545
+ return [4 /*yield*/, axios(body)];
546
+ case 5:
528
547
  resp = _c.sent();
529
- // Only store serializable data, not the full axios response
530
- output.txid = ((_a = resp.data) === null || _a === void 0 ? void 0 : _a.result) || resp.data;
531
- output.success = true;
532
- return [3 /*break*/, 5];
533
- case 4:
534
- e_7 = _c.sent();
535
- log.error(tag, "Broadcast error: ", e_7.message || e_7);
548
+ responseTime = Date.now() - startTime;
549
+ // Update node performance metrics
550
+ update_node_performance(symbol, node.url, true, responseTime);
551
+ txid = ((_a = resp.data) === null || _a === void 0 ? void 0 : _a.result) || resp.data;
552
+ log.info(tag, "\u2705 Broadcast succeeded via node ".concat(i + 1, " in ").concat(responseTime, "ms on attempt ").concat(retry + 1, ". TXID: ").concat(txid));
553
+ return [2 /*return*/, {
554
+ success: true,
555
+ txid: txid
556
+ }];
557
+ case 6:
558
+ error_1 = _c.sent();
559
+ responseTime = Date.now() - startTime;
560
+ // Update node performance metrics
561
+ update_node_performance(symbol, node.url, false, responseTime);
536
562
  errorMessage = 'Unknown error occurred';
537
563
  statusCode = null;
538
- if (e_7.response) {
539
- statusCode = e_7.response.status;
540
- log.debug(tag, "HTTP Status: ", statusCode);
541
- log.debug(tag, "Response headers: ", e_7.response.headers);
542
- if (e_7.response.data) {
543
- log.debug(tag, "Response data: ", e_7.response.data);
544
- if (e_7.response.data.error) {
545
- errorMessage = e_7.response.data.error;
546
- log.error(tag, "API Error: ", errorMessage);
564
+ if (error_1.response) {
565
+ statusCode = error_1.response.status;
566
+ log.error(tag, "Node ".concat(i + 1, " HTTP Status: "), statusCode);
567
+ log.error(tag, "Node ".concat(i + 1, " Response headers: "), error_1.response.headers);
568
+ if (error_1.response.data) {
569
+ log.error(tag, "Node ".concat(i + 1, " Response data: "), error_1.response.data);
570
+ if (error_1.response.data.error) {
571
+ errorMessage = error_1.response.data.error;
547
572
  }
548
- else if (typeof e_7.response.data === 'string') {
549
- errorMessage = e_7.response.data;
573
+ else if (typeof error_1.response.data === 'string') {
574
+ errorMessage = error_1.response.data;
550
575
  }
551
576
  else {
552
- errorMessage = "HTTP ".concat(statusCode, ": ").concat(e_7.response.statusText || 'Request failed');
577
+ errorMessage = "HTTP ".concat(statusCode, ": ").concat(error_1.response.statusText || 'Request failed');
578
+ log.error(tag, "Node ".concat(i + 1, " Full response object: "), JSON.stringify(error_1.response.data));
553
579
  }
554
580
  }
555
581
  else {
556
- errorMessage = "HTTP ".concat(statusCode, ": ").concat(e_7.response.statusText || 'Request failed');
582
+ errorMessage = "HTTP ".concat(statusCode, ": ").concat(error_1.response.statusText || 'Request failed');
557
583
  }
558
584
  }
559
- else if (e_7.request) {
560
- // Request was made but no response received
585
+ else if (error_1.request) {
561
586
  errorMessage = 'Network error: No response received';
562
- log.debug(tag, "Request config: ", (_b = e_7.config) === null || _b === void 0 ? void 0 : _b.url);
587
+ log.error(tag, "Node ".concat(i + 1, " Request config: "), (_b = error_1.config) === null || _b === void 0 ? void 0 : _b.url);
563
588
  }
564
589
  else {
565
- // Something else happened
566
- errorMessage = e_7.message || 'Request setup error';
590
+ errorMessage = error_1.message || 'Request setup error';
567
591
  }
568
- output.error = errorMessage;
569
- output.statusCode = statusCode;
570
- return [3 /*break*/, 5];
571
- case 5: return [2 /*return*/, output];
572
- case 6:
573
- e_8 = _c.sent();
574
- console.error(tag, 'error: ', e_8);
575
- throw e_8;
576
- case 7: return [2 /*return*/];
592
+ attemptInfo = "[Node ".concat(i + 1, ", Attempt ").concat(retry + 1, "/").concat(MAX_RETRIES, "]");
593
+ log.error(tag, "\u274C ".concat(attemptInfo, " failed after ").concat(responseTime, "ms: ").concat(errorMessage));
594
+ allErrors.push("".concat(attemptInfo, " ").concat(errorMessage));
595
+ // Continue to next node in this retry round
596
+ return [3 /*break*/, 7];
597
+ case 7:
598
+ i++;
599
+ return [3 /*break*/, 3];
600
+ case 8:
601
+ if (!(retry < MAX_RETRIES - 1)) return [3 /*break*/, 10];
602
+ log.info(tag, "All nodes failed in attempt ".concat(retry + 1, ". Waiting ").concat(RETRY_DELAY_MS_1, "ms before retry..."));
603
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, RETRY_DELAY_MS_1); })];
604
+ case 9:
605
+ _c.sent();
606
+ _c.label = 10;
607
+ case 10:
608
+ retry++;
609
+ return [3 /*break*/, 2];
610
+ case 11:
611
+ errorSummary = "All ".concat(activeNodes.length, " nodes failed after ").concat(MAX_RETRIES, " attempts each. Errors:\n").concat(allErrors.join('\n'));
612
+ log.error(tag, errorSummary);
613
+ return [2 /*return*/, {
614
+ success: false,
615
+ error: errorSummary,
616
+ statusCode: 500
617
+ }];
618
+ case 12:
619
+ e_7 = _c.sent();
620
+ console.error(tag, 'error: ', e_7);
621
+ throw e_7;
622
+ case 13: return [2 /*return*/];
577
623
  }
578
624
  });
579
625
  });
580
626
  };
581
627
  var get_transaction = function (coin, txid) {
582
628
  return __awaiter(this, void 0, void 0, function () {
583
- var tag, url, body, resp, e_9;
629
+ var tag, url, body, resp, e_8;
584
630
  return __generator(this, function (_a) {
585
631
  switch (_a.label) {
586
632
  case 0:
@@ -603,9 +649,9 @@ var get_transaction = function (coin, txid) {
603
649
  resp = _a.sent();
604
650
  return [2 /*return*/, resp.data];
605
651
  case 3:
606
- e_9 = _a.sent();
607
- console.error(tag, e_9);
608
- throw e_9;
652
+ e_8 = _a.sent();
653
+ console.error(tag, e_8);
654
+ throw e_8;
609
655
  case 4: return [2 /*return*/];
610
656
  }
611
657
  });
@@ -614,7 +660,7 @@ var get_transaction = function (coin, txid) {
614
660
  // Enhanced UTXO function with priority-based sequential failover
615
661
  var get_utxos_by_xpub = function (coin, xpub) {
616
662
  return __awaiter(this, void 0, void 0, function () {
617
- var tag, symbol, nodes_2, activeNodes, i, node, startTime, url, body, resp, responseTime, error_1, responseTime, errorMessage, e_10;
663
+ var tag, symbol, nodes_3, activeNodes, i, node, startTime, url, body, resp, responseTime, error_2, responseTime, errorMessage, e_9;
618
664
  return __generator(this, function (_a) {
619
665
  switch (_a.label) {
620
666
  case 0:
@@ -623,11 +669,11 @@ var get_utxos_by_xpub = function (coin, xpub) {
623
669
  case 1:
624
670
  _a.trys.push([1, 8, , 9]);
625
671
  symbol = coin.toUpperCase();
626
- nodes_2 = BLOCKBOOK_NODES[symbol];
627
- if (!nodes_2 || nodes_2.length === 0) {
672
+ nodes_3 = BLOCKBOOK_NODES[symbol];
673
+ if (!nodes_3 || nodes_3.length === 0) {
628
674
  throw new Error("No nodes configured for ".concat(symbol));
629
675
  }
630
- activeNodes = nodes_2.filter(function (n) { return n.isActive; }).sort(function (a, b) { return a.priority - b.priority; });
676
+ activeNodes = nodes_3.filter(function (n) { return n.isActive; }).sort(function (a, b) { return a.priority - b.priority; });
631
677
  if (activeNodes.length === 0) {
632
678
  throw new Error("No active nodes available for ".concat(symbol));
633
679
  }
@@ -657,11 +703,11 @@ var get_utxos_by_xpub = function (coin, xpub) {
657
703
  log.info(tag, "\u2705 Node ".concat(i + 1, " succeeded in ").concat(responseTime, "ms, returned ").concat(resp.data.length, " UTXOs"));
658
704
  return [2 /*return*/, resp.data];
659
705
  case 5:
660
- error_1 = _a.sent();
706
+ error_2 = _a.sent();
661
707
  responseTime = Date.now() - startTime;
662
708
  // Update node performance metrics
663
709
  update_node_performance(symbol, node.url, false, responseTime);
664
- errorMessage = error_1 instanceof Error ? error_1.message : String(error_1);
710
+ errorMessage = error_2 instanceof Error ? error_2.message : String(error_2);
665
711
  log.warn(tag, "\u274C Node ".concat(i + 1, " failed after ").concat(responseTime, "ms:"), errorMessage);
666
712
  // If this is the last node, throw the error
667
713
  if (i === activeNodes.length - 1) {
@@ -674,9 +720,9 @@ var get_utxos_by_xpub = function (coin, xpub) {
674
720
  return [3 /*break*/, 2];
675
721
  case 7: return [3 /*break*/, 9];
676
722
  case 8:
677
- e_10 = _a.sent();
678
- console.error(tag, e_10);
679
- throw e_10;
723
+ e_9 = _a.sent();
724
+ console.error(tag, e_9);
725
+ throw e_9;
680
726
  case 9: return [2 /*return*/];
681
727
  }
682
728
  });
@@ -730,7 +776,7 @@ var update_node_performance = function (coin, url, success, responseTime) {
730
776
  };
731
777
  var get_balance_by_xpub = function (coin, xpub) {
732
778
  return __awaiter(this, void 0, void 0, function () {
733
- var tag, output, balance, i, uxto, e_11;
779
+ var tag, output, balance, i, uxto, e_10;
734
780
  return __generator(this, function (_a) {
735
781
  switch (_a.label) {
736
782
  case 0:
@@ -752,9 +798,9 @@ var get_balance_by_xpub = function (coin, xpub) {
752
798
  }
753
799
  return [2 /*return*/, balance / 100000000];
754
800
  case 3:
755
- e_11 = _a.sent();
756
- console.error(tag, e_11);
757
- throw e_11;
801
+ e_10 = _a.sent();
802
+ console.error(tag, e_10);
803
+ throw e_10;
758
804
  case 4: return [2 /*return*/];
759
805
  }
760
806
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pioneer-platform/blockbook",
3
- "version": "8.7.1",
3
+ "version": "8.8.0",
4
4
  "main": "./lib/index.js",
5
5
  "types": "./lib/index.d.ts",
6
6
  "scripts": {
@@ -11,9 +11,9 @@
11
11
  "build:live": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/index.ts"
12
12
  },
13
13
  "dependencies": {
14
- "@pioneer-platform/loggerdog": "^8.7.1",
15
- "@pioneer-platform/nodes": "^8.7.1",
16
- "@pioneer-platform/pioneer-caip": "^9.6.1",
14
+ "@pioneer-platform/loggerdog": "^8.8.0",
15
+ "@pioneer-platform/nodes": "^8.8.0",
16
+ "@pioneer-platform/pioneer-caip": "^9.7.0",
17
17
  "@types/request-promise-native": "^1.0.17",
18
18
  "axiom": "^0.1.6",
19
19
  "axios": "^1.6.0",