@subql/node-ethereum 1.10.1-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/LICENSE +201 -0
- package/README.md +76 -0
- package/bin/run +4 -0
- package/bin/run.cmd +3 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/app.module.d.ts +2 -0
- package/dist/app.module.js +35 -0
- package/dist/app.module.js.map +1 -0
- package/dist/configure/SubqueryProject.d.ts +29 -0
- package/dist/configure/SubqueryProject.js +82 -0
- package/dist/configure/SubqueryProject.js.map +1 -0
- package/dist/configure/configure.module.d.ts +7 -0
- package/dist/configure/configure.module.js +172 -0
- package/dist/configure/configure.module.js.map +1 -0
- package/dist/configure/configure.module.spec.d.ts +1 -0
- package/dist/configure/configure.module.spec.js +26 -0
- package/dist/configure/configure.module.spec.js.map +1 -0
- package/dist/ethereum/api.ethereum.d.ts +21 -0
- package/dist/ethereum/api.ethereum.js +190 -0
- package/dist/ethereum/api.ethereum.js.map +1 -0
- package/dist/ethereum/api.service.ethereum.d.ts +8 -0
- package/dist/ethereum/api.service.ethereum.js +57 -0
- package/dist/ethereum/api.service.ethereum.js.map +1 -0
- package/dist/ethereum/block.ethereum.d.ts +15 -0
- package/dist/ethereum/block.ethereum.js +87 -0
- package/dist/ethereum/block.ethereum.js.map +1 -0
- package/dist/ethereum/index.d.ts +2 -0
- package/dist/ethereum/index.js +21 -0
- package/dist/ethereum/index.js.map +1 -0
- package/dist/ethereum/utils.ethereum.d.ts +6 -0
- package/dist/ethereum/utils.ethereum.js +131 -0
- package/dist/ethereum/utils.ethereum.js.map +1 -0
- package/dist/indexer/dictionary.service.d.ts +7 -0
- package/dist/indexer/dictionary.service.js +29 -0
- package/dist/indexer/dictionary.service.js.map +1 -0
- package/dist/indexer/ds-processor.service.d.ts +26 -0
- package/dist/indexer/ds-processor.service.js +133 -0
- package/dist/indexer/ds-processor.service.js.map +1 -0
- package/dist/indexer/dynamic-ds.service.d.ts +23 -0
- package/dist/indexer/dynamic-ds.service.js +105 -0
- package/dist/indexer/dynamic-ds.service.js.map +1 -0
- package/dist/indexer/fetch.module.d.ts +2 -0
- package/dist/indexer/fetch.module.js +68 -0
- package/dist/indexer/fetch.module.js.map +1 -0
- package/dist/indexer/fetch.service.d.ts +43 -0
- package/dist/indexer/fetch.service.js +359 -0
- package/dist/indexer/fetch.service.js.map +1 -0
- package/dist/indexer/indexer.manager.d.ts +36 -0
- package/dist/indexer/indexer.manager.js +256 -0
- package/dist/indexer/indexer.manager.js.map +1 -0
- package/dist/indexer/indexer.module.d.ts +2 -0
- package/dist/indexer/indexer.module.js +52 -0
- package/dist/indexer/indexer.module.js.map +1 -0
- package/dist/indexer/project.service.d.ts +39 -0
- package/dist/indexer/project.service.js +255 -0
- package/dist/indexer/project.service.js.map +1 -0
- package/dist/indexer/sandbox.service.d.ts +12 -0
- package/dist/indexer/sandbox.service.js +58 -0
- package/dist/indexer/sandbox.service.js.map +1 -0
- package/dist/indexer/types.d.ts +10 -0
- package/dist/indexer/types.js +11 -0
- package/dist/indexer/types.js.map +1 -0
- package/dist/indexer/worker/block-dispatcher.service.d.ts +69 -0
- package/dist/indexer/worker/block-dispatcher.service.js +356 -0
- package/dist/indexer/worker/block-dispatcher.service.js.map +1 -0
- package/dist/indexer/worker/worker.d.ts +14 -0
- package/dist/indexer/worker/worker.js +85 -0
- package/dist/indexer/worker/worker.js.map +1 -0
- package/dist/indexer/worker/worker.module.d.ts +2 -0
- package/dist/indexer/worker/worker.module.js +33 -0
- package/dist/indexer/worker/worker.module.js.map +1 -0
- package/dist/indexer/worker/worker.service.d.ts +28 -0
- package/dist/indexer/worker/worker.service.js +79 -0
- package/dist/indexer/worker/worker.service.js.map +1 -0
- package/dist/init.d.ts +1 -0
- package/dist/init.js +54 -0
- package/dist/init.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +14 -0
- package/dist/main.js.map +1 -0
- package/dist/meta/meta.controller.d.ts +23 -0
- package/dist/meta/meta.controller.js +36 -0
- package/dist/meta/meta.controller.js.map +1 -0
- package/dist/meta/meta.module.d.ts +2 -0
- package/dist/meta/meta.module.js +77 -0
- package/dist/meta/meta.module.js.map +1 -0
- package/dist/meta/meta.service.d.ts +42 -0
- package/dist/meta/meta.service.js +110 -0
- package/dist/meta/meta.service.js.map +1 -0
- package/dist/subcommands/forceClean.init.d.ts +1 -0
- package/dist/subcommands/forceClean.init.js +25 -0
- package/dist/subcommands/forceClean.init.js.map +1 -0
- package/dist/subcommands/forceClean.module.d.ts +4 -0
- package/dist/subcommands/forceClean.module.js +38 -0
- package/dist/subcommands/forceClean.module.js.map +1 -0
- package/dist/subcommands/forceClean.service.d.ts +8 -0
- package/dist/subcommands/forceClean.service.js +65 -0
- package/dist/subcommands/forceClean.service.js.map +1 -0
- package/dist/subcommands/reindex.init.d.ts +1 -0
- package/dist/subcommands/reindex.init.js +25 -0
- package/dist/subcommands/reindex.init.js.map +1 -0
- package/dist/subcommands/reindex.module.d.ts +4 -0
- package/dist/subcommands/reindex.module.js +39 -0
- package/dist/subcommands/reindex.module.js.map +1 -0
- package/dist/subcommands/reindex.service.d.ts +24 -0
- package/dist/subcommands/reindex.service.js +114 -0
- package/dist/subcommands/reindex.service.js.map +1 -0
- package/dist/utils/project.d.ts +13 -0
- package/dist/utils/project.js +191 -0
- package/dist/utils/project.js.map +1 -0
- package/dist/utils/string.d.ts +4 -0
- package/dist/utils/string.js +32 -0
- package/dist/utils/string.js.map +1 -0
- package/dist/yargs.d.ts +154 -0
- package/dist/yargs.js +193 -0
- package/dist/yargs.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2022 OnFinality Limited authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.AppModule = void 0;
|
|
12
|
+
const common_1 = require("@nestjs/common");
|
|
13
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
14
|
+
const schedule_1 = require("@nestjs/schedule");
|
|
15
|
+
const node_core_1 = require("@subql/node-core");
|
|
16
|
+
const configure_module_1 = require("./configure/configure.module");
|
|
17
|
+
const fetch_module_1 = require("./indexer/fetch.module");
|
|
18
|
+
const meta_module_1 = require("./meta/meta.module");
|
|
19
|
+
let AppModule = class AppModule {
|
|
20
|
+
};
|
|
21
|
+
AppModule = __decorate([
|
|
22
|
+
(0, common_1.Module)({
|
|
23
|
+
imports: [
|
|
24
|
+
node_core_1.DbModule.forRoot(),
|
|
25
|
+
event_emitter_1.EventEmitterModule.forRoot(),
|
|
26
|
+
configure_module_1.ConfigureModule.register(),
|
|
27
|
+
schedule_1.ScheduleModule.forRoot(),
|
|
28
|
+
fetch_module_1.FetchModule,
|
|
29
|
+
meta_module_1.MetaModule,
|
|
30
|
+
],
|
|
31
|
+
controllers: [],
|
|
32
|
+
})
|
|
33
|
+
], AppModule);
|
|
34
|
+
exports.AppModule = AppModule;
|
|
35
|
+
//# sourceMappingURL=app.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;AAEtC,2CAAwC;AACxC,yDAA2D;AAC3D,+CAAkD;AAClD,gDAA4C;AAC5C,mEAA+D;AAC/D,yDAAqD;AACrD,oDAAgD;AAazC,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,SAAS;IAXrB,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,0BAAW;YACX,wBAAU;SACX;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,SAAS,CAAG;AAAZ,8BAAS","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitterModule } from '@nestjs/event-emitter';\nimport { ScheduleModule } from '@nestjs/schedule';\nimport { DbModule } from '@subql/node-core';\nimport { ConfigureModule } from './configure/configure.module';\nimport { FetchModule } from './indexer/fetch.module';\nimport { MetaModule } from './meta/meta.module';\n\n@Module({\n imports: [\n DbModule.forRoot(),\n EventEmitterModule.forRoot(),\n ConfigureModule.register(),\n ScheduleModule.forRoot(),\n FetchModule,\n MetaModule,\n ],\n controllers: [],\n})\nexport class AppModule {}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { RegisteredTypes } from '@polkadot/types/types';
|
|
2
|
+
import { ReaderOptions, RunnerSpecs } from '@subql/common';
|
|
3
|
+
import { EthereumProjectNetworkConfig, SubqlEthereumDataSource, FileType } from '@subql/common-ethereum';
|
|
4
|
+
import { GraphQLSchema } from 'graphql';
|
|
5
|
+
export declare type SubqlProjectDs = SubqlEthereumDataSource & {
|
|
6
|
+
mapping: SubqlEthereumDataSource['mapping'] & {
|
|
7
|
+
entryScript: string;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
export declare type SubqlProjectDsTemplate = Omit<SubqlProjectDs, 'startBlock'> & {
|
|
11
|
+
name: string;
|
|
12
|
+
};
|
|
13
|
+
export declare class SubqueryProject {
|
|
14
|
+
id: string;
|
|
15
|
+
root: string;
|
|
16
|
+
network: Partial<EthereumProjectNetworkConfig>;
|
|
17
|
+
dataSources: SubqlProjectDs[];
|
|
18
|
+
schema: GraphQLSchema;
|
|
19
|
+
templates: SubqlProjectDsTemplate[];
|
|
20
|
+
chainTypes?: RegisteredTypes;
|
|
21
|
+
runner?: RunnerSpecs;
|
|
22
|
+
static create(path: string, networkOverrides?: Partial<EthereumProjectNetworkConfig>, readerOptions?: ReaderOptions): Promise<SubqueryProject>;
|
|
23
|
+
}
|
|
24
|
+
export interface SubqueryProjectNetwork {
|
|
25
|
+
chainId: string;
|
|
26
|
+
endpoint?: string;
|
|
27
|
+
dictionary?: string;
|
|
28
|
+
chaintypes?: FileType;
|
|
29
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2022 OnFinality Limited authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.SubqueryProject = void 0;
|
|
6
|
+
const common_1 = require("@subql/common");
|
|
7
|
+
const common_ethereum_1 = require("@subql/common-ethereum");
|
|
8
|
+
const utils_1 = require("@subql/utils");
|
|
9
|
+
const project_1 = require("../utils/project");
|
|
10
|
+
const NOT_SUPPORT = (name) => {
|
|
11
|
+
throw new Error(`Manifest specVersion ${name}() is not supported`);
|
|
12
|
+
};
|
|
13
|
+
class SubqueryProject {
|
|
14
|
+
static async create(path, networkOverrides, readerOptions) {
|
|
15
|
+
// We have to use reader here, because path can be remote or local
|
|
16
|
+
// and the `loadProjectManifest(projectPath)` only support local mode
|
|
17
|
+
const reader = await common_1.ReaderFactory.create(path, readerOptions);
|
|
18
|
+
const projectSchema = await reader.getProjectSchema();
|
|
19
|
+
if (projectSchema === undefined) {
|
|
20
|
+
throw new Error(`Get manifest from project path ${path} failed`);
|
|
21
|
+
}
|
|
22
|
+
const manifest = (0, common_ethereum_1.parseEthereumProjectManifest)(projectSchema);
|
|
23
|
+
if (manifest.isV1_0_0) {
|
|
24
|
+
return loadProjectFromManifest1_0_0(manifest.asV1_0_0, reader, path, networkOverrides);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
NOT_SUPPORT(manifest.specVersion);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.SubqueryProject = SubqueryProject;
|
|
32
|
+
function processChainId(network) {
|
|
33
|
+
if (network.chainId && network.genesisHash) {
|
|
34
|
+
throw new Error('Please only provide one of chainId and genesisHash');
|
|
35
|
+
}
|
|
36
|
+
else if (network.genesisHash && !network.chainId) {
|
|
37
|
+
network.chainId = network.genesisHash;
|
|
38
|
+
}
|
|
39
|
+
delete network.genesisHash;
|
|
40
|
+
return network;
|
|
41
|
+
}
|
|
42
|
+
async function loadProjectFromManifestBase(projectManifest, reader, path, networkOverrides) {
|
|
43
|
+
const root = await (0, project_1.getProjectRoot)(reader);
|
|
44
|
+
const network = processChainId(Object.assign(Object.assign({}, projectManifest.network), networkOverrides));
|
|
45
|
+
if (!network.endpoint) {
|
|
46
|
+
throw new Error(`Network endpoint must be provided for network. chainId="${network.chainId}"`);
|
|
47
|
+
}
|
|
48
|
+
let schemaString;
|
|
49
|
+
try {
|
|
50
|
+
schemaString = await reader.getFile(projectManifest.schema.file);
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
throw new Error(`unable to fetch the schema from ${projectManifest.schema.file}`);
|
|
54
|
+
}
|
|
55
|
+
const schema = (0, utils_1.buildSchemaFromString)(schemaString);
|
|
56
|
+
const chainTypes = projectManifest.network.chaintypes
|
|
57
|
+
? await (0, project_1.getChainTypes)(reader, root, projectManifest.network.chaintypes.file)
|
|
58
|
+
: undefined;
|
|
59
|
+
const dataSources = await (0, project_1.updateDataSourcesV0_2_0)(projectManifest.dataSources, reader, root);
|
|
60
|
+
return {
|
|
61
|
+
id: reader.root ? reader.root : path,
|
|
62
|
+
root,
|
|
63
|
+
network,
|
|
64
|
+
dataSources,
|
|
65
|
+
schema,
|
|
66
|
+
chainTypes,
|
|
67
|
+
templates: [],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const { name: packageName, version: packageVersion, } = require('../../package.json');
|
|
71
|
+
async function loadProjectFromManifest1_0_0(projectManifest, reader, path, networkOverrides) {
|
|
72
|
+
const project = await loadProjectFromManifestBase(projectManifest, reader, path, networkOverrides);
|
|
73
|
+
project.runner = projectManifest.runner;
|
|
74
|
+
if (packageName !== project.runner.node.name) {
|
|
75
|
+
throw new Error(`Runner requires ${project.runner.node.name}, current node ${packageName}`);
|
|
76
|
+
}
|
|
77
|
+
if (!(0, common_1.validateSemver)(packageVersion, project.runner.node.version)) {
|
|
78
|
+
throw new Error(`Runner require node version ${project.runner.node.version}, current node ${packageVersion}`);
|
|
79
|
+
}
|
|
80
|
+
return project;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=SubqueryProject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubqueryProject.js","sourceRoot":"","sources":["../../src/configure/SubqueryProject.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RegisteredTypes } from '@polkadot/types/types';\nimport {\n ReaderFactory,\n ReaderOptions,\n Reader,\n RunnerSpecs,\n validateSemver,\n} from '@subql/common';\nimport {\n EthereumProjectNetworkConfig,\n parseEthereumProjectManifest,\n SubqlEthereumDataSource,\n FileType,\n ProjectManifestV1_0_0Impl,\n} from '@subql/common-ethereum';\nimport { buildSchemaFromString } from '@subql/utils';\nimport { GraphQLSchema } from 'graphql';\nimport {\n getChainTypes,\n getProjectRoot,\n updateDataSourcesV0_2_0,\n} from '../utils/project';\n\nexport type SubqlProjectDs = SubqlEthereumDataSource & {\n mapping: SubqlEthereumDataSource['mapping'] & { entryScript: string };\n};\n\nexport type SubqlProjectDsTemplate = Omit<SubqlProjectDs, 'startBlock'> & {\n name: string;\n};\n\nconst NOT_SUPPORT = (name: string) => {\n throw new Error(`Manifest specVersion ${name}() is not supported`);\n};\n\nexport class SubqueryProject {\n id: string;\n root: string;\n network: Partial<EthereumProjectNetworkConfig>;\n dataSources: SubqlProjectDs[];\n schema: GraphQLSchema;\n templates: SubqlProjectDsTemplate[];\n chainTypes?: RegisteredTypes;\n runner?: RunnerSpecs;\n\n static async create(\n path: string,\n networkOverrides?: Partial<EthereumProjectNetworkConfig>,\n readerOptions?: ReaderOptions,\n ): Promise<SubqueryProject> {\n // We have to use reader here, because path can be remote or local\n // and the `loadProjectManifest(projectPath)` only support local mode\n const reader = await ReaderFactory.create(path, readerOptions);\n const projectSchema = await reader.getProjectSchema();\n if (projectSchema === undefined) {\n throw new Error(`Get manifest from project path ${path} failed`);\n }\n const manifest = parseEthereumProjectManifest(projectSchema);\n\n if (manifest.isV1_0_0) {\n return loadProjectFromManifest1_0_0(\n manifest.asV1_0_0,\n reader,\n path,\n networkOverrides,\n );\n } else {\n NOT_SUPPORT(manifest.specVersion);\n }\n }\n}\n\nexport interface SubqueryProjectNetwork {\n chainId: string;\n endpoint?: string;\n dictionary?: string;\n chaintypes?: FileType;\n}\n\nfunction processChainId(network: any): SubqueryProjectNetwork {\n if (network.chainId && network.genesisHash) {\n throw new Error('Please only provide one of chainId and genesisHash');\n } else if (network.genesisHash && !network.chainId) {\n network.chainId = network.genesisHash;\n }\n delete network.genesisHash;\n return network;\n}\n\ntype SUPPORT_MANIFEST = ProjectManifestV1_0_0Impl;\n\nasync function loadProjectFromManifestBase(\n projectManifest: SUPPORT_MANIFEST,\n reader: Reader,\n path: string,\n networkOverrides?: Partial<EthereumProjectNetworkConfig>,\n): Promise<SubqueryProject> {\n const root = await getProjectRoot(reader);\n\n const network = processChainId({\n ...projectManifest.network,\n ...networkOverrides,\n });\n\n if (!network.endpoint) {\n throw new Error(\n `Network endpoint must be provided for network. chainId=\"${network.chainId}\"`,\n );\n }\n\n let schemaString: string;\n try {\n schemaString = await reader.getFile(projectManifest.schema.file);\n } catch (e) {\n throw new Error(\n `unable to fetch the schema from ${projectManifest.schema.file}`,\n );\n }\n const schema = buildSchemaFromString(schemaString);\n\n const chainTypes = projectManifest.network.chaintypes\n ? await getChainTypes(reader, root, projectManifest.network.chaintypes.file)\n : undefined;\n\n const dataSources = await updateDataSourcesV0_2_0(\n projectManifest.dataSources,\n reader,\n root,\n );\n return {\n id: reader.root ? reader.root : path, //TODO, need to method to get project_id\n root,\n network,\n dataSources,\n schema,\n chainTypes,\n templates: [],\n };\n}\n\nconst {\n name: packageName,\n version: packageVersion,\n} = require('../../package.json');\n\nasync function loadProjectFromManifest1_0_0(\n projectManifest: ProjectManifestV1_0_0Impl,\n reader: Reader,\n path: string,\n networkOverrides?: Partial<EthereumProjectNetworkConfig>,\n): Promise<SubqueryProject> {\n const project = await loadProjectFromManifestBase(\n projectManifest,\n reader,\n path,\n networkOverrides,\n );\n project.runner = projectManifest.runner;\n if (packageName !== project.runner.node.name) {\n throw new Error(\n `Runner requires ${project.runner.node.name}, current node ${packageName}`,\n );\n }\n if (!validateSemver(packageVersion, project.runner.node.version)) {\n throw new Error(\n `Runner require node version ${project.runner.node.version}, current node ${packageVersion}`,\n );\n }\n return project;\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { NodeConfig } from '@subql/node-core';
|
|
3
|
+
export declare function validDbSchemaName(name: string): boolean;
|
|
4
|
+
export declare class ConfigureModule {
|
|
5
|
+
static registerWithConfig(config: NodeConfig): DynamicModule;
|
|
6
|
+
static register(): DynamicModule;
|
|
7
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2022 OnFinality Limited authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
+
};
|
|
13
|
+
var ConfigureModule_1;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ConfigureModule = exports.validDbSchemaName = void 0;
|
|
16
|
+
const assert_1 = __importDefault(require("assert"));
|
|
17
|
+
const path_1 = __importDefault(require("path"));
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const common_2 = require("@subql/common");
|
|
20
|
+
const node_core_1 = require("@subql/node-core");
|
|
21
|
+
const lodash_1 = require("lodash");
|
|
22
|
+
const yargs_1 = require("../yargs");
|
|
23
|
+
const SubqueryProject_1 = require("./SubqueryProject");
|
|
24
|
+
const logger = (0, node_core_1.getLogger)('configure');
|
|
25
|
+
const YargsNameMapping = {
|
|
26
|
+
local: 'localMode',
|
|
27
|
+
};
|
|
28
|
+
function yargsToIConfig(yargs) {
|
|
29
|
+
return Object.entries(yargs).reduce((acc, [key, value]) => {
|
|
30
|
+
var _a;
|
|
31
|
+
if (['_', '$0'].includes(key))
|
|
32
|
+
return acc;
|
|
33
|
+
if (key === 'network-registry') {
|
|
34
|
+
try {
|
|
35
|
+
value = JSON.parse(value);
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
throw new Error('Argument `network-registry` is not valid JSON');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
acc[(_a = YargsNameMapping[key]) !== null && _a !== void 0 ? _a : (0, lodash_1.camelCase)(key)] = value;
|
|
42
|
+
return acc;
|
|
43
|
+
}, {});
|
|
44
|
+
}
|
|
45
|
+
function defaultSubqueryName(config) {
|
|
46
|
+
var _a;
|
|
47
|
+
const ipfsMatch = config.subquery.match(common_2.IPFS_REGEX);
|
|
48
|
+
return Object.assign(Object.assign({}, config), { subqueryName: (_a = config.subqueryName) !== null && _a !== void 0 ? _a : (ipfsMatch
|
|
49
|
+
? config.subquery.replace(common_2.IPFS_REGEX, '')
|
|
50
|
+
: (0, lodash_1.last)((0, common_2.getProjectRootAndManifest)(config.subquery).root.split(path_1.default.sep))) });
|
|
51
|
+
}
|
|
52
|
+
// Check if a subquery name is a valid schema name
|
|
53
|
+
function validDbSchemaName(name) {
|
|
54
|
+
if (name.length === 0) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
name = name.toLowerCase();
|
|
59
|
+
const regexp = new RegExp('^[a-zA-Z_][a-zA-Z0-9_\\-\\/]{0,62}$');
|
|
60
|
+
const flag0 = !name.startsWith('pg_'); // Reserved identifier
|
|
61
|
+
const flag1 = regexp.test(name); // <= Valid characters, less than 63 bytes
|
|
62
|
+
if (!flag0) {
|
|
63
|
+
logger.error(`Invalid schema name '${name}', schema name must not be prefixed with 'pg_'`);
|
|
64
|
+
}
|
|
65
|
+
if (!flag1) {
|
|
66
|
+
logger.error(`Invalid schema name '${name}', schema name must start with a letter or underscore,
|
|
67
|
+
be less than 63 bytes and must contain only valid alphanumeric characters (can include characters '_-/')`);
|
|
68
|
+
}
|
|
69
|
+
return flag0 && flag1;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.validDbSchemaName = validDbSchemaName;
|
|
73
|
+
function warnDeprecations() {
|
|
74
|
+
const { argv } = yargs_1.yargsOptions;
|
|
75
|
+
if (argv['subquery-name']) {
|
|
76
|
+
logger.warn('Note that argument --subquery-name has been deprecated in favour of --db-schema');
|
|
77
|
+
}
|
|
78
|
+
if (argv.local) {
|
|
79
|
+
logger.warn('Note that argument --local has been deprecated');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
let ConfigureModule = ConfigureModule_1 = class ConfigureModule {
|
|
83
|
+
static registerWithConfig(config) {
|
|
84
|
+
if (!validDbSchemaName(config.dbSchema)) {
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
if (config.debug) {
|
|
88
|
+
(0, node_core_1.setLevel)('debug');
|
|
89
|
+
}
|
|
90
|
+
const project = async () => {
|
|
91
|
+
const p = await SubqueryProject_1.SubqueryProject.create(config.subquery, (0, lodash_1.omitBy)({
|
|
92
|
+
endpoint: config.networkEndpoint,
|
|
93
|
+
dictionary: config.networkDictionary,
|
|
94
|
+
}, lodash_1.isNil), {
|
|
95
|
+
ipfs: config.ipfs,
|
|
96
|
+
}).catch((err) => {
|
|
97
|
+
logger.error(err, 'Create Subquery project from given path failed!');
|
|
98
|
+
process.exit(1);
|
|
99
|
+
});
|
|
100
|
+
return p;
|
|
101
|
+
};
|
|
102
|
+
return {
|
|
103
|
+
module: ConfigureModule_1,
|
|
104
|
+
providers: [
|
|
105
|
+
{
|
|
106
|
+
provide: node_core_1.NodeConfig,
|
|
107
|
+
useValue: config,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
provide: SubqueryProject_1.SubqueryProject,
|
|
111
|
+
useFactory: project,
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
exports: [node_core_1.NodeConfig, SubqueryProject_1.SubqueryProject],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
static register() {
|
|
118
|
+
const { argv } = yargs_1.yargsOptions;
|
|
119
|
+
let config;
|
|
120
|
+
if (argv.config) {
|
|
121
|
+
config = node_core_1.NodeConfig.fromFile(argv.config, yargsToIConfig(argv));
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
if (!argv.subquery) {
|
|
125
|
+
logger.error('Subquery path is missing neither in cli options nor in config file');
|
|
126
|
+
yargs_1.yargsOptions.showHelp();
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
warnDeprecations();
|
|
130
|
+
(0, assert_1.default)(argv.subquery, 'subquery path is missing');
|
|
131
|
+
config = new node_core_1.NodeConfig(defaultSubqueryName(yargsToIConfig(argv)));
|
|
132
|
+
}
|
|
133
|
+
if (!validDbSchemaName(config.dbSchema)) {
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
if (config.debug) {
|
|
137
|
+
(0, node_core_1.setLevel)('debug');
|
|
138
|
+
}
|
|
139
|
+
const project = async () => {
|
|
140
|
+
const p = await SubqueryProject_1.SubqueryProject.create(argv.subquery, (0, lodash_1.omitBy)({
|
|
141
|
+
endpoint: config.networkEndpoint,
|
|
142
|
+
dictionary: config.networkDictionary,
|
|
143
|
+
}, lodash_1.isNil), {
|
|
144
|
+
ipfs: config.ipfs,
|
|
145
|
+
}).catch((err) => {
|
|
146
|
+
logger.error(err, 'Create Subquery project from given path failed!');
|
|
147
|
+
process.exit(1);
|
|
148
|
+
});
|
|
149
|
+
return p;
|
|
150
|
+
};
|
|
151
|
+
return {
|
|
152
|
+
module: ConfigureModule_1,
|
|
153
|
+
providers: [
|
|
154
|
+
{
|
|
155
|
+
provide: node_core_1.NodeConfig,
|
|
156
|
+
useValue: config,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
provide: SubqueryProject_1.SubqueryProject,
|
|
160
|
+
useFactory: project,
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
exports: [node_core_1.NodeConfig, SubqueryProject_1.SubqueryProject],
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
ConfigureModule = ConfigureModule_1 = __decorate([
|
|
168
|
+
(0, common_1.Global)(),
|
|
169
|
+
(0, common_1.Module)({})
|
|
170
|
+
], ConfigureModule);
|
|
171
|
+
exports.ConfigureModule = ConfigureModule;
|
|
172
|
+
//# sourceMappingURL=configure.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.module.js","sourceRoot":"","sources":["../../src/configure/configure.module.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport assert from 'assert';\nimport path from 'path';\nimport { DynamicModule, Global, Module } from '@nestjs/common';\nimport { getProjectRootAndManifest, IPFS_REGEX } from '@subql/common';\nimport { EthereumProjectNetworkConfig } from '@subql/common-ethereum';\nimport {\n IConfig,\n MinConfig,\n NodeConfig,\n getLogger,\n setLevel,\n} from '@subql/node-core';\nimport { camelCase, last, omitBy, isNil } from 'lodash';\nimport { yargsOptions } from '../yargs';\nimport { SubqueryProject } from './SubqueryProject';\n\nconst logger = getLogger('configure');\n\nconst YargsNameMapping: Record<string, string> = {\n local: 'localMode',\n};\n\ntype Args = typeof yargsOptions.argv['argv'];\n\nfunction yargsToIConfig(yargs: Args): Partial<IConfig> {\n return Object.entries(yargs).reduce((acc, [key, value]) => {\n if (['_', '$0'].includes(key)) return acc;\n\n if (key === 'network-registry') {\n try {\n value = JSON.parse(value as string);\n } catch (e) {\n throw new Error('Argument `network-registry` is not valid JSON');\n }\n }\n acc[YargsNameMapping[key] ?? camelCase(key)] = value;\n return acc;\n }, {} as any);\n}\n\nfunction defaultSubqueryName(config: Partial<IConfig>): MinConfig {\n const ipfsMatch = config.subquery.match(IPFS_REGEX);\n return {\n ...config,\n subqueryName:\n config.subqueryName ??\n (ipfsMatch\n ? config.subquery.replace(IPFS_REGEX, '')\n : last(\n getProjectRootAndManifest(config.subquery).root.split(path.sep),\n )),\n } as MinConfig;\n}\n\n// Check if a subquery name is a valid schema name\nexport function validDbSchemaName(name: string): boolean {\n if (name.length === 0) {\n return false;\n } else {\n name = name.toLowerCase();\n const regexp = new RegExp('^[a-zA-Z_][a-zA-Z0-9_\\\\-\\\\/]{0,62}$');\n const flag0 = !name.startsWith('pg_'); // Reserved identifier\n const flag1 = regexp.test(name); // <= Valid characters, less than 63 bytes\n if (!flag0) {\n logger.error(\n `Invalid schema name '${name}', schema name must not be prefixed with 'pg_'`,\n );\n }\n if (!flag1) {\n logger.error(\n `Invalid schema name '${name}', schema name must start with a letter or underscore, \n be less than 63 bytes and must contain only valid alphanumeric characters (can include characters '_-/')`,\n );\n }\n return flag0 && flag1;\n }\n}\n\nfunction warnDeprecations() {\n const { argv } = yargsOptions;\n if (argv['subquery-name']) {\n logger.warn(\n 'Note that argument --subquery-name has been deprecated in favour of --db-schema',\n );\n }\n if (argv.local) {\n logger.warn('Note that argument --local has been deprecated');\n }\n}\n\n@Global()\n@Module({})\nexport class ConfigureModule {\n static registerWithConfig(config: NodeConfig): DynamicModule {\n if (!validDbSchemaName(config.dbSchema)) {\n process.exit(1);\n }\n\n if (config.debug) {\n setLevel('debug');\n }\n\n const project = async () => {\n const p = await SubqueryProject.create(\n config.subquery,\n omitBy<EthereumProjectNetworkConfig>(\n {\n endpoint: config.networkEndpoint,\n dictionary: config.networkDictionary,\n },\n isNil,\n ),\n {\n ipfs: config.ipfs,\n },\n ).catch((err) => {\n logger.error(err, 'Create Subquery project from given path failed!');\n process.exit(1);\n });\n return p;\n };\n\n return {\n module: ConfigureModule,\n providers: [\n {\n provide: NodeConfig,\n useValue: config,\n },\n {\n provide: SubqueryProject,\n useFactory: project,\n },\n ],\n exports: [NodeConfig, SubqueryProject],\n };\n }\n static register(): DynamicModule {\n const { argv } = yargsOptions;\n let config: NodeConfig;\n if (argv.config) {\n config = NodeConfig.fromFile(argv.config, yargsToIConfig(argv));\n } else {\n if (!argv.subquery) {\n logger.error(\n 'Subquery path is missing neither in cli options nor in config file',\n );\n yargsOptions.showHelp();\n process.exit(1);\n }\n\n warnDeprecations();\n assert(argv.subquery, 'subquery path is missing');\n config = new NodeConfig(defaultSubqueryName(yargsToIConfig(argv)));\n }\n\n if (!validDbSchemaName(config.dbSchema)) {\n process.exit(1);\n }\n\n if (config.debug) {\n setLevel('debug');\n }\n\n const project = async () => {\n const p = await SubqueryProject.create(\n argv.subquery,\n omitBy<Partial<EthereumProjectNetworkConfig>>(\n {\n endpoint: config.networkEndpoint,\n dictionary: config.networkDictionary,\n },\n isNil,\n ),\n {\n ipfs: config.ipfs,\n },\n ).catch((err) => {\n logger.error(err, 'Create Subquery project from given path failed!');\n process.exit(1);\n });\n return p;\n };\n\n return {\n module: ConfigureModule,\n providers: [\n {\n provide: NodeConfig,\n useValue: config,\n },\n {\n provide: SubqueryProject,\n useFactory: project,\n },\n ],\n exports: [NodeConfig, SubqueryProject],\n };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2022 OnFinality Limited authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
const configure_module_1 = require("./configure.module");
|
|
6
|
+
describe('Configure', () => {
|
|
7
|
+
it('validDbSchemaName - works', () => {
|
|
8
|
+
expect((0, configure_module_1.validDbSchemaName)('subquery_1')).toBeTruthy();
|
|
9
|
+
});
|
|
10
|
+
it('validDbSchemaName - works not alphanumeric', () => {
|
|
11
|
+
expect((0, configure_module_1.validDbSchemaName)('subquery_-/1')).toBeTruthy();
|
|
12
|
+
});
|
|
13
|
+
it('validDbSchemaName - long', () => {
|
|
14
|
+
expect((0, configure_module_1.validDbSchemaName)('a'.repeat(64))).toBeFalsy();
|
|
15
|
+
});
|
|
16
|
+
it('validDbSchemaName - invalid prefix', () => {
|
|
17
|
+
expect((0, configure_module_1.validDbSchemaName)('pg_whatever')).toBeFalsy();
|
|
18
|
+
});
|
|
19
|
+
it('validDbSchemaName - invalid tokens', () => {
|
|
20
|
+
expect((0, configure_module_1.validDbSchemaName)('he$$*')).toBeFalsy();
|
|
21
|
+
});
|
|
22
|
+
it('validDbSchemaName - empty', () => {
|
|
23
|
+
expect((0, configure_module_1.validDbSchemaName)('')).toBeFalsy();
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=configure.module.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.module.spec.js","sourceRoot":"","sources":["../../src/configure/configure.module.spec.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;AAEtC,yDAAuD;AAEvD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,IAAA,oCAAiB,EAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,IAAA,oCAAiB,EAAC,cAAc,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,IAAA,oCAAiB,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACxD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,IAAA,oCAAiB,EAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,IAAA,oCAAiB,EAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,IAAA,oCAAiB,EAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { validDbSchemaName } from './configure.module';\n\ndescribe('Configure', () => {\n it('validDbSchemaName - works', () => {\n expect(validDbSchemaName('subquery_1')).toBeTruthy();\n });\n it('validDbSchemaName - works not alphanumeric', () => {\n expect(validDbSchemaName('subquery_-/1')).toBeTruthy();\n });\n it('validDbSchemaName - long', () => {\n expect(validDbSchemaName('a'.repeat(64))).toBeFalsy();\n });\n it('validDbSchemaName - invalid prefix', () => {\n expect(validDbSchemaName('pg_whatever')).toBeFalsy();\n });\n it('validDbSchemaName - invalid tokens', () => {\n expect(validDbSchemaName('he$$*')).toBeFalsy();\n });\n it('validDbSchemaName - empty', () => {\n expect(validDbSchemaName('')).toBeFalsy();\n });\n});\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RuntimeDataSourceV0_2_0 } from '@subql/common-ethereum';
|
|
2
|
+
import { ApiWrapper, BlockWrapper, EthereumBlockWrapper, EthereumResult, EthereumLog } from '@subql/types-ethereum';
|
|
3
|
+
export declare class EthereumApi implements ApiWrapper<EthereumBlockWrapper> {
|
|
4
|
+
private endpoint;
|
|
5
|
+
private client;
|
|
6
|
+
private genesisBlock;
|
|
7
|
+
private contractInterfaces;
|
|
8
|
+
private chainId;
|
|
9
|
+
constructor(endpoint: string);
|
|
10
|
+
init(): Promise<void>;
|
|
11
|
+
getLastHeight(): Promise<number>;
|
|
12
|
+
getRuntimeChain(): string;
|
|
13
|
+
getChainId(): number;
|
|
14
|
+
getGenesisHash(): string;
|
|
15
|
+
getSpecName(): string;
|
|
16
|
+
getFinalizedBlockHeight(): Promise<number>;
|
|
17
|
+
fetchBlocks(bufferBlocks: number[]): Promise<EthereumBlockWrapper[]>;
|
|
18
|
+
freezeApi(processor: any, blockContent: BlockWrapper): void;
|
|
19
|
+
private buildInterface;
|
|
20
|
+
parseLog<T extends EthereumResult = EthereumResult>(log: EthereumLog, ds: RuntimeDataSourceV0_2_0): Promise<EthereumLog<T> | EthereumLog>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2022 OnFinality Limited authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
|
+
};
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.EthereumApi = void 0;
|
|
9
|
+
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const http_1 = __importDefault(require("http"));
|
|
11
|
+
const https_1 = __importDefault(require("https"));
|
|
12
|
+
const abi_1 = require("@ethersproject/abi");
|
|
13
|
+
const providers_1 = require("@ethersproject/providers");
|
|
14
|
+
const node_core_1 = require("@subql/node-core");
|
|
15
|
+
const utils_1 = require("ethers/lib/utils");
|
|
16
|
+
const block_ethereum_1 = require("./block.ethereum");
|
|
17
|
+
const utils_ethereum_1 = require("./utils.ethereum");
|
|
18
|
+
const Web3HttpProvider = require('web3-providers-http');
|
|
19
|
+
const Web3WsProvider = require('web3-providers-ws');
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
21
|
+
const { version: packageVersion } = require('../../package.json');
|
|
22
|
+
const logger = (0, node_core_1.getLogger)('api.ethereum');
|
|
23
|
+
async function loadAssets(ds) {
|
|
24
|
+
if (!ds.assets) {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
const res = {};
|
|
28
|
+
for (const [name, { file }] of Object.entries(ds.assets)) {
|
|
29
|
+
try {
|
|
30
|
+
res[name] = await fs_1.default.promises.readFile(file, { encoding: 'utf8' });
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
throw new Error(`Failed to load datasource asset ${file}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return res;
|
|
37
|
+
}
|
|
38
|
+
class EthereumApi {
|
|
39
|
+
constructor(endpoint) {
|
|
40
|
+
this.endpoint = endpoint;
|
|
41
|
+
this.contractInterfaces = {};
|
|
42
|
+
const { hostname, pathname, port, protocol, searchParams } = new URL(endpoint);
|
|
43
|
+
const httpAgent = new http_1.default.Agent({ keepAlive: true, maxSockets: 10 });
|
|
44
|
+
const httpsAgent = new https_1.default.Agent({ keepAlive: true, maxSockets: 10 });
|
|
45
|
+
const protocolStr = protocol.replace(':', '');
|
|
46
|
+
const portNum = port
|
|
47
|
+
? parseInt(port, 10)
|
|
48
|
+
: protocolStr === 'https'
|
|
49
|
+
? undefined
|
|
50
|
+
: 80;
|
|
51
|
+
let provider;
|
|
52
|
+
if (protocolStr === 'https' || protocolStr === 'http') {
|
|
53
|
+
const options = {
|
|
54
|
+
keepAlive: true,
|
|
55
|
+
headers: [
|
|
56
|
+
{
|
|
57
|
+
name: 'User-Agent',
|
|
58
|
+
value: `Subquery-Node ${packageVersion}`,
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
agent: {
|
|
62
|
+
http: httpAgent,
|
|
63
|
+
https: httpsAgent,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
if (searchParams.apiKey) {
|
|
67
|
+
options.headers.apiKey = searchParams.get('apiKey');
|
|
68
|
+
}
|
|
69
|
+
provider = new Web3HttpProvider(this.endpoint, options);
|
|
70
|
+
}
|
|
71
|
+
else if (protocolStr === 'ws' || protocolStr === 'wss') {
|
|
72
|
+
const options = {
|
|
73
|
+
headers: {
|
|
74
|
+
'User-Agent': `Subquery-Node ${packageVersion}`,
|
|
75
|
+
},
|
|
76
|
+
clientConfig: {
|
|
77
|
+
keepAlive: true,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
if (searchParams.apiKey) {
|
|
81
|
+
options.headers.apiKey = searchParams.get('apiKey');
|
|
82
|
+
}
|
|
83
|
+
provider = new Web3WsProvider(endpoint, options);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
throw new Error(`Unsupported protocol: ${protocol}`);
|
|
87
|
+
}
|
|
88
|
+
this.client = new providers_1.Web3Provider(provider);
|
|
89
|
+
}
|
|
90
|
+
async init() {
|
|
91
|
+
this.genesisBlock = await this.client.send('eth_getBlockByNumber', [
|
|
92
|
+
(0, utils_1.hexValue)(0),
|
|
93
|
+
true,
|
|
94
|
+
]);
|
|
95
|
+
logger.info(this.endpoint);
|
|
96
|
+
this.chainId = await this.client.send('net_version', []);
|
|
97
|
+
}
|
|
98
|
+
async getLastHeight() {
|
|
99
|
+
return this.client.getBlockNumber();
|
|
100
|
+
}
|
|
101
|
+
getRuntimeChain() {
|
|
102
|
+
return 'ethereum';
|
|
103
|
+
}
|
|
104
|
+
getChainId() {
|
|
105
|
+
return this.chainId;
|
|
106
|
+
}
|
|
107
|
+
getGenesisHash() {
|
|
108
|
+
return this.genesisBlock.hash;
|
|
109
|
+
}
|
|
110
|
+
getSpecName() {
|
|
111
|
+
return 'ethereum';
|
|
112
|
+
}
|
|
113
|
+
async getFinalizedBlockHeight() {
|
|
114
|
+
// Doesn't seem to be a difference between finalized and latest
|
|
115
|
+
return this.client.getBlockNumber();
|
|
116
|
+
}
|
|
117
|
+
async fetchBlocks(bufferBlocks) {
|
|
118
|
+
return Promise.all(bufferBlocks.map(async (num) => {
|
|
119
|
+
try {
|
|
120
|
+
// Fetch Block
|
|
121
|
+
const block_promise = await this.client.send('eth_getBlockByNumber', [
|
|
122
|
+
(0, utils_1.hexValue)(num),
|
|
123
|
+
true,
|
|
124
|
+
]);
|
|
125
|
+
const block = (0, utils_ethereum_1.formatBlock)(block_promise);
|
|
126
|
+
//const block = this.client.formatter.blockWithTransactions(rawBlock);
|
|
127
|
+
block.stateRoot = this.client.formatter.hash(block.stateRoot);
|
|
128
|
+
// Get transaction receipts
|
|
129
|
+
const transactions = await Promise.all(block.transactions.map(async (tx) => {
|
|
130
|
+
//logger.info(JSON.stringify(tx))
|
|
131
|
+
const transaction = (0, utils_ethereum_1.formatTransaction)(tx);
|
|
132
|
+
const receipt = await this.client.send('eth_getTransactionReceipt', [tx.hash]);
|
|
133
|
+
transaction.receipt = (0, utils_ethereum_1.formatReceipt)(receipt, block);
|
|
134
|
+
return transaction;
|
|
135
|
+
}));
|
|
136
|
+
return new block_ethereum_1.EthereumBlockWrapped(block, transactions);
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
// Wrap error from an axios error to fix issue with error being undefined
|
|
140
|
+
const error = new Error(e.message);
|
|
141
|
+
logger.error(error, `Failed to fetch block at height ${num}`);
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
freezeApi(processor, blockContent) {
|
|
147
|
+
processor.freeze(this.client, 'api');
|
|
148
|
+
}
|
|
149
|
+
buildInterface(abiName, assets) {
|
|
150
|
+
if (!assets[abiName]) {
|
|
151
|
+
throw new Error(`ABI named "${abiName}" not referenced in assets`);
|
|
152
|
+
}
|
|
153
|
+
// This assumes that all datasources have a different abi name or they are the same abi
|
|
154
|
+
if (!this.contractInterfaces[abiName]) {
|
|
155
|
+
// Constructing the interface validates the ABI
|
|
156
|
+
try {
|
|
157
|
+
let abiObj = JSON.parse(assets[abiName]);
|
|
158
|
+
/*
|
|
159
|
+
* Allows parsing JSON artifacts as well as ABIs
|
|
160
|
+
* https://trufflesuite.github.io/artifact-updates/background.html#what-are-artifacts
|
|
161
|
+
*/
|
|
162
|
+
if (!Array.isArray(abiObj) && abiObj.abi) {
|
|
163
|
+
abiObj = abiObj.abi;
|
|
164
|
+
}
|
|
165
|
+
this.contractInterfaces[abiName] = new abi_1.Interface(abiObj);
|
|
166
|
+
}
|
|
167
|
+
catch (e) {
|
|
168
|
+
logger.error(`Unable to parse ABI: ${e.message}`);
|
|
169
|
+
throw new Error('ABI is invalid');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return this.contractInterfaces[abiName];
|
|
173
|
+
}
|
|
174
|
+
async parseLog(log, ds) {
|
|
175
|
+
var _a;
|
|
176
|
+
try {
|
|
177
|
+
if (!((_a = ds === null || ds === void 0 ? void 0 : ds.options) === null || _a === void 0 ? void 0 : _a.abi)) {
|
|
178
|
+
return log;
|
|
179
|
+
}
|
|
180
|
+
const iface = this.buildInterface(ds.options.abi, await loadAssets(ds));
|
|
181
|
+
return Object.assign(Object.assign({}, log), { args: iface === null || iface === void 0 ? void 0 : iface.parseLog(log).args });
|
|
182
|
+
}
|
|
183
|
+
catch (e) {
|
|
184
|
+
logger.warn(`Failed to parse log data: ${e.message}`);
|
|
185
|
+
return log;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
exports.EthereumApi = EthereumApi;
|
|
190
|
+
//# sourceMappingURL=api.ethereum.js.map
|