@subql/node-starknet 5.7.3-1 → 5.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/CHANGELOG.md +5 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/blockchain.service.d.ts +30 -0
  4. package/dist/blockchain.service.js +111 -0
  5. package/dist/blockchain.service.js.map +1 -0
  6. package/dist/{indexer/project.service.test.js → blockchain.service.spec.js} +7 -7
  7. package/dist/blockchain.service.spec.js.map +1 -0
  8. package/dist/indexer/fetch.module.js +29 -27
  9. package/dist/indexer/fetch.module.js.map +1 -1
  10. package/dist/indexer/indexer.manager.d.ts +6 -10
  11. package/dist/indexer/indexer.manager.js +15 -11
  12. package/dist/indexer/indexer.manager.js.map +1 -1
  13. package/dist/indexer/worker/worker-fetch.module.js +7 -18
  14. package/dist/indexer/worker/worker-fetch.module.js.map +1 -1
  15. package/dist/indexer/worker/worker.js.map +1 -1
  16. package/dist/indexer/worker/worker.module.js +0 -1
  17. package/dist/indexer/worker/worker.module.js.map +1 -1
  18. package/dist/indexer/worker/worker.service.js +1 -0
  19. package/dist/indexer/worker/worker.service.js.map +1 -1
  20. package/dist/init.js +1 -2
  21. package/dist/init.js.map +1 -1
  22. package/dist/starknet/api.service.starknet.d.ts +2 -2
  23. package/dist/starknet/api.service.starknet.js +10 -8
  24. package/dist/starknet/api.service.starknet.js.map +1 -1
  25. package/dist/starknet/{api.service.starknet.test.js → api.service.starknet.spec.js} +11 -3
  26. package/dist/starknet/api.service.starknet.spec.js.map +1 -0
  27. package/dist/starknet/api.starknet.d.ts +2 -3
  28. package/dist/starknet/api.starknet.js +1 -3
  29. package/dist/starknet/api.starknet.js.map +1 -1
  30. package/dist/starknet/{block.starknet.test.js → block.starknet.spec.js} +1 -1
  31. package/dist/starknet/{block.starknet.test.js.map → block.starknet.spec.js.map} +1 -1
  32. package/dist/starknet/{decodeCalldata.test.js → decodeCalldata.spec.js} +1 -1
  33. package/dist/starknet/{decodeCalldata.test.js.map → decodeCalldata.spec.js.map} +1 -1
  34. package/dist/subcommands/reindex.module.js +19 -8
  35. package/dist/subcommands/reindex.module.js.map +1 -1
  36. package/dist/subcommands/testing.module.js +14 -32
  37. package/dist/subcommands/testing.module.js.map +1 -1
  38. package/dist/subcommands/testing.service.js.map +1 -1
  39. package/package.json +11 -12
  40. package/dist/indexer/blockDispatcher/block-dispatcher.service.d.ts +0 -15
  41. package/dist/indexer/blockDispatcher/block-dispatcher.service.js +0 -51
  42. package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +0 -1
  43. package/dist/indexer/blockDispatcher/index.d.ts +0 -4
  44. package/dist/indexer/blockDispatcher/index.js +0 -10
  45. package/dist/indexer/blockDispatcher/index.js.map +0 -1
  46. package/dist/indexer/blockDispatcher/starknet-block-dispatcher.d.ts +0 -5
  47. package/dist/indexer/blockDispatcher/starknet-block-dispatcher.js +0 -5
  48. package/dist/indexer/blockDispatcher/starknet-block-dispatcher.js.map +0 -1
  49. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.d.ts +0 -17
  50. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +0 -48
  51. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +0 -1
  52. package/dist/indexer/ds-processor.service.d.ts +0 -6
  53. package/dist/indexer/ds-processor.service.js +0 -22
  54. package/dist/indexer/ds-processor.service.js.map +0 -1
  55. package/dist/indexer/dynamic-ds.service.d.ts +0 -8
  56. package/dist/indexer/dynamic-ds.service.js +0 -69
  57. package/dist/indexer/dynamic-ds.service.js.map +0 -1
  58. package/dist/indexer/fetch.service.d.ts +0 -20
  59. package/dist/indexer/fetch.service.js +0 -74
  60. package/dist/indexer/fetch.service.js.map +0 -1
  61. package/dist/indexer/project.service.d.ts +0 -15
  62. package/dist/indexer/project.service.js +0 -71
  63. package/dist/indexer/project.service.js.map +0 -1
  64. package/dist/indexer/project.service.test.js.map +0 -1
  65. package/dist/indexer/unfinalizedBlocks.service.d.ts +0 -10
  66. package/dist/indexer/unfinalizedBlocks.service.js +0 -48
  67. package/dist/indexer/unfinalizedBlocks.service.js.map +0 -1
  68. package/dist/starknet/api.service.starknet.test.js.map +0 -1
  69. /package/dist/{indexer/project.service.test.d.ts → blockchain.service.spec.d.ts} +0 -0
  70. /package/dist/starknet/{api.service.starknet.test.d.ts → api.service.starknet.spec.d.ts} +0 -0
  71. /package/dist/starknet/{block.starknet.test.d.ts → block.starknet.spec.d.ts} +0 -0
  72. /package/dist/starknet/{decodeCalldata.test.d.ts → decodeCalldata.spec.d.ts} +0 -0
