@subql/node-ethereum 4.7.4-1 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/configure/SubqueryProject.d.ts +5 -18
- package/dist/configure/SubqueryProject.js +16 -101
- package/dist/configure/SubqueryProject.js.map +1 -1
- package/dist/configure/configure.module.js +1 -1
- package/dist/configure/configure.module.js.map +1 -1
- package/dist/ethereum/api.service.ethereum.js +1 -3
- package/dist/ethereum/api.service.ethereum.js.map +1 -1
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js +1 -3
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +1 -1
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +1 -4
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +1 -1
- package/dist/indexer/dictionary/ethDictionary.service.js +1 -3
- package/dist/indexer/dictionary/ethDictionary.service.js.map +1 -1
- package/dist/indexer/dynamic-ds.service.js +1 -3
- package/dist/indexer/dynamic-ds.service.js.map +1 -1
- package/dist/indexer/fetch.service.js +1 -3
- package/dist/indexer/fetch.service.js.map +1 -1
- package/dist/indexer/project.service.js +1 -3
- package/dist/indexer/project.service.js.map +1 -1
- package/dist/subcommands/testing.service.js +1 -3
- package/dist/subcommands/testing.service.js.map +1 -1
- package/package.json +5 -6
|
@@ -1,27 +1,14 @@
|
|
|
1
1
|
import { SubqlEthereumDataSource } from '@subql/common-ethereum';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { BaseSubqueryProject, CronFilter } from '@subql/node-core';
|
|
3
|
+
import { Reader } from '@subql/types-core';
|
|
4
4
|
import { EthereumNetworkConfig, RuntimeDatasourceTemplate, CustomDatasourceTemplate, EthereumBlockFilter } from '@subql/types-ethereum';
|
|
5
|
-
import { GraphQLSchema } from 'graphql';
|
|
6
5
|
export type EthereumProjectDs = SubqlEthereumDataSource;
|
|
7
6
|
export type EthereumProjectDsTemplate = RuntimeDatasourceTemplate | CustomDatasourceTemplate;
|
|
8
7
|
export type SubqlProjectBlockFilter = EthereumBlockFilter & CronFilter;
|
|
9
8
|
type NetworkConfig = EthereumNetworkConfig & {
|
|
10
9
|
chainId: string;
|
|
11
10
|
};
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
readonly root: string;
|
|
16
|
-
readonly network: NetworkConfig;
|
|
17
|
-
readonly schema: GraphQLSchema;
|
|
18
|
-
readonly templates: EthereumProjectDsTemplate[];
|
|
19
|
-
readonly runner?: RunnerSpecs | undefined;
|
|
20
|
-
readonly parent?: ParentProject | undefined;
|
|
21
|
-
constructor(id: string, root: string, network: NetworkConfig, dataSources: EthereumProjectDs[], schema: GraphQLSchema, templates: EthereumProjectDsTemplate[], runner?: RunnerSpecs | undefined, parent?: ParentProject | undefined);
|
|
22
|
-
get dataSources(): EthereumProjectDs[];
|
|
23
|
-
applyCronTimestamps(getTimestamp: (height: number) => Promise<Date>): Promise<void>;
|
|
24
|
-
static create(path: string, rawManifest: unknown, reader: Reader, root: string, // If project local then directory otherwise temp directory
|
|
25
|
-
networkOverrides?: Partial<EthereumNetworkConfig>): Promise<SubqueryProject>;
|
|
26
|
-
}
|
|
11
|
+
export type SubqueryProject = BaseSubqueryProject<EthereumProjectDs, EthereumProjectDsTemplate, NetworkConfig>;
|
|
12
|
+
export declare function createSubQueryProject(path: string, rawManifest: unknown, reader: Reader, root: string, // If project local then directory otherwise temp directory
|
|
13
|
+
networkOverrides?: Partial<NetworkConfig>): Promise<SubqueryProject>;
|
|
27
14
|
export {};
|
|
@@ -1,111 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors
|
|
3
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
-
};
|
|
16
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.
|
|
18
|
-
const assert_1 = __importDefault(require("assert"));
|
|
19
|
-
const common_1 = require("@nestjs/common");
|
|
20
|
-
const common_2 = require("@subql/common");
|
|
5
|
+
exports.createSubQueryProject = void 0;
|
|
21
6
|
const common_ethereum_1 = require("@subql/common-ethereum");
|
|
22
7
|
const node_core_1 = require("@subql/node-core");
|
|
23
|
-
const utils_1 = require("@subql/utils");
|
|
24
|
-
const graphql_1 = require("graphql");
|
|
25
8
|
const { version: packageVersion } = require('../../package.json');
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
this.schema = schema;
|
|
40
|
-
this.templates = templates;
|
|
41
|
-
this.runner = runner;
|
|
42
|
-
this.parent = parent;
|
|
43
|
-
this.#dataSources = dataSources;
|
|
44
|
-
}
|
|
45
|
-
get dataSources() {
|
|
46
|
-
return this.#dataSources;
|
|
47
|
-
}
|
|
48
|
-
async applyCronTimestamps(getTimestamp) {
|
|
49
|
-
this.#dataSources = await (0, node_core_1.insertBlockFiltersCronSchedules)(this.dataSources, getTimestamp, common_ethereum_1.isRuntimeDs, common_ethereum_1.EthereumHandlerKind.Block);
|
|
50
|
-
}
|
|
51
|
-
static async create(path, rawManifest, reader, root, // If project local then directory otherwise temp directory
|
|
52
|
-
networkOverrides) {
|
|
53
|
-
// rawManifest and reader can be reused here.
|
|
54
|
-
// It has been pre-fetched and used for rebase manifest runner options with args
|
|
55
|
-
// in order to generate correct configs.
|
|
56
|
-
// But we still need reader here, because path can be remote or local
|
|
57
|
-
// and the `loadProjectManifest(projectPath)` only support local mode
|
|
58
|
-
if (rawManifest === undefined) {
|
|
59
|
-
throw new Error(`Get manifest from project path ${path} failed`);
|
|
60
|
-
}
|
|
61
|
-
const manifest = (0, common_ethereum_1.parseEthereumProjectManifest)(rawManifest);
|
|
62
|
-
if (manifest.isV1_0_0) {
|
|
63
|
-
return loadProjectFromManifestBase(manifest.asV1_0_0, reader, path, root, networkOverrides);
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
throw new Error(`Manifest specVersion ${manifest.specVersion} is not supported`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
SubqueryProject = __decorate([
|
|
71
|
-
(0, common_1.Injectable)(),
|
|
72
|
-
__metadata("design:paramtypes", [String, String, Object, Array, graphql_1.GraphQLSchema, Array, Object, Object])
|
|
73
|
-
], SubqueryProject);
|
|
74
|
-
exports.SubqueryProject = SubqueryProject;
|
|
75
|
-
function processChainId(network) {
|
|
76
|
-
if (network.chainId && network.genesisHash) {
|
|
77
|
-
throw new Error('Please only provide one of chainId and genesisHash');
|
|
78
|
-
}
|
|
79
|
-
else if (network.genesisHash && !network.chainId) {
|
|
80
|
-
network.chainId = network.genesisHash;
|
|
81
|
-
}
|
|
82
|
-
delete network.genesisHash;
|
|
83
|
-
return network;
|
|
84
|
-
}
|
|
85
|
-
async function loadProjectFromManifestBase(projectManifest, reader, path, root, networkOverrides) {
|
|
86
|
-
if (typeof projectManifest.network.endpoint === 'string') {
|
|
87
|
-
projectManifest.network.endpoint = [projectManifest.network.endpoint];
|
|
88
|
-
}
|
|
89
|
-
const network = processChainId({
|
|
90
|
-
...projectManifest.network,
|
|
91
|
-
...networkOverrides,
|
|
9
|
+
async function createSubQueryProject(path, rawManifest, reader, root, // If project local then directory otherwise temp directory
|
|
10
|
+
networkOverrides) {
|
|
11
|
+
const project = await node_core_1.BaseSubqueryProject.create({
|
|
12
|
+
parseManifest: (raw) => (0, common_ethereum_1.parseEthereumProjectManifest)(raw).asV1_0_0,
|
|
13
|
+
path,
|
|
14
|
+
rawManifest,
|
|
15
|
+
reader,
|
|
16
|
+
root,
|
|
17
|
+
nodeSemver: packageVersion,
|
|
18
|
+
blockHandlerKind: common_ethereum_1.EthereumHandlerKind.Block,
|
|
19
|
+
networkOverrides,
|
|
20
|
+
isRuntimeDs: common_ethereum_1.isRuntimeDs,
|
|
21
|
+
isCustomDs: common_ethereum_1.isCustomDs,
|
|
92
22
|
});
|
|
93
|
-
|
|
94
|
-
throw new Error(`Network endpoint must be provided for network. chainId="${network.chainId}"`);
|
|
95
|
-
}
|
|
96
|
-
let schemaString;
|
|
97
|
-
try {
|
|
98
|
-
schemaString = await reader.getFile(projectManifest.schema.file);
|
|
99
|
-
}
|
|
100
|
-
catch (e) {
|
|
101
|
-
throw new Error(`unable to fetch the schema from ${projectManifest.schema.file}`);
|
|
102
|
-
}
|
|
103
|
-
const schema = (0, utils_1.buildSchemaFromString)(schemaString);
|
|
104
|
-
const templates = await (0, node_core_1.loadProjectTemplates)(projectManifest.templates, root, reader, common_ethereum_1.isCustomDs);
|
|
105
|
-
const runner = projectManifest.runner;
|
|
106
|
-
(0, assert_1.default)((0, common_2.validateSemver)(packageVersion, runner.node.version), new Error(`Runner require node version ${runner.node.version}, current node ${packageVersion}`));
|
|
107
|
-
const dataSources = await (0, node_core_1.updateDataSourcesV1_0_0)(projectManifest.dataSources, reader, root, common_ethereum_1.isCustomDs);
|
|
108
|
-
return new SubqueryProject(reader.root ? reader.root : path, //TODO, need to method to get project_id
|
|
109
|
-
root, network, dataSources, schema, templates, runner, projectManifest.parent);
|
|
23
|
+
return project;
|
|
110
24
|
}
|
|
25
|
+
exports.createSubQueryProject = createSubQueryProject;
|
|
111
26
|
//# sourceMappingURL=SubqueryProject.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubqueryProject.js","sourceRoot":"","sources":["../../src/configure/SubqueryProject.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC
|
|
1
|
+
{"version":3,"file":"SubqueryProject.js","sourceRoot":"","sources":["../../src/configure/SubqueryProject.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAEnC,4DAMgC;AAChC,gDAAmE;AASnE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAmB3D,KAAK,UAAU,qBAAqB,CACzC,IAAY,EACZ,WAAoB,EACpB,MAAc,EACd,IAAY,EAAE,2DAA2D;AACzE,gBAAyC;IAEzC,MAAM,OAAO,GAAG,MAAM,+BAAmB,CAAC,MAAM,CAAkB;QAChE,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,8CAA4B,EAAC,GAAG,CAAC,CAAC,QAAQ;QAClE,IAAI;QACJ,WAAW;QACX,MAAM;QACN,IAAI;QACJ,UAAU,EAAE,cAAc;QAC1B,gBAAgB,EAAE,qCAAmB,CAAC,KAAK;QAC3C,gBAAgB;QAChB,WAAW,EAAX,6BAAW;QACX,UAAU,EAAV,4BAAU;KACX,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AArBD,sDAqBC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport {\n parseEthereumProjectManifest,\n SubqlEthereumDataSource,\n isRuntimeDs,\n EthereumHandlerKind,\n isCustomDs,\n} from '@subql/common-ethereum';\nimport { BaseSubqueryProject, CronFilter } from '@subql/node-core';\nimport { Reader } from '@subql/types-core';\nimport {\n EthereumNetworkConfig,\n RuntimeDatasourceTemplate,\n CustomDatasourceTemplate,\n EthereumBlockFilter,\n} from '@subql/types-ethereum';\n\nconst { version: packageVersion } = require('../../package.json');\n\nexport type EthereumProjectDs = SubqlEthereumDataSource;\n\nexport type EthereumProjectDsTemplate =\n | RuntimeDatasourceTemplate\n | CustomDatasourceTemplate;\n\nexport type SubqlProjectBlockFilter = EthereumBlockFilter & CronFilter;\n\n// This is the runtime type after we have mapped genesisHash to chainId and endpoint/dict have been provided when dealing with deployments\ntype NetworkConfig = EthereumNetworkConfig & { chainId: string };\n\nexport type SubqueryProject = BaseSubqueryProject<\n EthereumProjectDs,\n EthereumProjectDsTemplate,\n NetworkConfig\n>;\n\nexport async function createSubQueryProject(\n path: string,\n rawManifest: unknown,\n reader: Reader,\n root: string, // If project local then directory otherwise temp directory\n networkOverrides?: Partial<NetworkConfig>,\n): Promise<SubqueryProject> {\n const project = await BaseSubqueryProject.create<SubqueryProject>({\n parseManifest: (raw) => parseEthereumProjectManifest(raw).asV1_0_0,\n path,\n rawManifest,\n reader,\n root,\n nodeSemver: packageVersion,\n blockHandlerKind: EthereumHandlerKind.Block,\n networkOverrides,\n isRuntimeDs,\n isCustomDs,\n });\n\n return project;\n}\n"]}
|
|
@@ -18,7 +18,7 @@ const pjson = require('../../package.json');
|
|
|
18
18
|
let ConfigureModule = ConfigureModule_1 = class ConfigureModule {
|
|
19
19
|
static async getInstance() {
|
|
20
20
|
const { argv } = yargs_1.yargsOptions;
|
|
21
|
-
return (0, node_core_1.registerApp)(argv, SubqueryProject_1.
|
|
21
|
+
return (0, node_core_1.registerApp)(argv, SubqueryProject_1.createSubQueryProject, yargs_1.yargsOptions.showHelp.bind(yargs_1.yargsOptions), pjson);
|
|
22
22
|
}
|
|
23
23
|
static async register() {
|
|
24
24
|
const { nodeConfig, project } = await ConfigureModule_1.getInstance();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.module.js","sourceRoot":"","sources":["../../src/configure/configure.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;AAEnC,2CAA+D;AAC/D,gDAA2D;AAC3D,oCAAwC;AACxC,
|
|
1
|
+
{"version":3,"file":"configure.module.js","sourceRoot":"","sources":["../../src/configure/configure.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;AAEnC,2CAA+D;AAC/D,gDAA2D;AAC3D,oCAAwC;AACxC,uDAA2E;AAE3E,MAAM,KAAK,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAIrC,IAAM,eAAe,uBAArB,MAAM,eAAe;IAC1B,MAAM,CAAC,KAAK,CAAC,WAAW;QAItB,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;QAC9B,OAAO,IAAA,uBAAW,EAChB,IAAI,EACJ,uCAAqB,EACrB,oBAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAY,CAAC,EACxC,KAAK,CACN,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,QAAQ;QACnB,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,iBAAe,CAAC,WAAW,EAAE,CAAC;QAEpE,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,sBAAU;oBACnB,QAAQ,EAAE,UAAU;iBACrB;gBACD;oBACE,OAAO,EAAE,kBAAkB;oBAC3B,QAAQ,EAAE,OAAO;iBAClB;gBACD;oBACE,OAAO,EAAE,wBAAwB;oBACjC,QAAQ,EAAE,OAAO;iBAClB;gBACD;oBACE,OAAO,EAAE,MAAM;oBACf,QAAQ,EAAE,IAAI;iBACf;aACF;YACD,OAAO,EAAE;gBACP,sBAAU;gBACV,kBAAkB;gBAClB,wBAAwB;gBACxB,MAAM;aACP;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AA5CY,eAAe;IAF3B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,eAAe,CA4C3B;AA5CY,0CAAe","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { DynamicModule, Global, Module } from '@nestjs/common';\nimport { NodeConfig, registerApp } from '@subql/node-core';\nimport { yargsOptions } from '../yargs';\nimport { createSubQueryProject, SubqueryProject } from './SubqueryProject';\n\nconst pjson = require('../../package.json');\n\n@Global()\n@Module({})\nexport class ConfigureModule {\n static async getInstance(): Promise<{\n nodeConfig: NodeConfig;\n project: SubqueryProject;\n }> {\n const { argv } = yargsOptions;\n return registerApp<SubqueryProject>(\n argv,\n createSubQueryProject,\n yargsOptions.showHelp.bind(yargsOptions),\n pjson,\n );\n }\n static async register(): Promise<DynamicModule> {\n const { nodeConfig, project } = await ConfigureModule.getInstance();\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: [\n NodeConfig,\n 'ISubqueryProject',\n 'IProjectUpgradeService',\n 'Null',\n ],\n };\n }\n}\n"]}
|
|
@@ -23,7 +23,6 @@ const common_1 = require("@nestjs/common");
|
|
|
23
23
|
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
24
24
|
const node_core_1 = require("@subql/node-core");
|
|
25
25
|
const NodeConfig_1 = require("../configure/NodeConfig");
|
|
26
|
-
const SubqueryProject_1 = require("../configure/SubqueryProject");
|
|
27
26
|
const project_1 = require("../utils/project");
|
|
28
27
|
const api_connection_1 = require("./api.connection");
|
|
29
28
|
const logger = (0, node_core_1.getLogger)('api');
|
|
@@ -151,8 +150,7 @@ let EthereumApiService = class EthereumApiService extends node_core_1.ApiService
|
|
|
151
150
|
EthereumApiService = __decorate([
|
|
152
151
|
(0, common_1.Injectable)(),
|
|
153
152
|
__param(0, (0, common_1.Inject)('ISubqueryProject')),
|
|
154
|
-
__metadata("design:paramtypes", [
|
|
155
|
-
node_core_1.ConnectionPoolService,
|
|
153
|
+
__metadata("design:paramtypes", [Object, node_core_1.ConnectionPoolService,
|
|
156
154
|
event_emitter_1.EventEmitter2,
|
|
157
155
|
node_core_1.NodeConfig])
|
|
158
156
|
], EthereumApiService);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.service.ethereum.js","sourceRoot":"","sources":["../../src/ethereum/api.service.ethereum.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport assert from 'assert';\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiService,\n ConnectionPoolService,\n getLogger,\n NodeConfig,\n profilerWrap,\n IBlock,\n exitWithError,\n} from '@subql/node-core';\nimport {\n EthereumBlock,\n EthereumNetworkConfig,\n LightEthereumBlock,\n} from '@subql/types-ethereum';\nimport { EthereumNodeConfig } from '../configure/NodeConfig';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { isOnlyEventHandlers } from '../utils/project';\nimport {\n EthereumApiConnection,\n FetchFunc,\n GetFetchFunc,\n} from './api.connection';\nimport { EthereumApi } from './api.ethereum';\nimport SafeEthProvider from './safe-api';\n\nconst logger = getLogger('api');\n\n@Injectable()\nexport class EthereumApiService extends ApiService<\n EthereumApi,\n SafeEthProvider,\n IBlock<EthereumBlock>[] | IBlock<LightEthereumBlock>[]\n> {\n private fetchBlocksFunction?: FetchFunc;\n private fetchBlocksBatches: GetFetchFunc = () => {\n assert(this.fetchBlocksFunction, 'Fetch blocks function is not defined');\n return this.fetchBlocksFunction;\n };\n private nodeConfig: EthereumNodeConfig;\n\n constructor(\n @Inject('ISubqueryProject') private project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<EthereumApiConnection>,\n eventEmitter: EventEmitter2,\n nodeConfig: NodeConfig,\n ) {\n super(connectionPoolService, eventEmitter);\n this.nodeConfig = new EthereumNodeConfig(nodeConfig);\n\n this.updateBlockFetching();\n }\n\n async init(): Promise<EthereumApiService> {\n let network: EthereumNetworkConfig;\n try {\n network = this.project.network;\n } catch (e) {\n exitWithError(new Error(`Failed to init api`, { cause: e }), logger);\n }\n\n const endpoints = Array.isArray(network.endpoint)\n ? network.endpoint\n : [network.endpoint];\n\n if (this.nodeConfig.primaryNetworkEndpoint) {\n endpoints.push(this.nodeConfig.primaryNetworkEndpoint);\n }\n\n await this.createConnections(network, (endpoint) =>\n EthereumApiConnection.create(\n endpoint,\n this.nodeConfig.blockConfirmations,\n this.fetchBlocksBatches,\n this.eventEmitter,\n this.nodeConfig.unfinalizedBlocks,\n ),\n );\n\n return this;\n }\n\n protected metadataMismatchError(\n metadata: string,\n expected: string,\n actual: string,\n ): Error {\n return Error(\n `Value of ${metadata} does not match across all endpoints. Please check that your endpoints are for the same network.\\n\n Expected: ${expected}\n Actual: ${actual}`,\n );\n }\n\n get api(): EthereumApi {\n return this.unsafeApi;\n }\n\n safeApi(height: number): SafeEthProvider {\n const maxRetries = 5;\n\n const retryErrorCodes = [\n 'UNKNOWN_ERROR',\n 'NOT_IMPLEMENTED',\n 'NETWORK_ERROR',\n 'SERVER_ERROR',\n 'TIMEOUT',\n 'BAD_DATA',\n 'CANCELLED',\n ];\n\n const handler: ProxyHandler<SafeEthProvider> = {\n get: (target, prop, receiver) => {\n const originalMethod = target[prop as keyof SafeEthProvider];\n if (typeof originalMethod === 'function') {\n return async (\n ...args: Parameters<typeof originalMethod>\n ): Promise<ReturnType<typeof originalMethod>> => {\n let retries = 0;\n let currentApi = target;\n let throwingError: Error | undefined;\n\n while (retries < maxRetries) {\n try {\n return await (originalMethod as Function).apply(\n currentApi,\n args,\n );\n } catch (error: any) {\n // other than retryErrorCodes, other errors does not have anything to do with network request, retrying would not change its outcome\n if (!retryErrorCodes.includes(error?.code)) {\n throw error;\n }\n\n logger.warn(\n `Request failed with api at height ${height} (retry ${retries}): ${error.message}`,\n );\n throwingError = error;\n currentApi = this.unsafeApi.getSafeApi(height);\n retries++;\n }\n }\n\n logger.error(\n `Maximum retries (${maxRetries}) exceeded for api at height ${height}`,\n );\n if (!throwingError) {\n throw new Error('Failed to make request, maximum retries failed');\n }\n throw throwingError;\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n };\n\n return new Proxy(this.unsafeApi.getSafeApi(height), handler);\n }\n\n private async fetchFullBlocksBatch(\n api: EthereumApi,\n batch: number[],\n ): Promise<IBlock<EthereumBlock>[]> {\n return api.fetchBlocks(batch);\n }\n\n private async fetchLightBlocksBatch(\n api: EthereumApi,\n batch: number[],\n ): Promise<IBlock<LightEthereumBlock>[]> {\n return api.fetchBlocksLight(batch);\n }\n\n updateBlockFetching(): void {\n const onlyEventHandlers = isOnlyEventHandlers(this.project);\n const skipTransactions =\n this.nodeConfig.skipTransactions && onlyEventHandlers;\n\n if (this.nodeConfig.skipTransactions) {\n if (onlyEventHandlers) {\n logger.info(\n 'skipTransactions is enabled, only events and block headers will be fetched.',\n );\n } else {\n logger.info(\n `skipTransactions is disabled, the project contains handlers that aren't event handlers.`,\n );\n }\n } else {\n if (onlyEventHandlers) {\n logger.warn(\n 'skipTransactions is disabled, the project contains only event handlers, it could be enabled to improve indexing performance.',\n );\n } else {\n logger.info(`skipTransactions is disabled.`);\n }\n }\n\n const fetchFunc = skipTransactions\n ? this.fetchLightBlocksBatch.bind(this)\n : this.fetchFullBlocksBatch.bind(this);\n\n if (this.nodeConfig?.profiler) {\n this.fetchBlocksFunction = profilerWrap(\n fetchFunc,\n 'SubstrateUtil',\n 'fetchBlocksBatches',\n ) as FetchFunc;\n } else {\n this.fetchBlocksFunction = fetchFunc;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"api.service.ethereum.js","sourceRoot":"","sources":["../../src/ethereum/api.service.ethereum.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport assert from 'assert';\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiService,\n ConnectionPoolService,\n getLogger,\n NodeConfig,\n profilerWrap,\n IBlock,\n exitWithError,\n} from '@subql/node-core';\nimport {\n EthereumBlock,\n EthereumNetworkConfig,\n LightEthereumBlock,\n} from '@subql/types-ethereum';\nimport { EthereumNodeConfig } from '../configure/NodeConfig';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { isOnlyEventHandlers } from '../utils/project';\nimport {\n EthereumApiConnection,\n FetchFunc,\n GetFetchFunc,\n} from './api.connection';\nimport { EthereumApi } from './api.ethereum';\nimport SafeEthProvider from './safe-api';\n\nconst logger = getLogger('api');\n\n@Injectable()\nexport class EthereumApiService extends ApiService<\n EthereumApi,\n SafeEthProvider,\n IBlock<EthereumBlock>[] | IBlock<LightEthereumBlock>[]\n> {\n private fetchBlocksFunction?: FetchFunc;\n private fetchBlocksBatches: GetFetchFunc = () => {\n assert(this.fetchBlocksFunction, 'Fetch blocks function is not defined');\n return this.fetchBlocksFunction;\n };\n private nodeConfig: EthereumNodeConfig;\n\n constructor(\n @Inject('ISubqueryProject') private project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<EthereumApiConnection>,\n eventEmitter: EventEmitter2,\n nodeConfig: NodeConfig,\n ) {\n super(connectionPoolService, eventEmitter);\n this.nodeConfig = new EthereumNodeConfig(nodeConfig);\n\n this.updateBlockFetching();\n }\n\n async init(): Promise<EthereumApiService> {\n let network: EthereumNetworkConfig;\n try {\n network = this.project.network;\n } catch (e) {\n exitWithError(new Error(`Failed to init api`, { cause: e }), logger);\n }\n\n const endpoints = Array.isArray(network.endpoint)\n ? network.endpoint\n : [network.endpoint];\n\n if (this.nodeConfig.primaryNetworkEndpoint) {\n endpoints.push(this.nodeConfig.primaryNetworkEndpoint);\n }\n\n await this.createConnections(network, (endpoint) =>\n EthereumApiConnection.create(\n endpoint,\n this.nodeConfig.blockConfirmations,\n this.fetchBlocksBatches,\n this.eventEmitter,\n this.nodeConfig.unfinalizedBlocks,\n ),\n );\n\n return this;\n }\n\n protected metadataMismatchError(\n metadata: string,\n expected: string,\n actual: string,\n ): Error {\n return Error(\n `Value of ${metadata} does not match across all endpoints. Please check that your endpoints are for the same network.\\n\n Expected: ${expected}\n Actual: ${actual}`,\n );\n }\n\n get api(): EthereumApi {\n return this.unsafeApi;\n }\n\n safeApi(height: number): SafeEthProvider {\n const maxRetries = 5;\n\n const retryErrorCodes = [\n 'UNKNOWN_ERROR',\n 'NOT_IMPLEMENTED',\n 'NETWORK_ERROR',\n 'SERVER_ERROR',\n 'TIMEOUT',\n 'BAD_DATA',\n 'CANCELLED',\n ];\n\n const handler: ProxyHandler<SafeEthProvider> = {\n get: (target, prop, receiver) => {\n const originalMethod = target[prop as keyof SafeEthProvider];\n if (typeof originalMethod === 'function') {\n return async (\n ...args: Parameters<typeof originalMethod>\n ): Promise<ReturnType<typeof originalMethod>> => {\n let retries = 0;\n let currentApi = target;\n let throwingError: Error | undefined;\n\n while (retries < maxRetries) {\n try {\n return await (originalMethod as Function).apply(\n currentApi,\n args,\n );\n } catch (error: any) {\n // other than retryErrorCodes, other errors does not have anything to do with network request, retrying would not change its outcome\n if (!retryErrorCodes.includes(error?.code)) {\n throw error;\n }\n\n logger.warn(\n `Request failed with api at height ${height} (retry ${retries}): ${error.message}`,\n );\n throwingError = error;\n currentApi = this.unsafeApi.getSafeApi(height);\n retries++;\n }\n }\n\n logger.error(\n `Maximum retries (${maxRetries}) exceeded for api at height ${height}`,\n );\n if (!throwingError) {\n throw new Error('Failed to make request, maximum retries failed');\n }\n throw throwingError;\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n };\n\n return new Proxy(this.unsafeApi.getSafeApi(height), handler);\n }\n\n private async fetchFullBlocksBatch(\n api: EthereumApi,\n batch: number[],\n ): Promise<IBlock<EthereumBlock>[]> {\n return api.fetchBlocks(batch);\n }\n\n private async fetchLightBlocksBatch(\n api: EthereumApi,\n batch: number[],\n ): Promise<IBlock<LightEthereumBlock>[]> {\n return api.fetchBlocksLight(batch);\n }\n\n updateBlockFetching(): void {\n const onlyEventHandlers = isOnlyEventHandlers(this.project);\n const skipTransactions =\n this.nodeConfig.skipTransactions && onlyEventHandlers;\n\n if (this.nodeConfig.skipTransactions) {\n if (onlyEventHandlers) {\n logger.info(\n 'skipTransactions is enabled, only events and block headers will be fetched.',\n );\n } else {\n logger.info(\n `skipTransactions is disabled, the project contains handlers that aren't event handlers.`,\n );\n }\n } else {\n if (onlyEventHandlers) {\n logger.warn(\n 'skipTransactions is disabled, the project contains only event handlers, it could be enabled to improve indexing performance.',\n );\n } else {\n logger.info(`skipTransactions is disabled.`);\n }\n }\n\n const fetchFunc = skipTransactions\n ? this.fetchLightBlocksBatch.bind(this)\n : this.fetchFullBlocksBatch.bind(this);\n\n if (this.nodeConfig?.profiler) {\n this.fetchBlocksFunction = profilerWrap(\n fetchFunc,\n 'SubstrateUtil',\n 'fetchBlocksBatches',\n ) as FetchFunc;\n } else {\n this.fetchBlocksFunction = fetchFunc;\n }\n }\n}\n"]}
|
|
@@ -18,7 +18,6 @@ exports.BlockDispatcherService = void 0;
|
|
|
18
18
|
const common_1 = require("@nestjs/common");
|
|
19
19
|
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
20
20
|
const node_core_1 = require("@subql/node-core");
|
|
21
|
-
const SubqueryProject_1 = require("../../configure/SubqueryProject");
|
|
22
21
|
const indexer_manager_1 = require("../indexer.manager");
|
|
23
22
|
/**
|
|
24
23
|
* @description Intended to behave the same as WorkerBlockDispatcherService but doesn't use worker threads or any parallel processing
|
|
@@ -43,8 +42,7 @@ BlockDispatcherService = __decorate([
|
|
|
43
42
|
indexer_manager_1.IndexerManager,
|
|
44
43
|
event_emitter_1.EventEmitter2, Object, Object, node_core_1.StoreService,
|
|
45
44
|
node_core_1.StoreCacheService,
|
|
46
|
-
node_core_1.PoiSyncService,
|
|
47
|
-
SubqueryProject_1.SubqueryProject])
|
|
45
|
+
node_core_1.PoiSyncService, Object])
|
|
48
46
|
], BlockDispatcherService);
|
|
49
47
|
exports.BlockDispatcherService = BlockDispatcherService;
|
|
50
48
|
//# sourceMappingURL=block-dispatcher.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-dispatcher.service.js","sourceRoot":"","sources":["../../../src/indexer/blockDispatcher/block-dispatcher.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAA2E;AAC3E,yDAAsD;AACtD,gDAW0B;
|
|
1
|
+
{"version":3,"file":"block-dispatcher.service.js","sourceRoot":"","sources":["../../../src/indexer/blockDispatcher/block-dispatcher.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAA2E;AAC3E,yDAAsD;AACtD,gDAW0B;AAK1B,wDAAoD;AAGpD;;GAEG;AAEI,IAAM,sBAAsB,GAA5B,MAAM,sBACX,SAAQ,2BAAgD;IAM9C;IAHV,YACE,UAAsB,EACtB,UAAsB,EACd,cAA8B,EACtC,YAA2B,EAE3B,cAAkD,EAElD,qBAA6C,EAC7C,YAA0B,EAC1B,iBAAoC,EACpC,cAA8B,EACF,OAAwB;QAEpD,KAAK,CACH,UAAU,EACV,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,OAAO,EACP,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CACxC,CAAC;QArBM,mBAAc,GAAd,cAAc,CAAgB;IAsBxC,CAAC;IAES,KAAK,CAAC,UAAU,CACxB,KAA2B;QAE3B,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CACnC,KAAK,EACL,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,CACxE,CAAC;IACJ,CAAC;CACF,CAAA;AAvCY,sBAAsB;IADlC,IAAA,mBAAU,GAAE;IAUR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;IAEzB,WAAA,IAAA,eAAM,EAAC,wBAAwB,CAAC,CAAA;IAKhC,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCAXf,sBAAU;QACV,sBAAU;QACE,gCAAc;QACxB,6BAAa,kBAKb,wBAAY;QACP,6BAAiB;QACpB,0BAAc;GAfrB,sBAAsB,CAuClC;AAvCY,wDAAsB","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n NodeConfig,\n StoreCacheService,\n StoreService,\n IProjectService,\n BlockDispatcher,\n ProcessBlockResponse,\n ApiService,\n IProjectUpgradeService,\n PoiSyncService,\n IBlock,\n} from '@subql/node-core';\nimport {\n EthereumProjectDs,\n SubqueryProject,\n} from '../../configure/SubqueryProject';\nimport { IndexerManager } from '../indexer.manager';\nimport { BlockContent } from '../types';\n\n/**\n * @description Intended to behave the same as WorkerBlockDispatcherService but doesn't use worker threads or any parallel processing\n */\n@Injectable()\nexport class BlockDispatcherService\n extends BlockDispatcher<BlockContent, EthereumProjectDs>\n implements OnApplicationShutdown\n{\n constructor(\n apiService: ApiService,\n nodeConfig: NodeConfig,\n private indexerManager: IndexerManager,\n eventEmitter: EventEmitter2,\n @Inject('IProjectService')\n projectService: IProjectService<EthereumProjectDs>,\n @Inject('IProjectUpgradeService')\n projectUpgradeService: IProjectUpgradeService,\n storeService: StoreService,\n storeCacheService: StoreCacheService,\n poiSyncService: PoiSyncService,\n @Inject('ISubqueryProject') project: SubqueryProject,\n ) {\n super(\n nodeConfig,\n eventEmitter,\n projectService,\n projectUpgradeService,\n storeService,\n storeCacheService,\n poiSyncService,\n project,\n apiService.fetchBlocks.bind(apiService),\n );\n }\n\n protected async indexBlock(\n block: IBlock<BlockContent>,\n ): Promise<ProcessBlockResponse> {\n return this.indexerManager.indexBlock(\n block,\n await this.projectService.getDataSources(block.getHeader().blockHeight),\n );\n }\n}\n"]}
|
|
@@ -22,7 +22,6 @@ const path_1 = __importDefault(require("path"));
|
|
|
22
22
|
const common_1 = require("@nestjs/common");
|
|
23
23
|
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
24
24
|
const node_core_1 = require("@subql/node-core");
|
|
25
|
-
const SubqueryProject_1 = require("../../configure/SubqueryProject");
|
|
26
25
|
const dynamic_ds_service_1 = require("../dynamic-ds.service");
|
|
27
26
|
const unfinalizedBlocks_service_1 = require("../unfinalizedBlocks.service");
|
|
28
27
|
let WorkerBlockDispatcherService = class WorkerBlockDispatcherService extends node_core_1.WorkerBlockDispatcher {
|
|
@@ -42,9 +41,7 @@ WorkerBlockDispatcherService = __decorate([
|
|
|
42
41
|
event_emitter_1.EventEmitter2, Object, Object, node_core_1.InMemoryCacheService,
|
|
43
42
|
node_core_1.StoreService,
|
|
44
43
|
node_core_1.StoreCacheService,
|
|
45
|
-
node_core_1.PoiSyncService,
|
|
46
|
-
SubqueryProject_1.SubqueryProject,
|
|
47
|
-
dynamic_ds_service_1.DynamicDsService,
|
|
44
|
+
node_core_1.PoiSyncService, Object, dynamic_ds_service_1.DynamicDsService,
|
|
48
45
|
unfinalizedBlocks_service_1.UnfinalizedBlocksService,
|
|
49
46
|
node_core_1.ConnectionPoolStateManager, Object])
|
|
50
47
|
], WorkerBlockDispatcherService);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-block-dispatcher.service.js","sourceRoot":"","sources":["../../../src/indexer/blockDispatcher/worker-block-dispatcher.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;;;;AAEnC,gDAAwB;AACxB,2CAA2E;AAC3E,yDAAsD;AACtD,gDAY0B;
|
|
1
|
+
{"version":3,"file":"worker-block-dispatcher.service.js","sourceRoot":"","sources":["../../../src/indexer/blockDispatcher/worker-block-dispatcher.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;;;;AAEnC,gDAAwB;AACxB,2CAA2E;AAC3E,yDAAsD;AACtD,gDAY0B;AAO1B,8DAAyD;AAEzD,4EAAwE;AAQjE,IAAM,4BAA4B,GAAlC,MAAM,4BACX,SAAQ,iCAAsE;IAG9E,YACE,UAAsB,EACtB,YAA2B,EAE3B,cAAkD,EAElD,oBAA4C,EAC5C,YAAkC,EAClC,YAA0B,EAC1B,iBAAoC,EACpC,cAA8B,EACF,OAAwB,EACpD,gBAAkC,EAClC,uBAAiD,EACjD,mBAAsE,EACtE,cAAwC;QAExC,KAAK,CACH,UAAU,EACV,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,OAAO,EACP,GAAG,EAAE,CACH,IAAA,+BAAmB,EAMjB,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,wCAAwC,CAAC,EACjE,EAAE,EACF,YAAY,CAAC,QAAQ,EAAE,EACvB,YAAY,CAAC,QAAQ,EAAE,EACvB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,OAAO,CAAC,IAAI,EACZ,cAAc,CAAC,WAAW,EAC1B,cAAc,CACf,EACH,cAAc,CACf,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,UAAU,CACxB,MAAqB,EACrB,MAAc;QAEd,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,yBAAyB,CAAC,CAAC;IAC/D,CAAC;CACF,CAAA;AA1DY,4BAA4B;IADxC,IAAA,mBAAU,GAAE;IAQR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;IAEzB,WAAA,IAAA,eAAM,EAAC,wBAAwB,CAAC,CAAA;IAMhC,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCAVf,sBAAU;QACR,6BAAa,kBAKb,gCAAoB;QACpB,wBAAY;QACP,6BAAiB;QACpB,0BAAc,UAEZ,qCAAgB;QACT,oDAAwB;QAC5B,sCAA0B;GAlBtC,4BAA4B,CA0DxC;AA1DY,oEAA4B","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport path from 'path';\nimport { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n NodeConfig,\n StoreService,\n StoreCacheService,\n IProjectService,\n WorkerBlockDispatcher,\n ConnectionPoolStateManager,\n IProjectUpgradeService,\n PoiSyncService,\n InMemoryCacheService,\n createIndexerWorker,\n MonitorServiceInterface,\n} from '@subql/node-core';\nimport { EthereumBlock } from '@subql/types-ethereum';\nimport {\n EthereumProjectDs,\n SubqueryProject,\n} from '../../configure/SubqueryProject';\nimport { EthereumApiConnection } from '../../ethereum/api.connection';\nimport { DynamicDsService } from '../dynamic-ds.service';\nimport { BlockContent } from '../types';\nimport { UnfinalizedBlocksService } from '../unfinalizedBlocks.service';\nimport { IIndexerWorker } from '../worker/worker';\n\ntype IndexerWorker = IIndexerWorker & {\n terminate: () => Promise<number>;\n};\n\n@Injectable()\nexport class WorkerBlockDispatcherService\n extends WorkerBlockDispatcher<EthereumProjectDs, IndexerWorker, EthereumBlock>\n implements OnApplicationShutdown\n{\n constructor(\n nodeConfig: NodeConfig,\n eventEmitter: EventEmitter2,\n @Inject('IProjectService')\n projectService: IProjectService<EthereumProjectDs>,\n @Inject('IProjectUpgradeService')\n projectUpgadeService: IProjectUpgradeService,\n cacheService: InMemoryCacheService,\n storeService: StoreService,\n storeCacheService: StoreCacheService,\n poiSyncService: PoiSyncService,\n @Inject('ISubqueryProject') project: SubqueryProject,\n dynamicDsService: DynamicDsService,\n unfinalizedBlocksSevice: UnfinalizedBlocksService,\n connectionPoolState: ConnectionPoolStateManager<EthereumApiConnection>,\n monitorService?: MonitorServiceInterface,\n ) {\n super(\n nodeConfig,\n eventEmitter,\n projectService,\n projectUpgadeService,\n storeService,\n storeCacheService,\n poiSyncService,\n project,\n () =>\n createIndexerWorker<\n IIndexerWorker,\n EthereumApiConnection,\n BlockContent,\n EthereumProjectDs\n >(\n path.resolve(__dirname, '../../../dist/indexer/worker/worker.js'),\n [],\n storeService.getStore(),\n cacheService.getCache(),\n dynamicDsService,\n unfinalizedBlocksSevice,\n connectionPoolState,\n project.root,\n projectService.startHeight,\n monitorService,\n ),\n monitorService,\n );\n }\n\n protected async fetchBlock(\n worker: IndexerWorker,\n height: number,\n ): Promise<void> {\n await worker.fetchBlock(height, 0 /* Unused with ethereum*/);\n }\n}\n"]}
|
|
@@ -19,7 +19,6 @@ const common_1 = require("@nestjs/common");
|
|
|
19
19
|
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
20
20
|
const common_2 = require("@subql/common");
|
|
21
21
|
const node_core_1 = require("@subql/node-core");
|
|
22
|
-
const SubqueryProject_1 = require("../../configure/SubqueryProject");
|
|
23
22
|
const ethereum_1 = require("../../ethereum");
|
|
24
23
|
const v1_1 = require("./v1");
|
|
25
24
|
const v2_1 = require("./v2");
|
|
@@ -63,8 +62,7 @@ EthDictionaryService = __decorate([
|
|
|
63
62
|
(0, common_1.Injectable)(),
|
|
64
63
|
__param(0, (0, common_1.Inject)('ISubqueryProject')),
|
|
65
64
|
__param(3, (0, common_1.Inject)(node_core_1.ApiService)),
|
|
66
|
-
__metadata("design:paramtypes", [
|
|
67
|
-
node_core_1.NodeConfig,
|
|
65
|
+
__metadata("design:paramtypes", [Object, node_core_1.NodeConfig,
|
|
68
66
|
event_emitter_1.EventEmitter2,
|
|
69
67
|
ethereum_1.EthereumApiService])
|
|
70
68
|
], EthDictionaryService);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ethDictionary.service.js","sourceRoot":"","sources":["../../../src/indexer/dictionary/ethDictionary.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,0CAA+C;AAC/C,gDAK0B;
|
|
1
|
+
{"version":3,"file":"ethDictionary.service.js","sourceRoot":"","sources":["../../../src/indexer/dictionary/ethDictionary.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,0CAA+C;AAC/C,gDAK0B;AAG1B,6CAAoD;AACpD,6BAAuC;AACvC,6BAAuC;AAEvC,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,YAAY,CAAC,CAAC;AAGhC,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,6BAGzC;IAEyC;IAGV;IAJ9B,YACwC,OAAwB,EAC9D,UAAsB,EACtB,YAA2B,EACC,UAA8B;QAE1D,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QALnB,YAAO,GAAP,OAAO,CAAiB;QAGlC,eAAU,GAAV,UAAU,CAAoB;IAG5D,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,cAAc,GAAsB,EAAE,CAAC;QAC7C,MAAM,cAAc,GAAsB,EAAE,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;SACnE;QAED,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAC3D,uBAAc,CAAC,QAAQ,EACvB,IAAI,CAAC,OAAO,CAAC,OAAO,CACrB,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,mBAAmB,EAAE;YAC1C,IAAI;gBACF,MAAM,YAAY,GAAG,MAAM,oBAAe,CAAC,MAAM,CAC/C,QAAQ,EACR,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,UAAU,CAAC,GAAG,CACpB,CAAC;gBACF,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;aACnC;YAAC,OAAO,CAAC,EAAE;gBACV,IAAI;oBACF,MAAM,YAAY,GAAG,MAAM,oBAAe,CAAC,MAAM,CAC/C,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,UAAU,EACf,QAAQ,CACT,CAAC;oBACF,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBACnC;gBAAC,OAAO,CAAC,EAAE;oBACV,MAAM,CAAC,IAAI,CACT,wBAAwB,QAAQ,6BAA6B,CAC9D,CAAC;iBACH;aACF;SACF;QACD,MAAM,CAAC,KAAK,CACV,4BAA4B,cAAc,CAAC,MAAM,SAAS,cAAc,CAAC,MAAM,EAAE,CAClF,CAAC;QACF,2BAA2B;QAC3B,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;IACpD,CAAC;CACF,CAAA;AAxDY,oBAAoB;IADhC,IAAA,mBAAU,GAAE;IAMR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;IAG1B,WAAA,IAAA,eAAM,EAAC,sBAAU,CAAC,CAAA;6CAFP,sBAAU;QACR,6BAAa;QACa,6BAAkB;GARjD,oBAAoB,CAwDhC;AAxDY,oDAAoB","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { NETWORK_FAMILY } from '@subql/common';\nimport {\n NodeConfig,\n DictionaryService,\n ApiService,\n getLogger,\n} from '@subql/node-core';\nimport { EthereumBlock, SubqlDatasource } from '@subql/types-ethereum';\nimport { SubqueryProject } from '../../configure/SubqueryProject';\nimport { EthereumApiService } from '../../ethereum';\nimport { EthDictionaryV1 } from './v1';\nimport { EthDictionaryV2 } from './v2';\n\nconst logger = getLogger('dictionary');\n\n@Injectable()\nexport class EthDictionaryService extends DictionaryService<\n SubqlDatasource,\n EthereumBlock\n> {\n constructor(\n @Inject('ISubqueryProject') protected project: SubqueryProject,\n nodeConfig: NodeConfig,\n eventEmitter: EventEmitter2,\n @Inject(ApiService) private apiService: EthereumApiService,\n ) {\n super(project.network.chainId, nodeConfig, eventEmitter);\n }\n\n async initDictionaries(): Promise<void> {\n const dictionariesV1: EthDictionaryV1[] = [];\n const dictionariesV2: EthDictionaryV2[] = [];\n\n if (!this.project) {\n throw new Error(`Project in Dictionary service not initialized `);\n }\n\n const dictionaryEndpoints = await this.getDictionaryEndpoints(\n NETWORK_FAMILY.ethereum,\n this.project.network,\n );\n\n for (const endpoint of dictionaryEndpoints) {\n try {\n const dictionaryV2 = await EthDictionaryV2.create(\n endpoint,\n this.nodeConfig,\n this.project,\n this.apiService.api,\n );\n dictionariesV2.push(dictionaryV2);\n } catch (e) {\n try {\n const dictionaryV1 = await EthDictionaryV1.create(\n this.project,\n this.nodeConfig,\n endpoint,\n );\n dictionariesV1.push(dictionaryV1);\n } catch (e) {\n logger.warn(\n `Dictionary endpoint \"${endpoint}\" is not a valid dictionary`,\n );\n }\n }\n }\n logger.debug(\n `Dictionary versions, v1: ${dictionariesV1.length}, v2: ${dictionariesV2.length}`,\n );\n // v2 should be prioritised\n this.init([...dictionariesV2, ...dictionariesV1]);\n }\n}\n"]}
|
|
@@ -20,7 +20,6 @@ const common_ethereum_1 = require("@subql/common-ethereum");
|
|
|
20
20
|
const node_core_1 = require("@subql/node-core");
|
|
21
21
|
const class_transformer_1 = require("class-transformer");
|
|
22
22
|
const class_validator_1 = require("class-validator");
|
|
23
|
-
const SubqueryProject_1 = require("../configure/SubqueryProject");
|
|
24
23
|
const ds_processor_service_1 = require("./ds-processor.service");
|
|
25
24
|
let DynamicDsService = class DynamicDsService extends node_core_1.DynamicDsService {
|
|
26
25
|
dsProcessorService;
|
|
@@ -64,8 +63,7 @@ let DynamicDsService = class DynamicDsService extends node_core_1.DynamicDsServi
|
|
|
64
63
|
DynamicDsService = __decorate([
|
|
65
64
|
(0, common_1.Injectable)(),
|
|
66
65
|
__param(1, (0, common_1.Inject)('ISubqueryProject')),
|
|
67
|
-
__metadata("design:paramtypes", [ds_processor_service_1.DsProcessorService,
|
|
68
|
-
SubqueryProject_1.SubqueryProject])
|
|
66
|
+
__metadata("design:paramtypes", [ds_processor_service_1.DsProcessorService, Object])
|
|
69
67
|
], DynamicDsService);
|
|
70
68
|
exports.DynamicDsService = DynamicDsService;
|
|
71
69
|
//# sourceMappingURL=dynamic-ds.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-ds.service.js","sourceRoot":"","sources":["../../src/indexer/dynamic-ds.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,4DAIgC;AAChC,gDAG0B;AAC1B,yDAAiD;AACjD,qDAA+C;
|
|
1
|
+
{"version":3,"file":"dynamic-ds.service.js","sourceRoot":"","sources":["../../src/indexer/dynamic-ds.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,4DAIgC;AAChC,gDAG0B;AAC1B,yDAAiD;AACjD,qDAA+C;AAK/C,iEAA4D;AAGrD,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,4BAGrC;IAEoB;IADnB,YACmB,kBAAsC,EAC3B,OAAwB;QAEpD,KAAK,CAAC,OAAO,CAAC,CAAC;QAHE,uBAAkB,GAAlB,kBAAkB,CAAoB;IAIzD,CAAC;IAES,KAAK,CAAC,aAAa,CAC3B,MAAwB;QAExB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAC5B,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,UAAU,CAClB,CAAC;QAEF,IAAI;YACF,IAAI,IAAA,4BAAU,EAAC,KAAK,CAAC,EAAE;gBACrB,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG;oBACxB,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO;oBAC1B,GAAG,MAAM,CAAC,IAAI;iBACf,CAAC;gBACF,MAAM,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;aACzD;iBAAM,IAAI,IAAA,6BAAW,EAAC,KAAK,CAAC,EAAE;gBAC7B,KAAK,CAAC,OAAO,GAAG;oBACd,GAAG,KAAK,CAAC,OAAO;oBAChB,GAAG,MAAM,CAAC,IAAI;iBACf,CAAC;gBAEF,MAAM,QAAQ,GAAG,IAAA,gCAAY,EAAC,+CAA6B,EAAE,KAAK,CAAC,CAAC;gBAEpE,MAAM,MAAM,GAAG,IAAA,8BAAY,EAAC,QAAQ,EAAE;oBACpC,SAAS,EAAE,IAAI;oBACf,oBAAoB,EAAE,KAAK;iBAC5B,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,MAAM,EAAE;oBACjB,MAAM,IAAI,KAAK,CACb,0BAA0B,MAAM;yBAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;yBACxB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;iBACH;aACF;YACD,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAM,EAAE;YACf,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;SACxE;IACH,CAAC;CACF,CAAA;AAnDY,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;IAOR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCADU,yCAAkB;GAL9C,gBAAgB,CAmD5B;AAnDY,4CAAgB","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n EthereumRuntimeDataSourceImpl,\n isCustomDs,\n isRuntimeDs,\n} from '@subql/common-ethereum';\nimport {\n DatasourceParams,\n DynamicDsService as BaseDynamicDsService,\n} from '@subql/node-core';\nimport { plainToClass } from 'class-transformer';\nimport { validateSync } from 'class-validator';\nimport {\n EthereumProjectDs,\n SubqueryProject,\n} from '../configure/SubqueryProject';\nimport { DsProcessorService } from './ds-processor.service';\n\n@Injectable()\nexport class DynamicDsService extends BaseDynamicDsService<\n EthereumProjectDs,\n SubqueryProject\n> {\n constructor(\n private readonly dsProcessorService: DsProcessorService,\n @Inject('ISubqueryProject') project: SubqueryProject,\n ) {\n super(project);\n }\n\n protected async getDatasource(\n params: DatasourceParams,\n ): Promise<EthereumProjectDs> {\n const dsObj = this.getTemplate<EthereumProjectDs>(\n params.templateName,\n params.startBlock,\n );\n\n try {\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(EthereumRuntimeDataSourceImpl, 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 return dsObj;\n } catch (e: any) {\n throw new Error(`Unable to create dynamic datasource.\\n ${e.message}`);\n }\n }\n}\n"]}
|
|
@@ -20,7 +20,6 @@ const event_emitter_1 = require("@nestjs/event-emitter");
|
|
|
20
20
|
const schedule_1 = require("@nestjs/schedule");
|
|
21
21
|
const common_ethereum_1 = require("@subql/common-ethereum");
|
|
22
22
|
const node_core_1 = require("@subql/node-core");
|
|
23
|
-
const SubqueryProject_1 = require("../configure/SubqueryProject");
|
|
24
23
|
const utils_ethereum_1 = require("../ethereum/utils.ethereum");
|
|
25
24
|
const ethDictionary_service_1 = require("./dictionary/ethDictionary.service");
|
|
26
25
|
const project_service_1 = require("./project.service");
|
|
@@ -66,8 +65,7 @@ FetchService = __decorate([
|
|
|
66
65
|
__param(4, (0, common_1.Inject)('IBlockDispatcher')),
|
|
67
66
|
__metadata("design:paramtypes", [node_core_1.ApiService,
|
|
68
67
|
node_core_1.NodeConfig,
|
|
69
|
-
project_service_1.ProjectService,
|
|
70
|
-
SubqueryProject_1.SubqueryProject, Object, ethDictionary_service_1.EthDictionaryService,
|
|
68
|
+
project_service_1.ProjectService, Object, Object, ethDictionary_service_1.EthDictionaryService,
|
|
71
69
|
unfinalizedBlocks_service_1.UnfinalizedBlocksService,
|
|
72
70
|
event_emitter_1.EventEmitter2,
|
|
73
71
|
schedule_1.SchedulerRegistry,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.service.js","sourceRoot":"","sources":["../../src/indexer/fetch.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,+CAAqD;AAErD,4DAAyE;AACzE,gDAQ0B;
|
|
1
|
+
{"version":3,"file":"fetch.service.js","sourceRoot":"","sources":["../../src/indexer/fetch.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,+CAAqD;AAErD,4DAAyE;AACzE,gDAQ0B;AAI1B,+DAGoC;AAEpC,8EAA0E;AAC1E,uDAAmD;AACnD,2EAAuE;AAEvE,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAGtB,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,4BAIjC;IAEW;IADV,YACU,UAAsB,EAC9B,UAAsB,EACK,cAA8B,EAC7B,OAAwB,EAEpD,eAAyC,EACzC,iBAAuC,EACvC,wBAAkD,EAClD,YAA2B,EAC3B,iBAAoC,EACpC,iBAAoC;QAEpC,KAAK,CACH,UAAU,EACV,cAAc,EACd,OAAO,CAAC,OAAO,EACf,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,CAClB,CAAC;QAtBM,eAAU,GAAV,UAAU,CAAY;IAuBhC,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;IACnC,CAAC;IAES,KAAK,CAAC,kBAAkB;QAChC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACjD,OAAO,IAAA,sCAAqB,EAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAES,KAAK,CAAC,aAAa;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;IACvC,CAAC;IAED,4DAA4D;IAClD,KAAK,CAAC,gBAAgB;QAC9B,MAAM,cAAc,GAAG,IAAA,6BAAY,EAAC,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC;QAEjE,OAAO,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IACvD,CAAC;IAES,UAAU,CAAC,WAA8B;QACjD,OAAO,IAAA,sBAAU,EAAC,WAAW,EAAE,4BAAU,EAAE,qCAAmB,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;IAES,KAAK,CAAC,mBAAmB;QACjC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACzC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAC5C,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,WAAW;QACzB,4CAA4C;QAC5C,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF,CAAA;AAjEY,YAAY;IADxB,IAAA,mBAAU,GAAE;IASR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;IACzB,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;IAC1B,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCAJP,sBAAU;QAClB,sBAAU;QACqB,gCAAc,kBAItC,4CAAoB;QACb,oDAAwB;QACpC,6BAAa;QACR,4BAAiB;QACjB,6BAAiB;GAhB3B,YAAY,CAiExB;AAjEY,oCAAY","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { SchedulerRegistry } from '@nestjs/schedule';\n\nimport { isCustomDs, EthereumHandlerKind } from '@subql/common-ethereum';\nimport {\n NodeConfig,\n BaseFetchService,\n ApiService,\n getModulos,\n getLogger,\n Header,\n StoreCacheService,\n} from '@subql/node-core';\nimport { EthereumBlock, SubqlDatasource } from '@subql/types-ethereum';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { EthereumApi } from '../ethereum';\nimport {\n calcInterval,\n ethereumBlockToHeader,\n} from '../ethereum/utils.ethereum';\nimport { IEthereumBlockDispatcher } from './blockDispatcher';\nimport { EthDictionaryService } from './dictionary/ethDictionary.service';\nimport { ProjectService } from './project.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\nconst BLOCK_TIME_VARIANCE = 5000;\n\nconst INTERVAL_PERCENT = 0.9;\n\n@Injectable()\nexport class FetchService extends BaseFetchService<\n SubqlDatasource,\n IEthereumBlockDispatcher,\n EthereumBlock\n> {\n constructor(\n private apiService: ApiService,\n nodeConfig: NodeConfig,\n @Inject('IProjectService') projectService: ProjectService,\n @Inject('ISubqueryProject') project: SubqueryProject,\n @Inject('IBlockDispatcher')\n blockDispatcher: IEthereumBlockDispatcher,\n dictionaryService: EthDictionaryService,\n unfinalizedBlocksService: UnfinalizedBlocksService,\n eventEmitter: EventEmitter2,\n schedulerRegistry: SchedulerRegistry,\n storeCacheService: StoreCacheService,\n ) {\n super(\n nodeConfig,\n projectService,\n project.network,\n blockDispatcher,\n dictionaryService,\n eventEmitter,\n schedulerRegistry,\n unfinalizedBlocksService,\n storeCacheService,\n );\n }\n\n get api(): EthereumApi {\n return this.apiService.unsafeApi;\n }\n\n protected async getFinalizedHeader(): Promise<Header> {\n const block = await this.api.getFinalizedBlock();\n return ethereumBlockToHeader(block);\n }\n\n protected async getBestHeight(): Promise<number> {\n return this.api.getBestBlockHeight();\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n protected async getChainInterval(): Promise<number> {\n const CHAIN_INTERVAL = calcInterval(this.api) * INTERVAL_PERCENT;\n\n return Math.min(BLOCK_TIME_VARIANCE, CHAIN_INTERVAL);\n }\n\n protected getModulos(dataSources: SubqlDatasource[]): number[] {\n return getModulos(dataSources, isCustomDs, EthereumHandlerKind.Block);\n }\n\n protected async initBlockDispatcher(): Promise<void> {\n await this.blockDispatcher.init((height) =>\n Promise.resolve(this.resetForNewDs(height)),\n );\n }\n\n protected async preLoopHook(): Promise<void> {\n // Ethereum doesn't need to do anything here\n return Promise.resolve();\n }\n}\n"]}
|
|
@@ -20,7 +20,6 @@ const common_1 = require("@nestjs/common");
|
|
|
20
20
|
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
21
21
|
const node_core_1 = require("@subql/node-core");
|
|
22
22
|
const x_sequelize_1 = require("@subql/x-sequelize");
|
|
23
|
-
const SubqueryProject_1 = require("../configure/SubqueryProject");
|
|
24
23
|
const ethereum_1 = require("../ethereum");
|
|
25
24
|
const ds_processor_service_1 = require("./ds-processor.service");
|
|
26
25
|
const dynamic_ds_service_1 = require("./dynamic-ds.service");
|
|
@@ -66,8 +65,7 @@ ProjectService = __decorate([
|
|
|
66
65
|
ethereum_1.EthereumApiService,
|
|
67
66
|
node_core_1.PoiService,
|
|
68
67
|
node_core_1.PoiSyncService,
|
|
69
|
-
x_sequelize_1.Sequelize,
|
|
70
|
-
SubqueryProject_1.SubqueryProject, Object, node_core_1.StoreService,
|
|
68
|
+
x_sequelize_1.Sequelize, Object, Object, node_core_1.StoreService,
|
|
71
69
|
node_core_1.NodeConfig,
|
|
72
70
|
dynamic_ds_service_1.DynamicDsService,
|
|
73
71
|
event_emitter_1.EventEmitter2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.service.js","sourceRoot":"","sources":["../../src/indexer/project.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,mDAA8C;AAC9C,2CAAoD;AACpD,yDAAsD;AACtD,gDAS0B;AAC1B,oDAA+C;
|
|
1
|
+
{"version":3,"file":"project.service.js","sourceRoot":"","sources":["../../src/indexer/project.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,mDAA8C;AAC9C,2CAAoD;AACpD,yDAAsD;AACtD,gDAS0B;AAC1B,oDAA+C;AAK/C,0CAAiD;AACjD,iEAA4D;AAC5D,6DAAwD;AACxD,2EAAuE;AAEvE,8DAA8D;AAC9D,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAG3D,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,8BAInC;IACW,cAAc,GAAG,cAAc,CAAC;IAE1C,YACE,kBAAsC,EAClB,UAA8B,EACN,UAAsB,EAElE,cAA8B,EACa,SAAoB,EACnC,OAAwB,EAEpD,qBAA8D,EAChB,YAA0B,EACxE,UAAsB,EACtB,gBAAkC,EAClC,YAA2B,EAC3B,uBAAiD;QAEjD,KAAK,CACH,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,cAAc,EACd,SAAS,EACT,OAAO,EACP,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,CACxB,CAAC;IACJ,CAAC;IAGK,AAAN,KAAK,CAAC,IAAI,CAAC,WAAoB;QAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAES,KAAK,CAAC,iBAAiB,CAAC,MAAc;QAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEnE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,0CAA0C;IACrF,CAAC;IAES,eAAe,CAAC,OAAwB;QAChD,+DAA+D;QAC/D,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;IACxC,CAAC;IAES,KAAK,CAAC,eAAe;QAC7B,OAAO,IAAI,CAAC,uBAAuB,CAAC,IAAI,CACtC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,oBAAoB,CACzC,CAAC;IACJ,CAAC;CACF,CAAA;AArBO;IADL,IAAA,oBAAQ,GAAE;;;;0CAGV;AA1CU,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAUR,WAAA,IAAA,eAAM,EAAC,sBAAU,CAAC,CAAA;IAClB,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,sBAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAC1C,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,0BAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAE9C,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,uBAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IACzC,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;IAC1B,WAAA,IAAA,eAAM,EAAC,wBAAwB,CAAC,CAAA;IAEhC,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,wBAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;qCATzB,yCAAkB;QACN,6BAAkB;QACM,sBAAU;QAElD,0BAAc;QACwB,uBAAS,kBAIH,wBAAY;QAC5D,sBAAU;QACJ,qCAAgB;QACpB,6BAAa;QACF,oDAAwB;GArBxC,cAAc,CA6D1B;AA7DY,wCAAc","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { isMainThread } from 'worker_threads';\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n PoiService,\n PoiSyncService,\n BaseProjectService,\n StoreService,\n NodeConfig,\n IProjectUpgradeService,\n ApiService,\n profiler,\n} from '@subql/node-core';\nimport { Sequelize } from '@subql/x-sequelize';\nimport {\n EthereumProjectDs,\n SubqueryProject,\n} from '../configure/SubqueryProject';\nimport { EthereumApiService } from '../ethereum';\nimport { DsProcessorService } from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../../package.json');\n\n@Injectable()\nexport class ProjectService extends BaseProjectService<\n EthereumApiService,\n EthereumProjectDs,\n UnfinalizedBlocksService\n> {\n protected packageVersion = packageVersion;\n\n constructor(\n dsProcessorService: DsProcessorService,\n @Inject(ApiService) apiService: EthereumApiService,\n @Inject(isMainThread ? PoiService : 'Null') poiService: PoiService,\n @Inject(isMainThread ? PoiSyncService : 'Null')\n poiSyncService: PoiSyncService,\n @Inject(isMainThread ? Sequelize : 'Null') sequelize: Sequelize,\n @Inject('ISubqueryProject') project: SubqueryProject,\n @Inject('IProjectUpgradeService')\n projectUpgradeService: IProjectUpgradeService<SubqueryProject>,\n @Inject(isMainThread ? StoreService : 'Null') storeService: StoreService,\n nodeConfig: NodeConfig,\n dynamicDsService: DynamicDsService,\n eventEmitter: EventEmitter2,\n unfinalizedBlockService: UnfinalizedBlocksService,\n ) {\n super(\n dsProcessorService,\n apiService,\n poiService,\n poiSyncService,\n sequelize,\n project,\n projectUpgradeService,\n storeService,\n nodeConfig,\n dynamicDsService,\n eventEmitter,\n unfinalizedBlockService,\n );\n }\n\n @profiler()\n async init(startHeight?: number): Promise<void> {\n return super.init(startHeight);\n }\n\n protected async getBlockTimestamp(height: number): Promise<Date> {\n const block = await this.apiService.unsafeApi.api.getBlock(height);\n\n return new Date(block.timestamp * 1000); // TODO test and make sure its in MS not S\n }\n\n protected onProjectChange(project: SubqueryProject): void | Promise<void> {\n // TODO update this when implementing skipBlock feature for Eth\n this.apiService.updateBlockFetching();\n }\n\n protected async initUnfinalized(): Promise<number | undefined> {\n return this.unfinalizedBlockService.init(\n this.reindex.bind(this),\n this.apiService.api.supportsFinalization,\n );\n }\n}\n"]}
|
|
@@ -18,7 +18,6 @@ exports.TestingService = void 0;
|
|
|
18
18
|
const common_1 = require("@nestjs/common");
|
|
19
19
|
const core_1 = require("@nestjs/core");
|
|
20
20
|
const node_core_1 = require("@subql/node-core");
|
|
21
|
-
const SubqueryProject_1 = require("../configure/SubqueryProject");
|
|
22
21
|
const testing_module_1 = require("./testing.module");
|
|
23
22
|
let TestingService = class TestingService extends node_core_1.TestingService {
|
|
24
23
|
constructor(nodeConfig, project) {
|
|
@@ -40,8 +39,7 @@ let TestingService = class TestingService extends node_core_1.TestingService {
|
|
|
40
39
|
TestingService = __decorate([
|
|
41
40
|
(0, common_1.Injectable)(),
|
|
42
41
|
__param(1, (0, common_1.Inject)('ISubqueryProject')),
|
|
43
|
-
__metadata("design:paramtypes", [node_core_1.NodeConfig,
|
|
44
|
-
SubqueryProject_1.SubqueryProject])
|
|
42
|
+
__metadata("design:paramtypes", [node_core_1.NodeConfig, Object])
|
|
45
43
|
], TestingService);
|
|
46
44
|
exports.TestingService = TestingService;
|
|
47
45
|
//# sourceMappingURL=testing.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.service.js","sourceRoot":"","sources":["../../src/subcommands/testing.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,uCAA2C;AAE3C,gDAM0B;
|
|
1
|
+
{"version":3,"file":"testing.service.js","sourceRoot":"","sources":["../../src/subcommands/testing.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,uCAA2C;AAE3C,gDAM0B;AAU1B,qDAAiD;AAG1C,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,0BAKnC;IACC,YACE,UAAsB,EACM,OAAwB;QAEpD,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,aAAa;QAWjB,MAAM,WAAW,GAAG,MAAM,kBAAW,CAAC,wBAAwB,CAC5D,8BAAa,EACb;YACE,MAAM,EAAE,IAAI,sBAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;SAChD,CACF,CAAC;QAEF,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QAEzB,MAAM,cAAc,GAAmB,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAE1E,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAE5B,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,sBAAU,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,UAAU,CACd,KAA2B,EAC3B,OAAe,EACf,cAA8B;QAE9B,MAAM,cAAc,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACzE,CAAC;CACF,CAAA;AA/CY,cAAc;IAD1B,IAAA,mBAAU,GAAE;IASR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCADf,sBAAU;GAPb,cAAc,CA+C1B;AA/CY,wCAAc","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport { NestFactory } from '@nestjs/core';\n\nimport {\n NodeConfig,\n TestingService as BaseTestingService,\n NestLogger,\n TestRunner,\n IBlock,\n} from '@subql/node-core';\nimport {\n EthereumProjectDs,\n SubqueryProject,\n} from '../configure/SubqueryProject';\nimport { EthereumApi } from '../ethereum';\nimport SafeEthProvider from '../ethereum/safe-api';\nimport { IndexerManager } from '../indexer/indexer.manager';\nimport { ProjectService } from '../indexer/project.service';\nimport { BlockContent } from '../indexer/types';\nimport { TestingModule } from './testing.module';\n\n@Injectable()\nexport class TestingService extends BaseTestingService<\n EthereumApi,\n SafeEthProvider,\n BlockContent,\n EthereumProjectDs\n> {\n constructor(\n nodeConfig: NodeConfig,\n @Inject('ISubqueryProject') project: SubqueryProject,\n ) {\n super(nodeConfig, project);\n }\n\n async getTestRunner(): Promise<\n [\n close: () => Promise<void>,\n runner: TestRunner<\n EthereumApi,\n SafeEthProvider,\n BlockContent,\n EthereumProjectDs\n >,\n ]\n > {\n const testContext = await NestFactory.createApplicationContext(\n TestingModule,\n {\n logger: new NestLogger(!!this.nodeConfig.debug),\n },\n );\n\n await testContext.init();\n\n const projectService: ProjectService = testContext.get('IProjectService');\n\n await projectService.init();\n\n return [testContext.close.bind(testContext), testContext.get(TestRunner)];\n }\n\n async indexBlock(\n block: IBlock<BlockContent>,\n handler: string,\n indexerManager: IndexerManager,\n ): Promise<void> {\n await indexerManager.indexBlock(block, this.getDsWithHandler(handler));\n }\n}\n"]}
|