@subql/node-ethereum 1.10.1-2 → 2.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.
Files changed (143) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +3 -2
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/configure/SubqueryProject.d.ts +9 -11
  5. package/dist/configure/SubqueryProject.js +19 -9
  6. package/dist/configure/SubqueryProject.js.map +1 -1
  7. package/dist/configure/configure.module.js +5 -7
  8. package/dist/configure/configure.module.js.map +1 -1
  9. package/dist/ethereum/api.connection.d.ts +11 -0
  10. package/dist/ethereum/api.connection.js +27 -0
  11. package/dist/ethereum/api.connection.js.map +1 -0
  12. package/dist/ethereum/api.ethereum.d.ts +18 -5
  13. package/dist/ethereum/api.ethereum.js +138 -81
  14. package/dist/ethereum/api.ethereum.js.map +1 -1
  15. package/dist/ethereum/api.service.ethereum.d.ts +11 -3
  16. package/dist/ethereum/api.service.ethereum.js +68 -18
  17. package/dist/ethereum/api.service.ethereum.js.map +1 -1
  18. package/dist/ethereum/api.service.ethereum.test.d.ts +1 -0
  19. package/dist/ethereum/api.service.ethereum.test.js +73 -0
  20. package/dist/ethereum/api.service.ethereum.test.js.map +1 -0
  21. package/dist/ethereum/block.ethereum.d.ts +1 -1
  22. package/dist/ethereum/block.ethereum.js +10 -12
  23. package/dist/ethereum/block.ethereum.js.map +1 -1
  24. package/dist/ethereum/ethers/json-rpc-batch-provider.d.ts +21 -0
  25. package/dist/ethereum/ethers/json-rpc-batch-provider.js +114 -0
  26. package/dist/ethereum/ethers/json-rpc-batch-provider.js.map +1 -0
  27. package/dist/ethereum/ethers/json-rpc-provider.d.ts +7 -0
  28. package/dist/ethereum/ethers/json-rpc-provider.js +68 -0
  29. package/dist/ethereum/ethers/json-rpc-provider.js.map +1 -0
  30. package/dist/ethereum/ethers/web/_version.d.ts +1 -0
  31. package/dist/ethereum/ethers/web/_version.js +6 -0
  32. package/dist/ethereum/ethers/web/_version.js.map +1 -0
  33. package/dist/ethereum/ethers/web/geturl.d.ts +3 -0
  34. package/dist/ethereum/ethers/web/geturl.js +116 -0
  35. package/dist/ethereum/ethers/web/geturl.js.map +1 -0
  36. package/dist/ethereum/ethers/web/index.d.ts +49 -0
  37. package/dist/ethereum/ethers/web/index.js +437 -0
  38. package/dist/ethereum/ethers/web/index.js.map +1 -0
  39. package/dist/ethereum/ethers/web/types.d.ts +26 -0
  40. package/dist/ethereum/ethers/web/types.js +4 -0
  41. package/dist/ethereum/ethers/web/types.js.map +1 -0
  42. package/dist/ethereum/safe-api.d.ts +34 -0
  43. package/dist/ethereum/safe-api.js +114 -0
  44. package/dist/ethereum/safe-api.js.map +1 -0
  45. package/dist/ethereum/utils.ethereum.d.ts +1 -1
  46. package/dist/ethereum/utils.ethereum.js +22 -87
  47. package/dist/ethereum/utils.ethereum.js.map +1 -1
  48. package/dist/indexer/blockDispatcher/block-dispatcher.service.d.ts +17 -0
  49. package/dist/indexer/blockDispatcher/block-dispatcher.service.js +55 -0
  50. package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +1 -0
  51. package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.d.ts +4 -0
  52. package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.js +5 -0
  53. package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.js.map +1 -0
  54. package/dist/indexer/blockDispatcher/index.d.ts +4 -0
  55. package/dist/indexer/blockDispatcher/index.js +10 -0
  56. package/dist/indexer/blockDispatcher/index.js.map +1 -0
  57. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.d.ts +15 -0
  58. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +88 -0
  59. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +1 -0
  60. package/dist/indexer/dictionary.service.d.ts +1 -0
  61. package/dist/indexer/dictionary.service.js +22 -2
  62. package/dist/indexer/dictionary.service.js.map +1 -1
  63. package/dist/indexer/ds-processor.service.d.ts +1 -1
  64. package/dist/indexer/ds-processor.service.js +4 -0
  65. package/dist/indexer/ds-processor.service.js.map +1 -1
  66. package/dist/indexer/dynamic-ds.service.d.ts +3 -19
  67. package/dist/indexer/dynamic-ds.service.js +20 -72
  68. package/dist/indexer/dynamic-ds.service.js.map +1 -1
  69. package/dist/indexer/fetch.module.js +40 -12
  70. package/dist/indexer/fetch.module.js.map +1 -1
  71. package/dist/indexer/fetch.service.d.ts +16 -7
  72. package/dist/indexer/fetch.service.js +188 -78
  73. package/dist/indexer/fetch.service.js.map +1 -1
  74. package/dist/indexer/indexer.manager.d.ts +11 -17
  75. package/dist/indexer/indexer.manager.js +68 -71
  76. package/dist/indexer/indexer.manager.js.map +1 -1
  77. package/dist/indexer/indexer.module.js +32 -8
  78. package/dist/indexer/indexer.module.js.map +1 -1
  79. package/dist/indexer/project.service.d.ts +11 -8
  80. package/dist/indexer/project.service.js +76 -82
  81. package/dist/indexer/project.service.js.map +1 -1
  82. package/dist/indexer/sandbox.service.js +11 -2
  83. package/dist/indexer/sandbox.service.js.map +1 -1
  84. package/dist/indexer/types.d.ts +2 -1
  85. package/dist/indexer/types.js.map +1 -1
  86. package/dist/indexer/unfinalizedBlocks.service.d.ts +36 -0
  87. package/dist/indexer/unfinalizedBlocks.service.js +197 -0
  88. package/dist/indexer/unfinalizedBlocks.service.js.map +1 -0
  89. package/dist/indexer/unfinalizedBlocks.spec.d.ts +1 -0
  90. package/dist/indexer/unfinalizedBlocks.spec.js +195 -0
  91. package/dist/indexer/unfinalizedBlocks.spec.js.map +1 -0
  92. package/dist/indexer/worker/worker.d.ts +22 -6
  93. package/dist/indexer/worker/worker.js +16 -3
  94. package/dist/indexer/worker/worker.js.map +1 -1
  95. package/dist/indexer/worker/worker.service.d.ts +10 -6
  96. package/dist/indexer/worker/worker.service.js +23 -10
  97. package/dist/indexer/worker/worker.service.js.map +1 -1
  98. package/dist/indexer/worker/worker.unfinalizedBlocks.service.d.ts +11 -0
  99. package/dist/indexer/worker/worker.unfinalizedBlocks.service.js +32 -0
  100. package/dist/indexer/worker/worker.unfinalizedBlocks.service.js.map +1 -0
  101. package/dist/init.js +2 -2
  102. package/dist/init.js.map +1 -1
  103. package/dist/main.js +6 -1
  104. package/dist/main.js.map +1 -1
  105. package/dist/meta/meta.module.js +8 -0
  106. package/dist/meta/meta.module.js.map +1 -1
  107. package/dist/meta/meta.service.d.ts +18 -3
  108. package/dist/meta/meta.service.js +89 -5
  109. package/dist/meta/meta.service.js.map +1 -1
  110. package/dist/subcommands/forceClean.service.d.ts +3 -1
  111. package/dist/subcommands/forceClean.service.js +30 -6
  112. package/dist/subcommands/forceClean.service.js.map +1 -1
  113. package/dist/subcommands/reindex.init.js +6 -1
  114. package/dist/subcommands/reindex.init.js.map +1 -1
  115. package/dist/subcommands/reindex.module.js +20 -1
  116. package/dist/subcommands/reindex.module.js.map +1 -1
  117. package/dist/subcommands/reindex.service.d.ts +7 -3
  118. package/dist/subcommands/reindex.service.js +44 -50
  119. package/dist/subcommands/reindex.service.js.map +1 -1
  120. package/dist/subcommands/testing.init.d.ts +1 -0
  121. package/dist/subcommands/testing.init.js +34 -0
  122. package/dist/subcommands/testing.init.js.map +1 -0
  123. package/dist/subcommands/testing.module.d.ts +4 -0
  124. package/dist/subcommands/testing.module.js +77 -0
  125. package/dist/subcommands/testing.module.js.map +1 -0
  126. package/dist/subcommands/testing.service.d.ts +9 -0
  127. package/dist/subcommands/testing.service.js +43 -0
  128. package/dist/subcommands/testing.service.js.map +1 -0
  129. package/dist/utils/project.d.ts +3 -0
  130. package/dist/utils/project.js +45 -1
  131. package/dist/utils/project.js.map +1 -1
  132. package/dist/utils/reindex.d.ts +6 -0
  133. package/dist/utils/reindex.js +48 -0
  134. package/dist/utils/reindex.js.map +1 -0
  135. package/dist/utils/string.js +10 -2
  136. package/dist/utils/string.js.map +1 -1
  137. package/dist/yargs.d.ts +97 -49
  138. package/dist/yargs.js +130 -69
  139. package/dist/yargs.js.map +1 -1
  140. package/package.json +13 -12
  141. package/dist/indexer/worker/block-dispatcher.service.d.ts +0 -69
  142. package/dist/indexer/worker/block-dispatcher.service.js +0 -356
  143. package/dist/indexer/worker/block-dispatcher.service.js.map +0 -1