@@ -0,0 +1,30 @@
1
+ import { isCustomDs, isRuntimeDs } from '@subql/common-starknet';
2
+ import { DatasourceParams, Header, IBlock, IBlockchainService } from '@subql/node-core';
3
+ import { LightStarknetBlock, StarknetBlock, StarknetCustomDatasource, StarknetHandlerKind, SubqlDatasource } from '@subql/types-starknet';
4
+ import { SubqueryProject } from './configure/SubqueryProject';
5
+ import { BlockContent } from './indexer/types';
6
+ import { IIndexerWorker } from './indexer/worker/worker';
7
+ import { StarknetApiService } from './starknet';
8
+ import SafeStarknetProvider from './starknet/safe-api';
9
+ export declare class BlockchainService implements IBlockchainService<SubqlDatasource, StarknetCustomDatasource, SubqueryProject, SafeStarknetProvider, LightStarknetBlock, StarknetBlock, IIndexerWorker> {
10
+ private apiService;
11
+ blockHandlerKind: StarknetHandlerKind;
12
+ isCustomDs: typeof isCustomDs;
13
+ isRuntimeDs: typeof isRuntimeDs;
14
+ packageVersion: any;
15
+ constructor(apiService: StarknetApiService);
16
+ fetchBlocks(blockNums: number[]): Promise<IBlock<LightStarknetBlock>[] | IBlock<StarknetBlock>[]>;
17
+ fetchBlockWorker(worker: IIndexerWorker, blockNum: number, context: {
18
+ workers: IIndexerWorker[];
19
+ }): Promise<Header>;
20
+ getBlockSize(block: IBlock<BlockContent>): number;
21
+ getFinalizedHeader(): Promise<Header>;
22
+ getBestHeight(): Promise<number>;
23
+ getChainInterval(): Promise<number>;
24
+ getHeaderForHash(hash: string): Promise<Header>;
25
+ getHeaderForHeight(height: number): Promise<Header>;
26
+ updateDynamicDs(params: DatasourceParams, dsObj: SubqlDatasource | StarknetCustomDatasource): Promise<void>;
27
+ getSafeApi(block: BlockContent): Promise<SafeStarknetProvider>;
28
+ onProjectChange(project: SubqueryProject): Promise<void> | void;
29
+ getBlockTimestamp(height: number): Promise<Date>;
30
+ }
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ // Copyright 2020-2025 SubQuery Pte Ltd authors & contributors
3
+ // SPDX-License-Identifier: GPL-3.0
4
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
5
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
6
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
7
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
8
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
9
+ };
10
+ var __metadata = (this && this.__metadata) || function (k, v) {
11
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
12
+ };
13
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
14
+ return function (target, key) { decorator(target, key, paramIndex); }
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.BlockchainService = void 0;
18
+ const common_1 = require("@nestjs/common");
19
+ const common_starknet_1 = require("@subql/common-starknet");
20
+ const types_starknet_1 = require("@subql/types-starknet");
21
+ const class_transformer_1 = require("class-transformer");
22
+ const class_validator_1 = require("class-validator");
23
+ const types_1 = require("./indexer/types");
24
+ const starknet_1 = require("./starknet");
25
+ const utils_starknet_1 = require("./starknet/utils.starknet");
26
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
27
+ const { version: packageVersion } = require('../package.json');
28
+ const BLOCK_TIME_VARIANCE = 5000;
29
+ const INTERVAL_PERCENT = 0.9;
30
+ let BlockchainService = class BlockchainService {
31
+ apiService;
32
+ blockHandlerKind = types_starknet_1.StarknetHandlerKind.Block;
33
+ isCustomDs = common_starknet_1.isCustomDs;
34
+ isRuntimeDs = common_starknet_1.isRuntimeDs;
35
+ packageVersion = packageVersion;
36
+ constructor(apiService) {
37
+ this.apiService = apiService;
38
+ }
39
+ async fetchBlocks(blockNums) {
40
+ return this.apiService.fetchBlocks(blockNums);
41
+ }
42
+ async fetchBlockWorker(worker, blockNum, context) {
43
+ return worker.fetchBlock(blockNum, 0);
44
+ }
45
+ getBlockSize(block) {
46
+ return (0, types_1.getBlockSize)(block.block);
47
+ }
48
+ async getFinalizedHeader() {
49
+ const blockHeader = await this.apiService.api.getFinalizedBlock();
50
+ return (0, utils_starknet_1.starknetBlockHeaderToHeader)(blockHeader);
51
+ }
52
+ async getBestHeight() {
53
+ return this.apiService.api.getBestBlockHeight();
54
+ }
55
+ // eslint-disable-next-line @typescript-eslint/require-await
56
+ async getChainInterval() {
57
+ const CHAIN_INTERVAL = (0, utils_starknet_1.calcInterval)(this.apiService.api) * INTERVAL_PERCENT;
58
+ return Math.min(BLOCK_TIME_VARIANCE, CHAIN_INTERVAL);
59
+ }
60
+ async getHeaderForHash(hash) {
61
+ const block = await this.apiService.api.fetchLightBlock(hash);
62
+ return block.getHeader();
63
+ }
64
+ async getHeaderForHeight(height) {
65
+ const block = await this.apiService.api.fetchLightBlock(height);
66
+ return block.getHeader();
67
+ }
68
+ // eslint-disable-next-line @typescript-eslint/require-await
69
+ async updateDynamicDs(params, dsObj) {
70
+ if ((0, common_starknet_1.isCustomDs)(dsObj)) {
71
+ dsObj.processor.options = {
72
+ ...dsObj.processor.options,
73
+ ...params.args,
74
+ };
75
+ // await this.dsProcessorService.validateCustomDs([dsObj]);
76
+ }
77
+ else if ((0, common_starknet_1.isRuntimeDs)(dsObj)) {
78
+ dsObj.options = {
79
+ ...dsObj.options,
80
+ ...params.args,
81
+ };
82
+ const parsedDs = (0, class_transformer_1.plainToClass)(common_starknet_1.StarknetRuntimeDataSourceImpl, dsObj);
83
+ const errors = (0, class_validator_1.validateSync)(parsedDs, {
84
+ whitelist: true,
85
+ forbidNonWhitelisted: false,
86
+ });
87
+ if (errors.length) {
88
+ throw new Error(`Dynamic ds is invalid\n${errors
89
+ .map((e) => e.toString())
90
+ .join('\n')}`);
91
+ }
92
+ }
93
+ }
94
+ // eslint-disable-next-line @typescript-eslint/require-await
95
+ async getSafeApi(block) {
96
+ return this.apiService.safeApi(block.blockNumber);
97
+ }
98
+ onProjectChange(project) {
99
+ this.apiService.updateBlockFetching();
100
+ }
101
+ async getBlockTimestamp(height) {
102
+ const block = await this.apiService.unsafeApi.api.getBlock(height);
103
+ return new Date(block.timestamp * 1000);
104
+ }
105
+ };
106
+ exports.BlockchainService = BlockchainService;
107
+ exports.BlockchainService = BlockchainService = __decorate([
108
+ __param(0, (0, common_1.Inject)('APIService')),
109
+ __metadata("design:paramtypes", [starknet_1.StarknetApiService])
110
+ ], BlockchainService);
111
+ //# sourceMappingURL=blockchain.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockchain.service.js","sourceRoot":"","sources":["../src/blockchain.service.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 { Inject } from '@nestjs/common';\nimport {\n isCustomDs,\n isRuntimeDs,\n StarknetRuntimeDataSourceImpl,\n} from '@subql/common-starknet';\nimport {\n DatasourceParams,\n Header,\n IBlock,\n IBlockchainService,\n} from '@subql/node-core';\nimport {\n LightStarknetBlock,\n StarknetBlock,\n StarknetCustomDatasource,\n StarknetHandlerKind,\n SubqlDatasource,\n} from '@subql/types-starknet';\nimport { plainToClass } from 'class-transformer';\nimport { validateSync } from 'class-validator';\nimport { SubqueryProject } from './configure/SubqueryProject';\nimport { BlockContent, getBlockSize } from './indexer/types';\nimport { IIndexerWorker } from './indexer/worker/worker';\nimport { StarknetApiService } from './starknet';\nimport SafeStarknetProvider from './starknet/safe-api';\nimport {\n calcInterval,\n starknetBlockHeaderToHeader,\n} from './starknet/utils.starknet';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../package.json');\n\nconst BLOCK_TIME_VARIANCE = 5000;\n\nconst INTERVAL_PERCENT = 0.9;\n\nexport class BlockchainService\n implements\n IBlockchainService<\n SubqlDatasource,\n StarknetCustomDatasource,\n SubqueryProject,\n SafeStarknetProvider,\n LightStarknetBlock,\n StarknetBlock,\n IIndexerWorker\n >\n{\n blockHandlerKind = StarknetHandlerKind.Block;\n isCustomDs = isCustomDs;\n isRuntimeDs = isRuntimeDs;\n packageVersion = packageVersion;\n\n constructor(@Inject('APIService') private apiService: StarknetApiService) {}\n\n async fetchBlocks(\n blockNums: number[],\n ): Promise<IBlock<LightStarknetBlock>[] | IBlock<StarknetBlock>[]> {\n return this.apiService.fetchBlocks(blockNums);\n }\n\n async fetchBlockWorker(\n worker: IIndexerWorker,\n blockNum: number,\n context: { workers: IIndexerWorker[] },\n ): Promise<Header> {\n return worker.fetchBlock(blockNum, 0);\n }\n\n getBlockSize(block: IBlock<BlockContent>): number {\n return getBlockSize(block.block);\n }\n\n async getFinalizedHeader(): Promise<Header> {\n const blockHeader = await this.apiService.api.getFinalizedBlock();\n return starknetBlockHeaderToHeader(blockHeader);\n }\n\n async getBestHeight(): Promise<number> {\n return this.apiService.api.getBestBlockHeight();\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getChainInterval(): Promise<number> {\n const CHAIN_INTERVAL = calcInterval(this.apiService.api) * INTERVAL_PERCENT;\n\n return Math.min(BLOCK_TIME_VARIANCE, CHAIN_INTERVAL);\n }\n\n async getHeaderForHash(hash: string): Promise<Header> {\n const block = await this.apiService.api.fetchLightBlock(hash);\n return block.getHeader();\n }\n\n async getHeaderForHeight(height: number): Promise<Header> {\n const block = await this.apiService.api.fetchLightBlock(height);\n return block.getHeader();\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async updateDynamicDs(\n params: DatasourceParams,\n dsObj: SubqlDatasource | StarknetCustomDatasource,\n ): Promise<void> {\n if (isCustomDs(dsObj)) {\n dsObj.processor.options = {\n ...dsObj.processor.options,\n ...params.args,\n };\n // await this.dsProcessorService.validateCustomDs([dsObj]);\n } else if (isRuntimeDs(dsObj)) {\n dsObj.options = {\n ...dsObj.options,\n ...params.args,\n };\n\n const parsedDs = plainToClass(StarknetRuntimeDataSourceImpl, dsObj);\n\n const errors = validateSync(parsedDs, {\n whitelist: true,\n forbidNonWhitelisted: false,\n });\n if (errors.length) {\n throw new Error(\n `Dynamic ds is invalid\\n${errors\n .map((e) => e.toString())\n .join('\\n')}`,\n );\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getSafeApi(block: BlockContent): Promise<SafeStarknetProvider> {\n return this.apiService.safeApi(block.blockNumber);\n }\n\n onProjectChange(project: SubqueryProject): Promise<void> | void {\n this.apiService.updateBlockFetching();\n }\n\n async getBlockTimestamp(height: number): Promise<Date> {\n const block = await this.apiService.unsafeApi.api.getBlock(height);\n\n return new Date(block.timestamp * 1000);\n }\n}\n"]}
@@ -3,8 +3,8 @@
3
3
  // SPDX-License-Identifier: GPL-3.0
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  const event_emitter_1 = require("@nestjs/event-emitter");
6
- const starknet_1 = require("../starknet");
7
- const project_service_1 = require("./project.service");
6
+ const blockchain_service_1 = require("./blockchain.service");
7
+ const starknet_1 = require("./starknet");
8
8
  const HTTP_ENDPOINT = 'https://free-rpc.nethermind.io/mainnet-juno/v0_7';
9
9
  const mockApiService = async () => {
10
10
  const strkApi = new starknet_1.StarknetApi(HTTP_ENDPOINT, new event_emitter_1.EventEmitter2());
@@ -13,15 +13,15 @@ const mockApiService = async () => {
13
13
  unsafeApi: strkApi,
14
14
  };
15
15
  };
