@subql/node-ethereum 2.6.2-3 → 2.6.2-4

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.
@@ -36,7 +36,6 @@ let DynamicDsService = class DynamicDsService extends node_core_1.DynamicDsServi
36
36
  throw new Error(`Unable to find matching template in project for name: "${params.templateName}"`);
37
37
  }
38
38
  const dsObj = Object.assign(Object.assign({}, template), { startBlock: params.startBlock });
39
- delete dsObj.name;
40
39
  try {
41
40
  if ((0, common_ethereum_1.isCustomDs)(dsObj)) {
42
41
  dsObj.processor.options = Object.assign(Object.assign({}, dsObj.processor.options), params.args);
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-ds.service.js","sourceRoot":"","sources":["../../src/indexer/dynamic-ds.service.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;;;;;;;AAEtC,2CAAoD;AACpD,4DAIgC;AAChC,gDAG0B;AAC1B,yDAAiD;AACjD,qDAA+C;AAC/C,mCAAmC;AACnC,kEAA+E;AAC/E,iEAA4D;AAGrD,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,4BAAoC;IACxE,YACmB,kBAAsC,EACV,OAAwB;QAErE,KAAK,EAAE,CAAC;QAHS,uBAAkB,GAAlB,kBAAkB,CAAoB;QACV,YAAO,GAAP,OAAO,CAAiB;IAGvE,CAAC;IAES,KAAK,CAAC,aAAa,CAC3B,MAAwB;;QAExB,MAAM,QAAQ,GAAG,IAAA,kBAAS,EACxB,MAAA,IAAI,CAAC,OAAO,CAAC,SAAS,0CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,YAAY,CAAC,CACpE,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,IAAI,KAAK,CACb,0DAA0D,MAAM,CAAC,YAAY,GAAG,CACjF,CAAC;SACH;QAED,MAAM,KAAK,GAAG,gCACT,QAAQ,KACX,UAAU,EAAE,MAAM,CAAC,UAAU,GACZ,CAAC;QACpB,OAAO,KAAK,CAAC,IAAI,CAAC;QAClB,IAAI;YACF,IAAI,IAAA,4BAAU,EAAC,KAAK,CAAC,EAAE;gBACrB,KAAK,CAAC,SAAS,CAAC,OAAO,mCAClB,KAAK,CAAC,SAAS,CAAC,OAAO,GACvB,MAAM,CAAC,IAAI,CACf,CAAC;gBACF,MAAM,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;aACzD;iBAAM,IAAI,IAAA,6BAAW,EAAC,KAAK,CAAC,EAAE;gBAC7B,KAAK,CAAC,OAAO,mCACR,KAAK,CAAC,OAAO,GACb,MAAM,CAAC,IAAI,CACf,CAAC;gBAEF,MAAM,QAAQ,GAAG,IAAA,gCAAY,EAAC,+CAA6B,EAAE,KAAK,CAAC,CAAC;gBAEpE,MAAM,MAAM,GAAG,IAAA,8BAAY,EAAC,QAAQ,EAAE;oBACpC,SAAS,EAAE,IAAI;oBACf,oBAAoB,EAAE,KAAK;iBAC5B,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,MAAM,EAAE;oBACjB,MAAM,IAAI,KAAK,CACb,0BAA0B,MAAM;yBAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;yBACxB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;iBACH;aACF;YACD,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;SACxE;IACH,CAAC;CACF,CAAA;AA1DY,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;IAIR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCADU,yCAAkB;QACD,iCAAe;GAH5D,gBAAgB,CA0D5B;AA1DY,4CAAgB","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n EthereumRuntimeDataSourceImpl,\n isCustomDs,\n isRuntimeDs,\n} from '@subql/common-ethereum';\nimport {\n DatasourceParams,\n DynamicDsService as BaseDynamicDsService,\n} from '@subql/node-core';\nimport { plainToClass } from 'class-transformer';\nimport { validateSync } from 'class-validator';\nimport { cloneDeep } from 'lodash';\nimport { SubqlProjectDs, SubqueryProject } from '../configure/SubqueryProject';\nimport { DsProcessorService } from './ds-processor.service';\n\n@Injectable()\nexport class DynamicDsService extends BaseDynamicDsService<SubqlProjectDs> {\n constructor(\n private readonly dsProcessorService: DsProcessorService,\n @Inject('ISubqueryProject') private readonly project: SubqueryProject,\n ) {\n super();\n }\n\n protected async getDatasource(\n params: DatasourceParams,\n ): Promise<SubqlProjectDs> {\n const template = cloneDeep(\n this.project.templates?.find((t) => t.name === params.templateName),\n );\n\n if (!template) {\n throw new Error(\n `Unable to find matching template in project for name: \"${params.templateName}\"`,\n );\n }\n\n const dsObj = {\n ...template,\n startBlock: params.startBlock,\n } as SubqlProjectDs;\n delete dsObj.name;\n try {\n if (isCustomDs(dsObj)) {\n dsObj.processor.options = {\n ...dsObj.processor.options,\n ...params.args,\n };\n await this.dsProcessorService.validateCustomDs([dsObj]);\n } else if (isRuntimeDs(dsObj)) {\n dsObj.options = {\n ...dsObj.options,\n ...params.args,\n };\n\n const parsedDs = plainToClass(EthereumRuntimeDataSourceImpl, dsObj);\n\n const errors = validateSync(parsedDs, {\n whitelist: true,\n forbidNonWhitelisted: false,\n });\n if (errors.length) {\n throw new Error(\n `Dynamic ds is invalid\\n${errors\n .map((e) => e.toString())\n .join('\\n')}`,\n );\n }\n }\n return dsObj;\n } catch (e) {\n throw new Error(`Unable to create dynamic datasource.\\n ${e.message}`);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"dynamic-ds.service.js","sourceRoot":"","sources":["../../src/indexer/dynamic-ds.service.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;;;;;;;AAEtC,2CAAoD;AACpD,4DAIgC;AAChC,gDAG0B;AAC1B,yDAAiD;AACjD,qDAA+C;AAC/C,mCAAmC;AACnC,kEAA+E;AAC/E,iEAA4D;AAGrD,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,4BAAoC;IACxE,YACmB,kBAAsC,EACV,OAAwB;QAErE,KAAK,EAAE,CAAC;QAHS,uBAAkB,GAAlB,kBAAkB,CAAoB;QACV,YAAO,GAAP,OAAO,CAAiB;IAGvE,CAAC;IAES,KAAK,CAAC,aAAa,CAC3B,MAAwB;;QAExB,MAAM,QAAQ,GAAG,IAAA,kBAAS,EACxB,MAAA,IAAI,CAAC,OAAO,CAAC,SAAS,0CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,YAAY,CAAC,CACpE,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,IAAI,KAAK,CACb,0DAA0D,MAAM,CAAC,YAAY,GAAG,CACjF,CAAC;SACH;QAED,MAAM,KAAK,GAAG,gCACT,QAAQ,KACX,UAAU,EAAE,MAAM,CAAC,UAAU,GACZ,CAAC;QACpB,IAAI;YACF,IAAI,IAAA,4BAAU,EAAC,KAAK,CAAC,EAAE;gBACrB,KAAK,CAAC,SAAS,CAAC,OAAO,mCAClB,KAAK,CAAC,SAAS,CAAC,OAAO,GACvB,MAAM,CAAC,IAAI,CACf,CAAC;gBACF,MAAM,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;aACzD;iBAAM,IAAI,IAAA,6BAAW,EAAC,KAAK,CAAC,EAAE;gBAC7B,KAAK,CAAC,OAAO,mCACR,KAAK,CAAC,OAAO,GACb,MAAM,CAAC,IAAI,CACf,CAAC;gBAEF,MAAM,QAAQ,GAAG,IAAA,gCAAY,EAAC,+CAA6B,EAAE,KAAK,CAAC,CAAC;gBAEpE,MAAM,MAAM,GAAG,IAAA,8BAAY,EAAC,QAAQ,EAAE;oBACpC,SAAS,EAAE,IAAI;oBACf,oBAAoB,EAAE,KAAK;iBAC5B,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,MAAM,EAAE;oBACjB,MAAM,IAAI,KAAK,CACb,0BAA0B,MAAM;yBAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;yBACxB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;iBACH;aACF;YACD,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;SACxE;IACH,CAAC;CACF,CAAA;AAzDY,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;IAIR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCADU,yCAAkB;QACD,iCAAe;GAH5D,gBAAgB,CAyD5B;AAzDY,4CAAgB","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n EthereumRuntimeDataSourceImpl,\n isCustomDs,\n isRuntimeDs,\n} from '@subql/common-ethereum';\nimport {\n DatasourceParams,\n DynamicDsService as BaseDynamicDsService,\n} from '@subql/node-core';\nimport { plainToClass } from 'class-transformer';\nimport { validateSync } from 'class-validator';\nimport { cloneDeep } from 'lodash';\nimport { SubqlProjectDs, SubqueryProject } from '../configure/SubqueryProject';\nimport { DsProcessorService } from './ds-processor.service';\n\n@Injectable()\nexport class DynamicDsService extends BaseDynamicDsService<SubqlProjectDs> {\n constructor(\n private readonly dsProcessorService: DsProcessorService,\n @Inject('ISubqueryProject') private readonly project: SubqueryProject,\n ) {\n super();\n }\n\n protected async getDatasource(\n params: DatasourceParams,\n ): Promise<SubqlProjectDs> {\n const template = cloneDeep(\n this.project.templates?.find((t) => t.name === params.templateName),\n );\n\n if (!template) {\n throw new Error(\n `Unable to find matching template in project for name: \"${params.templateName}\"`,\n );\n }\n\n const dsObj = {\n ...template,\n startBlock: params.startBlock,\n } as SubqlProjectDs;\n try {\n if (isCustomDs(dsObj)) {\n dsObj.processor.options = {\n ...dsObj.processor.options,\n ...params.args,\n };\n await this.dsProcessorService.validateCustomDs([dsObj]);\n } else if (isRuntimeDs(dsObj)) {\n dsObj.options = {\n ...dsObj.options,\n ...params.args,\n };\n\n const parsedDs = plainToClass(EthereumRuntimeDataSourceImpl, dsObj);\n\n const errors = validateSync(parsedDs, {\n whitelist: true,\n forbidNonWhitelisted: false,\n });\n if (errors.length) {\n throw new Error(\n `Dynamic ds is invalid\\n${errors\n .map((e) => e.toString())\n .join('\\n')}`,\n );\n }\n }\n return dsObj;\n } catch (e) {\n throw new Error(`Unable to create dynamic datasource.\\n ${e.message}`);\n }\n }\n}\n"]}
@@ -2,8 +2,66 @@
2
2
  // Copyright 2020-2022 OnFinality Limited authors & contributors
3
3
  // SPDX-License-Identifier: Apache-2.0
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
+ const node_core_1 = require("@subql/node-core");
5
6
  const types_ethereum_1 = require("@subql/types-ethereum");
7
+ const graphql_1 = require("graphql");
8
+ const ds_processor_service_1 = require("./ds-processor.service");
9
+ const dynamic_ds_service_1 = require("./dynamic-ds.service");
6
10
  const fetch_service_1 = require("./fetch.service");
11
+ const HTTP_ENDPOINT = 'https://eth.api.onfinality.io/public';
12
+ const mockTempDs = [
13
+ {
14
+ name: 'ERC721',
15
+ kind: types_ethereum_1.EthereumDatasourceKind.Runtime,
16
+ assets: new Map(),
17
+ mapping: {
18
+ entryScript: '',
19
+ file: '',
20
+ handlers: [
21
+ {
22
+ handler: 'handleERC721',
23
+ kind: types_ethereum_1.EthereumHandlerKind.Event,
24
+ filter: {
25
+ topics: ['Transfer(address, address, uint256)'],
26
+ },
27
+ },
28
+ ],
29
+ },
30
+ },
31
+ {
32
+ name: 'ERC1155',
33
+ kind: types_ethereum_1.EthereumDatasourceKind.Runtime,
34
+ assets: new Map(),
35
+ mapping: {
36
+ entryScript: '',
37
+ file: '',
38
+ handlers: [
39
+ {
40
+ handler: 'handleERC1155',
41
+ kind: types_ethereum_1.EthereumHandlerKind.Event,
42
+ filter: {
43
+ topics: [
44
+ 'TransferSingle(address, address, address, uint256, uint256)',
45
+ ],
46
+ },
47
+ },
48
+ ],
49
+ },
50
+ },
51
+ ];
52
+ function testSubqueryProject(endpoint, ds, mockTempDs) {
53
+ return {
54
+ network: {
55
+ endpoint,
56
+ chainId: '1',
57
+ },
58
+ dataSources: ds,
59
+ id: 'test',
60
+ root: './',
61
+ schema: new graphql_1.GraphQLSchema({}),
62
+ templates: mockTempDs,
63
+ };
64
+ }
7
65
  describe('Dictioanry queries', () => {
8
66
  describe('Transaction filters', () => {
9
67
  it('Build a filter for contract creation transactions', () => {
@@ -33,5 +91,132 @@ describe('Dictioanry queries', () => {
33
91
  ]);
34
92
  });
35
93
  });
94
+ describe('Correct dictionary query with dynamic ds', () => {
95
+ it('Build correct erc1155 transfer single query', () => {
96
+ const ds = {
97
+ kind: types_ethereum_1.EthereumDatasourceKind.Runtime,
98
+ assets: new Map(),
99
+ startBlock: 1,
100
+ mapping: {
101
+ file: '',
102
+ handlers: [
103
+ {
104
+ handler: 'handleDyanmicDs',
105
+ kind: types_ethereum_1.EthereumHandlerKind.Event,
106
+ filter: {
107
+ topics: [
108
+ 'TransferSingle(address, address, address, uint256, uint256)',
109
+ ],
110
+ },
111
+ },
112
+ ],
113
+ },
114
+ };
115
+ const result = (0, fetch_service_1.buildDictionaryQueryEntries)([ds], 1);
116
+ expect(result).toEqual([
117
+ {
118
+ entity: 'evmLogs',
119
+ conditions: [
120
+ {
121
+ field: 'topics0',
122
+ value: '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62',
123
+ matcher: 'equalTo',
124
+ },
125
+ ],
126
+ },
127
+ ]);
128
+ });
129
+ it('Build dictionary query for multiple dictionary queries', async () => {
130
+ const nodeConfig = new node_core_1.NodeConfig({
131
+ subquery: '',
132
+ subqueryName: '',
133
+ });
134
+ const ds = {
135
+ kind: types_ethereum_1.EthereumDatasourceKind.Runtime,
136
+ assets: new Map(),
137
+ startBlock: 1,
138
+ mapping: {
139
+ file: '',
140
+ handlers: [
141
+ {
142
+ handler: 'handleDyanmicDs',
143
+ kind: types_ethereum_1.EthereumHandlerKind.Event,
144
+ filter: {
145
+ topics: [
146
+ 'TransferSingle(address, address, address, uint256, uint256)',
147
+ ],
148
+ },
149
+ },
150
+ ],
151
+ },
152
+ };
153
+ const project = testSubqueryProject(HTTP_ENDPOINT, ds, mockTempDs);
154
+ const dsProcessService = new ds_processor_service_1.DsProcessorService(project, nodeConfig);
155
+ const dynamicDsService = new dynamic_ds_service_1.DynamicDsService(dsProcessService, project);
156
+ const fetchService = new fetch_service_1.FetchService(null, null, project, null, null, dsProcessService, dynamicDsService, null, null, null);
157
+ const mockMetadataDS = [
158
+ {
159
+ templateName: 'ERC721',
160
+ args: { address: '0xc9aeee58550328a2462f758c8d47022ec53589c2' },
161
+ startBlock: 1,
162
+ },
163
+ {
164
+ templateName: 'ERC1155',
165
+ args: { address: '0x63228048121877a9e0f52020834a135074e8207c' },
166
+ startBlock: 1,
167
+ },
168
+ ];
169
+ jest
170
+ .spyOn(dynamicDsService, 'getDynamicDatasourceParams')
171
+ .mockResolvedValue(mockMetadataDS);
172
+ dynamicDsService.project.templates = mockTempDs;
173
+ const loadedDSResult = await dynamicDsService.getDynamicDatasources(); // mocks params to mockMetadataDS
174
+ fetchService.project.dataSources = [ds];
175
+ fetchService.templateDynamicDatasouces = loadedDSResult;
176
+ const dictionaryQueries = fetchService.buildDictionaryQueryEntries(1);
177
+ expect(dictionaryQueries).toEqual([
178
+ {
179
+ entity: 'evmLogs',
180
+ conditions: [
181
+ {
182
+ field: 'topics0',
183
+ value: '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62',
184
+ matcher: 'equalTo',
185
+ },
186
+ ],
187
+ },
188
+ {
189
+ entity: 'evmLogs',
190
+ conditions: [
191
+ {
192
+ field: 'address',
193
+ value: ['0xc9aeee58550328a2462f758c8d47022ec53589c2'],
194
+ matcher: 'in',
195
+ },
196
+ {
197
+ field: 'topics0',
198
+ value: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
199
+ matcher: 'equalTo',
200
+ },
201
+ ],
202
+ },
203
+ {
204
+ entity: 'evmLogs',
205
+ conditions: [
206
+ {
207
+ field: 'address',
208
+ value: ['0x63228048121877a9e0f52020834a135074e8207c'],
209
+ matcher: 'in',
210
+ },
211
+ {
212
+ field: 'topics0',
213
+ value: '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62',
214
+ matcher: 'equalTo',
215
+ },
216
+ ],
217
+ },
218
+ ]);
219
+ });
220
+ });
36
221
  });
37
222
  //# sourceMappingURL=fetch.service.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.service.spec.js","sourceRoot":"","sources":["../../src/indexer/fetch.service.spec.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;AAEtC,0DAI+B;AAC/B,mDAA8D;AAE9D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,EAAE,GAA2B;gBACjC,IAAI,EAAE,uCAAsB,CAAC,OAAO;gBACpC,MAAM,EAAE,IAAI,GAAG,EAAE;gBACjB,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE;oBACP,IAAI,EAAE,EAAE;oBACR,QAAQ,EAAE;wBACR;4BACE,OAAO,EAAE,mBAAmB;4BAC5B,IAAI,EAAE,oCAAmB,CAAC,IAAI;4BAC9B,MAAM,EAAE;gCACN,EAAE,EAAE,IAAI;6BACT;yBACF;qBACF;iBACF;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,2CAA2B,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAEpD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB;oBACE,MAAM,EAAE,iBAAiB;oBACzB,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;iBAC9D;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n EthereumDatasourceKind,\n EthereumHandlerKind,\n SubqlRuntimeDatasource,\n} from '@subql/types-ethereum';\nimport { buildDictionaryQueryEntries } from './fetch.service';\n\ndescribe('Dictioanry queries', () => {\n describe('Transaction filters', () => {\n it('Build a filter for contract creation transactions', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleTransaction',\n kind: EthereumHandlerKind.Call,\n filter: {\n to: null,\n },\n },\n ],\n },\n };\n\n const result = buildDictionaryQueryEntries([ds], 1);\n\n expect(result).toEqual([\n {\n entity: 'evmTransactions',\n conditions: [{ field: 'to', matcher: 'isNull', value: true }],\n },\n ]);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"fetch.service.spec.js","sourceRoot":"","sources":["../../src/indexer/fetch.service.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { NodeConfig } from '@subql/node-core';\nimport {\n EthereumDatasourceKind,\n EthereumHandlerKind,\n SubqlRuntimeDatasource,\n} from '@subql/types-ethereum';\nimport { GraphQLSchema } from 'graphql';\nimport {\n SubqlProjectDsTemplate,\n SubqueryProject,\n} from '../configure/SubqueryProject';\nimport { DsProcessorService } from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { buildDictionaryQueryEntries, FetchService } from './fetch.service';\n\nconst HTTP_ENDPOINT = 'https://eth.api.onfinality.io/public';\nconst mockTempDs: SubqlProjectDsTemplate[] = [\n {\n name: 'ERC721',\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n mapping: {\n entryScript: '',\n file: '',\n handlers: [\n {\n handler: 'handleERC721',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: ['Transfer(address, address, uint256)'],\n },\n },\n ],\n },\n },\n {\n name: 'ERC1155',\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n mapping: {\n entryScript: '',\n file: '',\n handlers: [\n {\n handler: 'handleERC1155',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: [\n 'TransferSingle(address, address, address, uint256, uint256)',\n ],\n },\n },\n ],\n },\n },\n];\n\nfunction testSubqueryProject(\n endpoint: string,\n ds: any,\n mockTempDs,\n): SubqueryProject {\n return {\n network: {\n endpoint,\n chainId: '1',\n },\n dataSources: ds as any,\n id: 'test',\n root: './',\n schema: new GraphQLSchema({}),\n templates: mockTempDs as any,\n };\n}\n\ndescribe('Dictioanry queries', () => {\n describe('Transaction filters', () => {\n it('Build a filter for contract creation transactions', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleTransaction',\n kind: EthereumHandlerKind.Call,\n filter: {\n to: null,\n },\n },\n ],\n },\n };\n\n const result = buildDictionaryQueryEntries([ds], 1);\n\n expect(result).toEqual([\n {\n entity: 'evmTransactions',\n conditions: [{ field: 'to', matcher: 'isNull', value: true }],\n },\n ]);\n });\n });\n describe('Correct dictionary query with dynamic ds', () => {\n it('Build correct erc1155 transfer single query', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleDyanmicDs',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: [\n 'TransferSingle(address, address, address, uint256, uint256)',\n ],\n },\n },\n ],\n },\n };\n const result = buildDictionaryQueryEntries([ds], 1);\n expect(result).toEqual([\n {\n entity: 'evmLogs',\n conditions: [\n {\n field: 'topics0',\n value:\n '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62',\n matcher: 'equalTo',\n },\n ],\n },\n ]);\n });\n\n it('Build dictionary query for multiple dictionary queries', async () => {\n const nodeConfig = new NodeConfig({\n subquery: '',\n subqueryName: '',\n });\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleDyanmicDs',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: [\n 'TransferSingle(address, address, address, uint256, uint256)',\n ],\n },\n },\n ],\n },\n };\n\n const project = testSubqueryProject(HTTP_ENDPOINT, ds, mockTempDs);\n\n const dsProcessService = new DsProcessorService(project, nodeConfig);\n\n const dynamicDsService = new DynamicDsService(dsProcessService, project);\n const fetchService = new FetchService(\n null,\n null,\n project,\n null,\n null,\n dsProcessService,\n dynamicDsService,\n null,\n null,\n null,\n );\n const mockMetadataDS = [\n {\n templateName: 'ERC721',\n args: { address: '0xc9aeee58550328a2462f758c8d47022ec53589c2' },\n startBlock: 1,\n },\n {\n templateName: 'ERC1155',\n args: { address: '0x63228048121877a9e0f52020834a135074e8207c' },\n startBlock: 1,\n },\n ];\n\n jest\n .spyOn(dynamicDsService as any, 'getDynamicDatasourceParams')\n .mockResolvedValue(mockMetadataDS);\n\n (dynamicDsService as any).project.templates = mockTempDs;\n const loadedDSResult = await (\n dynamicDsService as any\n ).getDynamicDatasources(); // mocks params to mockMetadataDS\n\n (fetchService as any).project.dataSources = [ds];\n (fetchService as any).templateDynamicDatasouces = loadedDSResult;\n\n const dictionaryQueries = (\n fetchService as any\n ).buildDictionaryQueryEntries(1);\n expect(dictionaryQueries).toEqual([\n {\n entity: 'evmLogs',\n conditions: [\n {\n field: 'topics0',\n value:\n '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62',\n matcher: 'equalTo',\n },\n ],\n },\n {\n entity: 'evmLogs',\n conditions: [\n {\n field: 'address',\n value: ['0xc9aeee58550328a2462f758c8d47022ec53589c2'],\n matcher: 'in',\n },\n {\n field: 'topics0',\n value:\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n matcher: 'equalTo',\n },\n ],\n },\n {\n entity: 'evmLogs',\n conditions: [\n {\n field: 'address',\n value: ['0x63228048121877a9e0f52020834a135074e8207c'],\n matcher: 'in',\n },\n {\n field: 'topics0',\n value:\n '0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62',\n matcher: 'equalTo',\n },\n ],\n },\n ]);\n });\n });\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@subql/node-ethereum",
3
- "version": "2.6.2-3",
3
+ "version": "2.6.2-4",
4
4
  "description": "",
5
5
  "author": "Ian He",
6
6
  "license": "Apache-2.0",
@@ -68,5 +68,5 @@
68
68
  "/dist",
69
69
  "/bin"
70
70
  ],
71
- "stableVersion": "2.6.2-2"
71
+ "stableVersion": "2.6.2-3"
72
72
  }