@subql/node 6.4.0 → 6.4.1-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 (122) hide show
  1. package/package.json +5 -4
  2. package/dist/.tsbuildinfo +0 -1
  3. package/dist/app.module.d.ts +0 -2
  4. package/dist/app.module.js +0 -42
  5. package/dist/app.module.js.map +0 -1
  6. package/dist/blockchain.service.d.ts +0 -31
  7. package/dist/blockchain.service.js +0 -146
  8. package/dist/blockchain.service.js.map +0 -1
  9. package/dist/configure/NodeConfig.d.ts +0 -19
  10. package/dist/configure/NodeConfig.js +0 -28
  11. package/dist/configure/NodeConfig.js.map +0 -1
  12. package/dist/configure/SubqueryProject.d.ts +0 -13
  13. package/dist/configure/SubqueryProject.js +0 -29
  14. package/dist/configure/SubqueryProject.js.map +0 -1
  15. package/dist/configure/configure.module.d.ts +0 -11
  16. package/dist/configure/configure.module.js +0 -63
  17. package/dist/configure/configure.module.js.map +0 -1
  18. package/dist/indexer/api.service.d.ts +0 -36
  19. package/dist/indexer/api.service.js +0 -315
  20. package/dist/indexer/api.service.js.map +0 -1
  21. package/dist/indexer/apiPromise.connection.d.ts +0 -24
  22. package/dist/indexer/apiPromise.connection.js +0 -106
  23. package/dist/indexer/apiPromise.connection.js.map +0 -1
  24. package/dist/indexer/dictionary/index.d.ts +0 -2
  25. package/dist/indexer/dictionary/index.js +0 -21
  26. package/dist/indexer/dictionary/index.js.map +0 -1
  27. package/dist/indexer/dictionary/substrateDictionary.service.d.ts +0 -13
  28. package/dist/indexer/dictionary/substrateDictionary.service.js +0 -93
  29. package/dist/indexer/dictionary/substrateDictionary.service.js.map +0 -1
  30. package/dist/indexer/dictionary/types.d.ts +0 -10
  31. package/dist/indexer/dictionary/types.js +0 -5
  32. package/dist/indexer/dictionary/types.js.map +0 -1
  33. package/dist/indexer/dictionary/v1/index.d.ts +0 -1
  34. package/dist/indexer/dictionary/v1/index.js +0 -20
  35. package/dist/indexer/dictionary/v1/index.js.map +0 -1
  36. package/dist/indexer/dictionary/v1/substrateDictionaryV1.d.ts +0 -19
  37. package/dist/indexer/dictionary/v1/substrateDictionaryV1.js +0 -223
  38. package/dist/indexer/dictionary/v1/substrateDictionaryV1.js.map +0 -1
  39. package/dist/indexer/dictionary/v2/index.d.ts +0 -2
  40. package/dist/indexer/dictionary/v2/index.js +0 -21
  41. package/dist/indexer/dictionary/v2/index.js.map +0 -1
  42. package/dist/indexer/dictionary/v2/substrateDictionaryV2.d.ts +0 -20
  43. package/dist/indexer/dictionary/v2/substrateDictionaryV2.js +0 -46
  44. package/dist/indexer/dictionary/v2/substrateDictionaryV2.js.map +0 -1
  45. package/dist/indexer/dictionary/v2/types.d.ts +0 -5
  46. package/dist/indexer/dictionary/v2/types.js +0 -5
  47. package/dist/indexer/dictionary/v2/types.js.map +0 -1
  48. package/dist/indexer/fetch.module.d.ts +0 -2
  49. package/dist/indexer/fetch.module.js +0 -94
  50. package/dist/indexer/fetch.module.js.map +0 -1
  51. package/dist/indexer/indexer.manager.d.ts +0 -27
  52. package/dist/indexer/indexer.manager.js +0 -153
  53. package/dist/indexer/indexer.manager.js.map +0 -1
  54. package/dist/indexer/runtime/base-runtime.service.d.ts +0 -24
  55. package/dist/indexer/runtime/base-runtime.service.js +0 -136
  56. package/dist/indexer/runtime/base-runtime.service.js.map +0 -1
  57. package/dist/indexer/runtime/runtimeService.d.ts +0 -15
  58. package/dist/indexer/runtime/runtimeService.js +0 -94
  59. package/dist/indexer/runtime/runtimeService.js.map +0 -1
  60. package/dist/indexer/runtime/workerRuntimeService.d.ts +0 -9
  61. package/dist/indexer/runtime/workerRuntimeService.js +0 -43
  62. package/dist/indexer/runtime/workerRuntimeService.js.map +0 -1
  63. package/dist/indexer/types.d.ts +0 -20
  64. package/dist/indexer/types.js +0 -13
  65. package/dist/indexer/types.js.map +0 -1
  66. package/dist/indexer/worker/worker-fetch.module.d.ts +0 -5
  67. package/dist/indexer/worker/worker-fetch.module.js +0 -60
  68. package/dist/indexer/worker/worker-fetch.module.js.map +0 -1
  69. package/dist/indexer/worker/worker.d.ts +0 -9
  70. package/dist/indexer/worker/worker.js +0 -48
  71. package/dist/indexer/worker/worker.js.map +0 -1
  72. package/dist/indexer/worker/worker.module.d.ts +0 -2
  73. package/dist/indexer/worker/worker.module.js +0 -33
  74. package/dist/indexer/worker/worker.module.js.map +0 -1
  75. package/dist/indexer/worker/worker.service.d.ts +0 -26
  76. package/dist/indexer/worker/worker.service.js +0 -71
  77. package/dist/indexer/worker/worker.service.js.map +0 -1
  78. package/dist/indexer/x-provider/cachedProvider.d.ts +0 -2
  79. package/dist/indexer/x-provider/cachedProvider.js +0 -40
  80. package/dist/indexer/x-provider/cachedProvider.js.map +0 -1
  81. package/dist/indexer/x-provider/http.d.ts +0 -75
  82. package/dist/indexer/x-provider/http.js +0 -198
  83. package/dist/indexer/x-provider/http.js.map +0 -1
  84. package/dist/init.d.ts +0 -1
  85. package/dist/init.js +0 -41
  86. package/dist/init.js.map +0 -1
  87. package/dist/main.d.ts +0 -1
  88. package/dist/main.js +0 -19
  89. package/dist/main.js.map +0 -1
  90. package/dist/subcommands/forceClean.init.d.ts +0 -1
  91. package/dist/subcommands/forceClean.init.js +0 -10
  92. package/dist/subcommands/forceClean.init.js.map +0 -1
  93. package/dist/subcommands/forceClean.module.d.ts +0 -2
  94. package/dist/subcommands/forceClean.module.js +0 -28
  95. package/dist/subcommands/forceClean.module.js.map +0 -1
  96. package/dist/subcommands/reindex.init.d.ts +0 -3
  97. package/dist/subcommands/reindex.init.js +0 -33
  98. package/dist/subcommands/reindex.init.js.map +0 -1
  99. package/dist/subcommands/reindex.module.d.ts +0 -2
  100. package/dist/subcommands/reindex.module.js +0 -69
  101. package/dist/subcommands/reindex.module.js.map +0 -1
  102. package/dist/subcommands/testing.init.d.ts +0 -1
  103. package/dist/subcommands/testing.init.js +0 -21
  104. package/dist/subcommands/testing.init.js.map +0 -1
  105. package/dist/subcommands/testing.module.d.ts +0 -2
  106. package/dist/subcommands/testing.module.js +0 -65
  107. package/dist/subcommands/testing.module.js.map +0 -1
  108. package/dist/subcommands/testing.service.d.ts +0 -14
  109. package/dist/subcommands/testing.service.js +0 -60
  110. package/dist/subcommands/testing.service.js.map +0 -1
  111. package/dist/utils/project.d.ts +0 -9
  112. package/dist/utils/project.js +0 -116
  113. package/dist/utils/project.js.map +0 -1
  114. package/dist/utils/substrate.d.ts +0 -41
  115. package/dist/utils/substrate.js +0 -348
  116. package/dist/utils/substrate.js.map +0 -1
  117. package/dist/utils/test.utils.d.ts +0 -2
  118. package/dist/utils/test.utils.js +0 -70
  119. package/dist/utils/test.utils.js.map +0 -1
  120. package/dist/yargs.d.ts +0 -276
  121. package/dist/yargs.js +0 -27
  122. package/dist/yargs.js.map +0 -1