16
- describe('ProjectService', () => {
17
- let projectService;
16
+ describe('BlockchainService', () => {
17
+ let blockchainService;
18
18
  beforeEach(async () => {
19
19
  const apiService = await mockApiService();
20
- projectService = new project_service_1.ProjectService(null, apiService, null, null, null, null, null, null, {}, null, null, null);
20
+ blockchainService = new blockchain_service_1.BlockchainService(apiService);
21
21
  });
22
22
  it('can get a block timestamps', async () => {
23
- const timestamp = await projectService.getBlockTimestamp(500_000);
23
+ const timestamp = await blockchainService.getBlockTimestamp(500_000);
24
24
  expect(timestamp).toEqual(new Date('2024-01-09T03:54:22.000Z'));
25
25
  });
26
26
  });
27
- //# sourceMappingURL=project.service.test.js.map
27
+ //# sourceMappingURL=blockchain.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockchain.service.spec.js","sourceRoot":"","sources":["../src/blockchain.service.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,yDAAsD;AACtD,6DAAyD;AACzD,yCAA6D;AAE7D,MAAM,aAAa,GAAG,kDAAkD,CAAC;AAEzE,MAAM,cAAc,GAAG,KAAK,IAAiC,EAAE;IAC7D,MAAM,OAAO,GAAG,IAAI,sBAAW,CAAC,aAAa,EAAE,IAAI,6BAAa,EAAE,CAAC,CAAC;IAEpE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IAErB,OAAO;QACL,SAAS,EAAE,OAAO;KACZ,CAAC;AACX,CAAC,CAAC;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,iBAAoC,CAAC;IAEzC,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;QAE1C,iBAAiB,GAAG,IAAI,sCAAiB,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAErE,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { BlockchainService } from './blockchain.service';\nimport { StarknetApi, StarknetApiService } from './starknet';\n\nconst HTTP_ENDPOINT = 'https://free-rpc.nethermind.io/mainnet-juno/v0_7';\n\nconst mockApiService = async (): Promise<StarknetApiService> => {\n const strkApi = new StarknetApi(HTTP_ENDPOINT, new EventEmitter2());\n\n await strkApi.init();\n\n return {\n unsafeApi: strkApi,\n } as any;\n};\n\ndescribe('BlockchainService', () => {\n let blockchainService: BlockchainService;\n\n beforeEach(async () => {\n const apiService = await mockApiService();\n\n blockchainService = new BlockchainService(apiService);\n });\n\n it('can get a block timestamps', async () => {\n const timestamp = await blockchainService.getBlockTimestamp(500_000);\n\n expect(timestamp).toEqual(new Date('2024-01-09T03:54:22.000Z'));\n });\n});\n"]}
@@ -7,20 +7,19 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
8
8
  return c > 3 && r && Object.defineProperty(target, key, r), r;
9
9
  };
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
10
13
  Object.defineProperty(exports, "__esModule", { value: true });
11
14
  exports.FetchModule = void 0;
15
+ const node_path_1 = __importDefault(require("node:path"));
12
16
  const common_1 = require("@nestjs/common");
13
17
  const event_emitter_1 = require("@nestjs/event-emitter");
14
18
  const node_core_1 = require("@subql/node-core");
19
+ const blockchain_service_1 = require("../blockchain.service");
15
20
  const api_service_starknet_1 = require("../starknet/api.service.starknet");
16
- const blockDispatcher_1 = require("./blockDispatcher");
17
21
  const starknetDictionary_service_1 = require("./dictionary/starknetDictionary.service");
18
- const ds_processor_service_1 = require("./ds-processor.service");
19
- const dynamic_ds_service_1 = require("./dynamic-ds.service");
20
- const fetch_service_1 = require("./fetch.service");
21
22
  const indexer_manager_1 = require("./indexer.manager");
22
- const project_service_1 = require("./project.service");
23
- const unfinalizedBlocks_service_1 = require("./unfinalizedBlocks.service");
24
23
  let FetchModule = class FetchModule {
25
24
  };
26
25
  exports.FetchModule = FetchModule;
@@ -29,12 +28,8 @@ exports.FetchModule = FetchModule = __decorate([
29
28
  imports: [node_core_1.CoreModule],
30
29
  providers: [
31
30
  {
32
- provide: node_core_1.ApiService,
33
- useFactory: async (project, connectionPoolService, eventEmitter, nodeConfig) => {
34
- const apiService = new api_service_starknet_1.StarknetApiService(project, connectionPoolService, eventEmitter, nodeConfig);
35
- await apiService.init();
36
- return apiService;
37
- },
31
+ provide: 'APIService',
32
+ useFactory: api_service_starknet_1.StarknetApiService.create,
38
33
  inject: [
39
34
  'ISubqueryProject',
40
35
  node_core_1.ConnectionPoolService,
@@ -42,40 +37,47 @@ exports.FetchModule = FetchModule = __decorate([
42
37
  node_core_1.NodeConfig,
43
38
  ],
44
39
  },
40
+ {
41
+ provide: 'IBlockchainService',
42
+ useClass: blockchain_service_1.BlockchainService,
43
+ },
44
+ node_core_1.DsProcessorService,
45
+ node_core_1.DynamicDsService,
46
+ {
47
+ provide: 'IUnfinalizedBlocksService',
48
+ useClass: node_core_1.UnfinalizedBlocksService,
49
+ },
50
+ {
51
+ useClass: node_core_1.ProjectService,
52
+ provide: 'IProjectService',
53
+ },
45
54
  indexer_manager_1.IndexerManager,
46
55
  {
47
56
  provide: 'IBlockDispatcher',
48
- useFactory: (nodeConfig, eventEmitter, projectService, projectUpgradeService, apiService, indexerManager, cacheService, storeService, storeModelProvider, poiSyncService, project, dynamicDsService, unfinalizedBlocks, connectionPoolState, monitorService) => nodeConfig.workers
49
- ? new blockDispatcher_1.WorkerBlockDispatcherService(nodeConfig, eventEmitter, projectService, projectUpgradeService, cacheService, storeService, storeModelProvider, poiSyncService, project, dynamicDsService, unfinalizedBlocks, connectionPoolState, monitorService)
50
- : new blockDispatcher_1.BlockDispatcherService(apiService, nodeConfig, indexerManager, eventEmitter, projectService, projectUpgradeService, storeService, storeModelProvider, poiSyncService, project),
57
+ useFactory: (0, node_core_1.blockDispatcherFactory)(node_path_1.default.resolve(__dirname, '../../dist/indexer/worker/worker.js'), []),
51
58
  inject: [
52
59
  node_core_1.NodeConfig,
53
60
  event_emitter_1.EventEmitter2,
54
61
  'IProjectService',
55
62
  'IProjectUpgradeService',
56
- node_core_1.ApiService,
57
- indexer_manager_1.IndexerManager,
58
63
  node_core_1.InMemoryCacheService,
59
64
  node_core_1.StoreService,
60
65
  'IStoreModelProvider',
61
66
  node_core_1.PoiSyncService,
62
67
  'ISubqueryProject',
63
- dynamic_ds_service_1.DynamicDsService,
64
- unfinalizedBlocks_service_1.UnfinalizedBlocksService,
68
+ node_core_1.DynamicDsService,
69
+ 'IUnfinalizedBlocksService',
65
70
  node_core_1.ConnectionPoolStateManager,
71
+ 'IBlockchainService',
72
+ indexer_manager_1.IndexerManager,
66
73
  node_core_1.MonitorService,
67
74
  ],
68
75
  },
69
- fetch_service_1.FetchService,
70
- starknetDictionary_service_1.StarknetDictionaryService,
71
- ds_processor_service_1.DsProcessorService,
72
- dynamic_ds_service_1.DynamicDsService,
73
- api_service_starknet_1.StarknetApiService,
74
76
  {
75
- useClass: project_service_1.ProjectService,
76
- provide: 'IProjectService',
77
+ provide: node_core_1.DictionaryService,
78
+ useClass: starknetDictionary_service_1.StarknetDictionaryService,
77
79
  },
78
- unfinalizedBlocks_service_1.UnfinalizedBlocksService,
80
+ node_core_1.FetchService,
79
81
  ],
80
82
  })
81
83
  ], FetchModule);
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.module.js","sourceRoot":"","sources":["../../src/indexer/fetch.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAAsD;AACtD,gDAY0B;AAG1B,2EAAsE;AACtE,uDAG2B;AAC3B,wFAAoF;AACpF,iEAA4D;AAC5D,6DAAwD;AACxD,mDAA+C;AAC/C,uDAAmD;AACnD,uDAAmD;AACnD,2EAAuE;AA2GhE,IAAM,WAAW,GAAjB,MAAM,WAAW;CAAG,CAAA;AAAd,kCAAW;sBAAX,WAAW;IAzGvB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,sBAAU,CAAC;QACrB,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,sBAAU;gBACnB,UAAU,EAAE,KAAK,EACf,OAAwB,EACxB,qBAAmE,EACnE,YAA2B,EAC3B,UAAsB,EACtB,EAAE;oBACF,MAAM,UAAU,GAAG,IAAI,yCAAkB,CACvC,OAAO,EACP,qBAAqB,EACrB,YAAY,EACZ,UAAU,CACX,CAAC;oBACF,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;oBACxB,OAAO,UAAU,CAAC;gBACpB,CAAC;gBACD,MAAM,EAAE;oBACN,kBAAkB;oBAClB,iCAAqB;oBACrB,6BAAa;oBACb,sBAAU;iBACX;aACF;YACD,gCAAc;YACd;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,UAAU,EAAE,CACV,UAAsB,EACtB,YAA2B,EAC3B,cAA8B,EAC9B,qBAA6C,EAC7C,UAA8B,EAC9B,cAA8B,EAC9B,YAAkC,EAClC,YAA0B,EAC1B,kBAAuC,EACvC,cAA8B,EAC9B,OAAwB,EACxB,gBAAkC,EAClC,iBAA2C,EAC3C,mBAAsE,EACtE,cAA+B,EAC/B,EAAE,CACF,UAAU,CAAC,OAAO;oBAChB,CAAC,CAAC,IAAI,8CAA4B,CAC9B,UAAU,EACV,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,OAAO,EACP,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,CACf;oBACH,CAAC,CAAC,IAAI,wCAAsB,CACxB,UAAU,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,OAAO,CACR;gBACP,MAAM,EAAE;oBACN,sBAAU;oBACV,6BAAa;oBACb,iBAAiB;oBACjB,wBAAwB;oBACxB,sBAAU;oBACV,gCAAc;oBACd,gCAAoB;oBACpB,wBAAY;oBACZ,qBAAqB;oBACrB,0BAAc;oBACd,kBAAkB;oBAClB,qCAAgB;oBAChB,oDAAwB;oBACxB,sCAA0B;oBAC1B,0BAAc;iBACf;aACF;YACD,4BAAY;YACZ,sDAAyB;YACzB,yCAAkB;YAClB,qCAAgB;YAChB,yCAAkB;YAClB;gBACE,QAAQ,EAAE,gCAAc;gBACxB,OAAO,EAAE,iBAAiB;aAC3B;YACD,oDAAwB;SACzB;KACF,CAAC;GACW,WAAW,CAAG","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n StoreService,\n ApiService,\n NodeConfig,\n ConnectionPoolService,\n ConnectionPoolStateManager,\n IProjectUpgradeService,\n PoiSyncService,\n InMemoryCacheService,\n MonitorService,\n CoreModule,\n IStoreModelProvider,\n} from '@subql/node-core';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { StarknetApiConnection } from '../starknet/api.connection';\nimport { StarknetApiService } from '../starknet/api.service.starknet';\nimport {\n BlockDispatcherService,\n WorkerBlockDispatcherService,\n} from './blockDispatcher';\nimport { StarknetDictionaryService } from './dictionary/starknetDictionary.service';\nimport { DsProcessorService } from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { FetchService } from './fetch.service';\nimport { IndexerManager } from './indexer.manager';\nimport { ProjectService } from './project.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\n@Module({\n imports: [CoreModule],\n providers: [\n {\n provide: ApiService,\n useFactory: async (\n project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<StarknetApiConnection>,\n eventEmitter: EventEmitter2,\n nodeConfig: NodeConfig,\n ) => {\n const apiService = new StarknetApiService(\n project,\n connectionPoolService,\n eventEmitter,\n nodeConfig,\n );\n await apiService.init();\n return apiService;\n },\n inject: [\n 'ISubqueryProject',\n ConnectionPoolService,\n EventEmitter2,\n NodeConfig,\n ],\n },\n IndexerManager,\n {\n provide: 'IBlockDispatcher',\n useFactory: (\n nodeConfig: NodeConfig,\n eventEmitter: EventEmitter2,\n projectService: ProjectService,\n projectUpgradeService: IProjectUpgradeService,\n apiService: StarknetApiService,\n indexerManager: IndexerManager,\n cacheService: InMemoryCacheService,\n storeService: StoreService,\n storeModelProvider: IStoreModelProvider,\n poiSyncService: PoiSyncService,\n project: SubqueryProject,\n dynamicDsService: DynamicDsService,\n unfinalizedBlocks: UnfinalizedBlocksService,\n connectionPoolState: ConnectionPoolStateManager<StarknetApiConnection>,\n monitorService?: MonitorService,\n ) =>\n nodeConfig.workers\n ? new WorkerBlockDispatcherService(\n nodeConfig,\n eventEmitter,\n projectService,\n projectUpgradeService,\n cacheService,\n storeService,\n storeModelProvider,\n poiSyncService,\n project,\n dynamicDsService,\n unfinalizedBlocks,\n connectionPoolState,\n monitorService,\n )\n : new BlockDispatcherService(\n apiService,\n nodeConfig,\n indexerManager,\n eventEmitter,\n projectService,\n projectUpgradeService,\n storeService,\n storeModelProvider,\n poiSyncService,\n project,\n ),\n inject: [\n NodeConfig,\n EventEmitter2,\n 'IProjectService',\n 'IProjectUpgradeService',\n ApiService,\n IndexerManager,\n InMemoryCacheService,\n StoreService,\n 'IStoreModelProvider',\n PoiSyncService,\n 'ISubqueryProject',\n DynamicDsService,\n UnfinalizedBlocksService,\n ConnectionPoolStateManager,\n MonitorService,\n ],\n },\n FetchService,\n StarknetDictionaryService,\n DsProcessorService,\n DynamicDsService,\n StarknetApiService,\n {\n useClass: ProjectService,\n provide: 'IProjectService',\n },\n UnfinalizedBlocksService,\n ],\n})\nexport class FetchModule {}\n"]}
1
+ {"version":3,"file":"fetch.module.js","sourceRoot":"","sources":["../../src/indexer/fetch.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;AAEnC,0DAA6B;AAC7B,2CAAwC;AACxC,yDAAsD;AACtD,gDAgB0B;AAC1B,8DAA0D;AAC1D,2EAAsE;AACtE,wFAAoF;AACpF,uDAAmD;AA6D5C,IAAM,WAAW,GAAjB,MAAM,WAAW;CAAG,CAAA;AAAd,kCAAW;sBAAX,WAAW;IA3DvB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,sBAAU,CAAC;QACrB,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,YAAY;gBACrB,UAAU,EAAE,yCAAkB,CAAC,MAAM;gBACrC,MAAM,EAAE;oBACN,kBAAkB;oBAClB,iCAAqB;oBACrB,6BAAa;oBACb,sBAAU;iBACX;aACF;YACD;gBACE,OAAO,EAAE,oBAAoB;gBAC7B,QAAQ,EAAE,sCAAiB;aAC5B;YACD,8BAAkB;YAClB,4BAAgB;YAChB;gBACE,OAAO,EAAE,2BAA2B;gBACpC,QAAQ,EAAE,oCAAwB;aACnC;YACD;gBACE,QAAQ,EAAE,0BAAc;gBACxB,OAAO,EAAE,iBAAiB;aAC3B;YACD,gCAAc;YACd;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,UAAU,EAAE,IAAA,kCAAsB,EAChC,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,qCAAqC,CAAC,EAC9D,EAAE,CACH;gBACD,MAAM,EAAE;oBACN,sBAAU;oBACV,6BAAa;oBACb,iBAAiB;oBACjB,wBAAwB;oBACxB,gCAAoB;oBACpB,wBAAY;oBACZ,qBAAqB;oBACrB,0BAAc;oBACd,kBAAkB;oBAClB,4BAAgB;oBAChB,2BAA2B;oBAC3B,sCAA0B;oBAC1B,oBAAoB;oBACpB,gCAAc;oBACd,0BAAc;iBACf;aACF;YACD;gBACE,OAAO,EAAE,6BAAiB;gBAC1B,QAAQ,EAAE,sDAAyB;aACpC;YACD,wBAAY;SACb;KACF,CAAC;GACW,WAAW,CAAG","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport path from 'node:path';\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n StoreService,\n NodeConfig,\n ConnectionPoolService,\n ConnectionPoolStateManager,\n PoiSyncService,\n InMemoryCacheService,\n MonitorService,\n CoreModule,\n blockDispatcherFactory,\n ProjectService,\n UnfinalizedBlocksService,\n DynamicDsService,\n DsProcessorService,\n FetchService,\n DictionaryService,\n} from '@subql/node-core';\nimport { BlockchainService } from '../blockchain.service';\nimport { StarknetApiService } from '../starknet/api.service.starknet';\nimport { StarknetDictionaryService } from './dictionary/starknetDictionary.service';\nimport { IndexerManager } from './indexer.manager';\n\n@Module({\n imports: [CoreModule],\n providers: [\n {\n provide: 'APIService',\n useFactory: StarknetApiService.create,\n inject: [\n 'ISubqueryProject',\n ConnectionPoolService,\n EventEmitter2,\n NodeConfig,\n ],\n },\n {\n provide: 'IBlockchainService',\n useClass: BlockchainService,\n },\n DsProcessorService,\n DynamicDsService,\n {\n provide: 'IUnfinalizedBlocksService',\n useClass: UnfinalizedBlocksService,\n },\n {\n useClass: ProjectService,\n provide: 'IProjectService',\n },\n IndexerManager,\n {\n provide: 'IBlockDispatcher',\n useFactory: blockDispatcherFactory(\n path.resolve(__dirname, '../../dist/indexer/worker/worker.js'),\n [],\n ),\n inject: [\n NodeConfig,\n EventEmitter2,\n 'IProjectService',\n 'IProjectUpgradeService',\n InMemoryCacheService,\n StoreService,\n 'IStoreModelProvider',\n PoiSyncService,\n 'ISubqueryProject',\n DynamicDsService,\n 'IUnfinalizedBlocksService',\n ConnectionPoolStateManager,\n 'IBlockchainService',\n IndexerManager,\n MonitorService,\n ],\n },\n {\n provide: DictionaryService,\n useClass: StarknetDictionaryService,\n },\n FetchService,\n ],\n})\nexport class FetchModule {}\n"]}
@@ -1,17 +1,13 @@
1
- import { isBlockHandlerProcessor, isCallHandlerProcessor, isEventHandlerProcessor, isCustomDs, isRuntimeDs, StarknetCustomDataSource, StarknetHandlerKind, StarknetRuntimeHandlerInputMap, SubqlStarknetDataSource } from '@subql/common-starknet';
2
- import { ApiService, NodeConfig, IndexerSandbox, ProcessBlockResponse, BaseIndexerManager, IBlock, SandboxService } from '@subql/node-core';
3
- import { StarknetTransaction, StarknetLog, StarknetBlock, StarknetRuntimeDatasource, StarknetBlockFilter, StarknetLogFilter, StarknetTransactionFilter } from '@subql/types-starknet';
1
+ import { isBlockHandlerProcessor, isCallHandlerProcessor, isEventHandlerProcessor, StarknetCustomDataSource, StarknetHandlerKind, StarknetRuntimeHandlerInputMap, SubqlStarknetDataSource } from '@subql/common-starknet';
2
+ import { ApiService, NodeConfig, IndexerSandbox, ProcessBlockResponse, BaseIndexerManager, IBlock, SandboxService, DsProcessorService, DynamicDsService, UnfinalizedBlocksService } from '@subql/node-core';
3
+ import { StarknetTransaction, StarknetLog, StarknetBlock, StarknetRuntimeDatasource, StarknetBlockFilter, StarknetLogFilter, StarknetTransactionFilter, SubqlDatasource, StarknetCustomDatasource } from '@subql/types-starknet';
4
+ import { BlockchainService } from '../blockchain.service';
4
5
  import { StarknetProjectDs } from '../configure/SubqueryProject';
