@pioneer-platform/blockbook 8.7.1 → 8.8.1
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 +23 -0
- package/lib/index.d.ts +11 -1
- package/lib/index.js +113 -67
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# @pioneer-platform/blockbook
|
|
2
2
|
|
|
3
|
+
## 8.8.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Automated patch version bump for all packages
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @pioneer-platform/loggerdog@8.8.1
|
|
10
|
+
- @pioneer-platform/nodes@8.8.1
|
|
11
|
+
- @pioneer-platform/pioneer-caip@9.7.1
|
|
12
|
+
|
|
13
|
+
## 8.8.0
|
|
14
|
+
|
|
15
|
+
### Minor Changes
|
|
16
|
+
|
|
17
|
+
- Automated minor version bump for all packages
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- Updated dependencies
|
|
22
|
+
- @pioneer-platform/loggerdog@8.8.0
|
|
23
|
+
- @pioneer-platform/nodes@8.8.0
|
|
24
|
+
- @pioneer-platform/pioneer-caip@9.7.0
|
|
25
|
+
|
|
3
26
|
## 8.7.1
|
|
4
27
|
|
|
5
28
|
### 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<
|
|
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,
|
|
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,
|
|
506
|
-
|
|
507
|
-
|
|
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:
|
|
516
|
-
|
|
517
|
-
output = {
|
|
518
|
-
success: false
|
|
542
|
+
data: hex,
|
|
543
|
+
timeout: 15000 // 15s timeout per node
|
|
519
544
|
};
|
|
520
|
-
|
|
521
|
-
|
|
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
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
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 (
|
|
539
|
-
statusCode =
|
|
540
|
-
log.
|
|
541
|
-
log.
|
|
542
|
-
if (
|
|
543
|
-
log.
|
|
544
|
-
if (
|
|
545
|
-
errorMessage =
|
|
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
|
|
549
|
-
errorMessage =
|
|
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(
|
|
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(
|
|
582
|
+
errorMessage = "HTTP ".concat(statusCode, ": ").concat(error_1.response.statusText || 'Request failed');
|
|
557
583
|
}
|
|
558
584
|
}
|
|
559
|
-
else if (
|
|
560
|
-
// Request was made but no response received
|
|
585
|
+
else if (error_1.request) {
|
|
561
586
|
errorMessage = 'Network error: No response received';
|
|
562
|
-
log.
|
|
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
|
-
|
|
566
|
-
errorMessage = e_7.message || 'Request setup error';
|
|
590
|
+
errorMessage = error_1.message || 'Request setup error';
|
|
567
591
|
}
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
case
|
|
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,
|
|
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
|
-
|
|
607
|
-
console.error(tag,
|
|
608
|
-
throw
|
|
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,
|
|
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
|
-
|
|
627
|
-
if (!
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
678
|
-
console.error(tag,
|
|
679
|
-
throw
|
|
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,
|
|
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
|
-
|
|
756
|
-
console.error(tag,
|
|
757
|
-
throw
|
|
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.
|
|
3
|
+
"version": "8.8.1",
|
|
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.
|
|
15
|
-
"@pioneer-platform/nodes": "^8.
|
|
16
|
-
"@pioneer-platform/pioneer-caip": "^9.
|
|
14
|
+
"@pioneer-platform/loggerdog": "^8.8.1",
|
|
15
|
+
"@pioneer-platform/nodes": "^8.8.1",
|
|
16
|
+
"@pioneer-platform/pioneer-caip": "^9.7.1",
|
|
17
17
|
"@types/request-promise-native": "^1.0.17",
|
|
18
18
|
"axiom": "^0.1.6",
|
|
19
19
|
"axios": "^1.6.0",
|