@substrate/api-sidecar 20.3.1 → 20.4.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.
Files changed (184) hide show
  1. package/README.md +9 -0
  2. package/build/package.json +9 -19
  3. package/build/src/chains-config/assetHubKusamaControllers.js +17 -0
  4. package/build/src/chains-config/assetHubKusamaControllers.js.map +1 -1
  5. package/build/src/chains-config/assetHubNextWestendControllers.js +18 -0
  6. package/build/src/chains-config/assetHubNextWestendControllers.js.map +1 -1
  7. package/build/src/chains-config/assetHubPolkadotControllers.js +17 -0
  8. package/build/src/chains-config/assetHubPolkadotControllers.js.map +1 -1
  9. package/build/src/chains-config/assetHubWestendControllers.js +18 -0
  10. package/build/src/chains-config/assetHubWestendControllers.js.map +1 -1
  11. package/build/src/chains-config/index.d.ts +6 -0
  12. package/build/src/chains-config/index.js +24 -1
  13. package/build/src/chains-config/index.js.map +1 -1
  14. package/build/src/controllers/AbstractController.d.ts +13 -2
  15. package/build/src/controllers/AbstractController.js +73 -13
  16. package/build/src/controllers/AbstractController.js.map +1 -1
  17. package/build/src/controllers/accounts/AccountsAssetsController.d.ts +16 -0
  18. package/build/src/controllers/accounts/AccountsAssetsController.js +75 -8
  19. package/build/src/controllers/accounts/AccountsAssetsController.js.map +1 -1
  20. package/build/src/controllers/accounts/AccountsBalanceInfoController.d.ts +9 -0
  21. package/build/src/controllers/accounts/AccountsBalanceInfoController.js +50 -10
  22. package/build/src/controllers/accounts/AccountsBalanceInfoController.js.map +1 -1
  23. package/build/src/controllers/accounts/AccountsPoolAssetsController.d.ts +15 -0
  24. package/build/src/controllers/accounts/AccountsPoolAssetsController.js +74 -8
  25. package/build/src/controllers/accounts/AccountsPoolAssetsController.js.map +1 -1
  26. package/build/src/controllers/accounts/AccountsProxyInfoController.d.ts +1 -1
  27. package/build/src/controllers/accounts/AccountsProxyInfoController.js +30 -5
  28. package/build/src/controllers/accounts/AccountsProxyInfoController.js.map +1 -1
  29. package/build/src/controllers/accounts/AccountsStakingInfoController.d.ts +9 -0
  30. package/build/src/controllers/accounts/AccountsStakingInfoController.js +47 -6
  31. package/build/src/controllers/accounts/AccountsStakingInfoController.js.map +1 -1
  32. package/build/src/controllers/accounts/AccountsStakingPayoutsController.d.ts +9 -0
  33. package/build/src/controllers/accounts/AccountsStakingPayoutsController.js +71 -14
  34. package/build/src/controllers/accounts/AccountsStakingPayoutsController.js.map +1 -1
  35. package/build/src/controllers/accounts/AccountsVestingInfoController.d.ts +8 -0
  36. package/build/src/controllers/accounts/AccountsVestingInfoController.js +36 -8
  37. package/build/src/controllers/accounts/AccountsVestingInfoController.js.map +1 -1
  38. package/build/src/controllers/blocks/BlocksController.d.ts +10 -0
  39. package/build/src/controllers/blocks/BlocksController.js +244 -23
  40. package/build/src/controllers/blocks/BlocksController.js.map +1 -1
  41. package/build/src/controllers/blocks/BlocksExtrinsicsController.js +95 -36
  42. package/build/src/controllers/blocks/BlocksExtrinsicsController.js.map +1 -1
  43. package/build/src/controllers/blocks/BlocksRawExtrinsicsController.js +29 -4
  44. package/build/src/controllers/blocks/BlocksRawExtrinsicsController.js.map +1 -1
  45. package/build/src/controllers/controllerInjection.spec.js +5 -1
  46. package/build/src/controllers/controllerInjection.spec.js.map +1 -1
  47. package/build/src/controllers/index.d.ts +23 -0
  48. package/build/src/controllers/index.js +27 -4
  49. package/build/src/controllers/index.js.map +1 -1
  50. package/build/src/controllers/pallets/PalletsAssetConversionController.js +58 -6
  51. package/build/src/controllers/pallets/PalletsAssetConversionController.js.map +1 -1
  52. package/build/src/controllers/pallets/PalletsAssetsController.d.ts +8 -0
  53. package/build/src/controllers/pallets/PalletsAssetsController.js +38 -3
  54. package/build/src/controllers/pallets/PalletsAssetsController.js.map +1 -1
  55. package/build/src/controllers/pallets/PalletsConstsController.js +82 -18
  56. package/build/src/controllers/pallets/PalletsConstsController.js.map +1 -1
  57. package/build/src/controllers/pallets/PalletsDispatchablesController.d.ts +0 -8
  58. package/build/src/controllers/pallets/PalletsDispatchablesController.js +82 -28
  59. package/build/src/controllers/pallets/PalletsDispatchablesController.js.map +1 -1
  60. package/build/src/controllers/pallets/PalletsErrorsController.js +82 -18
  61. package/build/src/controllers/pallets/PalletsErrorsController.js.map +1 -1
  62. package/build/src/controllers/pallets/PalletsEventsController.js +82 -18
  63. package/build/src/controllers/pallets/PalletsEventsController.js.map +1 -1
  64. package/build/src/controllers/pallets/PalletsForeignAssetsController.d.ts +8 -0
  65. package/build/src/controllers/pallets/PalletsForeignAssetsController.js +38 -3
  66. package/build/src/controllers/pallets/PalletsForeignAssetsController.js.map +1 -1
  67. package/build/src/controllers/pallets/PalletsNominationPoolsController.js +58 -6
  68. package/build/src/controllers/pallets/PalletsNominationPoolsController.js.map +1 -1
  69. package/build/src/controllers/pallets/PalletsOnGoingReferendaController.js +30 -3
  70. package/build/src/controllers/pallets/PalletsOnGoingReferendaController.js.map +1 -1
  71. package/build/src/controllers/pallets/PalletsPoolAssetsController.js +30 -3
  72. package/build/src/controllers/pallets/PalletsPoolAssetsController.js.map +1 -1
  73. package/build/src/controllers/pallets/PalletsStakingProgressController.d.ts +1 -1
  74. package/build/src/controllers/pallets/PalletsStakingProgressController.js +30 -8
  75. package/build/src/controllers/pallets/PalletsStakingProgressController.js.map +1 -1
  76. package/build/src/controllers/pallets/PalletsStakingValidatorsController.js +30 -3
  77. package/build/src/controllers/pallets/PalletsStakingValidatorsController.js.map +1 -1
  78. package/build/src/controllers/pallets/PalletsStorageController.js +84 -19
  79. package/build/src/controllers/pallets/PalletsStorageController.js.map +1 -1
  80. package/build/src/controllers/rc/accounts/RcAccountsBalanceInfoController.d.ts +15 -0
  81. package/build/src/controllers/rc/accounts/RcAccountsBalanceInfoController.js +65 -0
  82. package/build/src/controllers/rc/accounts/RcAccountsBalanceInfoController.js.map +1 -0
  83. package/build/src/controllers/rc/accounts/RcAccountsProxyInfoController.d.ts +15 -0
  84. package/build/src/controllers/rc/accounts/RcAccountsProxyInfoController.js +59 -0
  85. package/build/src/controllers/rc/accounts/RcAccountsProxyInfoController.js.map +1 -0
  86. package/build/src/controllers/rc/accounts/index.d.ts +2 -0
  87. package/build/src/controllers/rc/accounts/index.js +26 -0
  88. package/build/src/controllers/rc/accounts/index.js.map +1 -0
  89. package/build/src/controllers/rc/blocks/RcBlocksController.d.ts +17 -0
  90. package/build/src/controllers/rc/blocks/RcBlocksController.js +263 -0
  91. package/build/src/controllers/rc/blocks/RcBlocksController.js.map +1 -0
  92. package/build/src/controllers/rc/blocks/RcBlocksExtrinsicsController.d.ts +11 -0
  93. package/build/src/controllers/rc/blocks/RcBlocksExtrinsicsController.js +80 -0
  94. package/build/src/controllers/rc/blocks/RcBlocksExtrinsicsController.js.map +1 -0
  95. package/build/src/controllers/rc/blocks/RcBlocksRawExtrinsicsController.d.ts +10 -0
  96. package/build/src/controllers/rc/blocks/RcBlocksRawExtrinsicsController.js +60 -0
  97. package/build/src/controllers/rc/blocks/RcBlocksRawExtrinsicsController.js.map +1 -0
  98. package/build/src/controllers/rc/blocks/RcBlocksTraceController.d.ts +12 -0
  99. package/build/src/controllers/rc/blocks/RcBlocksTraceController.js +89 -0
  100. package/build/src/controllers/rc/blocks/RcBlocksTraceController.js.map +1 -0
  101. package/build/src/controllers/rc/blocks/index.d.ts +4 -0
  102. package/build/src/controllers/rc/blocks/index.js +30 -0
  103. package/build/src/controllers/rc/blocks/index.js.map +1 -0
  104. package/build/src/controllers/rc/index.d.ts +4 -0
  105. package/build/src/controllers/rc/index.js +36 -0
  106. package/build/src/controllers/rc/index.js.map +1 -0
  107. package/build/src/controllers/rc/node/RcNodeNetworkController.d.ts +40 -0
  108. package/build/src/controllers/rc/node/RcNodeNetworkController.js +76 -0
  109. package/build/src/controllers/rc/node/RcNodeNetworkController.js.map +1 -0
  110. package/build/src/controllers/rc/node/RcNodeTransactionPoolController.d.ts +27 -0
  111. package/build/src/controllers/rc/node/RcNodeTransactionPoolController.js +66 -0
  112. package/build/src/controllers/rc/node/RcNodeTransactionPoolController.js.map +1 -0
  113. package/build/src/controllers/rc/node/RcNodeVersionController.d.ts +24 -0
  114. package/build/src/controllers/rc/node/RcNodeVersionController.js +59 -0
  115. package/build/src/controllers/rc/node/RcNodeVersionController.js.map +1 -0
  116. package/build/src/controllers/rc/node/index.d.ts +3 -0
  117. package/build/src/controllers/rc/node/index.js +13 -0
  118. package/build/src/controllers/rc/node/index.js.map +1 -0
  119. package/build/src/controllers/rc/pallets/RcPalletsConstsController.d.ts +10 -0
  120. package/build/src/controllers/rc/pallets/RcPalletsConstsController.js +79 -0
  121. package/build/src/controllers/rc/pallets/RcPalletsConstsController.js.map +1 -0
  122. package/build/src/controllers/rc/pallets/RcPalletsDispatchablesController.d.ts +10 -0
  123. package/build/src/controllers/rc/pallets/RcPalletsDispatchablesController.js +79 -0
  124. package/build/src/controllers/rc/pallets/RcPalletsDispatchablesController.js.map +1 -0
  125. package/build/src/controllers/rc/pallets/RcPalletsErrorsController.d.ts +10 -0
  126. package/build/src/controllers/rc/pallets/RcPalletsErrorsController.js +79 -0
  127. package/build/src/controllers/rc/pallets/RcPalletsErrorsController.js.map +1 -0
  128. package/build/src/controllers/rc/pallets/RcPalletsEventsController.d.ts +10 -0
  129. package/build/src/controllers/rc/pallets/RcPalletsEventsController.js +79 -0
  130. package/build/src/controllers/rc/pallets/RcPalletsEventsController.js.map +1 -0
  131. package/build/src/controllers/rc/pallets/RcPalletsOnGoingReferendaController.d.ts +9 -0
  132. package/build/src/controllers/rc/pallets/RcPalletsOnGoingReferendaController.js +52 -0
  133. package/build/src/controllers/rc/pallets/RcPalletsOnGoingReferendaController.js.map +1 -0
  134. package/build/src/controllers/rc/pallets/RcPalletsStorageController.d.ts +10 -0
  135. package/build/src/controllers/rc/pallets/RcPalletsStorageController.js +81 -0
  136. package/build/src/controllers/rc/pallets/RcPalletsStorageController.js.map +1 -0
  137. package/build/src/controllers/rc/pallets/index.d.ts +6 -0
  138. package/build/src/controllers/rc/pallets/index.js +34 -0
  139. package/build/src/controllers/rc/pallets/index.js.map +1 -0
  140. package/build/src/controllers/rc/runtime/RcRuntimeCodeController.d.ts +26 -0
  141. package/build/src/controllers/rc/runtime/RcRuntimeCodeController.js +68 -0
  142. package/build/src/controllers/rc/runtime/RcRuntimeCodeController.js.map +1 -0
  143. package/build/src/controllers/rc/runtime/RcRuntimeMetadataController.d.ts +47 -0
  144. package/build/src/controllers/rc/runtime/RcRuntimeMetadataController.js +140 -0
  145. package/build/src/controllers/rc/runtime/RcRuntimeMetadataController.js.map +1 -0
  146. package/build/src/controllers/rc/runtime/RcRuntimeSpecController.d.ts +34 -0
  147. package/build/src/controllers/rc/runtime/RcRuntimeSpecController.js +76 -0
  148. package/build/src/controllers/rc/runtime/RcRuntimeSpecController.js.map +1 -0
  149. package/build/src/controllers/rc/runtime/index.d.ts +3 -0
  150. package/build/src/controllers/rc/runtime/index.js +28 -0
  151. package/build/src/controllers/rc/runtime/index.js.map +1 -0
  152. package/build/src/logging/transformers/nodeUtilFormat.js +17 -7
  153. package/build/src/logging/transformers/nodeUtilFormat.js.map +1 -1
  154. package/build/src/main.js +21 -7
  155. package/build/src/main.js.map +1 -1
  156. package/build/src/metrics/index.js +17 -7
  157. package/build/src/metrics/index.js.map +1 -1
  158. package/build/src/middleware/logger/httpLogger.js +17 -7
  159. package/build/src/middleware/logger/httpLogger.js.map +1 -1
  160. package/build/src/middleware/validate/index.d.ts +1 -0
  161. package/build/src/middleware/validate/index.js +3 -1
  162. package/build/src/middleware/validate/index.js.map +1 -1
  163. package/build/src/middleware/validate/validateUseRcBlockMiddleware.d.ts +10 -0
  164. package/build/src/middleware/validate/validateUseRcBlockMiddleware.js +58 -0
  165. package/build/src/middleware/validate/validateUseRcBlockMiddleware.js.map +1 -0
  166. package/build/src/services/accounts/AccountsStakingInfoService.js +0 -1
  167. package/build/src/services/accounts/AccountsStakingInfoService.js.map +1 -1
  168. package/build/src/services/blocks/BlocksService.js +15 -1
  169. package/build/src/services/blocks/BlocksService.js.map +1 -1
  170. package/build/src/services/pallets/PalletsStakingProgressService.d.ts +56 -0
  171. package/build/src/services/pallets/PalletsStakingProgressService.js +140 -21
  172. package/build/src/services/pallets/PalletsStakingProgressService.js.map +1 -1
  173. package/build/src/services/pallets/PalletsStakingProgressService.spec.js +255 -43
  174. package/build/src/services/pallets/PalletsStakingProgressService.spec.js.map +1 -1
  175. package/build/src/types/requests.d.ts +1 -0
  176. package/build/src/types/responses/AccountAssets.d.ts +4 -0
  177. package/build/src/types/responses/AccountBalanceInfo.d.ts +2 -0
  178. package/build/src/types/responses/AccountPoolAssets.d.ts +6 -2
  179. package/build/src/types/responses/AccountProxyInfo.d.ts +2 -0
  180. package/build/src/types/responses/AccountStakingInfo.d.ts +2 -0
  181. package/build/src/types/responses/AccountStakingPayouts.d.ts +2 -0
  182. package/build/src/types/responses/AccountVestingInfo.d.ts +2 -0
  183. package/build/src/types/responses/PalletStakingProgress.d.ts +2 -0
  184. package/package.json +9 -19
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ // Copyright 2017-2025 Parity Technologies (UK) Ltd.
3
+ // This file is part of Substrate API Sidecar.
4
+ //
5
+ // Substrate API Sidecar is free software: you can redistribute it and/or modify
6
+ // it under the terms of the GNU General Public License as published by
7
+ // the Free Software Foundation, either version 3 of the License, or
8
+ // (at your option) any later version.
9
+ //
10
+ // This program is distributed in the hope that it will be useful,
11
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ // GNU General Public License for more details.
14
+ //
15
+ // You should have received a copy of the GNU General Public License
16
+ // along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.RcAccountsProxyInfo = exports.RcAccountsBalanceInfo = void 0;
22
+ var RcAccountsBalanceInfoController_1 = require("./RcAccountsBalanceInfoController");
23
+ Object.defineProperty(exports, "RcAccountsBalanceInfo", { enumerable: true, get: function () { return __importDefault(RcAccountsBalanceInfoController_1).default; } });
24
+ var RcAccountsProxyInfoController_1 = require("./RcAccountsProxyInfoController");
25
+ Object.defineProperty(exports, "RcAccountsProxyInfo", { enumerable: true, get: function () { return __importDefault(RcAccountsProxyInfoController_1).default; } });
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/controllers/rc/accounts/index.ts"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,8CAA8C;AAC9C,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAC/C,EAAE;AACF,oEAAoE;AACpE,wEAAwE;;;;;;AAExE,qFAAqF;AAA5E,yJAAA,OAAO,OAAyB;AACzC,iFAAiF;AAAxE,qJAAA,OAAO,OAAuB"}
@@ -0,0 +1,17 @@
1
+ import { BlocksService } from '../../../services';
2
+ import { ControllerOptions } from '../../../types/chains-config';
3
+ import AbstractController from '../../AbstractController';
4
+ export default class RcBlocksController extends AbstractController<BlocksService> {
5
+ private readonly options;
6
+ private blockStore;
7
+ static controllerName: string;
8
+ static requiredPallets: string[][];
9
+ constructor(_api: string, options: ControllerOptions);
10
+ protected initRoutes(): void;
11
+ private emitExtrinsicMetrics;
12
+ private getLatestBlock;
13
+ private getBlockById;
14
+ private getBlockHeaderById;
15
+ private getLatestBlockHeader;
16
+ private getBlocks;
17
+ }
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ // Copyright 2017-2025 Parity Technologies (UK) Ltd.
3
+ // This file is part of Substrate API Sidecar.
4
+ //
5
+ // Substrate API Sidecar is free software: you can redistribute it and/or modify
6
+ // it under the terms of the GNU General Public License as published by
7
+ // the Free Software Foundation, either version 3 of the License, or
8
+ // (at your option) any later version.
9
+ //
10
+ // This program is distributed in the hope that it will be useful,
11
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ // GNU General Public License for more details.
14
+ //
15
+ // You should have received a copy of the GNU General Public License
16
+ // along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ const util_1 = require("@polkadot/util");
22
+ const http_errors_1 = require("http-errors");
23
+ const apiRegistry_1 = require("../../../apiRegistry");
24
+ const validate_1 = require("../../../middleware/validate");
25
+ const services_1 = require("../../../services");
26
+ const PromiseQueue_1 = require("../../../util/PromiseQueue");
27
+ const AbstractController_1 = __importDefault(require("../../AbstractController"));
28
+ class RcBlocksController extends AbstractController_1.default {
29
+ constructor(_api, options) {
30
+ var _a;
31
+ const rcApiSpecName = (_a = apiRegistry_1.ApiPromiseRegistry.getSpecNameByType('relay')) === null || _a === void 0 ? void 0 : _a.values();
32
+ const rcSpecName = rcApiSpecName ? Array.from(rcApiSpecName)[0] : undefined;
33
+ if (!rcSpecName) {
34
+ throw new Error('Relay chain API spec name is not defined.');
35
+ }
36
+ super(rcSpecName, '/rc/blocks', new services_1.BlocksService(rcSpecName, options.minCalcFeeRuntime, options.hasQueryFeeApi));
37
+ this.options = options;
38
+ this.emitExtrinsicMetrics = (totExtrinsics, totBlocks, method, path, res) => {
39
+ if (res.locals.metrics) {
40
+ const seconds = res.locals.metrics.timer();
41
+ const extrinsics_in_request = res.locals.metrics.registry['sas_extrinsics_in_request'];
42
+ extrinsics_in_request.labels({ method: method, route: path, status_code: res.statusCode }).observe(totExtrinsics);
43
+ const extrinsics_per_second = res.locals.metrics.registry['sas_extrinsics_per_second'];
44
+ extrinsics_per_second
45
+ .labels({ method: method, route: path, status_code: res.statusCode })
46
+ .observe(totExtrinsics / seconds);
47
+ const extrinsicsPerBlockMetrics = res.locals.metrics.registry['sas_extrinsics_per_block'];
48
+ extrinsicsPerBlockMetrics
49
+ .labels({ method: 'GET', route: path, status_code: res.statusCode })
50
+ .observe(totExtrinsics / totBlocks);
51
+ const seconds_per_block = res.locals.metrics.registry['sas_seconds_per_block'];
52
+ seconds_per_block
53
+ .labels({ method: method, route: path, status_code: res.statusCode })
54
+ .observe(seconds / totBlocks);
55
+ if (totBlocks > 1) {
56
+ const seconds_per_block = res.locals.metrics.registry['sas_seconds_per_block'];
57
+ seconds_per_block
58
+ .labels({ method: method, route: path, status_code: res.statusCode })
59
+ .observe(seconds / totBlocks);
60
+ }
61
+ }
62
+ };
63
+ this.getLatestBlock = async ({ query: { eventDocs, extrinsicDocs, finalized, noFees, decodedXcmMsgs, paraId }, method, route }, res) => {
64
+ var _a;
65
+ const rcApi = (_a = apiRegistry_1.ApiPromiseRegistry.getApiByType('relay')[0]) === null || _a === void 0 ? void 0 : _a.api;
66
+ if (!rcApi) {
67
+ throw new Error('Relay chain API not found, please use SAS_SUBSTRATE_MULTI_CHAIN_URL env variable');
68
+ }
69
+ const eventDocsArg = eventDocs === 'true';
70
+ const extrinsicDocsArg = extrinsicDocs === 'true';
71
+ let hash, queryFinalizedHead, omitFinalizedTag;
72
+ if (!this.options.finalizes) {
73
+ omitFinalizedTag = true;
74
+ queryFinalizedHead = false;
75
+ hash = (await rcApi.rpc.chain.getHeader()).hash;
76
+ }
77
+ else if (finalized === 'false') {
78
+ omitFinalizedTag = false;
79
+ queryFinalizedHead = true;
80
+ hash = (await rcApi.rpc.chain.getHeader()).hash;
81
+ }
82
+ else {
83
+ omitFinalizedTag = false;
84
+ queryFinalizedHead = false;
85
+ hash = await rcApi.rpc.chain.getFinalizedHead();
86
+ }
87
+ const noFeesArg = noFees === 'true';
88
+ const decodedXcmMsgsArg = decodedXcmMsgs === 'true';
89
+ const paraIdArg = paraId ? this.parseNumberOrThrow(paraId, 'paraId must be an integer') : undefined;
90
+ const options = {
91
+ eventDocs: eventDocsArg,
92
+ extrinsicDocs: extrinsicDocsArg,
93
+ checkFinalized: false,
94
+ queryFinalizedHead,
95
+ omitFinalizedTag,
96
+ noFees: noFeesArg,
97
+ checkDecodedXcm: decodedXcmMsgsArg,
98
+ paraId: paraIdArg,
99
+ };
100
+ const cacheKey = hash.toString() +
101
+ Number(options.eventDocs) +
102
+ Number(options.extrinsicDocs) +
103
+ Number(options.checkFinalized) +
104
+ Number(options.noFees) +
105
+ Number(options.checkDecodedXcm) +
106
+ Number(options.paraId);
107
+ const isBlockCached = this.blockStore.get(cacheKey);
108
+ if (isBlockCached) {
109
+ RcBlocksController.sanitizedSend(res, isBlockCached);
110
+ return;
111
+ }
112
+ const historicApi = await rcApi.at(hash);
113
+ const block = await this.service.fetchBlock(hash, historicApi, options);
114
+ this.blockStore.set(cacheKey, block);
115
+ RcBlocksController.sanitizedSend(res, block);
116
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
117
+ const path = route.path;
118
+ if (res.locals.metrics) {
119
+ this.emitExtrinsicMetrics(block.extrinsics.length, 1, method, path, res);
120
+ }
121
+ };
122
+ this.getBlockById = async ({ params: { number }, query: { eventDocs, extrinsicDocs, noFees, finalizedKey, decodedXcmMsgs, paraId }, method, route, }, res) => {
123
+ var _a;
124
+ const rcApi = (_a = apiRegistry_1.ApiPromiseRegistry.getApiByType('relay')[0]) === null || _a === void 0 ? void 0 : _a.api;
125
+ if (!rcApi) {
126
+ throw new Error('Relay chain API not found, please use SAS_SUBSTRATE_MULTI_CHAIN_URL env variable');
127
+ }
128
+ const checkFinalized = (0, util_1.isHex)(number);
129
+ const hash = await this.getHashFromAt(number, { api: rcApi });
130
+ const eventDocsArg = eventDocs === 'true';
131
+ const extrinsicDocsArg = extrinsicDocs === 'true';
132
+ const finalizeOverride = finalizedKey === 'false';
133
+ const queryFinalizedHead = !this.options.finalizes ? false : true;
134
+ const noFeesArg = noFees === 'true';
135
+ let omitFinalizedTag = !this.options.finalizes ? true : false;
136
+ if (finalizeOverride) {
137
+ omitFinalizedTag = true;
138
+ }
139
+ const decodedXcmMsgsArg = decodedXcmMsgs === 'true';
140
+ const paraIdArg = paraId ? this.parseNumberOrThrow(paraId, 'paraId must be an integer') : undefined;
141
+ const options = {
142
+ eventDocs: eventDocsArg,
143
+ extrinsicDocs: extrinsicDocsArg,
144
+ checkFinalized,
145
+ queryFinalizedHead,
146
+ omitFinalizedTag,
147
+ noFees: noFeesArg,
148
+ checkDecodedXcm: decodedXcmMsgsArg,
149
+ paraId: paraIdArg,
150
+ };
151
+ const cacheKey = hash.toString() +
152
+ Number(options.eventDocs) +
153
+ Number(options.extrinsicDocs) +
154
+ Number(options.checkFinalized) +
155
+ Number(options.noFees) +
156
+ Number(options.checkDecodedXcm) +
157
+ Number(options.paraId);
158
+ const isBlockCached = this.blockStore.get(cacheKey);
159
+ if (isBlockCached) {
160
+ RcBlocksController.sanitizedSend(res, isBlockCached);
161
+ return;
162
+ }
163
+ const historicApi = await rcApi.at(hash);
164
+ const block = await this.service.fetchBlock(hash, historicApi, options);
165
+ this.blockStore.set(cacheKey, block);
166
+ RcBlocksController.sanitizedSend(res, block);
167
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
168
+ const path = route.path;
169
+ if (res.locals.metrics) {
170
+ this.emitExtrinsicMetrics(block.extrinsics.length, 1, method, path, res);
171
+ }
172
+ };
173
+ this.getBlockHeaderById = async ({ params: { number } }, res) => {
174
+ var _a;
175
+ const rcApi = (_a = apiRegistry_1.ApiPromiseRegistry.getApiByType('relay')[0]) === null || _a === void 0 ? void 0 : _a.api;
176
+ if (!rcApi) {
177
+ throw new Error('Relay chain API not found, please use SAS_SUBSTRATE_MULTI_CHAIN_URL env variable');
178
+ }
179
+ const hash = await this.getHashFromAt(number, { api: rcApi });
180
+ const headerResult = await this.service.fetchBlockHeader(hash);
181
+ RcBlocksController.sanitizedSend(res, headerResult);
182
+ };
183
+ this.getLatestBlockHeader = async ({ query: { finalized } }, res) => {
184
+ var _a;
185
+ const rcApi = (_a = apiRegistry_1.ApiPromiseRegistry.getApiByType('relay')[0]) === null || _a === void 0 ? void 0 : _a.api;
186
+ if (!rcApi) {
187
+ throw new Error('Relay chain API not found, please use SAS_SUBSTRATE_MULTI_CHAIN_URL env variable');
188
+ }
189
+ const paramFinalized = finalized !== 'false';
190
+ const hash = paramFinalized ? await rcApi.rpc.chain.getFinalizedHead() : undefined;
191
+ const headerResult = await this.service.fetchBlockHeader(hash);
192
+ RcBlocksController.sanitizedSend(res, headerResult);
193
+ };
194
+ this.getBlocks = async ({ query: { range, eventDocs, extrinsicDocs, noFees }, method, route }, res) => {
195
+ var _a;
196
+ if (!range)
197
+ throw new http_errors_1.BadRequest('range query parameter must be inputted.');
198
+ const rcApi = (_a = apiRegistry_1.ApiPromiseRegistry.getApiByType('relay')[0]) === null || _a === void 0 ? void 0 : _a.api;
199
+ if (!rcApi) {
200
+ throw new Error('Relay chain API not found, please use SAS_SUBSTRATE_MULTI_CHAIN_URL env variable');
201
+ }
202
+ const rangeOfNums = this.parseRangeOfNumbersOrThrow(range, 500);
203
+ const eventDocsArg = eventDocs === 'true';
204
+ const extrinsicDocsArg = extrinsicDocs === 'true';
205
+ const queryFinalizedHead = !this.options.finalizes ? false : true;
206
+ const omitFinalizedTag = !this.options.finalizes ? true : false;
207
+ const noFeesArg = noFees === 'true';
208
+ const options = {
209
+ eventDocs: eventDocsArg,
210
+ extrinsicDocs: extrinsicDocsArg,
211
+ checkFinalized: false,
212
+ queryFinalizedHead,
213
+ omitFinalizedTag,
214
+ noFees: noFeesArg,
215
+ checkDecodedXcm: false,
216
+ paraId: undefined,
217
+ };
218
+ const pQueue = new PromiseQueue_1.PromiseQueue(4);
219
+ const blocksPromise = [];
220
+ for (let i = 0; i < rangeOfNums.length; i++) {
221
+ const result = pQueue.run(async () => {
222
+ const hash = await this.getHashFromAt(rangeOfNums[i].toString(), { api: rcApi });
223
+ const historicApi = await rcApi.at(hash);
224
+ return await this.service.fetchBlock(hash, historicApi, options);
225
+ });
226
+ blocksPromise.push(result);
227
+ }
228
+ const allBlocks = await Promise.all(blocksPromise);
229
+ blocksPromise.length = 0;
230
+ const blocks = allBlocks;
231
+ blocks.sort((a, b) => a.number.toNumber() - b.number.toNumber());
232
+ RcBlocksController.sanitizedSend(res, blocks);
233
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
234
+ const path = route.path;
235
+ if (res.locals.metrics) {
236
+ const totExtrinsics = blocks.reduce((current, block) => {
237
+ const extrinsics = block.extrinsics;
238
+ if (Array.isArray(extrinsics)) {
239
+ return current + extrinsics.length;
240
+ }
241
+ return current;
242
+ }, 0);
243
+ this.emitExtrinsicMetrics(totExtrinsics, blocks.length, method, path, res);
244
+ }
245
+ };
246
+ this.initRoutes();
247
+ this.blockStore = options.blockStore;
248
+ }
249
+ initRoutes() {
250
+ this.router.use(this.path, (0, validate_1.validateBoolean)(['eventDocs', 'extrinsicDocs', 'finalized']));
251
+ this.safeMountAsyncGetHandlers([
252
+ ['/', this.getBlocks],
253
+ ['/head', this.getLatestBlock],
254
+ ['/:number', this.getBlockById],
255
+ ['/head/header', this.getLatestBlockHeader],
256
+ ['/:number/header', this.getBlockHeaderById],
257
+ ]);
258
+ }
259
+ }
260
+ RcBlocksController.controllerName = 'RcBlocks';
261
+ RcBlocksController.requiredPallets = [['System', 'Session']];
262
+ exports.default = RcBlocksController;
263
+ //# sourceMappingURL=RcBlocksController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RcBlocksController.js","sourceRoot":"","sources":["../../../../../src/controllers/rc/blocks/RcBlocksController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { BlocksService } from '../../../services';
2
+ import type { ControllerOptions } from '../../../types/chains-config';
3
+ import AbstractController from '../../AbstractController';
4
+ export default class RcBlocksExtrinsicsController extends AbstractController<BlocksService> {
5
+ private blockStore;
6
+ static controllerName: string;
7
+ static requiredPallets: string[][];
8
+ constructor(_api: string, options: ControllerOptions);
9
+ protected initRoutes(): void;
10
+ private getExtrinsicByTimepoint;
11
+ }
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ // Copyright 2017-2025 Parity Technologies (UK) Ltd.
3
+ // This file is part of Substrate API Sidecar.
4
+ //
5
+ // Substrate API Sidecar is free software: you can redistribute it and/or modify
6
+ // it under the terms of the GNU General Public License as published by
7
+ // the Free Software Foundation, either version 3 of the License, or
8
+ // (at your option) any later version.
9
+ //
10
+ // This program is distributed in the hope that it will be useful,
11
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ // GNU General Public License for more details.
14
+ //
15
+ // You should have received a copy of the GNU General Public License
16
+ // along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ const apiRegistry_1 = require("../../../apiRegistry");
22
+ const services_1 = require("../../../services");
23
+ const AbstractController_1 = __importDefault(require("../../AbstractController"));
24
+ class RcBlocksExtrinsicsController extends AbstractController_1.default {
25
+ constructor(_api, options) {
26
+ var _a;
27
+ const rcApiSpecName = (_a = apiRegistry_1.ApiPromiseRegistry.getSpecNameByType('relay')) === null || _a === void 0 ? void 0 : _a.values();
28
+ const rcSpecName = rcApiSpecName ? Array.from(rcApiSpecName)[0] : undefined;
29
+ if (!rcSpecName) {
30
+ throw new Error('Relay chain API spec name is not defined.');
31
+ }
32
+ super(rcSpecName, '/rc/blocks/:blockId/extrinsics', new services_1.BlocksService(rcSpecName, options.minCalcFeeRuntime, options.hasQueryFeeApi));
33
+ this.getExtrinsicByTimepoint = async ({ params: { blockId, extrinsicIndex }, query: { eventDocs, extrinsicDocs, noFees } }, res) => {
34
+ var _a;
35
+ const rcApi = (_a = apiRegistry_1.ApiPromiseRegistry.getApiByType('relay')[0]) === null || _a === void 0 ? void 0 : _a.api;
36
+ if (!rcApi) {
37
+ throw new Error('Relay chain API not found, please use SAS_SUBSTRATE_MULTI_CHAIN_URL env variable');
38
+ }
39
+ const hash = await this.getHashFromAt(blockId, { api: rcApi });
40
+ const eventDocsArg = eventDocs === 'true';
41
+ const extrinsicDocsArg = extrinsicDocs === 'true';
42
+ const noFeesArg = noFees === 'true';
43
+ const options = {
44
+ eventDocs: eventDocsArg,
45
+ extrinsicDocs: extrinsicDocsArg,
46
+ checkFinalized: true,
47
+ queryFinalizedHead: false,
48
+ omitFinalizedTag: true,
49
+ noFees: noFeesArg,
50
+ checkDecodedXcm: false,
51
+ paraId: undefined,
52
+ };
53
+ const cacheKey = hash.toString() +
54
+ Number(options.eventDocs) +
55
+ Number(options.extrinsicDocs) +
56
+ Number(options.checkFinalized) +
57
+ Number(options.noFees) +
58
+ Number(options.checkDecodedXcm);
59
+ const isBlockCached = this.blockStore.get(cacheKey);
60
+ const historicApi = await rcApi.at(hash);
61
+ const block = isBlockCached ? isBlockCached : await this.service.fetchBlock(hash, historicApi, options);
62
+ if (!isBlockCached) {
63
+ this.blockStore.set(cacheKey, block);
64
+ }
65
+ this.parseNumberOrThrow(extrinsicIndex, '`extrinsicIndex` path param is not a number');
66
+ const index = parseInt(extrinsicIndex, 10);
67
+ const extrinsic = this.service.fetchExtrinsicByIndex(block, index);
68
+ RcBlocksExtrinsicsController.sanitizedSend(res, extrinsic);
69
+ };
70
+ this.initRoutes();
71
+ this.blockStore = options.blockStore;
72
+ }
73
+ initRoutes() {
74
+ this.safeMountAsyncGetHandlers([['/:extrinsicIndex', this.getExtrinsicByTimepoint]]);
75
+ }
76
+ }
77
+ RcBlocksExtrinsicsController.controllerName = 'RcBlocksExtrinsics';
78
+ RcBlocksExtrinsicsController.requiredPallets = [['System', 'Session']];
79
+ exports.default = RcBlocksExtrinsicsController;
80
+ //# sourceMappingURL=RcBlocksExtrinsicsController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RcBlocksExtrinsicsController.js","sourceRoot":"","sources":["../../../../../src/controllers/rc/blocks/RcBlocksExtrinsicsController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { BlocksService } from '../../../services';
2
+ import { ControllerOptions } from '../../../types/chains-config';
3
+ import AbstractController from '../../AbstractController';
4
+ export default class RcBlocksRawExtrinsicsController extends AbstractController<BlocksService> {
5
+ static controllerName: string;
6
+ static requiredPallets: never[];
7
+ constructor(_api: string, options: ControllerOptions);
8
+ protected initRoutes(): void;
9
+ private getBlockRawExtrinsics;
10
+ }
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ // Copyright 2017-2025 Parity Technologies (UK) Ltd.
3
+ // This file is part of Substrate API Sidecar.
4
+ //
5
+ // Substrate API Sidecar is free software: you can redistribute it and/or modify
6
+ // it under the terms of the GNU General Public License as published by
7
+ // the Free Software Foundation, either version 3 of the License, or
8
+ // (at your option) any later version.
9
+ //
10
+ // This program is distributed in the hope that it will be useful,
11
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ // GNU General Public License for more details.
14
+ //
15
+ // You should have received a copy of the GNU General Public License
16
+ // along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ const apiRegistry_1 = require("../../../apiRegistry");
22
+ const services_1 = require("../../../services");
23
+ const AbstractController_1 = __importDefault(require("../../AbstractController"));
24
+ class RcBlocksRawExtrinsicsController extends AbstractController_1.default {
25
+ constructor(_api, options) {
26
+ var _a;
27
+ const rcApiSpecName = (_a = apiRegistry_1.ApiPromiseRegistry.getSpecNameByType('relay')) === null || _a === void 0 ? void 0 : _a.values();
28
+ const rcSpecName = rcApiSpecName ? Array.from(rcApiSpecName)[0] : undefined;
29
+ if (!rcSpecName) {
30
+ throw new Error('Relay chain API spec name is not defined.');
31
+ }
32
+ super(rcSpecName, '/rc/blocks/:blockId/extrinsics-raw', new services_1.BlocksService(rcSpecName, options.minCalcFeeRuntime, options.hasQueryFeeApi));
33
+ this.getBlockRawExtrinsics = async ({ params: { blockId }, method, route }, res) => {
34
+ var _a;
35
+ const rcApi = (_a = apiRegistry_1.ApiPromiseRegistry.getApiByType('relay')[0]) === null || _a === void 0 ? void 0 : _a.api;
36
+ if (!rcApi) {
37
+ throw new Error('Relay chain API not found, please use SAS_SUBSTRATE_MULTI_CHAIN_URL env variable');
38
+ }
39
+ const hash = await this.getHashFromAt(blockId, { api: rcApi });
40
+ const rawBlock = await this.service.fetchBlockRaw(hash);
41
+ RcBlocksRawExtrinsicsController.sanitizedSend(res, rawBlock);
42
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
43
+ const path = route.path;
44
+ if (res.locals.metrics) {
45
+ const extrinsics_per_block_metrics = res.locals.metrics.registry['sas_extrinsics_per_block'];
46
+ extrinsics_per_block_metrics
47
+ .labels({ method: method, route: path, status_code: res.statusCode })
48
+ .observe(rawBlock.extrinsics.length);
49
+ }
50
+ };
51
+ this.initRoutes();
52
+ }
53
+ initRoutes() {
54
+ this.safeMountAsyncGetHandlers([['', this.getBlockRawExtrinsics]]);
55
+ }
56
+ }
57
+ RcBlocksRawExtrinsicsController.controllerName = 'RcBlocksRawExtrinsics';
58
+ RcBlocksRawExtrinsicsController.requiredPallets = [];
59
+ exports.default = RcBlocksRawExtrinsicsController;
60
+ //# sourceMappingURL=RcBlocksRawExtrinsicsController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RcBlocksRawExtrinsicsController.js","sourceRoot":"","sources":["../../../../../src/controllers/rc/blocks/RcBlocksRawExtrinsicsController.ts"],"names":[],"mappings":";AAAA,oDAAoD;AACpD,8CAA8C;AAC9C,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,oEAAoE;AACpE,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,+CAA+C;AAC/C,EAAE;AACF,oEAAoE;AACpE,wEAAwE;;;;;AAIxE,sDAA0D;AAC1D,gDAAkD;AAGlD,kFAA0D;AAE1D,MAAqB,+BAAgC,SAAQ,4BAAiC;IAG7F,YAAY,IAAY,EAAE,OAA0B;;QACnD,MAAM,aAAa,GAAG,MAAA,gCAAkB,CAAC,iBAAiB,CAAC,OAAO,CAAC,0CAAE,MAAM,EAAE,CAAC;QAC9E,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK,CACJ,UAAU,EACV,oCAAoC,EACpC,IAAI,wBAAa,CAAC,UAAU,EAAE,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,cAAc,CAAC,CAChF,CAAC;QAQK,0BAAqB,GAAgE,KAAK,EACjG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EACtC,GAAG,EACa,EAAE;;YAClB,MAAM,KAAK,GAAG,MAAA,gCAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,0CAAE,GAAG,CAAC;YAE/D,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;YACrG,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAExD,+BAA+B,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAE7D,sEAAsE;YACtE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAc,CAAC;YAElC,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,4BAA4B,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAqB,CAAC;gBACjH,4BAA4B;qBAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;qBACpE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;QACF,CAAC,CAAC;QA/BD,IAAI,CAAC,UAAU,EAAE,CAAC;IACnB,CAAC;IAES,UAAU;QACnB,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;;AAlBM,8CAAc,GAAG,uBAAuB,AAA1B,CAA2B;AACzC,+CAAe,GAAG,EAAE,AAAL,CAAM;kBAFR,+BAA+B"}
@@ -0,0 +1,12 @@
1
+ import { BlocksTraceService } from '../../../services';
2
+ import AbstractController from '../../AbstractController';
3
+ export default class RcBlocksTraceController extends AbstractController<BlocksTraceService> {
4
+ static controllerName: string;
5
+ static requiredPallets: never[];
6
+ constructor(_api: string);
7
+ protected initRoutes(): void;
8
+ private getLatestBlockTraces;
9
+ private getBlockTraces;
10
+ private getLatestBlockOperations;
11
+ private getBlockOperations;
12
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ // Copyright 2017-2025 Parity Technologies (UK) Ltd.
3
+ // This file is part of Substrate API Sidecar.
4
+ //
5
+ // Substrate API Sidecar is free software: you can redistribute it and/or modify
6
+ // it under the terms of the GNU General Public License as published by
7
+ // the Free Software Foundation, either version 3 of the License, or
8
+ // (at your option) any later version.
9
+ //
10
+ // This program is distributed in the hope that it will be useful,
11
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ // GNU General Public License for more details.
14
+ //
15
+ // You should have received a copy of the GNU General Public License
16
+ // along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ const apiRegistry_1 = require("../../../apiRegistry");
22
+ const middleware_1 = require("../../../middleware");
23
+ const services_1 = require("../../../services");
24
+ const AbstractController_1 = __importDefault(require("../../AbstractController"));
25
+ class RcBlocksTraceController extends AbstractController_1.default {
26
+ constructor(_api) {
27
+ var _a;
28
+ const rcApiSpecName = (_a = apiRegistry_1.ApiPromiseRegistry.getSpecNameByType('relay')) === null || _a === void 0 ? void 0 : _a.values();
29
+ const rcSpecName = rcApiSpecName ? Array.from(rcApiSpecName)[0] : undefined;
30
+ if (!rcSpecName) {
31
+ throw new Error('Relay chain API spec name is not defined.');
32
+ }
33
+ super(rcSpecName, '/experimental/rc/blocks', new services_1.BlocksTraceService(rcSpecName));
34
+ this.getLatestBlockTraces = async (_req, res) => {
35
+ var _a;
36
+ const rcApi = (_a = apiRegistry_1.ApiPromiseRegistry.getApiByType('relay')[0]) === null || _a === void 0 ? void 0 : _a.api;
37
+ if (!rcApi) {
38
+ throw new Error('Relay chain API not found, please use SAS_SUBSTRATE_MULTI_CHAIN_URL env variable');
39
+ }
40
+ const hash = await rcApi.rpc.chain.getFinalizedHead();
41
+ RcBlocksTraceController.sanitizedSend(res, await this.service.traces(hash));
42
+ };
43
+ this.getBlockTraces = async ({ params: { number } }, res) => {
44
+ var _a;
45
+ const rcApi = (_a = apiRegistry_1.ApiPromiseRegistry.getApiByType('relay')[0]) === null || _a === void 0 ? void 0 : _a.api;
46
+ if (!rcApi) {
47
+ throw new Error('Relay chain API not found, please use SAS_SUBSTRATE_MULTI_CHAIN_URL env variable');
48
+ }
49
+ const hash = await this.getHashFromAt(number, { api: rcApi });
50
+ RcBlocksTraceController.sanitizedSend(res, await this.service.traces(hash));
51
+ };
52
+ this.getLatestBlockOperations = async ({ query: { actions } }, res) => {
53
+ var _a;
54
+ const rcApi = (_a = apiRegistry_1.ApiPromiseRegistry.getApiByType('relay')[0]) === null || _a === void 0 ? void 0 : _a.api;
55
+ if (!rcApi) {
56
+ throw new Error('Relay chain API not found, please use SAS_SUBSTRATE_MULTI_CHAIN_URL env variable');
57
+ }
58
+ const hash = await rcApi.rpc.chain.getFinalizedHead();
59
+ const includeActions = actions === 'true';
60
+ const historicApi = await rcApi.at(hash);
61
+ RcBlocksTraceController.sanitizedSend(res, await this.service.operations(hash, historicApi, includeActions));
62
+ };
63
+ this.getBlockOperations = async ({ params: { number }, query: { actions } }, res) => {
64
+ var _a;
65
+ const rcApi = (_a = apiRegistry_1.ApiPromiseRegistry.getApiByType('relay')[0]) === null || _a === void 0 ? void 0 : _a.api;
66
+ if (!rcApi) {
67
+ throw new Error('Relay chain API not found, please use SAS_SUBSTRATE_MULTI_CHAIN_URL env variable');
68
+ }
69
+ const hash = await this.getHashFromAt(number, { api: rcApi });
70
+ const includeActions = actions === 'true';
71
+ const historicApi = await rcApi.at(hash);
72
+ RcBlocksTraceController.sanitizedSend(res, await this.service.operations(hash, historicApi, includeActions));
73
+ };
74
+ this.initRoutes();
75
+ }
76
+ initRoutes() {
77
+ this.router.use(this.path, (0, middleware_1.validateBoolean)(['actions']));
78
+ this.safeMountAsyncGetHandlers([
79
+ ['/head/traces', this.getLatestBlockTraces],
80
+ ['/:number/traces', this.getBlockTraces],
81
+ ['/:number/traces/operations', this.getBlockOperations],
82
+ ['/head/traces/operations', this.getLatestBlockOperations],
83
+ ]);
84
+ }
85
+ }
86
+ RcBlocksTraceController.controllerName = 'RcBlocksTrace';
87
+ RcBlocksTraceController.requiredPallets = [];
88
+ exports.default = RcBlocksTraceController;
89
+ //# sourceMappingURL=RcBlocksTraceController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RcBlocksTraceController.js","sourceRoot":"","sources":["../../../../../src/controllers/rc/blocks/RcBlocksTraceController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { default as RcBlocks } from './RcBlocksController';
2
+ export { default as RcBlocksExtrinsics } from './RcBlocksExtrinsicsController';
3
+ export { default as RcBlocksRawExtrinsics } from './RcBlocksRawExtrinsicsController';
4
+ export { default as RcBlocksTrace } from './RcBlocksTraceController';