5
- import { StarknetApi } from '../starknet';
6
+ import { StarknetApi, StarknetApiService } from '../starknet';
6
7
  import SafeStarknetProvider from '../starknet/safe-api';
7
- import { DsProcessorService } from './ds-processor.service';
8
- import { DynamicDsService } from './dynamic-ds.service';
9
8
  import { BlockContent } from './types';
10
- import { UnfinalizedBlocksService } from './unfinalizedBlocks.service';
11
9
  export declare class IndexerManager extends BaseIndexerManager<StarknetApi, SafeStarknetProvider, BlockContent, ApiService, SubqlStarknetDataSource, StarknetCustomDataSource, typeof FilterTypeMap, typeof ProcessorTypeMap, StarknetRuntimeHandlerInputMap> {
12
- protected isRuntimeDs: typeof isRuntimeDs;
13
- protected isCustomDs: typeof isCustomDs;
14
- constructor(apiService: ApiService, nodeConfig: NodeConfig, sandboxService: SandboxService<SafeStarknetProvider, StarknetApi>, dsProcessorService: DsProcessorService, dynamicDsService: DynamicDsService, unfinalizedBlocksService: UnfinalizedBlocksService);
10
+ constructor(apiService: StarknetApiService, nodeConfig: NodeConfig, sandboxService: SandboxService<SafeStarknetProvider, StarknetApi>, dsProcessorService: DsProcessorService<SubqlDatasource, StarknetCustomDatasource>, dynamicDsService: DynamicDsService<SubqlDatasource>, unfinalizedBlocksService: UnfinalizedBlocksService<BlockContent>, blockchainService: BlockchainService);
15
11
  indexBlock(block: IBlock<BlockContent>, dataSources: SubqlStarknetDataSource[]): Promise<ProcessBlockResponse>;
16
12
  private getApi;
17
13
  protected getDsProcessor(ds: SubqlStarknetDataSource, safeApi: SafeStarknetProvider): IndexerSandbox;
@@ -10,20 +10,20 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
10
10
  var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
12
12
  };
13
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
14
+ return function (target, key) { decorator(target, key, paramIndex); }
15
+ };
13
16
  Object.defineProperty(exports, "__esModule", { value: true });
14
17
  exports.IndexerManager = void 0;
15
18
  const common_1 = require("@nestjs/common");
16
19
  const common_starknet_1 = require("@subql/common-starknet");