@@ -1,41 +0,0 @@
1
- import { ApiPromise } from '@polkadot/api';
2
- import { Vec } from '@polkadot/types';
3
- import '@polkadot/api-augment/substrate';
4
- import { BlockHash, EventRecord, RuntimeVersion, SignedBlock, Header as SubstrateHeader } from '@polkadot/types/interfaces';
5
- import { BN } from '@polkadot/util';
6
- import { IBlock, Header } from '@subql/node-core';
7
- import { SubstrateBlockFilter, SubstrateCallFilter, SubstrateEventFilter, SubstrateBlock, SubstrateEvent, SubstrateExtrinsic } from '@subql/types';
8
- import { BlockContent, LightBlockContent } from '../indexer/types';
9
- type MissTsHeader = Omit<Header, 'timestamp'>;
10
- export declare function substrateHeaderToHeader(header: SubstrateHeader): MissTsHeader;
11
- export declare function substrateBlockToHeader(block: SignedBlock): Header;
12
- export declare function wrapBlock(signedBlock: SignedBlock, events: EventRecord[], specVersion: number): SubstrateBlock;
13
- export declare function getTimestamp({ block: { extrinsics }, }: SignedBlock): Date | undefined;
14
- export declare function getHeaderForHash(api: ApiPromise, blockHash: string): Promise<Header>;
15
- export declare function wrapExtrinsics(wrappedBlock: SubstrateBlock, allEvents: EventRecord[]): SubstrateExtrinsic[];
16
- export declare function wrapEvents(extrinsics: SubstrateExtrinsic[], events: EventRecord[], block: SubstrateBlock): SubstrateEvent[];
17
- export declare function filterBlock(block: SubstrateBlock, filter?: SubstrateBlockFilter): SubstrateBlock | undefined;
18
- export declare function filterBlockModulo(block: SubstrateBlock, filter: SubstrateBlockFilter): boolean;
19
- export declare function filterExtrinsic({ block, extrinsic, success }: SubstrateExtrinsic, filter?: SubstrateCallFilter): boolean;
20
- export declare function filterExtrinsics(extrinsics: SubstrateExtrinsic[], filterOrFilters: SubstrateCallFilter | SubstrateCallFilter[] | undefined): SubstrateExtrinsic[];
21
- export declare function filterEvent({ block, event }: SubstrateEvent, filter?: SubstrateEventFilter): boolean;
22
- export declare function filterEvents(events: SubstrateEvent[], filterOrFilters?: SubstrateEventFilter | SubstrateEventFilter[]): SubstrateEvent[];
23
- export declare function prefetchMetadata(api: ApiPromise, hash: BlockHash): Promise<void>;
24
- /**
25
- *
26
- * @param api
27
- * @param startHeight
28
- * @param endHeight
29
- * @param overallSpecVer exists if all blocks in the range have same parant specVersion
30
- */
31
- export declare function getBlockByHeight(api: ApiPromise, height: number): Promise<SignedBlock>;
32
- export declare function getHeaderByHeight(api: ApiPromise, height: number): Promise<SubstrateHeader>;
33
- export declare function fetchBlocksArray(api: ApiPromise, blockArray: number[]): Promise<SignedBlock[]>;
34
- export declare function fetchHeaderArray(api: ApiPromise, blockArray: number[]): Promise<SubstrateHeader[]>;
35
- export declare function fetchEventsRange(api: ApiPromise, hashs: BlockHash[]): Promise<Vec<EventRecord>[]>;
36
- export declare function fetchRuntimeVersionRange(api: ApiPromise, hashs: BlockHash[]): Promise<RuntimeVersion[]>;
37
- export declare function fetchBlocksBatches(api: ApiPromise, blockArray: number[], overallSpecVer?: number): Promise<IBlock<BlockContent>[]>;
38
- export declare function fetchLightBlock(api: ApiPromise, height: number): Promise<IBlock<LightBlockContent>>;
39
- export declare function fetchBlocksBatchesLight(api: ApiPromise, blockArray: number[]): Promise<IBlock<LightBlockContent>[]>;
40
- export declare function calcInterval(api: ApiPromise): BN;
41
- export {};
@@ -1,348 +0,0 @@
1
- "use strict";
2
- // Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
3
- // SPDX-License-Identifier: GPL-3.0
4
- var __importDefault = (this && this.__importDefault) || function (mod) {
5
- return (mod && mod.__esModule) ? mod : { "default": mod };
6
- };
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.substrateHeaderToHeader = substrateHeaderToHeader;
9
- exports.substrateBlockToHeader = substrateBlockToHeader;
10
- exports.wrapBlock = wrapBlock;
11
- exports.getTimestamp = getTimestamp;
12
- exports.getHeaderForHash = getHeaderForHash;
13
- exports.wrapExtrinsics = wrapExtrinsics;
14
- exports.wrapEvents = wrapEvents;
15
- exports.filterBlock = filterBlock;
16
- exports.filterBlockModulo = filterBlockModulo;
17
- exports.filterExtrinsic = filterExtrinsic;
18
- exports.filterExtrinsics = filterExtrinsics;
19
- exports.filterEvent = filterEvent;
20
- exports.filterEvents = filterEvents;
21
- exports.prefetchMetadata = prefetchMetadata;
22
- exports.getBlockByHeight = getBlockByHeight;
23
- exports.getHeaderByHeight = getHeaderByHeight;
24
- exports.fetchBlocksArray = fetchBlocksArray;
25
- exports.fetchHeaderArray = fetchHeaderArray;
26
- exports.fetchEventsRange = fetchEventsRange;
27
- exports.fetchRuntimeVersionRange = fetchRuntimeVersionRange;
28
- exports.fetchBlocksBatches = fetchBlocksBatches;
29
- exports.fetchLightBlock = fetchLightBlock;
30
- exports.fetchBlocksBatchesLight = fetchBlocksBatchesLight;
31
- exports.calcInterval = calcInterval;
32
- const assert_1 = __importDefault(require("assert"));
33
- require("@polkadot/api-augment/substrate");
34
- const util_1 = require("@polkadot/util");
35
- const node_core_1 = require("@subql/node-core");
36
- const lodash_1 = require("lodash");
37
- const apiPromise_connection_1 = require("../indexer/apiPromise.connection");
38
- const logger = (0, node_core_1.getLogger)('fetch');
39
- const INTERVAL_THRESHOLD = util_1.BN_THOUSAND.div(util_1.BN_TWO);
40
- const DEFAULT_TIME = new util_1.BN(6_000);
41
- const A_DAY = new util_1.BN(24 * 60 * 60 * 1000);
42
- function substrateHeaderToHeader(header) {
43
- return {
44
- blockHeight: header.number.toNumber(),
45
- blockHash: header.hash.toHex(),
46
- parentHash: header.parentHash.toHex(),
47
- };
48
- }
49
- function substrateBlockToHeader(block) {
50
- const timestamp = getTimestamp(block);
51
- (0, assert_1.default)(timestamp, 'Failed to retrieve a reliable timestamp. This issue is more likely to occur on networks like Shiden');
52
- return {
53
- ...substrateHeaderToHeader(block.block.header),
54
- timestamp,
55
- };
56
- }
57
- function wrapBlock(signedBlock, events, specVersion) {
58
- return (0, lodash_1.merge)(signedBlock, {
59
- timestamp: getTimestamp(signedBlock),
60
- specVersion: specVersion,
61
- events,
62
- });
63
- }
64
- function getTimestamp({ block: { extrinsics }, }) {
65
- // extrinsics can be undefined when fetching light blocks
66
- if (extrinsics) {
67
- for (const e of extrinsics) {
68
- const { method: { method, section }, } = e;
69
- if (section === 'timestamp' && method === 'set') {
70
- const date = new Date(e.args[0].toJSON());
71
- if (isNaN(date.getTime())) {
72
- throw new Error('timestamp args type wrong');
73
- }
74
- return date;
75
- }
76
- }
77
- }
78
- // For network that doesn't use timestamp-set, return undefined
79
- // See test `return undefined if no timestamp set extrinsic`
80
- // E.g Shiden
81
- return undefined;
82
- }
83
- async function getHeaderForHash(api, blockHash) {
84
- const block = await api.rpc.chain.getBlock(blockHash).catch((e) => {
85
- logger.error(`failed to fetch Block hash="${blockHash}" ${getApiDecodeErrMsg(e.message)}`);
86
- throw apiPromise_connection_1.ApiPromiseConnection.handleError(e);
87
- });
88
- return substrateBlockToHeader(block);
89
- }
90
- function wrapExtrinsics(wrappedBlock, allEvents) {
91
- const groupedEvents = groupEventsByExtrinsic(allEvents);
92
- return wrappedBlock.block.extrinsics.map((extrinsic, idx) => {
93
- const events = groupedEvents[idx];
94
- return {
95
- idx,
96
- extrinsic,
97
- block: wrappedBlock,
98
- events,
99
- success: getExtrinsicSuccess(events),
100
- };
101
- });
102
- }
103
- function getExtrinsicSuccess(events) {
104
- return (events.findIndex((evt) => evt.event.method === 'ExtrinsicSuccess') > -1);
105
- }
106
- function groupEventsByExtrinsic(events) {
107
- return events.reduce((acc, event) => {
108
- const extrinsicIdx = event.phase.isApplyExtrinsic
109
- ? event.phase.asApplyExtrinsic.toNumber()
110
- : undefined;
111
- if (extrinsicIdx === undefined) {
112
- return acc;
113
- }
114
- acc[extrinsicIdx] ??= [];
115
- acc[extrinsicIdx].push(event);
116
- return acc;
117
- }, {});
118
- }
119
- function wrapEvents(extrinsics, events, block) {
120
- return events.reduce((acc, event, idx) => {
121
- const { phase } = event;
122
- const wrappedEvent = (0, lodash_1.merge)(event, { idx, block });
123
- if (phase.isApplyExtrinsic) {
124
- wrappedEvent.extrinsic = extrinsics[phase.asApplyExtrinsic.toNumber()];
125
- }
126
- acc.push(wrappedEvent);
127
- return acc;
128
- }, []);
129
- }
130
- function checkSpecRange(specVersionRange, specVersion) {
131
- const [lowerBond, upperBond] = specVersionRange;
132
- return ((lowerBond === undefined ||
133
- lowerBond === null ||
134
- specVersion >= lowerBond) &&
135
- (upperBond === undefined || upperBond === null || specVersion <= upperBond));
136
- }
137
- function filterBlock(block, filter) {
138
- if (!filter)
139
- return block;
140
- if (!filterBlockModulo(block, filter))
141
- return;
142
- if (block.timestamp &&
143
- !(0, node_core_1.filterBlockTimestamp)(block.timestamp.getTime(), filter)) {
144
- return;
145
- }
146
- return filter.specVersion === undefined ||
147
- block.specVersion === undefined ||
148
- checkSpecRange(filter.specVersion, block.specVersion)
149
- ? block
150
- : undefined;
151
- }
152
- function filterBlockModulo(block, filter) {
153
- const { modulo } = filter;
154
- if (!modulo)
155
- return true;
156
- return block.block.header.number.toNumber() % modulo === 0;
157
- }
158
- function filterExtrinsic({ block, extrinsic, success }, filter) {
159
- if (!filter)
160
- return true;
161
- return ((filter.specVersion === undefined ||
162
- block.specVersion === undefined ||
163
- checkSpecRange(filter.specVersion, block.specVersion)) &&
164
- (filter.module === undefined ||
165
- extrinsic.method.section === filter.module) &&
166
- (filter.method === undefined ||
167
- extrinsic.method.method === filter.method) &&
168
- (filter.success === undefined || success === filter.success) &&
169
- (filter.isSigned === undefined || extrinsic.isSigned === filter.isSigned));
170
- }
171
- function filterExtrinsics(extrinsics, filterOrFilters) {
172
- if (!filterOrFilters ||
173
- (filterOrFilters instanceof Array && filterOrFilters.length === 0)) {
174
- return extrinsics;
175
- }
176
- const filters = filterOrFilters instanceof Array ? filterOrFilters : [filterOrFilters];
177
- return extrinsics.filter((extrinsic) => filters.find((filter) => filterExtrinsic(extrinsic, filter)));
178
- }
179
- function filterEvent({ block, event }, filter) {
180
- if (!filter)
181
- return true;
182
- return ((filter.specVersion === undefined ||
183
- block.specVersion === undefined ||
184
- checkSpecRange(filter.specVersion, block.specVersion)) &&
185
- (filter.module ? event.section === filter.module : true) &&
186
- (filter.method ? event.method === filter.method : true));
187
- }
188
- function filterEvents(events, filterOrFilters) {
189
- if (!filterOrFilters ||
190
- (filterOrFilters instanceof Array && filterOrFilters.length === 0)) {
191
- return events;
192
- }
193
- const filters = filterOrFilters instanceof Array ? filterOrFilters : [filterOrFilters];
194
- return events.filter((event) => filters.find((filter) => filterEvent(event, filter)));
195
- }
196
- // TODO: prefetch all known runtime upgrades at once
197
- async function prefetchMetadata(api, hash) {
198
- await api.getBlockRegistry(hash);
199
- }
200
- /**
201
- *
202
- * @param api
203
- * @param startHeight
204
- * @param endHeight
205
- * @param overallSpecVer exists if all blocks in the range have same parant specVersion
206
- */
207
- async function getBlockByHeight(api, height) {
208
- const blockHash = await api.rpc.chain.getBlockHash(height).catch((e) => {
209
- logger.error(`failed to fetch BlockHash ${height}`);
210
- throw apiPromise_connection_1.ApiPromiseConnection.handleError(e);
211
- });
212
- const block = await api.rpc.chain.getBlock(blockHash).catch((e) => {
213
- logger.error(`failed to fetch Block hash="${blockHash}" height="${height}"${getApiDecodeErrMsg(e.message)}`);
214
- throw apiPromise_connection_1.ApiPromiseConnection.handleError(e);
215
- });
216
- // validate block is valid
217
- if (block.block.header.hash.toHex() !== blockHash.toHex()) {
218
- throw new Error(`fetched block header hash ${block.block.header.hash.toHex()} is not match with blockHash ${blockHash.toHex()} at block ${height}. This is likely a problem with the rpc provider.`);
219
- }
220
- return block;
221
- }
222
- async function getHeaderByHeight(api, height) {
223
- const blockHash = await api.rpc.chain.getBlockHash(height).catch((e) => {
224
- logger.error(`failed to fetch BlockHash ${height}`);
225
- throw apiPromise_connection_1.ApiPromiseConnection.handleError(e);
226
- });
227
- const header = await api.rpc.chain.getHeader(blockHash).catch((e) => {
228
- logger.error(`failed to fetch Block Header hash="${blockHash}" height="${height}"`);
229
- throw apiPromise_connection_1.ApiPromiseConnection.handleError(e);
230
- });
231
- // validate block is valid
232
- if (header.hash.toHex() !== blockHash.toHex()) {
233
- throw new Error(`fetched block header hash ${header.hash.toHex()} is not match with blockHash ${blockHash.toHex()} at block ${height}. This is likely a problem with the rpc provider.`);
234
- }
235
- return header;
236
- }
237
- async function fetchBlocksArray(api, blockArray) {
238
- return Promise.all(blockArray.map(async (height) => getBlockByHeight(api, height)));
239
- }
240
- async function fetchHeaderArray(api, blockArray) {
241
- return Promise.all(blockArray.map(async (height) => getHeaderByHeight(api, height)));
242
- }
243
- async function fetchEventsRange(api, hashs) {
244
- return Promise.all(hashs.map((hash) => api.query.system.events.at(hash).catch((e) => {
245
- logger.error(`failed to fetch events at block ${hash}${getApiDecodeErrMsg(e.message)}`);
246
- throw apiPromise_connection_1.ApiPromiseConnection.handleError(e);
247
- })));
248
- }
249
- async function fetchRuntimeVersionRange(api, hashs) {
250
- return Promise.all(hashs.map((hash) => api.rpc.state.getRuntimeVersion(hash).catch((e) => {
251
- logger.error(`failed to fetch RuntimeVersion at block ${hash}`);
252
- throw apiPromise_connection_1.ApiPromiseConnection.handleError(e);
253
- })));
254
- }
255
- async function fetchBlocksBatches(api, blockArray, overallSpecVer) {
256
- const blocks = await fetchBlocksArray(api, blockArray);
257
- const blockHashs = blocks.map((b) => b.block.header.hash);
258
- const parentBlockHashs = blocks.map((b) => b.block.header.parentHash);
259
- // If overallSpecVersion passed, we don't need to use api to get runtimeVersions
260
- // wrap block with specVersion
261
- // If specVersion changed, we also not guarantee in this batch contains multiple runtimes,
262
- // therefore we better to fetch runtime over all blocks
263
- const [blockEvents, runtimeVersions] = await Promise.all([
264
- fetchEventsRange(api, blockHashs),
265
- overallSpecVer !== undefined // note, we need to be careful if spec version is 0
266
- ? undefined
267
- : fetchRuntimeVersionRange(api, parentBlockHashs),
268
- ]);
269
- return blocks.map((block, idx) => {
270
- const events = blockEvents[idx];
271
- const parentSpecVersion = overallSpecVer ?? runtimeVersions?.[idx].specVersion.toNumber();
272
- (0, assert_1.default)(parentSpecVersion !== undefined, 'parentSpecVersion is undefined');
273
- const wrappedBlock = wrapBlock(block, events.toArray(), parentSpecVersion);
274
- const wrappedExtrinsics = wrapExtrinsics(wrappedBlock, events);
275
- const wrappedEvents = wrapEvents(wrappedExtrinsics, events, wrappedBlock);
276
- return {
277
- getHeader: () => substrateBlockToHeader(wrappedBlock),
278
- block: {
279
- block: wrappedBlock,
280
- extrinsics: wrappedExtrinsics,
281
- events: wrappedEvents,
282
- },
283
- };
284
- });
285
- }
286
- // TODO why is fetchBlocksBatches a breadth first function rather than depth?
287
- async function fetchLightBlock(api, height) {
288
- const blockHash = await api.rpc.chain.getBlockHash(height).catch((e) => {
289
- logger.error(`failed to fetch BlockHash ${height}`);
290
- throw apiPromise_connection_1.ApiPromiseConnection.handleError(e);
291
- });
292
- const [header, events, timestamp] = await Promise.all([
293
- api.rpc.chain.getHeader(blockHash).catch((e) => {
294
- logger.error(`failed to fetch Block Header hash="${blockHash}" height="${height}"`);
295
- throw apiPromise_connection_1.ApiPromiseConnection.handleError(e);
296
- }),
297
- api.query.system.events.at(blockHash).catch((e) => {
298
- logger.error(`failed to fetch events at block ${blockHash}`);
299
- throw apiPromise_connection_1.ApiPromiseConnection.handleError(e);
300
- }),
301
- // TODO: Maybe api.query.timestamp.now.at(blockHash) is the only option. If we do use it we need sufficient tests and errors if a chain doesn't support getting the timestamp.
302
- (await api.at(blockHash)).query.timestamp.now(),
303
- ]);
304
- const blockHeader = {
305
- block: { header },
306
- events: events.toArray(),
307
- };
308
- return {
309
- block: {
310
- block: blockHeader,
311
- events: events.map((evt, idx) => (0, lodash_1.merge)(evt, { idx, block: blockHeader })),
312
- },
313
- getHeader: () => {
314
- return {
315
- ...substrateHeaderToHeader(blockHeader.block.header),
316
- timestamp: new Date(timestamp.toNumber()),
317
- };
318
- },
319
- };
320
- }
321
- async function fetchBlocksBatchesLight(api, blockArray) {
322
- return Promise.all(blockArray.map((height) => fetchLightBlock(api, height)));
323
- }
324
- function calcInterval(api) {
325
- return (0, util_1.bnMin)(A_DAY, api.consts.babe?.expectedBlockTime ||
326
- api.consts.difficulty?.targetBlockTime ||
327
- api.consts.subspace?.expectedBlockTime ||
328
- (api.consts.timestamp?.minimumPeriod.gte(INTERVAL_THRESHOLD)
329
- ? api.consts.timestamp.minimumPeriod.mul(util_1.BN_TWO)
330
- : api.query.parachainSystem
331
- ? DEFAULT_TIME.mul(util_1.BN_TWO)
332
- : DEFAULT_TIME));
333
- }
334
- function getApiDecodeErrMsg(errMsg) {
335
- const decodedErrMsgs = [
336
- 'Unable to decode',
337
- 'failed decoding',
338
- 'unknown type',
339
- ];
340
- if (!decodedErrMsgs.find((decodedErrMsg) => errMsg.includes(decodedErrMsg))) {
341
- return '';
342
- }
343
- return (`\nThis is because the block cannot be decoded. To solve this you can either:` +
344
- '\n* Skip the block' +
345
- '\n* Update the chain types. You can test this by viewing the block with https://polkadot.js.org/apps/' +
346
- '\nFor further information please read the docs: https://academy.subquery.network/');
347
- }
348
- //# sourceMappingURL=substrate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"substrate.js","sourceRoot":"","sources":["../../src/utils/substrate.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport assert from 'assert';\nimport { ApiPromise } from '@polkadot/api';\nimport { Vec } from '@polkadot/types';\nimport '@polkadot/api-augment/substrate';\nimport {\n BlockHash,\n EventRecord,\n RuntimeVersion,\n SignedBlock,\n Header as SubstrateHeader,\n} from '@polkadot/types/interfaces';\nimport { BN, BN_THOUSAND, BN_TWO, bnMin } from '@polkadot/util';\nimport {\n getLogger,\n IBlock,\n Header,\n filterBlockTimestamp,\n} from '@subql/node-core';\nimport {\n SpecVersionRange,\n SubstrateBlockFilter,\n SubstrateCallFilter,\n SubstrateEventFilter,\n SubstrateBlock,\n SubstrateEvent,\n SubstrateExtrinsic,\n BlockHeader,\n} from '@subql/types';\nimport { merge } from 'lodash';\nimport { SubqlProjectBlockFilter } from '../configure/SubqueryProject';\nimport { ApiPromiseConnection } from '../indexer/apiPromise.connection';\nimport { BlockContent, LightBlockContent } from '../indexer/types';\n\nconst logger = getLogger('fetch');\nconst INTERVAL_THRESHOLD = BN_THOUSAND.div(BN_TWO);\nconst DEFAULT_TIME = new BN(6_000);\nconst A_DAY = new BN(24 * 60 * 60 * 1000);\n\ntype MissTsHeader = Omit<Header, 'timestamp'>;\n\nexport function substrateHeaderToHeader(header: SubstrateHeader): MissTsHeader {\n return {\n blockHeight: header.number.toNumber(),\n blockHash: header.hash.toHex(),\n parentHash: header.parentHash.toHex(),\n };\n}\n\nexport function substrateBlockToHeader(block: SignedBlock): Header {\n const timestamp = getTimestamp(block);\n assert(\n timestamp,\n 'Failed to retrieve a reliable timestamp. This issue is more likely to occur on networks like Shiden',\n );\n\n return {\n ...substrateHeaderToHeader(block.block.header),\n timestamp,\n };\n}\n\nexport function wrapBlock(\n signedBlock: SignedBlock,\n events: EventRecord[],\n specVersion: number,\n): SubstrateBlock {\n return merge(signedBlock, {\n timestamp: getTimestamp(signedBlock),\n specVersion: specVersion,\n events,\n });\n}\n\nexport function getTimestamp({\n block: { extrinsics },\n}: SignedBlock): Date | undefined {\n // extrinsics can be undefined when fetching light blocks\n if (extrinsics) {\n for (const e of extrinsics) {\n const {\n method: { method, section },\n } = e;\n if (section === 'timestamp' && method === 'set') {\n const date = new Date(e.args[0].toJSON() as number);\n if (isNaN(date.getTime())) {\n throw new Error('timestamp args type wrong');\n }\n return date;\n }\n }\n }\n // For network that doesn't use timestamp-set, return undefined\n // See test `return undefined if no timestamp set extrinsic`\n // E.g Shiden\n return undefined;\n}\n\nexport async function getHeaderForHash(\n api: ApiPromise,\n blockHash: string,\n): Promise<Header> {\n const block = await api.rpc.chain.getBlock(blockHash).catch((e) => {\n logger.error(\n `failed to fetch Block hash=\"${blockHash}\" ${getApiDecodeErrMsg(e.message)}`,\n );\n throw ApiPromiseConnection.handleError(e);\n });\n\n return substrateBlockToHeader(block);\n}\n\nexport function wrapExtrinsics(\n wrappedBlock: SubstrateBlock,\n allEvents: EventRecord[],\n): SubstrateExtrinsic[] {\n const groupedEvents = groupEventsByExtrinsic(allEvents);\n return wrappedBlock.block.extrinsics.map((extrinsic, idx) => {\n const events = groupedEvents[idx];\n return {\n idx,\n extrinsic,\n block: wrappedBlock,\n events,\n success: getExtrinsicSuccess(events),\n };\n });\n}\n\nfunction getExtrinsicSuccess(events: EventRecord[]): boolean {\n return (\n events.findIndex((evt) => evt.event.method === 'ExtrinsicSuccess') > -1\n );\n}\n\nfunction groupEventsByExtrinsic(\n events: EventRecord[],\n): Record<number, EventRecord[]> {\n return events.reduce(\n (acc, event) => {\n const extrinsicIdx = event.phase.isApplyExtrinsic\n ? event.phase.asApplyExtrinsic.toNumber()\n : undefined;\n if (extrinsicIdx === undefined) {\n return acc;\n }\n acc[extrinsicIdx] ??= [];\n acc[extrinsicIdx].push(event);\n return acc;\n },\n {} as Record<number, EventRecord[]>,\n );\n}\n\nexport function wrapEvents(\n extrinsics: SubstrateExtrinsic[],\n events: EventRecord[],\n block: SubstrateBlock,\n): SubstrateEvent[] {\n return events.reduce((acc, event, idx) => {\n const { phase } = event;\n const wrappedEvent: SubstrateEvent = merge(event, { idx, block });\n if (phase.isApplyExtrinsic) {\n wrappedEvent.extrinsic = extrinsics[phase.asApplyExtrinsic.toNumber()];\n }\n acc.push(wrappedEvent);\n return acc;\n }, [] as SubstrateEvent[]);\n}\n\nfunction checkSpecRange(\n specVersionRange: SpecVersionRange,\n specVersion: number,\n) {\n const [lowerBond, upperBond] = specVersionRange;\n return (\n (lowerBond === undefined ||\n lowerBond === null ||\n specVersion >= lowerBond) &&\n (upperBond === undefined || upperBond === null || specVersion <= upperBond)\n );\n}\n\nexport function filterBlock(\n block: SubstrateBlock,\n filter?: SubstrateBlockFilter,\n): SubstrateBlock | undefined {\n if (!filter) return block;\n if (!filterBlockModulo(block, filter)) return;\n if (\n block.timestamp &&\n !filterBlockTimestamp(\n block.timestamp.getTime(),\n filter as SubqlProjectBlockFilter,\n )\n ) {\n return;\n }\n return filter.specVersion === undefined ||\n block.specVersion === undefined ||\n checkSpecRange(filter.specVersion, block.specVersion)\n ? block\n : undefined;\n}\n\nexport function filterBlockModulo(\n block: SubstrateBlock,\n filter: SubstrateBlockFilter,\n): boolean {\n const { modulo } = filter;\n if (!modulo) return true;\n return block.block.header.number.toNumber() % modulo === 0;\n}\n\nexport function filterExtrinsic(\n { block, extrinsic, success }: SubstrateExtrinsic,\n filter?: SubstrateCallFilter,\n): boolean {\n if (!filter) return true;\n return (\n (filter.specVersion === undefined ||\n block.specVersion === undefined ||\n checkSpecRange(filter.specVersion, block.specVersion)) &&\n (filter.module === undefined ||\n extrinsic.method.section === filter.module) &&\n (filter.method === undefined ||\n extrinsic.method.method === filter.method) &&\n (filter.success === undefined || success === filter.success) &&\n (filter.isSigned === undefined || extrinsic.isSigned === filter.isSigned)\n );\n}\n\nexport function filterExtrinsics(\n extrinsics: SubstrateExtrinsic[],\n filterOrFilters: SubstrateCallFilter | SubstrateCallFilter[] | undefined,\n): SubstrateExtrinsic[] {\n if (\n !filterOrFilters ||\n (filterOrFilters instanceof Array && filterOrFilters.length === 0)\n ) {\n return extrinsics;\n }\n const filters =\n filterOrFilters instanceof Array ? filterOrFilters : [filterOrFilters];\n return extrinsics.filter((extrinsic) =>\n filters.find((filter) => filterExtrinsic(extrinsic, filter)),\n );\n}\n\nexport function filterEvent(\n { block, event }: SubstrateEvent,\n filter?: SubstrateEventFilter,\n): boolean {\n if (!filter) return true;\n return (\n (filter.specVersion === undefined ||\n block.specVersion === undefined ||\n checkSpecRange(filter.specVersion, block.specVersion)) &&\n (filter.module ? event.section === filter.module : true) &&\n (filter.method ? event.method === filter.method : true)\n );\n}\n\nexport function filterEvents(\n events: SubstrateEvent[],\n filterOrFilters?: SubstrateEventFilter | SubstrateEventFilter[],\n): SubstrateEvent[] {\n if (\n !filterOrFilters ||\n (filterOrFilters instanceof Array && filterOrFilters.length === 0)\n ) {\n return events;\n }\n const filters =\n filterOrFilters instanceof Array ? filterOrFilters : [filterOrFilters];\n return events.filter((event) =>\n filters.find((filter) => filterEvent(event, filter)),\n );\n}\n\n// TODO: prefetch all known runtime upgrades at once\nexport async function prefetchMetadata(\n api: ApiPromise,\n hash: BlockHash,\n): Promise<void> {\n await api.getBlockRegistry(hash);\n}\n\n/**\n *\n * @param api\n * @param startHeight\n * @param endHeight\n * @param overallSpecVer exists if all blocks in the range have same parant specVersion\n */\n\nexport async function getBlockByHeight(\n api: ApiPromise,\n height: number,\n): Promise<SignedBlock> {\n const blockHash = await api.rpc.chain.getBlockHash(height).catch((e) => {\n logger.error(`failed to fetch BlockHash ${height}`);\n throw ApiPromiseConnection.handleError(e);\n });\n\n const block = await api.rpc.chain.getBlock(blockHash).catch((e) => {\n logger.error(\n `failed to fetch Block hash=\"${blockHash}\" height=\"${height}\"${getApiDecodeErrMsg(e.message)}`,\n );\n throw ApiPromiseConnection.handleError(e);\n });\n\n // validate block is valid\n if (block.block.header.hash.toHex() !== blockHash.toHex()) {\n throw new Error(\n `fetched block header hash ${block.block.header.hash.toHex()} is not match with blockHash ${blockHash.toHex()} at block ${height}. This is likely a problem with the rpc provider.`,\n );\n }\n return block;\n}\n\nexport async function getHeaderByHeight(\n api: ApiPromise,\n height: number,\n): Promise<SubstrateHeader> {\n const blockHash = await api.rpc.chain.getBlockHash(height).catch((e) => {\n logger.error(`failed to fetch BlockHash ${height}`);\n throw ApiPromiseConnection.handleError(e);\n });\n\n const header = await api.rpc.chain.getHeader(blockHash).catch((e) => {\n logger.error(\n `failed to fetch Block Header hash=\"${blockHash}\" height=\"${height}\"`,\n );\n throw ApiPromiseConnection.handleError(e);\n });\n // validate block is valid\n if (header.hash.toHex() !== blockHash.toHex()) {\n throw new Error(\n `fetched block header hash ${header.hash.toHex()} is not match with blockHash ${blockHash.toHex()} at block ${height}. This is likely a problem with the rpc provider.`,\n );\n }\n return header;\n}\n\nexport async function fetchBlocksArray(\n api: ApiPromise,\n blockArray: number[],\n): Promise<SignedBlock[]> {\n return Promise.all(\n blockArray.map(async (height) => getBlockByHeight(api, height)),\n );\n}\n\nexport async function fetchHeaderArray(\n api: ApiPromise,\n blockArray: number[],\n): Promise<SubstrateHeader[]> {\n return Promise.all(\n blockArray.map(async (height) => getHeaderByHeight(api, height)),\n );\n}\n\nexport async function fetchEventsRange(\n api: ApiPromise,\n hashs: BlockHash[],\n): Promise<Vec<EventRecord>[]> {\n return Promise.all(\n hashs.map((hash) =>\n api.query.system.events.at(hash).catch((e) => {\n logger.error(\n `failed to fetch events at block ${hash}${getApiDecodeErrMsg(e.message)}`,\n );\n throw ApiPromiseConnection.handleError(e);\n }),\n ),\n );\n}\n\nexport async function fetchRuntimeVersionRange(\n api: ApiPromise,\n hashs: BlockHash[],\n): Promise<RuntimeVersion[]> {\n return Promise.all(\n hashs.map((hash) =>\n api.rpc.state.getRuntimeVersion(hash).catch((e) => {\n logger.error(`failed to fetch RuntimeVersion at block ${hash}`);\n throw ApiPromiseConnection.handleError(e);\n }),\n ),\n );\n}\n\nexport async function fetchBlocksBatches(\n api: ApiPromise,\n blockArray: number[],\n overallSpecVer?: number,\n): Promise<IBlock<BlockContent>[]> {\n const blocks = await fetchBlocksArray(api, blockArray);\n const blockHashs = blocks.map((b) => b.block.header.hash);\n const parentBlockHashs = blocks.map((b) => b.block.header.parentHash);\n // If overallSpecVersion passed, we don't need to use api to get runtimeVersions\n // wrap block with specVersion\n // If specVersion changed, we also not guarantee in this batch contains multiple runtimes,\n // therefore we better to fetch runtime over all blocks\n const [blockEvents, runtimeVersions] = await Promise.all([\n fetchEventsRange(api, blockHashs),\n overallSpecVer !== undefined // note, we need to be careful if spec version is 0\n ? undefined\n : fetchRuntimeVersionRange(api, parentBlockHashs),\n ]);\n\n return blocks.map((block, idx) => {\n const events = blockEvents[idx];\n const parentSpecVersion =\n overallSpecVer ?? runtimeVersions?.[idx].specVersion.toNumber();\n assert(parentSpecVersion !== undefined, 'parentSpecVersion is undefined');\n\n const wrappedBlock = wrapBlock(block, events.toArray(), parentSpecVersion);\n const wrappedExtrinsics = wrapExtrinsics(wrappedBlock, events);\n const wrappedEvents = wrapEvents(wrappedExtrinsics, events, wrappedBlock);\n\n return {\n getHeader: () => substrateBlockToHeader(wrappedBlock),\n block: {\n block: wrappedBlock,\n extrinsics: wrappedExtrinsics,\n events: wrappedEvents,\n },\n };\n });\n}\n\n// TODO why is fetchBlocksBatches a breadth first function rather than depth?\nexport async function fetchLightBlock(\n api: ApiPromise,\n height: number,\n): Promise<IBlock<LightBlockContent>> {\n const blockHash = await api.rpc.chain.getBlockHash(height).catch((e) => {\n logger.error(`failed to fetch BlockHash ${height}`);\n throw ApiPromiseConnection.handleError(e);\n });\n\n const [header, events, timestamp] = await Promise.all([\n api.rpc.chain.getHeader(blockHash).catch((e) => {\n logger.error(\n `failed to fetch Block Header hash=\"${blockHash}\" height=\"${height}\"`,\n );\n throw ApiPromiseConnection.handleError(e);\n }),\n api.query.system.events.at(blockHash).catch((e) => {\n logger.error(`failed to fetch events at block ${blockHash}`);\n throw ApiPromiseConnection.handleError(e);\n }),\n // TODO: Maybe api.query.timestamp.now.at(blockHash) is the only option. If we do use it we need sufficient tests and errors if a chain doesn't support getting the timestamp.\n (await api.at(blockHash)).query.timestamp.now(),\n ]);\n\n const blockHeader: BlockHeader = {\n block: { header },\n events: events.toArray(),\n };\n return {\n block: {\n block: blockHeader,\n events: events.map((evt, idx) => merge(evt, { idx, block: blockHeader })),\n },\n getHeader: () => {\n return {\n ...substrateHeaderToHeader(blockHeader.block.header),\n timestamp: new Date(timestamp.toNumber()),\n };\n },\n };\n}\n\nexport async function fetchBlocksBatchesLight(\n api: ApiPromise,\n blockArray: number[],\n): Promise<IBlock<LightBlockContent>[]> {\n return Promise.all(blockArray.map((height) => fetchLightBlock(api, height)));\n}\n\nexport function calcInterval(api: ApiPromise): BN {\n return bnMin(\n A_DAY,\n api.consts.babe?.expectedBlockTime ||\n (api.consts.difficulty?.targetBlockTime as any) ||\n api.consts.subspace?.expectedBlockTime ||\n (api.consts.timestamp?.minimumPeriod.gte(INTERVAL_THRESHOLD)\n ? api.consts.timestamp.minimumPeriod.mul(BN_TWO)\n : api.query.parachainSystem\n ? DEFAULT_TIME.mul(BN_TWO)\n : DEFAULT_TIME),\n );\n}\n\nfunction getApiDecodeErrMsg(errMsg: string): string {\n const decodedErrMsgs = [\n 'Unable to decode',\n 'failed decoding',\n 'unknown type',\n ];\n\n if (!decodedErrMsgs.find((decodedErrMsg) => errMsg.includes(decodedErrMsg))) {\n return '';\n }\n\n return (\n `\\nThis is because the block cannot be decoded. To solve this you can either:` +\n '\\n* Skip the block' +\n '\\n* Update the chain types. You can test this by viewing the block with https://polkadot.js.org/apps/' +\n '\\nFor further information please read the docs: https://academy.subquery.network/'\n );\n}\n"]}
@@ -1,2 +0,0 @@
1
- import { INestApplication } from '@nestjs/common';
2
- export declare function prepareApp(schemaName: string, cid: string, disableHistorical?: boolean, useSubscription?: boolean, timestampField?: boolean): Promise<INestApplication>;
@@ -1,70 +0,0 @@
1
- "use strict";
2
- // Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
3
- // SPDX-License-Identifier: GPL-3.0
4
- Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.prepareApp = prepareApp;
6
- const event_emitter_1 = require("@nestjs/event-emitter");
7
- const schedule_1 = require("@nestjs/schedule");
8
- const testing_1 = require("@nestjs/testing");
9
- const node_core_1 = require("@subql/node-core");
10
- const configure_module_1 = require("../configure/configure.module");
11
- const SubqueryProject_1 = require("../configure/SubqueryProject");
12
- const fetch_module_1 = require("../indexer/fetch.module");
13
- const mockInstance = async (cid, schemaName, historical, useSubscription, timestampField) => {
14
- const argv = {
15
- _: [],
16
- historical,
17
- subquery: `ipfs://${cid}`,
18
- dbSchema: schemaName,
19
- allowSchemaMigration: true,
20
- ipfs: 'https://unauthipfs.subquery.network/ipfs/api/v0',
21
- networkEndpoint: 'https://rpc.polkadot.io/public',
22
- timestampField,
23
- subscription: useSubscription,
24
- // unfinalizedBlocks: false,
25
- };
26
- return (0, node_core_1.registerApp)(argv, SubqueryProject_1.createSubQueryProject, () => { }, //jest.fn(),
27
- '');
28
- };
29
- async function mockRegister(cid, schemaName, historical, useSubscription, timestampField) {
30
- const { nodeConfig, project } = await mockInstance(cid, schemaName, historical, useSubscription, timestampField);
31
- return {
32
- module: configure_module_1.ConfigureModule,
33
- providers: [
34
- {
35
- provide: node_core_1.NodeConfig,
36
- useValue: nodeConfig,
37
- },
38
- {
39
- provide: 'ISubqueryProject',
40
- useValue: project,
41
- },
42
- {
43
- provide: 'IProjectUpgradeService',
44
- useValue: project,
45
- },
46
- {
47
- provide: 'Null',
48
- useValue: null,
49
- },
50
- ],
51
- exports: [node_core_1.NodeConfig, 'ISubqueryProject', 'IProjectUpgradeService', 'Null'],
52
- };
53
- }
54
- async function prepareApp(schemaName, cid, disableHistorical = false, useSubscription = false, timestampField = false) {
55
- const m = await testing_1.Test.createTestingModule({
56
- imports: [
57
- node_core_1.DbModule.forRoot(),
58
- event_emitter_1.EventEmitterModule.forRoot(),
59
- mockRegister(cid, schemaName, disableHistorical ? false : 'height', useSubscription, timestampField),
60
- schedule_1.ScheduleModule.forRoot(),
61
- node_core_1.CoreModule,
62
- fetch_module_1.FetchModule,
63
- ],
64
- controllers: [],
65
- }).compile();
66
- const app = m.createNestApplication();
67
- await app.init();
68
- return app;
69
- }
70
- //# sourceMappingURL=test.utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test.utils.js","sourceRoot":"","sources":["../../src/utils/test.utils.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAwFnC,gCA4BC;AA/GD,yDAA2D;AAC3D,+CAAkD;AAClD,6CAAuC;AACvC,gDAM0B;AAC1B,oEAAgE;AAChE,kEAGsC;AACtC,0DAAsD;AAEtD,MAAM,YAAY,GAAG,KAAK,EACxB,GAAW,EACX,UAAkB,EAClB,UAA0B,EAC1B,eAAwB,EACxB,cAAuB,EACvB,EAAE;IACF,MAAM,IAAI,GAAwB;QAChC,CAAC,EAAE,EAAE;QACL,UAAU;QACV,QAAQ,EAAE,UAAU,GAAG,EAAE;QACzB,QAAQ,EAAE,UAAU;QACpB,oBAAoB,EAAE,IAAI;QAC1B,IAAI,EAAE,iDAAiD;QACvD,eAAe,EAAE,gCAAgC;QACjD,cAAc;QACd,YAAY,EAAE,eAAe;QAC7B,4BAA4B;KAC7B,CAAC;IACF,OAAO,IAAA,uBAAW,EAChB,IAAI,EACJ,uCAAqB,EACrB,GAAG,EAAE,GAAE,CAAC,EAAE,YAAY;IACtB,EAAE,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,KAAK,UAAU,YAAY,CACzB,GAAW,EACX,UAAkB,EAClB,UAA0B,EAC1B,eAAwB,EACxB,cAAuB;IAEvB,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,YAAY,CAChD,GAAG,EACH,UAAU,EACV,UAAU,EACV,eAAe,EACf,cAAc,CACf,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,kCAAe;QACvB,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,sBAAU;gBACnB,QAAQ,EAAE,UAAU;aACrB;YACD;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,QAAQ,EAAE,OAAO;aAClB;YACD;gBACE,OAAO,EAAE,wBAAwB;gBACjC,QAAQ,EAAE,OAAO;aAClB;YACD;gBACE,OAAO,EAAE,MAAM;gBACf,QAAQ,EAAE,IAAI;aACf;SACF;QACD,OAAO,EAAE,CAAC,sBAAU,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,CAAC;KAC5E,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,UAAU,CAC9B,UAAkB,EAClB,GAAW,EACX,iBAAiB,GAAG,KAAK,EACzB,eAAe,GAAG,KAAK,EACvB,cAAc,GAAG,KAAK;IAEtB,MAAM,CAAC,GAAG,MAAM,cAAI,CAAC,mBAAmB,CAAC;QACvC,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAkB,CAAC,OAAO,EAAE;YAC5B,YAAY,CACV,GAAG,EACH,UAAU,EACV,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EACpC,eAAe,EACf,cAAc,CACf;YACD,yBAAc,CAAC,OAAO,EAAE;YACxB,sBAAU;YACV,0BAAW;SACZ;QACD,WAAW,EAAE,EAAE;KAChB,CAAC,CAAC,OAAO,EAAE,CAAC;IAEb,MAAM,GAAG,GAAG,CAAC,CAAC,qBAAqB,EAAE,CAAC;IACtC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IACjB,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\n// Utils for integration tests\n\nimport { DynamicModule, INestApplication } from '@nestjs/common';\nimport { EventEmitterModule } from '@nestjs/event-emitter';\nimport { ScheduleModule } from '@nestjs/schedule';\nimport { Test } from '@nestjs/testing';\nimport {\n CoreModule,\n DbModule,\n HistoricalMode,\n NodeConfig,\n registerApp,\n} from '@subql/node-core';\nimport { ConfigureModule } from '../configure/configure.module';\nimport {\n createSubQueryProject,\n SubqueryProject,\n} from '../configure/SubqueryProject';\nimport { FetchModule } from '../indexer/fetch.module';\n\nconst mockInstance = async (\n cid: string,\n schemaName: string,\n historical: HistoricalMode,\n useSubscription: boolean,\n timestampField: boolean,\n) => {\n const argv: Record<string, any> = {\n _: [],\n historical,\n subquery: `ipfs://${cid}`,\n dbSchema: schemaName,\n allowSchemaMigration: true,\n ipfs: 'https://unauthipfs.subquery.network/ipfs/api/v0',\n networkEndpoint: 'https://rpc.polkadot.io/public',\n timestampField,\n subscription: useSubscription,\n // unfinalizedBlocks: false,\n };\n return registerApp<SubqueryProject>(\n argv,\n createSubQueryProject,\n () => {}, //jest.fn(),\n '',\n );\n};\n\nasync function mockRegister(\n cid: string,\n schemaName: string,\n historical: HistoricalMode,\n useSubscription: boolean,\n timestampField: boolean,\n): Promise<DynamicModule> {\n const { nodeConfig, project } = await mockInstance(\n cid,\n schemaName,\n historical,\n useSubscription,\n timestampField,\n );\n\n return {\n module: ConfigureModule,\n providers: [\n {\n provide: NodeConfig,\n useValue: nodeConfig,\n },\n {\n provide: 'ISubqueryProject',\n useValue: project,\n },\n {\n provide: 'IProjectUpgradeService',\n useValue: project,\n },\n {\n provide: 'Null',\n useValue: null,\n },\n ],\n exports: [NodeConfig, 'ISubqueryProject', 'IProjectUpgradeService', 'Null'],\n };\n}\n\nexport async function prepareApp(\n schemaName: string,\n cid: string,\n disableHistorical = false,\n useSubscription = false,\n timestampField = false,\n): Promise<INestApplication> {\n const m = await Test.createTestingModule({\n imports: [\n DbModule.forRoot(),\n EventEmitterModule.forRoot(),\n mockRegister(\n cid,\n schemaName,\n disableHistorical ? false : 'height',\n useSubscription,\n timestampField,\n ),\n ScheduleModule.forRoot(),\n CoreModule,\n FetchModule,\n ],\n controllers: [],\n }).compile();\n\n const app = m.createNestApplication();\n await app.init();\n return app;\n}\n"]}