@@ -1,27 +1,30 @@
1
1
  import { RegisteredTypes } from '@polkadot/types/types';
2
2
  import { ReaderOptions, RunnerSpecs } from '@subql/common';
3
- import { EthereumProjectNetworkConfig, SubqlEthereumDataSource, EthereumBlockFilter, FileType } from '@subql/common-ethereum';
3
+ import { EthereumProjectNetworkConfig, SubqlEthereumDataSource, EthereumBlockFilter } from '@subql/common-ethereum';
4
4
  import Cron from 'cron-converter';
5
5
  import { GraphQLSchema } from 'graphql';
6
6
  import { EthereumApi } from '../ethereum/api.ethereum';
7
- export declare type SubqlProjectDs = SubqlEthereumDataSource & {
7
+ export type SubqlProjectDs = SubqlEthereumDataSource & {
8
8
  mapping: SubqlEthereumDataSource['mapping'] & {
9
9
  entryScript: string;
10
10
  };
11
11
  };
12
- export declare type SubqlProjectBlockFilter = EthereumBlockFilter & {
12
+ export type SubqlProjectBlockFilter = EthereumBlockFilter & {
13
13
  cronSchedule?: {
14
14
  schedule: Cron.Seeker;
15
15
  next: number;
16
16
  };
17
17
  };
18
- export declare type SubqlProjectDsTemplate = Omit<SubqlProjectDs, 'startBlock'> & {
18
+ export type SubqlProjectDsTemplate = Omit<SubqlProjectDs, 'startBlock'> & {
19
19
  name: string;
20
20
  };
21
+ type NetworkConfig = EthereumProjectNetworkConfig & {
22
+ chainId: string;
23
+ };
21
24
  export declare class SubqueryProject {
22
25
  id: string;
23
26
  root: string;
24
- network: Partial<EthereumProjectNetworkConfig>;
27
+ network: NetworkConfig;
25
28
  dataSources: SubqlProjectDs[];
26
29
  schema: GraphQLSchema;
27
30
  templates: SubqlProjectDsTemplate[];
@@ -29,10 +32,5 @@ export declare class SubqueryProject {
29
32
  runner?: RunnerSpecs;
30
33
  static create(path: string, networkOverrides?: Partial<EthereumProjectNetworkConfig>, readerOptions?: ReaderOptions): Promise<SubqueryProject>;
31
34
  }
32
- export interface SubqueryProjectNetwork {
33
- chainId: string;
34
- endpoint?: string;
35
- dictionary?: string;
36
- chaintypes?: FileType;
37
- }
38
35
  export declare function generateTimestampReferenceForBlockFilters(dataSources: SubqlProjectDs[], api: EthereumApi): Promise<SubqlProjectDs[]>;
36
+ export {};
@@ -1,12 +1,19 @@
1
1
  "use strict";
2
2
  // Copyright 2020-2022 OnFinality Limited authors & contributors
3
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
+ };
4
10
  var __importDefault = (this && this.__importDefault) || function (mod) {
5
11
  return (mod && mod.__esModule) ? mod : { "default": mod };
6
12
  };
7
13
  Object.defineProperty(exports, "__esModule", { value: true });
8
14
  exports.generateTimestampReferenceForBlockFilters = exports.SubqueryProject = void 0;
9
- const common_1 = require("@subql/common");
15
+ const common_1 = require("@nestjs/common");
16
+ const common_2 = require("@subql/common");
10
17
  const common_ethereum_1 = require("@subql/common-ethereum");
11
18
  const utils_1 = require("@subql/utils");
12
19
  const cron_converter_1 = __importDefault(require("cron-converter"));
@@ -14,11 +21,11 @@ const project_1 = require("../utils/project");
14
21
  const NOT_SUPPORT = (name) => {
15
22
  throw new Error(`Manifest specVersion ${name}() is not supported`);
16
23
  };
17
- class SubqueryProject {
24
+ let SubqueryProject = class SubqueryProject {
18
25
  static async create(path, networkOverrides, readerOptions) {
19
26
  // We have to use reader here, because path can be remote or local
20
27
  // and the `loadProjectManifest(projectPath)` only support local mode
21
- const reader = await common_1.ReaderFactory.create(path, readerOptions);
28
+ const reader = await common_2.ReaderFactory.create(path, readerOptions);
22
29
  const projectSchema = await reader.getProjectSchema();
23
30
  if (projectSchema === undefined) {
24
31
  throw new Error(`Get manifest from project path ${path} failed`);
@@ -31,7 +38,10 @@ class SubqueryProject {
31
38
  NOT_SUPPORT(manifest.specVersion);
32
39
  }
33
40
  }
34
- }
41
+ };
42
+ SubqueryProject = __decorate([
43
+ (0, common_1.Injectable)()
44
+ ], SubqueryProject);
35
45
  exports.SubqueryProject = SubqueryProject;
36
46
  function processChainId(network) {
37
47
  if (network.chainId && network.genesisHash) {
@@ -45,6 +55,9 @@ function processChainId(network) {
45
55
  }
46
56
  async function loadProjectFromManifestBase(projectManifest, reader, path, networkOverrides) {
47
57
  const root = await (0, project_1.getProjectRoot)(reader);
58
+ if (typeof projectManifest.network.endpoint === 'string') {
59
+ projectManifest.network.endpoint = [projectManifest.network.endpoint];
60
+ }
48
61
  const network = processChainId(Object.assign(Object.assign({}, projectManifest.network), networkOverrides));
49
62
  if (!network.endpoint) {
50
63
  throw new Error(`Network endpoint must be provided for network. chainId="${network.chainId}"`);
@@ -76,10 +89,7 @@ const { name: packageName, version: packageVersion, } = require('../../package.j
76
89
  async function loadProjectFromManifest1_0_0(projectManifest, reader, path, networkOverrides) {
77
90
  const project = await loadProjectFromManifestBase(projectManifest, reader, path, networkOverrides);
78
91
  project.runner = projectManifest.runner;
79
- if (packageName !== project.runner.node.name) {
80
- throw new Error(`Runner requires ${project.runner.node.name}, current node ${packageName}`);
81
- }
82
- if (!(0, common_1.validateSemver)(packageVersion, project.runner.node.version)) {
92
+ if (!(0, common_2.validateSemver)(packageVersion, project.runner.node.version)) {
83
93
  throw new Error(`Runner require node version ${project.runner.node.version}, current node ${packageVersion}`);
84
94
  }
85
95
  return project;
@@ -104,7 +114,7 @@ async function generateTimestampReferenceForBlockFilters(dataSources, api) {
104
114
  if (handler.kind === common_ethereum_1.EthereumHandlerKind.Block) {
105
115
  if ((_a = handler.filter) === null || _a === void 0 ? void 0 : _a.timestamp) {
106
116
  if (!block) {
107
- block = await api.getBlockByHeight(startBlock);
117
+ block = await api.getBlockByHeightOrHash(startBlock);
108
118
  timestampReference = new Date(block.timestamp * 1000); // Add millis
109
119
  }
110
120
  try {
@@ -1 +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 { Block } from '@ethersproject/abstract-provider';\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 EthereumBlockFilter,\n FileType,\n ProjectManifestV1_0_0Impl,\n isRuntimeDs,\n EthereumHandlerKind,\n} from '@subql/common-ethereum';\nimport { buildSchemaFromString } from '@subql/utils';\nimport Cron from 'cron-converter';\nimport { GraphQLSchema } from 'graphql';\nimport { EthereumApi } from '../ethereum/api.ethereum';\nimport {\n getChainTypes,\n getProjectRoot,\n updateDataSourcesV0_2_0,\n} from '../utils/project';\n// import { getBlockByHeight, getTimestamp } from '../utils/substrate';\n\nexport type SubqlProjectDs = SubqlEthereumDataSource & {\n mapping: SubqlEthereumDataSource['mapping'] & { entryScript: string };\n};\n\nexport type SubqlProjectBlockFilter = EthereumBlockFilter & {\n cronSchedule?: {\n schedule: Cron.Seeker;\n next: number;\n };\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\n const templates = await loadProjectTemplates(projectManifest, root, reader);\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\nasync function loadProjectTemplates(\n projectManifest: ProjectManifestV1_0_0Impl,\n root: string,\n reader: Reader,\n): Promise<SubqlProjectDsTemplate[]> {\n if (projectManifest.templates && projectManifest.templates.length !== 0) {\n const dsTemplates = await updateDataSourcesV0_2_0(\n projectManifest.templates,\n reader,\n root,\n );\n return dsTemplates.map((ds, index) => ({\n ...ds,\n name: projectManifest.templates[index].name,\n }));\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await\nexport async function generateTimestampReferenceForBlockFilters(\n dataSources: SubqlProjectDs[],\n api: EthereumApi,\n): Promise<SubqlProjectDs[]> {\n const cron = new Cron();\n\n dataSources = await Promise.all(\n dataSources.map(async (ds) => {\n if (isRuntimeDs(ds)) {\n const startBlock = ds.startBlock ?? 1;\n let block: Block;\n let timestampReference: Date;\n\n ds.mapping.handlers = await Promise.all(\n ds.mapping.handlers.map(async (handler) => {\n if (handler.kind === EthereumHandlerKind.Block) {\n if (handler.filter?.timestamp) {\n if (!block) {\n block = await api.getBlockByHeight(startBlock);\n timestampReference = new Date(block.timestamp * 1000); // Add millis\n }\n try {\n cron.fromString(handler.filter.timestamp);\n } catch (e) {\n throw new Error(\n `Invalid Cron string: ${handler.filter.timestamp}`,\n );\n }\n\n const schedule = cron.schedule(timestampReference);\n (handler.filter as SubqlProjectBlockFilter).cronSchedule = {\n schedule: schedule,\n get next() {\n return Date.parse(this.schedule.next().format());\n },\n };\n }\n }\n return handler;\n }),\n );\n }\n return ds;\n }),\n );\n\n return dataSources;\n}\n"]}
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 { Block } from '@ethersproject/abstract-provider';\nimport { Injectable } from '@nestjs/common';\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 EthereumBlockFilter,\n ProjectManifestV1_0_0Impl,\n isRuntimeDs,\n EthereumHandlerKind,\n} from '@subql/common-ethereum';\nimport { buildSchemaFromString } from '@subql/utils';\nimport Cron from 'cron-converter';\nimport { GraphQLSchema } from 'graphql';\nimport { EthereumApi } from '../ethereum/api.ethereum';\nimport {\n getChainTypes,\n getProjectRoot,\n updateDataSourcesV0_2_0,\n} from '../utils/project';\n// import { getBlockByHeight, getTimestamp } from '../utils/substrate';\n\nexport type SubqlProjectDs = SubqlEthereumDataSource & {\n mapping: SubqlEthereumDataSource['mapping'] & { entryScript: string };\n};\n\nexport type SubqlProjectBlockFilter = EthereumBlockFilter & {\n cronSchedule?: {\n schedule: Cron.Seeker;\n next: number;\n };\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\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 = EthereumProjectNetworkConfig & { chainId: string };\n\n@Injectable()\nexport class SubqueryProject {\n id: string;\n root: string;\n network: NetworkConfig;\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\nfunction processChainId(network: any): NetworkConfig {\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 if (typeof projectManifest.network.endpoint === 'string') {\n projectManifest.network.endpoint = [projectManifest.network.endpoint];\n }\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\n const templates = await loadProjectTemplates(projectManifest, root, reader);\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 (!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\nasync function loadProjectTemplates(\n projectManifest: ProjectManifestV1_0_0Impl,\n root: string,\n reader: Reader,\n): Promise<SubqlProjectDsTemplate[]> {\n if (projectManifest.templates && projectManifest.templates.length !== 0) {\n const dsTemplates = await updateDataSourcesV0_2_0(\n projectManifest.templates,\n reader,\n root,\n );\n return dsTemplates.map((ds, index) => ({\n ...ds,\n name: projectManifest.templates[index].name,\n }));\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await\nexport async function generateTimestampReferenceForBlockFilters(\n dataSources: SubqlProjectDs[],\n api: EthereumApi,\n): Promise<SubqlProjectDs[]> {\n const cron = new Cron();\n\n dataSources = await Promise.all(\n dataSources.map(async (ds) => {\n if (isRuntimeDs(ds)) {\n const startBlock = ds.startBlock ?? 1;\n let block: Block;\n let timestampReference: Date;\n\n ds.mapping.handlers = await Promise.all(\n ds.mapping.handlers.map(async (handler) => {\n if (handler.kind === EthereumHandlerKind.Block) {\n if (handler.filter?.timestamp) {\n if (!block) {\n block = await api.getBlockByHeightOrHash(startBlock);\n timestampReference = new Date(block.timestamp * 1000); // Add millis\n }\n try {\n cron.fromString(handler.filter.timestamp);\n } catch (e) {\n throw new Error(\n `Invalid Cron string: ${handler.filter.timestamp}`,\n );\n }\n\n const schedule = cron.schedule(timestampReference);\n (handler.filter as SubqlProjectBlockFilter).cronSchedule = {\n schedule: schedule,\n get next() {\n return Date.parse(this.schedule.next().format());\n },\n };\n }\n }\n return handler;\n }),\n );\n }\n return ds;\n }),\n );\n\n return dataSources;\n}\n"]}
@@ -22,9 +22,7 @@ const lodash_1 = require("lodash");
22
22
  const yargs_1 = require("../yargs");
23
23
  const SubqueryProject_1 = require("./SubqueryProject");
24
24
  const logger = (0, node_core_1.getLogger)('configure');
25
- const YargsNameMapping = {
26
- local: 'localMode',
27
- };
25
+ const YargsNameMapping = {};
28
26
  function yargsToIConfig(yargs) {
29
27
  return Object.entries(yargs).reduce((acc, [key, value]) => {
30
28
  var _a;
@@ -89,7 +87,7 @@ let ConfigureModule = ConfigureModule_1 = class ConfigureModule {
89
87
  }
90
88
  const project = async () => {
91
89
  const p = await SubqueryProject_1.SubqueryProject.create(config.subquery, (0, lodash_1.omitBy)({
92
- endpoint: config.networkEndpoint,
90
+ endpoint: config.networkEndpoints,
93
91
  dictionary: config.networkDictionary,
94
92
  }, lodash_1.isNil), {
95
93
  ipfs: config.ipfs,
@@ -138,7 +136,7 @@ let ConfigureModule = ConfigureModule_1 = class ConfigureModule {
138
136
  }
139
137
  const project = async () => {
140
138
  const p = await SubqueryProject_1.SubqueryProject.create(argv.subquery, (0, lodash_1.omitBy)({
141
- endpoint: config.networkEndpoint,
139
+ endpoint: config.networkEndpoints,
142
140
  dictionary: config.networkDictionary,
143
141
  }, lodash_1.isNil), {
144
142
  ipfs: config.ipfs,
@@ -156,11 +154,11 @@ let ConfigureModule = ConfigureModule_1 = class ConfigureModule {
156
154
  useValue: config,
157
155
  },
158
156
  {
159
- provide: SubqueryProject_1.SubqueryProject,
157
+ provide: 'ISubqueryProject',
160
158
  useFactory: project,
161
159
  },
162
160
  ],
163
- exports: [node_core_1.NodeConfig, SubqueryProject_1.SubqueryProject],
161
+ exports: [node_core_1.NodeConfig, 'ISubqueryProject'],
164
162
  };
165
163
  }
166
164
  };
@@ -1 +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"]}
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\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.networkEndpoints,\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.networkEndpoints,\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: 'ISubqueryProject',\n useFactory: project,\n },\n ],\n exports: [NodeConfig, 'ISubqueryProject'],\n };\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { EventEmitter2 } from '@nestjs/event-emitter';
2
+ import { ApiConnection } from '@subql/node-core';
3
+ import { EthereumApi } from './api.ethereum';
4
+ export declare class EthereumApiConnection implements ApiConnection {
5
+ private _api;
6
+ private constructor();
7
+ static create(endpoint: string, eventEmitter: EventEmitter2): Promise<EthereumApiConnection>;
8
+ get api(): EthereumApi;
9
+ apiConnect(): Promise<void>;
10
+ apiDisconnect(): Promise<void>;
11
+ }
@@ -0,0 +1,27 @@
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.EthereumApiConnection = void 0;
6
+ const api_ethereum_1 = require("./api.ethereum");
7
+ class EthereumApiConnection {
8
+ constructor(_api) {
9
+ this._api = _api;
10
+ }
11
+ static async create(endpoint, eventEmitter) {
12
+ const api = new api_ethereum_1.EthereumApi(endpoint, eventEmitter);
13
+ await api.init();
14
+ return new EthereumApiConnection(api);
15
+ }
16
+ get api() {
17
+ return this._api;
18
+ }
19
+ async apiConnect() {
20
+ await this._api.connect();
21
+ }
22
+ async apiDisconnect() {
23
+ await this._api.disconnect();
24
+ }
25
+ }
26
+ exports.EthereumApiConnection = EthereumApiConnection;
27
+ //# sourceMappingURL=api.connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.connection.js","sourceRoot":"","sources":["../../src/ethereum/api.connection.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;AAItC,iDAA6C;AAE7C,MAAa,qBAAqB;IAChC,YAA4B,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;IAAG,CAAC;IAEjD,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,QAAgB,EAChB,YAA2B;QAE3B,MAAM,GAAG,GAAG,IAAI,0BAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEpD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,OAAO,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;IACD,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAC/B,CAAC;CACF;AAxBD,sDAwBC","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { ApiConnection } from '@subql/node-core';\nimport { EthereumApi } from './api.ethereum';\n\nexport class EthereumApiConnection implements ApiConnection {\n private constructor(private _api: EthereumApi) {}\n\n static async create(\n endpoint: string,\n eventEmitter: EventEmitter2,\n ): Promise<EthereumApiConnection> {\n const api = new EthereumApi(endpoint, eventEmitter);\n\n await api.init();\n\n return new EthereumApiConnection(api);\n }\n\n get api(): EthereumApi {\n return this._api;\n }\n\n async apiConnect(): Promise<void> {\n await this._api.connect();\n }\n async apiDisconnect(): Promise<void> {\n await this._api.disconnect();\n }\n}\n"]}
@@ -1,24 +1,37 @@
1
- import { Block } from '@ethersproject/abstract-provider';
1
+ import { Block, TransactionReceipt } from '@ethersproject/abstract-provider';
2
+ import { EventEmitter2 } from '@nestjs/event-emitter';
2
3
  import { RuntimeDataSourceV0_2_0 } from '@subql/common-ethereum';
3
4
  import { ApiWrapper, BlockWrapper, EthereumBlockWrapper, EthereumTransaction, EthereumResult, EthereumLog } from '@subql/types-ethereum';
5
+ import { EthereumBlockWrapped } from './block.ethereum';
4
6
  export declare class EthereumApi implements ApiWrapper<EthereumBlockWrapper> {
5
7
  private endpoint;
8
+ private eventEmitter;
6
9
  private client;
10
+ private nonBatchClient?;
7
11
  private genesisBlock;
8
12
  private contractInterfaces;
9
13
  private chainId;
10
- constructor(endpoint: string);
14
+ private supportsFinalization;
15
+ private blockConfirmations;
16
+ constructor(endpoint: string, eventEmitter: EventEmitter2);
11
17
  init(): Promise<void>;
12
- getLastHeight(): Promise<number>;
18
+ private injectClient;
19
+ getFinalizedBlockHeight(): Promise<number>;
20
+ getBestBlockHeight(): Promise<number>;
13
21
  getRuntimeChain(): string;
14
22
  getChainId(): number;
15
23
  getGenesisHash(): string;
16
24
  getSpecName(): string;
17
- getFinalizedBlockHeight(): Promise<number>;
18
- getBlockByHeight(height: number): Promise<Block>;
25
+ getBlockByHeightOrHash(heightOrHash: number | string): Promise<Block>;
26
+ private getBlockPromise;
27
+ getTransactionReceipt(transactionHash: string | Promise<string>): Promise<TransactionReceipt>;
28
+ fetchBlock(blockNumber: number, includeTx?: boolean): Promise<EthereumBlockWrapped>;
19
29
  fetchBlocks(bufferBlocks: number[]): Promise<EthereumBlockWrapper[]>;
20
30
  freezeApi(processor: any, blockContent: BlockWrapper): void;
21
31
  private buildInterface;
22
32
  parseLog<T extends EthereumResult = EthereumResult>(log: EthereumLog, ds: RuntimeDataSourceV0_2_0): Promise<EthereumLog<T> | EthereumLog>;
23
33
  parseTransaction<T extends EthereumResult = EthereumResult>(transaction: EthereumTransaction, ds: RuntimeDataSourceV0_2_0): Promise<EthereumTransaction<T> | EthereumTransaction>;
34
+ connect(): Promise<void>;
35
+ disconnect(): Promise<void>;
36
+ handleError(e: Error): Error;
24
37
  }
@@ -12,11 +12,15 @@ const https_1 = __importDefault(require("https"));
12
12
  const abi_1 = require("@ethersproject/abi");
13
13
  const providers_1 = require("@ethersproject/providers");
14
14
  const node_core_1 = require("@subql/node-core");
15
+ const cacheable_lookup_1 = __importDefault(require("cacheable-lookup"));
15
16
  const utils_1 = require("ethers/lib/utils");
17
+ const project_1 = require("../utils/project");
18
+ const yargs_1 = require("../yargs");
16
19
  const block_ethereum_1 = require("./block.ethereum");
20
+ const json_rpc_batch_provider_1 = require("./ethers/json-rpc-batch-provider");
21
+ const json_rpc_provider_1 = require("./ethers/json-rpc-provider");
22
+ const safe_api_1 = __importDefault(require("./safe-api"));
17
23
  const utils_ethereum_1 = require("./utils.ethereum");
18
- const Web3HttpProvider = require('web3-providers-http');
19
- const Web3WsProvider = require('web3-providers-ws');
20
24
  // eslint-disable-next-line @typescript-eslint/no-var-requires
21
25
  const { version: packageVersion } = require('../../package.json');
22
26
  const logger = (0, node_core_1.getLogger)('api.ethereum');
@@ -35,68 +39,91 @@ async function loadAssets(ds) {
35
39
  }
36
40
  return res;
37
41
  }
42
+ function getHttpAgents() {
43
+ // By default Nodejs doesn't cache DNS lookups
44
+ // https://httptoolkit.com/blog/configuring-nodejs-dns/
45
+ const lookup = new cacheable_lookup_1.default();
46
+ const options = {
47
+ keepAlive: true,
48
+ /*, maxSockets: 100*/
49
+ };
50
+ const httpAgent = new http_1.default.Agent(options);
51
+ const httpsAgent = new https_1.default.Agent(options);
52
+ lookup.install(httpAgent);
53
+ lookup.install(httpsAgent);
54
+ return {
55
+ http: httpAgent,
56
+ https: httpsAgent,
57
+ };
58
+ }
38
59
  class EthereumApi {
39
- constructor(endpoint) {
60
+ constructor(endpoint, eventEmitter) {
40
61
  this.endpoint = endpoint;
62
+ this.eventEmitter = eventEmitter;
41
63
  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 });
64
+ // Ethereum POS
65
+ this.supportsFinalization = true;
66
+ this.blockConfirmations = yargs_1.yargsOptions.argv['block-confirmations'];
67
+ const { hostname, protocol, searchParams } = new URL(endpoint);
45
68
  const protocolStr = protocol.replace(':', '');
46
- const portNum = port
47
- ? parseInt(port, 10)
48
- : protocolStr === 'https'
49
- ? undefined
50
- : 80;
51
- let provider;
69
+ logger.info(`Api host: ${hostname}, method: ${protocolStr}`);
52
70
  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 = {
71
+ const connection = {
72
+ url: this.endpoint.split('?')[0],
73
73
  headers: {
74
74
  'User-Agent': `Subquery-Node ${packageVersion}`,
75
75
  },
76
- clientConfig: {
77
- keepAlive: true,
78
- },
76
+ allowGzip: true,
77
+ throttleLimit: 5,
78
+ throttleSlotInterval: 1,
79
+ agents: getHttpAgents(),
79
80
  };
80
- if (searchParams.apiKey) {
81
- options.headers.apiKey = searchParams.get('apiKey');
82
- }
83
- provider = new Web3WsProvider(endpoint, options);
81
+ searchParams.forEach((value, name, searchParams) => {
82
+ connection.headers[name] = value;
83
+ });
84
+ this.client = new json_rpc_batch_provider_1.JsonRpcBatchProvider(connection);
85
+ this.nonBatchClient = new json_rpc_provider_1.JsonRpcProvider(connection);
86
+ }
87
+ else if (protocolStr === 'ws' || protocolStr === 'wss') {
88
+ this.client = new providers_1.WebSocketProvider(this.endpoint);
84
89
  }
85
90
  else {
86
91
  throw new Error(`Unsupported protocol: ${protocol}`);
87
92
  }
88
- this.client = new providers_1.Web3Provider(provider);
89
93
  }
90
94
  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', []);
95
+ this.injectClient();
96
+ this.genesisBlock = await this.client.getBlock(0);
97
+ const network = await this.client.getNetwork();
98
+ this.chainId = network.chainId;
99
+ }
100
+ injectClient() {
101
+ const orig = this.client.send.bind(this.client);
102
+ Object.defineProperty(this.client, 'send', {
103
+ value: (...args) => {
104
+ this.eventEmitter.emit('rpcCall');
105
+ return orig(...args);
106
+ },
107
+ });
108
+ }
109
+ async getFinalizedBlockHeight() {
110
+ try {
111
+ if (this.supportsFinalization) {
112
+ return (await this.client.getBlock('finalized')).number;
113
+ }
114
+ else {
115
+ return (await this.getBestBlockHeight()) - this.blockConfirmations;
116
+ }
117
+ }
118
+ catch (e) {
119
+ // TODO handle specific error for this
120
+ this.supportsFinalization = false;
121
+ return this.getFinalizedBlockHeight();
122
+ }
97
123
  }
98
- async getLastHeight() {
99
- return this.client.getBlockNumber();
124
+ async getBestBlockHeight() {
125
+ const tag = this.supportsFinalization ? 'safe' : 'latest';
126
+ return (await this.client.getBlock(tag)).number;
100
127
  }
101
128
  getRuntimeChain() {
102
129
  return 'ethereum';
@@ -110,44 +137,54 @@ class EthereumApi {
110
137
  getSpecName() {
111
138
  return 'ethereum';
112
139
  }
113
- async getFinalizedBlockHeight() {
114
- // Doesn't seem to be a difference between finalized and latest
115
- return this.client.getBlockNumber();
140
+ async getBlockByHeightOrHash(heightOrHash) {
141
+ if (typeof heightOrHash === 'number') {
142
+ heightOrHash = (0, utils_1.hexValue)(heightOrHash);
143
+ }
144
+ return this.client.getBlock(heightOrHash);
145
+ }
146
+ async getBlockPromise(num, includeTx = true) {
147
+ const rawBlock = await this.client.send('eth_getBlockByNumber', [
148
+ (0, utils_1.hexValue)(num),
149
+ includeTx,
150
+ ]);
151
+ const block = (0, utils_ethereum_1.formatBlock)(rawBlock);
152
+ block.stateRoot = this.client.formatter.hash(block.stateRoot);
153
+ return block;
154
+ }
155
+ async getTransactionReceipt(transactionHash) {
156
+ return (0, project_1.retryOnFailEth)(this.client.getTransactionReceipt.bind(this.client, transactionHash));
116
157
  }
117
- async getBlockByHeight(height) {
118
- return this.client.getBlock(height);
158
+ async fetchBlock(blockNumber, includeTx) {
159
+ try {
160
+ const [block, logs] = await Promise.all([
161
+ this.getBlockPromise(blockNumber, includeTx),
162
+ this.client.getLogs({
163
+ fromBlock: (0, utils_1.hexValue)(blockNumber),
164
+ toBlock: (0, utils_1.hexValue)(blockNumber),
165
+ }),
166
+ ]);
167
+ const ret = new block_ethereum_1.EthereumBlockWrapped(block, includeTx
168
+ ? block.transactions.map((tx) => (Object.assign(Object.assign({}, (0, utils_ethereum_1.formatTransaction)(tx)), {
169
+ // TODO memoise
170
+ receipt: () => this.getTransactionReceipt(tx.hash).then((r) => (0, utils_ethereum_1.formatReceipt)(r, block)) })))
171
+ : [], logs.map((l) => (0, utils_ethereum_1.formatLog)(l, block)));
172
+ this.eventEmitter.emit('fetchBlock');
173
+ return ret;
174
+ }
175
+ catch (e) {
176
+ throw this.handleError(e);
177
+ }
119
178
  }
120
179
  async fetchBlocks(bufferBlocks) {
121
- return Promise.all(bufferBlocks.map(async (num) => {
122
- try {
123
- // Fetch Block
124
- const block_promise = await this.client.send('eth_getBlockByNumber', [
125
- (0, utils_1.hexValue)(num),
126
- true,
127
- ]);
128
- const block = (0, utils_ethereum_1.formatBlock)(block_promise);
129
- //const block = this.client.formatter.blockWithTransactions(rawBlock);
130
- block.stateRoot = this.client.formatter.hash(block.stateRoot);
131
- // Get transaction receipts
132
- const transactions = await Promise.all(block.transactions.map(async (tx) => {
133
- //logger.info(JSON.stringify(tx))
134
- const transaction = (0, utils_ethereum_1.formatTransaction)(tx);
135
- const receipt = await this.client.send('eth_getTransactionReceipt', [tx.hash]);
136
- transaction.receipt = (0, utils_ethereum_1.formatReceipt)(receipt, block);
137
- return transaction;
138
- }));
139
- return new block_ethereum_1.EthereumBlockWrapped(block, transactions);
140
- }
141
- catch (e) {
142
- // Wrap error from an axios error to fix issue with error being undefined
143
- const error = new Error(e.message);
144
- logger.error(error, `Failed to fetch block at height ${num}`);
145
- throw error;
146
- }
147
- }));
180
+ return Promise.all(bufferBlocks.map(async (num) => this.fetchBlock(num, true)));
148
181
  }
149
182
  freezeApi(processor, blockContent) {
150
- processor.freeze(this.client, 'api');
183
+ // We cannot use a batch http client because OnF don't support routing historical queries in batches to an archive nodes
184
+ const client = this.client instanceof providers_1.WebSocketProvider
185
+ ? this.client
186
+ : this.nonBatchClient;
187
+ processor.freeze(new safe_api_1.default(client, blockContent.blockHeight), 'api');
151
188
  }
152
189
  buildInterface(abiName, assets) {
153
190
  if (!assets[abiName]) {
@@ -207,6 +244,26 @@ class EthereumApi {
207
244
  return transaction;
208
245
  }
209
246
  }
247
+ // eslint-disable-next-line @typescript-eslint/require-await
248
+ async connect() {
249
+ logger.error('Ethereum API connect is not implemented');
250
+ throw new Error('Not implemented');
251
+ }
252
+ async disconnect() {
253
+ if (this.client instanceof providers_1.WebSocketProvider) {
254
+ await this.client.destroy();
255
+ }
256
+ else {
257
+ logger.warn('Disconnect called on HTTP provider');
258
+ }
259
+ }
260
+ handleError(e) {
261
+ if ((e === null || e === void 0 ? void 0 : e.status) === 429) {
262
+ const { hostname } = new URL(this.endpoint);
263
+ return new Error(`Rate Limited at endpoint: ${hostname}`);
264
+ }
265
+ return e;
266
+ }
210
267
  }
211
268
  exports.EthereumApi = EthereumApi;
212
269
  //# sourceMappingURL=api.ethereum.js.map