17
20
  const node_core_1 = require("@subql/node-core");
21
+ const blockchain_service_1 = require("../blockchain.service");
22
+ const starknet_1 = require("../starknet");
18
23
  const block_starknet_1 = require("../starknet/block.starknet");
19
- const ds_processor_service_1 = require("./ds-processor.service");
20
- const dynamic_ds_service_1 = require("./dynamic-ds.service");
21
- const unfinalizedBlocks_service_1 = require("./unfinalizedBlocks.service");
22
24
  let IndexerManager = class IndexerManager extends node_core_1.BaseIndexerManager {
23
- isRuntimeDs = common_starknet_1.isRuntimeDs;
24
- isCustomDs = common_starknet_1.isCustomDs;
25
- constructor(apiService, nodeConfig, sandboxService, dsProcessorService, dynamicDsService, unfinalizedBlocksService) {
26
- super(apiService, nodeConfig, sandboxService, dsProcessorService, dynamicDsService, unfinalizedBlocksService, FilterTypeMap, ProcessorTypeMap);
25
+ constructor(apiService, nodeConfig, sandboxService, dsProcessorService, dynamicDsService, unfinalizedBlocksService, blockchainService) {
26
+ super(apiService, nodeConfig, sandboxService, dsProcessorService, dynamicDsService, unfinalizedBlocksService, FilterTypeMap, ProcessorTypeMap, blockchainService);
27
27
  }
28
28
  async indexBlock(block, dataSources) {
29
29
  return super.internalIndexBlock(block, dataSources, () => this.getApi(block.block));
@@ -80,12 +80,16 @@ __decorate([
80
80
  ], IndexerManager.prototype, "indexBlock", null);
81
81
  exports.IndexerManager = IndexerManager = __decorate([
82
82
  (0, common_1.Injectable)(),
83
- __metadata("design:paramtypes", [node_core_1.ApiService,
83
+ __param(0, (0, common_1.Inject)('APIService')),
84
+ __param(5, (0, common_1.Inject)('IUnfinalizedBlocksService')),
85
+ __param(6, (0, common_1.Inject)('IBlockchainService')),
86
+ __metadata("design:paramtypes", [starknet_1.StarknetApiService,
84
87
  node_core_1.NodeConfig,
85
88
  node_core_1.SandboxService,
86
- ds_processor_service_1.DsProcessorService,
87
- dynamic_ds_service_1.DynamicDsService,
88
- unfinalizedBlocks_service_1.UnfinalizedBlocksService])
89
+ node_core_1.DsProcessorService,
90
+ node_core_1.DynamicDsService,
91
+ node_core_1.UnfinalizedBlocksService,
92
+ blockchain_service_1.BlockchainService])
89
93
  ], IndexerManager);
90
94
  const ProcessorTypeMap = {
91
95
  [common_starknet_1.StarknetHandlerKind.Block]: common_starknet_1.isBlockHandlerProcessor,
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.manager.js","sourceRoot":"","sources":["../../src/indexer/indexer.manager.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 { Injectable } from '@nestjs/common';\nimport {\n isBlockHandlerProcessor,\n isCallHandlerProcessor,\n isEventHandlerProcessor,\n isCustomDs,\n isRuntimeDs,\n StarknetCustomDataSource,\n StarknetHandlerKind,\n StarknetRuntimeHandlerInputMap,\n SubqlStarknetDataSource,\n} from '@subql/common-starknet';\nimport {\n ApiService,\n NodeConfig,\n profiler,\n IndexerSandbox,\n ProcessBlockResponse,\n BaseIndexerManager,\n IBlock,\n SandboxService,\n} from '@subql/node-core';\nimport {\n StarknetTransaction,\n StarknetLog,\n StarknetBlock,\n StarknetRuntimeDatasource,\n StarknetBlockFilter,\n StarknetLogFilter,\n StarknetTransactionFilter,\n} from '@subql/types-starknet';\nimport { StarknetProjectDs } from '../configure/SubqueryProject';\nimport { StarknetApi } from '../starknet';\nimport {\n filterBlocksProcessor,\n filterLogsProcessor,\n filterTransactionsProcessor,\n isFullBlock,\n} from '../starknet/block.starknet';\nimport SafeStarknetProvider from '../starknet/safe-api';\nimport { DsProcessorService } from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { BlockContent } from './types';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\n@Injectable()\nexport class IndexerManager extends BaseIndexerManager<\n StarknetApi,\n SafeStarknetProvider,\n BlockContent,\n ApiService,\n SubqlStarknetDataSource,\n StarknetCustomDataSource,\n typeof FilterTypeMap,\n typeof ProcessorTypeMap,\n StarknetRuntimeHandlerInputMap\n> {\n protected isRuntimeDs = isRuntimeDs;\n protected isCustomDs = isCustomDs;\n\n constructor(\n apiService: ApiService,\n nodeConfig: NodeConfig,\n sandboxService: SandboxService<SafeStarknetProvider, StarknetApi>,\n dsProcessorService: DsProcessorService,\n dynamicDsService: DynamicDsService,\n unfinalizedBlocksService: UnfinalizedBlocksService,\n ) {\n super(\n apiService,\n nodeConfig,\n sandboxService,\n dsProcessorService,\n dynamicDsService,\n unfinalizedBlocksService,\n FilterTypeMap,\n ProcessorTypeMap,\n );\n }\n\n @profiler()\n async indexBlock(\n block: IBlock<BlockContent>,\n dataSources: SubqlStarknetDataSource[],\n ): Promise<ProcessBlockResponse> {\n return super.internalIndexBlock(block, dataSources, () =>\n this.getApi(block.block),\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n private async getApi(block: BlockContent): Promise<SafeStarknetProvider> {\n return this.apiService.safeApi(block.blockNumber);\n }\n\n protected getDsProcessor(\n ds: SubqlStarknetDataSource,\n safeApi: SafeStarknetProvider,\n ): IndexerSandbox {\n return this.sandboxService.getDsProcessor(\n ds,\n safeApi,\n this.apiService.unsafeApi.api,\n );\n }\n\n protected async indexBlockData(\n block: BlockContent,\n dataSources: StarknetProjectDs[],\n getVM: (d: StarknetProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n if (isFullBlock(block)) {\n await this.indexBlockContent(block, dataSources, getVM);\n\n for (const tx of block.transactions) {\n await this.indexTransaction(tx, dataSources, getVM);\n\n for (const log of tx.logs ?? []) {\n await this.indexEvent(log, dataSources, getVM);\n }\n }\n } else {\n for (const log of block.logs ?? []) {\n await this.indexEvent(log, dataSources, getVM);\n }\n }\n }\n\n private async indexBlockContent(\n block: StarknetBlock,\n dataSources: StarknetProjectDs[],\n getVM: (d: StarknetProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n for (const ds of dataSources) {\n await this.indexData(StarknetHandlerKind.Block, block, ds, getVM);\n }\n }\n\n private async indexTransaction(\n tx: StarknetTransaction,\n dataSources: StarknetProjectDs[],\n getVM: (d: StarknetProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n for (const ds of dataSources) {\n await this.indexData(StarknetHandlerKind.Call, tx, ds, getVM);\n }\n }\n\n private async indexEvent(\n log: StarknetLog,\n dataSources: StarknetProjectDs[],\n getVM: (d: StarknetProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n for (const ds of dataSources) {\n await this.indexData(StarknetHandlerKind.Event, log, ds, getVM);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n protected async prepareFilteredData(\n kind: StarknetHandlerKind,\n data: any,\n ds: StarknetRuntimeDatasource,\n ): Promise<any> {\n return DataAbiParser[kind](this.apiService.api)(data, ds);\n }\n}\n\nconst ProcessorTypeMap = {\n [StarknetHandlerKind.Block]: isBlockHandlerProcessor,\n [StarknetHandlerKind.Event]: isEventHandlerProcessor,\n [StarknetHandlerKind.Call]: isCallHandlerProcessor,\n};\n\nconst FilterTypeMap = {\n [StarknetHandlerKind.Block]: (\n data: StarknetBlock,\n filter: StarknetBlockFilter,\n ds: SubqlStarknetDataSource,\n ) => filterBlocksProcessor(data, filter, ds.options?.address),\n [StarknetHandlerKind.Event]: (\n data: StarknetLog,\n filter: StarknetLogFilter,\n ds: SubqlStarknetDataSource,\n ) => filterLogsProcessor(data, filter, ds.options?.address),\n [StarknetHandlerKind.Call]: (\n data: StarknetTransaction,\n filter: StarknetTransactionFilter,\n ds: SubqlStarknetDataSource,\n ) => filterTransactionsProcessor(data, filter, ds.options?.address),\n};\n\nconst DataAbiParser = {\n [StarknetHandlerKind.Block]: () => (data: StarknetBlock) => data,\n [StarknetHandlerKind.Event]:\n (api: StarknetApi) => (data: StarknetLog, ds: StarknetRuntimeDatasource) =>\n api.parseLog(data, ds),\n [StarknetHandlerKind.Call]:\n (api: StarknetApi) =>\n (data: StarknetTransaction, ds: StarknetRuntimeDatasource) =>\n api.parseTransaction(data, ds),\n};\n"]}
1
+ {"version":3,"file":"indexer.manager.js","sourceRoot":"","sources":["../../src/indexer/indexer.manager.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 { Inject, Injectable } from '@nestjs/common';\nimport {\n isBlockHandlerProcessor,\n isCallHandlerProcessor,\n isEventHandlerProcessor,\n StarknetCustomDataSource,\n StarknetHandlerKind,\n StarknetRuntimeHandlerInputMap,\n SubqlStarknetDataSource,\n} from '@subql/common-starknet';\nimport {\n ApiService,\n NodeConfig,\n profiler,\n IndexerSandbox,\n ProcessBlockResponse,\n BaseIndexerManager,\n IBlock,\n SandboxService,\n DsProcessorService,\n DynamicDsService,\n UnfinalizedBlocksService,\n} from '@subql/node-core';\nimport {\n StarknetTransaction,\n StarknetLog,\n StarknetBlock,\n StarknetRuntimeDatasource,\n StarknetBlockFilter,\n StarknetLogFilter,\n StarknetTransactionFilter,\n SubqlDatasource,\n StarknetCustomDatasource,\n} from '@subql/types-starknet';\nimport { BlockchainService } from '../blockchain.service';\nimport { StarknetProjectDs } from '../configure/SubqueryProject';\nimport { StarknetApi, StarknetApiService } from '../starknet';\nimport {\n filterBlocksProcessor,\n filterLogsProcessor,\n filterTransactionsProcessor,\n isFullBlock,\n} from '../starknet/block.starknet';\nimport SafeStarknetProvider from '../starknet/safe-api';\nimport { BlockContent } from './types';\n\n@Injectable()\nexport class IndexerManager extends BaseIndexerManager<\n StarknetApi,\n SafeStarknetProvider,\n BlockContent,\n ApiService,\n SubqlStarknetDataSource,\n StarknetCustomDataSource,\n typeof FilterTypeMap,\n typeof ProcessorTypeMap,\n StarknetRuntimeHandlerInputMap\n> {\n constructor(\n @Inject('APIService') apiService: StarknetApiService,\n nodeConfig: NodeConfig,\n sandboxService: SandboxService<SafeStarknetProvider, StarknetApi>,\n dsProcessorService: DsProcessorService<\n SubqlDatasource,\n StarknetCustomDatasource\n >,\n dynamicDsService: DynamicDsService<SubqlDatasource>,\n @Inject('IUnfinalizedBlocksService')\n unfinalizedBlocksService: UnfinalizedBlocksService<BlockContent>,\n @Inject('IBlockchainService')\n blockchainService: BlockchainService,\n ) {\n super(\n apiService,\n nodeConfig,\n sandboxService,\n dsProcessorService,\n dynamicDsService,\n unfinalizedBlocksService,\n FilterTypeMap,\n ProcessorTypeMap,\n blockchainService,\n );\n }\n\n @profiler()\n async indexBlock(\n block: IBlock<BlockContent>,\n dataSources: SubqlStarknetDataSource[],\n ): Promise<ProcessBlockResponse> {\n return super.internalIndexBlock(block, dataSources, () =>\n this.getApi(block.block),\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n private async getApi(block: BlockContent): Promise<SafeStarknetProvider> {\n return this.apiService.safeApi(block.blockNumber);\n }\n\n protected getDsProcessor(\n ds: SubqlStarknetDataSource,\n safeApi: SafeStarknetProvider,\n ): IndexerSandbox {\n return this.sandboxService.getDsProcessor(\n ds,\n safeApi,\n this.apiService.unsafeApi.api,\n );\n }\n\n protected async indexBlockData(\n block: BlockContent,\n dataSources: StarknetProjectDs[],\n getVM: (d: StarknetProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n if (isFullBlock(block)) {\n await this.indexBlockContent(block, dataSources, getVM);\n\n for (const tx of block.transactions) {\n await this.indexTransaction(tx, dataSources, getVM);\n\n for (const log of tx.logs ?? []) {\n await this.indexEvent(log, dataSources, getVM);\n }\n }\n } else {\n for (const log of block.logs ?? []) {\n await this.indexEvent(log, dataSources, getVM);\n }\n }\n }\n\n private async indexBlockContent(\n block: StarknetBlock,\n dataSources: StarknetProjectDs[],\n getVM: (d: StarknetProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n for (const ds of dataSources) {\n await this.indexData(StarknetHandlerKind.Block, block, ds, getVM);\n }\n }\n\n private async indexTransaction(\n tx: StarknetTransaction,\n dataSources: StarknetProjectDs[],\n getVM: (d: StarknetProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n for (const ds of dataSources) {\n await this.indexData(StarknetHandlerKind.Call, tx, ds, getVM);\n }\n }\n\n private async indexEvent(\n log: StarknetLog,\n dataSources: StarknetProjectDs[],\n getVM: (d: StarknetProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n for (const ds of dataSources) {\n await this.indexData(StarknetHandlerKind.Event, log, ds, getVM);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n protected async prepareFilteredData(\n kind: StarknetHandlerKind,\n data: any,\n ds: StarknetRuntimeDatasource,\n ): Promise<any> {\n return DataAbiParser[kind](this.apiService.api)(data, ds);\n }\n}\n\nconst ProcessorTypeMap = {\n [StarknetHandlerKind.Block]: isBlockHandlerProcessor,\n [StarknetHandlerKind.Event]: isEventHandlerProcessor,\n [StarknetHandlerKind.Call]: isCallHandlerProcessor,\n};\n\nconst FilterTypeMap = {\n [StarknetHandlerKind.Block]: (\n data: StarknetBlock,\n filter: StarknetBlockFilter,\n ds: SubqlStarknetDataSource,\n ) => filterBlocksProcessor(data, filter, ds.options?.address),\n [StarknetHandlerKind.Event]: (\n data: StarknetLog,\n filter: StarknetLogFilter,\n ds: SubqlStarknetDataSource,\n ) => filterLogsProcessor(data, filter, ds.options?.address),\n [StarknetHandlerKind.Call]: (\n data: StarknetTransaction,\n filter: StarknetTransactionFilter,\n ds: SubqlStarknetDataSource,\n ) => filterTransactionsProcessor(data, filter, ds.options?.address),\n};\n\nconst DataAbiParser = {\n [StarknetHandlerKind.Block]: () => (data: StarknetBlock) => data,\n [StarknetHandlerKind.Event]:\n (api: StarknetApi) => (data: StarknetLog, ds: StarknetRuntimeDatasource) =>\n api.parseLog(data, ds),\n [StarknetHandlerKind.Call]:\n (api: StarknetApi) =>\n (data: StarknetTransaction, ds: StarknetRuntimeDatasource) =>\n api.parseTransaction(data, ds),\n};\n"]}
@@ -12,12 +12,9 @@ exports.WorkerFetchModule = void 0;
12
12
  const common_1 = require("@nestjs/common");
13
13
  const event_emitter_1 = require("@nestjs/event-emitter");
14
14
  const node_core_1 = require("@subql/node-core");
15
+ const blockchain_service_1 = require("../../blockchain.service");
15
16
  const starknet_1 = require("../../starknet");
16
- const ds_processor_service_1 = require("../ds-processor.service");
17
- const dynamic_ds_service_1 = require("../dynamic-ds.service");
18
17
  const indexer_manager_1 = require("../indexer.manager");
19
- const project_service_1 = require("../project.service");
20
- const unfinalizedBlocks_service_1 = require("../unfinalizedBlocks.service");
21
18
  const worker_service_1 = require("./worker.service");
22
19
  let WorkerFetchModule = class WorkerFetchModule {
23
20
  };
@@ -26,14 +23,11 @@ exports.WorkerFetchModule = WorkerFetchModule = __decorate([
26
23
  (0, common_1.Module)({
27
24
  imports: [node_core_1.WorkerCoreModule],
28
25
  providers: [
26
+ node_core_1.DsProcessorService,
29
27
  indexer_manager_1.IndexerManager,
30
28
  {
31
- provide: node_core_1.ApiService,
32
- useFactory: async (project, connectionPoolService, eventEmitter, nodeConfig) => {
33
- const apiService = new starknet_1.StarknetApiService(project, connectionPoolService, eventEmitter, nodeConfig);
34
- await apiService.init();
35
- return apiService;
36
- },
29
+ provide: 'APIService',
30
+ useFactory: starknet_1.StarknetApiService.create,
37
31
  inject: [
38
32
  'ISubqueryProject',
39
33
  node_core_1.ConnectionPoolService,
@@ -41,18 +35,13 @@ exports.WorkerFetchModule = WorkerFetchModule = __decorate([
41
35
  node_core_1.NodeConfig,
42
36
  ],
43
37
  },
44
- ds_processor_service_1.DsProcessorService,
45
- {
46
- provide: dynamic_ds_service_1.DynamicDsService,
47
- useFactory: () => new node_core_1.WorkerDynamicDsService(global.host),
48
- },
49
38
  {
50
39
  provide: 'IProjectService',
51
- useClass: project_service_1.ProjectService,
40
+ useClass: node_core_1.ProjectService,
52
41
  },
53
42
  {
54
- provide: unfinalizedBlocks_service_1.UnfinalizedBlocksService,
55
- useFactory: () => new node_core_1.WorkerUnfinalizedBlocksService(global.host),
43
+ provide: 'IBlockchainService',
44
+ useClass: blockchain_service_1.BlockchainService,
56
45
  },
57
46
  worker_service_1.WorkerService,
58
47
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"worker-fetch.module.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker-fetch.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAAsD;AACtD,gDAO0B;AAE1B,6CAAoD;AAEpD,kEAA6D;AAC7D,8DAAyD;AACzD,wDAAoD;AACpD,wDAAoD;AACpD,4EAAwE;AACxE,qDAAiD;AA+C1C,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;CAAG,CAAA;AAApB,8CAAiB;4BAAjB,iBAAiB;IA7C7B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAgB,CAAC;QAC3B,SAAS,EAAE;YACT,gCAAc;YACd;gBACE,OAAO,EAAE,sBAAU;gBACnB,UAAU,EAAE,KAAK,EACf,OAAwB,EACxB,qBAAmE,EACnE,YAA2B,EAC3B,UAAsB,EACtB,EAAE;oBACF,MAAM,UAAU,GAAG,IAAI,6BAAkB,CACvC,OAAO,EACP,qBAAqB,EACrB,YAAY,EACZ,UAAU,CACX,CAAC;oBACF,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;oBACxB,OAAO,UAAU,CAAC;gBACpB,CAAC;gBACD,MAAM,EAAE;oBACN,kBAAkB;oBAClB,iCAAqB;oBACrB,6BAAa;oBACb,sBAAU;iBACX;aACF;YACD,yCAAkB;YAClB;gBACE,OAAO,EAAE,qCAAgB;gBACzB,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,kCAAsB,CAAE,MAAc,CAAC,IAAI,CAAC;aACnE;YACD;gBACE,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,gCAAc;aACzB;YACD;gBACE,OAAO,EAAE,oDAAwB;gBACjC,UAAU,EAAE,GAAG,EAAE,CACf,IAAI,0CAA8B,CAAE,MAAc,CAAC,IAAI,CAAC;aAC3D;YACD,8BAAa;SACd;KACF,CAAC;GACW,iBAAiB,CAAG","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiService,\n ConnectionPoolService,\n WorkerDynamicDsService,\n NodeConfig,\n WorkerUnfinalizedBlocksService,\n WorkerCoreModule,\n} from '@subql/node-core';\nimport { SubqueryProject } from '../../configure/SubqueryProject';\nimport { StarknetApiService } from '../../starknet';\nimport { StarknetApiConnection } from '../../starknet/api.connection';\nimport { DsProcessorService } from '../ds-processor.service';\nimport { DynamicDsService } from '../dynamic-ds.service';\nimport { IndexerManager } from '../indexer.manager';\nimport { ProjectService } from '../project.service';\nimport { UnfinalizedBlocksService } from '../unfinalizedBlocks.service';\nimport { WorkerService } from './worker.service';\n\n@Module({\n imports: [WorkerCoreModule],\n providers: [\n IndexerManager,\n {\n provide: ApiService,\n useFactory: async (\n project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<StarknetApiConnection>,\n eventEmitter: EventEmitter2,\n nodeConfig: NodeConfig,\n ) => {\n const apiService = new StarknetApiService(\n project,\n connectionPoolService,\n eventEmitter,\n nodeConfig,\n );\n await apiService.init();\n return apiService;\n },\n inject: [\n 'ISubqueryProject',\n ConnectionPoolService,\n EventEmitter2,\n NodeConfig,\n ],\n },\n DsProcessorService,\n {\n provide: DynamicDsService,\n useFactory: () => new WorkerDynamicDsService((global as any).host),\n },\n {\n provide: 'IProjectService',\n useClass: ProjectService,\n },\n {\n provide: UnfinalizedBlocksService,\n useFactory: () =>\n new WorkerUnfinalizedBlocksService((global as any).host),\n },\n WorkerService,\n ],\n})\nexport class WorkerFetchModule {}\n"]}
1
+ {"version":3,"file":"worker-fetch.module.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker-fetch.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAAsD;AACtD,gDAO0B;AAC1B,iEAA6D;AAC7D,6CAAoD;AACpD,wDAAoD;AACpD,qDAAiD;AA4B1C,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;CAAG,CAAA;AAApB,8CAAiB;4BAAjB,iBAAiB;IA1B7B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAgB,CAAC;QAC3B,SAAS,EAAE;YACT,8BAAkB;YAClB,gCAAc;YACd;gBACE,OAAO,EAAE,YAAY;gBACrB,UAAU,EAAE,6BAAkB,CAAC,MAAM;gBACrC,MAAM,EAAE;oBACN,kBAAkB;oBAClB,iCAAqB;oBACrB,6BAAa;oBACb,sBAAU;iBACX;aACF;YACD;gBACE,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,0BAAc;aACzB;YACD;gBACE,OAAO,EAAE,oBAAoB;gBAC7B,QAAQ,EAAE,sCAAiB;aAC5B;YACD,8BAAa;SACd;KACF,CAAC;GACW,iBAAiB,CAAG","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiService,\n ConnectionPoolService,\n NodeConfig,\n WorkerCoreModule,\n ProjectService,\n DsProcessorService,\n} from '@subql/node-core';\nimport { BlockchainService } from '../../blockchain.service';\nimport { StarknetApiService } from '../../starknet';\nimport { IndexerManager } from '../indexer.manager';\nimport { WorkerService } from './worker.service';\n\n@Module({\n imports: [WorkerCoreModule],\n providers: [\n DsProcessorService,\n IndexerManager,\n {\n provide: 'APIService',\n useFactory: StarknetApiService.create,\n inject: [\n 'ISubqueryProject',\n ConnectionPoolService,\n EventEmitter2,\n NodeConfig,\n ],\n },\n {\n provide: 'IProjectService',\n useClass: ProjectService,\n },\n {\n provide: 'IBlockchainService',\n useClass: BlockchainService,\n },\n WorkerService,\n ],\n})\nexport class WorkerFetchModule {}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,iEAAiE;AACjE,kDAAkD;AAClD,wCAAwC;AACxC,oDAAqD;AACrD,wCAAwC;AACxC,uCAA2C;AAE3C,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;AAE9B,IAAA,mBAAU,EACR,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,SAA+B,EACpC,IAAI,CAAC,QAA8B,CACpC,CAAC;AAEF,6DAA+C;AAC/C,uCAA2C;AAC3C,gDAM0B;AAE1B,mDAA+C;AAC/C,qDAAiD;AAEjD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,WAAW,8BAAQ,EAAE,CAAC,CAAC;AAEhD,KAAK,UAAU,UAAU,CAAC,WAAoB;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,4BAAY,EAAE;YACjD,MAAM,EAAE,IAAI,sBAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,0EAA0E;SACjH,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,cAAc,GAAmB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAClE,uGAAuG;QACvG,MAAM,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEvC,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,8BAAa,CAAC,CAAC;QAE7C,IAAA,8BAAkB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAIA,MAAc,CAAC,IAAI,GAAG,IAAA,4BAAgB,EAAC,EAAE,EAAE;IAC1C,UAAU;CACX,CAAC,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\n// initlogger and yargs must be imported before all other imports\n// making sure logger is defined before its called\n// eslint-disable-next-line import/order\nimport { initLogger } from '@subql/node-core/logger';\n// eslint-disable-next-line import/order\nimport { yargsOptions } from '../../yargs';\n\nconst { argv } = yargsOptions;\n\ninitLogger(\n argv.debug,\n argv.outputFmt as 'json' | 'colored',\n argv.logLevel as string | undefined,\n);\n\nimport { threadId } from 'node:worker_threads';\nimport { NestFactory } from '@nestjs/core';\nimport {\n getLogger,\n NestLogger,\n createWorkerHost,\n IBaseIndexerWorker,\n initWorkerServices,\n} from '@subql/node-core';\nimport { ProjectService } from '../project.service';\nimport { WorkerModule } from './worker.module';\nimport { WorkerService } from './worker.service';\n\nconst logger = getLogger(`worker #${threadId}`);\n\nasync function initWorker(startHeight?: number): Promise<void> {\n try {\n const app = await NestFactory.create(WorkerModule, {\n logger: new NestLogger(!!argv.debug), // TIP: If the worker is crashing comment out this line for better logging\n });\n\n await app.init();\n\n const projectService: ProjectService = app.get('IProjectService');\n // Initialise async services, we do this here rather than in factories so we can capture one off events\n await projectService.init(startHeight);\n\n const workerService = app.get(WorkerService);\n\n initWorkerServices(app, workerService);\n } catch (e: any) {\n console.log('Failed to start worker', e);\n logger.error(e, 'Failed to start worker');\n throw e;\n }\n}\n\nexport type IIndexerWorker = IBaseIndexerWorker;\n\n(global as any).host = createWorkerHost([], {\n initWorker,\n});\n"]}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,iEAAiE;AACjE,kDAAkD;AAClD,wCAAwC;AACxC,oDAAqD;AACrD,wCAAwC;AACxC,uCAA2C;AAE3C,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;AAE9B,IAAA,mBAAU,EACR,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,SAA+B,EACpC,IAAI,CAAC,QAA8B,CACpC,CAAC;AAEF,6DAA+C;AAC/C,uCAA2C;AAC3C,gDAO0B;AAC1B,mDAA+C;AAC/C,qDAAiD;AAEjD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,WAAW,8BAAQ,EAAE,CAAC,CAAC;AAEhD,KAAK,UAAU,UAAU,CAAC,WAAoB;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,4BAAY,EAAE;YACjD,MAAM,EAAE,IAAI,sBAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,0EAA0E;SACjH,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,cAAc,GAAmB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAClE,uGAAuG;QACvG,MAAM,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEvC,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,8BAAa,CAAC,CAAC;QAE7C,IAAA,8BAAkB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAIA,MAAc,CAAC,IAAI,GAAG,IAAA,4BAAgB,EAAC,EAAE,EAAE;IAC1C,UAAU;CACX,CAAC,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\n// initlogger and yargs must be imported before all other imports\n// making sure logger is defined before its called\n// eslint-disable-next-line import/order\nimport { initLogger } from '@subql/node-core/logger';\n// eslint-disable-next-line import/order\nimport { yargsOptions } from '../../yargs';\n\nconst { argv } = yargsOptions;\n\ninitLogger(\n argv.debug,\n argv.outputFmt as 'json' | 'colored',\n argv.logLevel as string | undefined,\n);\n\nimport { threadId } from 'node:worker_threads';\nimport { NestFactory } from '@nestjs/core';\nimport {\n getLogger,\n NestLogger,\n createWorkerHost,\n IBaseIndexerWorker,\n initWorkerServices,\n ProjectService,\n} from '@subql/node-core';\nimport { WorkerModule } from './worker.module';\nimport { WorkerService } from './worker.service';\n\nconst logger = getLogger(`worker #${threadId}`);\n\nasync function initWorker(startHeight?: number): Promise<void> {\n try {\n const app = await NestFactory.create(WorkerModule, {\n logger: new NestLogger(!!argv.debug), // TIP: If the worker is crashing comment out this line for better logging\n });\n\n await app.init();\n\n const projectService: ProjectService = app.get('IProjectService');\n // Initialise async services, we do this here rather than in factories so we can capture one off events\n await projectService.init(startHeight);\n\n const workerService = app.get(WorkerService);\n\n initWorkerServices(app, workerService);\n } catch (e: any) {\n console.log('Failed to start worker', e);\n logger.error(e, 'Failed to start worker');\n throw e;\n }\n}\n\nexport type IIndexerWorker = IBaseIndexerWorker;\n\n(global as any).host = createWorkerHost([], {\n initWorker,\n});\n"]}
@@ -21,7 +21,6 @@ exports.WorkerModule = WorkerModule;
21
21
  exports.WorkerModule = WorkerModule = __decorate([
22
22
  (0, common_1.Module)({
23
23
  imports: [
24
- node_core_1.DbModule.forRoot(),
25
24
  event_emitter_1.EventEmitterModule.forRoot(),
26
25
  configure_module_1.ConfigureModule.register(),
27
26
  schedule_1.ScheduleModule.forRoot(),
@@ -1 +1 @@
1
- {"version":3,"file":"worker.module.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAA2D;AAC3D,+CAAkD;AAClD,gDAA8D;AAC9D,uEAAmE;AACnE,+DAA0D;AAanD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IAXxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAkB,CAAC,OAAO,EAAE;YAC5B,kCAAe,CAAC,QAAQ,EAAE;YAC1B,yBAAc,CAAC,OAAO,EAAE;YACxB,4BAAgB;YAChB,uCAAiB;SAClB;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,YAAY,CAAG","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitterModule } from '@nestjs/event-emitter';\nimport { ScheduleModule } from '@nestjs/schedule';\nimport { DbModule, WorkerCoreModule } from '@subql/node-core';\nimport { ConfigureModule } from '../../configure/configure.module';\nimport { WorkerFetchModule } from './worker-fetch.module';\n\n@Module({\n imports: [\n DbModule.forRoot(),\n EventEmitterModule.forRoot(),\n ConfigureModule.register(),\n ScheduleModule.forRoot(),\n WorkerCoreModule,\n WorkerFetchModule,\n ],\n controllers: [],\n})\nexport class WorkerModule {}\n"]}
1
+ {"version":3,"file":"worker.module.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAA2D;AAC3D,+CAAkD;AAClD,gDAAoD;AACpD,uEAAmE;AACnE,+DAA0D;AAYnD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IAVxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,kCAAkB,CAAC,OAAO,EAAE;YAC5B,kCAAe,CAAC,QAAQ,EAAE;YAC1B,yBAAc,CAAC,OAAO,EAAE;YACxB,4BAAgB;YAChB,uCAAiB;SAClB;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,YAAY,CAAG","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitterModule } from '@nestjs/event-emitter';\nimport { ScheduleModule } from '@nestjs/schedule';\nimport { WorkerCoreModule } from '@subql/node-core';\nimport { ConfigureModule } from '../../configure/configure.module';\nimport { WorkerFetchModule } from './worker-fetch.module';\n\n@Module({\n imports: [\n EventEmitterModule.forRoot(),\n ConfigureModule.register(),\n ScheduleModule.forRoot(),\n WorkerCoreModule,\n WorkerFetchModule,\n ],\n controllers: [],\n})\nexport class WorkerModule {}\n"]}
@@ -48,6 +48,7 @@ let WorkerService = class WorkerService extends node_core_1.BaseWorkerService {
48
48
  exports.WorkerService = WorkerService;
49
49
  exports.WorkerService = WorkerService = __decorate([
50
50
  (0, common_1.Injectable)(),
51
+ __param(0, (0, common_1.Inject)('APIService')),
51
52
  __param(2, (0, common_1.Inject)('IProjectService')),
52
53
  __param(3, (0, common_1.Inject)('IProjectUpgradeService')),
53
54
  __metadata("design:paramtypes", [node_core_1.ApiService,
@@ -1 +1 @@
1
- {"version":3,"file":"worker.service.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AAEpD,gDAS0B;AAI1B,kEAAsE;AACtE,wDAAoD;AACpD,oCAAsD;AAY/C,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,6BAKlC;IAEW;IAKA;IANV,YACU,UAIP,EACO,cAA8B,EAEtC,cAAkD,EAElD,qBAA6C,EAC7C,UAAsB;QAEtB,KAAK,CAAC,cAAc,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAC;QAZjD,eAAU,GAAV,UAAU,CAIjB;QACO,mBAAc,GAAd,cAAc,CAAgB;IAQxC,CAAC;IAES,KAAK,CAAC,eAAe,CAC7B,OAAe,EACf,KAAS;QAET,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;IAES,eAAe,CAAC,KAAmB;QAC3C,OAAO;YACL,GAAG,IAAA,sCAAqB,EAAC,KAAK,CAAC;YAC/B,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,mBAAmB,CACjC,KAA2B,EAC3B,WAAsC;QAEtC,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC;IAED,YAAY,CAAC,KAA2B;QACtC,OAAO,IAAA,oBAAY,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACF,CAAA;AA/CY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;IAcR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;IAEzB,WAAA,IAAA,eAAM,EAAC,wBAAwB,CAAC,CAAA;qCARb,sBAAU;QAKN,gCAAc,kBAK1B,sBAAU;GAjBb,aAAa,CA+CzB","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport { SubqlStarknetDataSource } from '@subql/common-starknet';\nimport {\n NodeConfig,\n IProjectService,\n ProcessBlockResponse,\n ApiService,\n BaseWorkerService,\n IProjectUpgradeService,\n IBlock,\n Header,\n} from '@subql/node-core';\nimport { StarknetProjectDs } from '../../configure/SubqueryProject';\nimport { StarknetApi } from '../../starknet';\nimport SafeStarknetProvider from '../../starknet/safe-api';\nimport { starknetBlockToHeader } from '../../starknet/utils.starknet';\nimport { IndexerManager } from '../indexer.manager';\nimport { BlockContent, getBlockSize } from '../types';\n\nexport type FetchBlockResponse = Header;\n\nexport type WorkerStatusResponse = {\n threadId: number;\n isIndexing: boolean;\n fetchedBlocks: number;\n toFetchBlocks: number;\n};\n\n@Injectable()\nexport class WorkerService extends BaseWorkerService<\n BlockContent,\n FetchBlockResponse,\n SubqlStarknetDataSource,\n {}\n> {\n constructor(\n private apiService: ApiService<\n StarknetApi,\n SafeStarknetProvider,\n IBlock<BlockContent>[]\n >,\n private indexerManager: IndexerManager,\n @Inject('IProjectService')\n projectService: IProjectService<StarknetProjectDs>,\n @Inject('IProjectUpgradeService')\n projectUpgradeService: IProjectUpgradeService,\n nodeConfig: NodeConfig,\n ) {\n super(projectService, projectUpgradeService, nodeConfig);\n }\n\n protected async fetchChainBlock(\n heights: number,\n extra: {},\n ): Promise<IBlock<BlockContent>> {\n const [block] = await this.apiService.fetchBlocks([heights]);\n return block;\n }\n\n protected toBlockResponse(block: BlockContent): Header {\n return {\n ...starknetBlockToHeader(block),\n parentHash: block.parentHash,\n };\n }\n\n protected async processFetchedBlock(\n block: IBlock<BlockContent>,\n dataSources: SubqlStarknetDataSource[],\n ): Promise<ProcessBlockResponse> {\n return this.indexerManager.indexBlock(block, dataSources);\n }\n\n getBlockSize(block: IBlock<BlockContent>): number {\n return getBlockSize(block.block);\n }\n}\n"]}
1
+ {"version":3,"file":"worker.service.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AAEpD,gDAS0B;AAI1B,kEAAsE;AACtE,wDAAoD;AACpD,oCAAsD;AAY/C,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,6BAKlC;IAGW;IAKA;IAPV,YAEU,UAIP,EACO,cAA8B,EAEtC,cAAkD,EAElD,qBAA6C,EAC7C,UAAsB;QAEtB,KAAK,CAAC,cAAc,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAC;QAZjD,eAAU,GAAV,UAAU,CAIjB;QACO,mBAAc,GAAd,cAAc,CAAgB;IAQxC,CAAC;IAES,KAAK,CAAC,eAAe,CAC7B,OAAe,EACf,KAAS;QAET,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;IAES,eAAe,CAAC,KAAmB;QAC3C,OAAO;YACL,GAAG,IAAA,sCAAqB,EAAC,KAAK,CAAC;YAC/B,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,mBAAmB,CACjC,KAA2B,EAC3B,WAAsC;QAEtC,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC;IAED,YAAY,CAAC,KAA2B;QACtC,OAAO,IAAA,oBAAY,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACF,CAAA;AAhDY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;IAQR,WAAA,IAAA,eAAM,EAAC,YAAY,CAAC,CAAA;IAOpB,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;IAEzB,WAAA,IAAA,eAAM,EAAC,wBAAwB,CAAC,CAAA;qCARb,sBAAU;QAKN,gCAAc,kBAK1B,sBAAU;GAlBb,aAAa,CAgDzB","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport { SubqlStarknetDataSource } from '@subql/common-starknet';\nimport {\n NodeConfig,\n IProjectService,\n ProcessBlockResponse,\n ApiService,\n BaseWorkerService,\n IProjectUpgradeService,\n IBlock,\n Header,\n} from '@subql/node-core';\nimport { StarknetProjectDs } from '../../configure/SubqueryProject';\nimport { StarknetApi } from '../../starknet';\nimport SafeStarknetProvider from '../../starknet/safe-api';\nimport { starknetBlockToHeader } from '../../starknet/utils.starknet';\nimport { IndexerManager } from '../indexer.manager';\nimport { BlockContent, getBlockSize } from '../types';\n\nexport type FetchBlockResponse = Header;\n\nexport type WorkerStatusResponse = {\n threadId: number;\n isIndexing: boolean;\n fetchedBlocks: number;\n toFetchBlocks: number;\n};\n\n@Injectable()\nexport class WorkerService extends BaseWorkerService<\n BlockContent,\n FetchBlockResponse,\n SubqlStarknetDataSource,\n {}\n> {\n constructor(\n @Inject('APIService')\n private apiService: ApiService<\n StarknetApi,\n SafeStarknetProvider,\n IBlock<BlockContent>[]\n >,\n private indexerManager: IndexerManager,\n @Inject('IProjectService')\n projectService: IProjectService<StarknetProjectDs>,\n @Inject('IProjectUpgradeService')\n projectUpgradeService: IProjectUpgradeService,\n nodeConfig: NodeConfig,\n ) {\n super(projectService, projectUpgradeService, nodeConfig);\n }\n\n protected async fetchChainBlock(\n heights: number,\n extra: {},\n ): Promise<IBlock<BlockContent>> {\n const [block] = await this.apiService.fetchBlocks([heights]);\n return block;\n }\n\n protected toBlockResponse(block: BlockContent): Header {\n return {\n ...starknetBlockToHeader(block),\n parentHash: block.parentHash,\n };\n }\n\n protected async processFetchedBlock(\n block: IBlock<BlockContent>,\n dataSources: SubqlStarknetDataSource[],\n ): Promise<ProcessBlockResponse> {\n return this.indexerManager.indexBlock(block, dataSources);\n }\n\n getBlockSize(block: IBlock<BlockContent>): number {\n return getBlockSize(block.block);\n }\n}\n"]}