@subql/node-ethereum 5.1.2 → 5.1.3

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 (101) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/app.module.js +2 -2
  4. package/dist/app.module.js.map +1 -1
  5. package/dist/configure/SubqueryProject.js +1 -2
  6. package/dist/configure/SubqueryProject.js.map +1 -1
  7. package/dist/configure/configure.module.js +2 -2
  8. package/dist/configure/configure.module.js.map +1 -1
  9. package/dist/ethereum/api.connection.js.map +1 -1
  10. package/dist/ethereum/api.ethereum.js.map +1 -1
  11. package/dist/ethereum/api.ethereum.test.js.map +1 -1
  12. package/dist/ethereum/api.service.ethereum.js +2 -2
  13. package/dist/ethereum/api.service.ethereum.js.map +1 -1
  14. package/dist/ethereum/api.service.ethereum.test.js +1 -1
  15. package/dist/ethereum/api.service.ethereum.test.js.map +1 -1
  16. package/dist/ethereum/block.ethereum.js +4 -5
  17. package/dist/ethereum/block.ethereum.js.map +1 -1
  18. package/dist/ethereum/ethers/celo/celo-provider.d.ts +69 -70
  19. package/dist/ethereum/ethers/json-rpc-batch-provider.d.ts +0 -1
  20. package/dist/ethereum/ethers/json-rpc-batch-provider.js.map +1 -1
  21. package/dist/ethereum/ethers/json-rpc-batch-provider.spec.js.map +1 -1
  22. package/dist/ethereum/ethers/json-rpc-provider.js.map +1 -1
  23. package/dist/ethereum/ethers/op/op-provider.d.ts +92 -93
  24. package/dist/ethereum/ethers/op/op-provider.js +2 -2
  25. package/dist/ethereum/ethers/op/op-provider.js.map +1 -1
  26. package/dist/ethereum/ethers/web/geturl.js +1 -2
  27. package/dist/ethereum/ethers/web/geturl.js.map +1 -1
  28. package/dist/ethereum/ethers/web/index.d.ts +0 -2
  29. package/dist/ethereum/ethers/web/index.js +3 -4
  30. package/dist/ethereum/ethers/web/index.js.map +1 -1
  31. package/dist/ethereum/ethers/web/types.d.ts +0 -2
  32. package/dist/ethereum/safe-api.js.map +1 -1
  33. package/dist/ethereum/utils.ethereum.js +9 -10
  34. package/dist/ethereum/utils.ethereum.js.map +1 -1
  35. package/dist/indexer/blockDispatcher/block-dispatcher.service.js +2 -2
  36. package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +1 -1
  37. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +2 -2
  38. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +1 -1
  39. package/dist/indexer/dictionary/ethDictionary.service.js +2 -2
  40. package/dist/indexer/dictionary/ethDictionary.service.js.map +1 -1
  41. package/dist/indexer/dictionary/utils.d.ts +4 -3
  42. package/dist/indexer/dictionary/utils.js +17 -19
  43. package/dist/indexer/dictionary/utils.js.map +1 -1
  44. package/dist/indexer/dictionary/utils.spec.js +24 -6
  45. package/dist/indexer/dictionary/utils.spec.js.map +1 -1
  46. package/dist/indexer/dictionary/v1/ethDictionaryV1.d.ts +4 -8
  47. package/dist/indexer/dictionary/v1/ethDictionaryV1.js +64 -68
  48. package/dist/indexer/dictionary/v1/ethDictionaryV1.js.map +1 -1
  49. package/dist/indexer/dictionary/v1/ethDictionaryV1.spec.js +64 -12
  50. package/dist/indexer/dictionary/v1/ethDictionaryV1.spec.js.map +1 -1
  51. package/dist/indexer/dictionary/v2/ethDictionaryV2.d.ts +1 -2
  52. package/dist/indexer/dictionary/v2/ethDictionaryV2.js +48 -69
  53. package/dist/indexer/dictionary/v2/ethDictionaryV2.js.map +1 -1
  54. package/dist/indexer/dictionary/v2/ethDictionaryV2.spec.js +39 -3
  55. package/dist/indexer/dictionary/v2/ethDictionaryV2.spec.js.map +1 -1
  56. package/dist/indexer/dictionary/v2/utils.js +1 -2
  57. package/dist/indexer/dictionary/v2/utils.js.map +1 -1
  58. package/dist/indexer/dictionary/v2/utils.spec.js.map +1 -1
  59. package/dist/indexer/ds-processor.service.js +2 -2
  60. package/dist/indexer/ds-processor.service.js.map +1 -1
  61. package/dist/indexer/dynamic-ds.service.js +2 -2
  62. package/dist/indexer/dynamic-ds.service.js.map +1 -1
  63. package/dist/indexer/fetch.module.js +2 -2
  64. package/dist/indexer/fetch.module.js.map +1 -1
  65. package/dist/indexer/fetch.service.js +2 -2
  66. package/dist/indexer/fetch.service.js.map +1 -1
  67. package/dist/indexer/indexer.manager.js +2 -2
  68. package/dist/indexer/indexer.manager.js.map +1 -1
  69. package/dist/indexer/project.service.js +2 -2
  70. package/dist/indexer/project.service.js.map +1 -1
  71. package/dist/indexer/project.service.test.js +1 -1
  72. package/dist/indexer/project.service.test.js.map +1 -1
  73. package/dist/indexer/unfinalizedBlocks.service.js +2 -2
  74. package/dist/indexer/unfinalizedBlocks.service.js.map +1 -1
  75. package/dist/indexer/unfinalizedBlocks.service.spec.js +1 -1
  76. package/dist/indexer/unfinalizedBlocks.service.spec.js.map +1 -1
  77. package/dist/indexer/worker/worker-fetch.module.js +2 -2
  78. package/dist/indexer/worker/worker-fetch.module.js.map +1 -1
  79. package/dist/indexer/worker/worker.js.map +1 -1
  80. package/dist/indexer/worker/worker.module.js +2 -2
  81. package/dist/indexer/worker/worker.module.js.map +1 -1
  82. package/dist/indexer/worker/worker.service.js +2 -2
  83. package/dist/indexer/worker/worker.service.js.map +1 -1
  84. package/dist/init.js +1 -2
  85. package/dist/init.js.map +1 -1
  86. package/dist/main.js.map +1 -1
  87. package/dist/subcommands/forceClean.module.js +2 -2
  88. package/dist/subcommands/forceClean.module.js.map +1 -1
  89. package/dist/subcommands/reindex.module.js +4 -4
  90. package/dist/subcommands/reindex.module.js.map +1 -1
  91. package/dist/subcommands/testing.init.js +1 -2
  92. package/dist/subcommands/testing.init.js.map +1 -1
  93. package/dist/subcommands/testing.module.js +4 -4
  94. package/dist/subcommands/testing.module.js.map +1 -1
  95. package/dist/subcommands/testing.service.js +2 -2
  96. package/dist/subcommands/testing.service.js.map +1 -1
  97. package/dist/utils/project.js +5 -6
  98. package/dist/utils/project.js.map +1 -1
  99. package/dist/utils/string.js +4 -5
  100. package/dist/utils/string.js.map +1 -1
  101. package/package.json +1 -1
@@ -2,7 +2,8 @@
2
2
  // Copyright 2020-2024 SubQuery Pte Ltd authors & contributors
3
3
  // SPDX-License-Identifier: GPL-3.0
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.EthDictionaryV2 = exports.buildDictionaryV2QueryEntry = void 0;
5
+ exports.EthDictionaryV2 = void 0;
6
+ exports.buildDictionaryV2QueryEntry = buildDictionaryV2QueryEntry;
6
7
  const common_ethereum_1 = require("@subql/common-ethereum");
7
8
  const node_core_1 = require("@subql/node-core");
8
9
  const types_ethereum_1 = require("@subql/types-ethereum");
@@ -14,33 +15,23 @@ const utils_1 = require("../utils");
14
15
  const utils_2 = require("./utils");
15
16
  const MIN_FETCH_LIMIT = 200;
16
17
  const logger = (0, node_core_1.getLogger)('dictionary-v2');
17
- function extractOptionAddresses(dsOptions) {
18
+ function applyAddresses(addresses) {
18
19
  const queryAddressLimit = yargs_1.yargsOptions.argv['query-address-limit'];
19
- const addressArray = [];
20
- if (Array.isArray(dsOptions)) {
21
- const addresses = dsOptions
22
- .map((option) => option.address)
23
- .filter((address) => Boolean(address));
24
- if (addresses.length > queryAddressLimit) {
25
- logger.debug(`Addresses length: ${addresses.length} is exceeding limit: ${queryAddressLimit}. Consider increasing this value with the flag --query-address-limit `);
26
- }
27
- if (addresses.length !== 0 && addresses.length <= queryAddressLimit) {
28
- addressArray.push(...addresses);
29
- }
30
- }
31
- else {
32
- if (dsOptions?.address) {
33
- addressArray.push(dsOptions.address.toLowerCase());
34
- }
35
- }
36
- return addressArray;
20
+ if (!addresses ||
21
+ !addresses.length ||
22
+ addresses.length > queryAddressLimit ||
23
+ addresses.filter((v) => !v).length // DONT use find because 'undefined' and 'null' as falsey
24
+ ) {
25
+ return [];
26
+ }
27
+ return (0, utils_1.validAddresses)(addresses).map((a) => a.toLowerCase());
37
28
  }
38
- function callFilterToDictionaryCondition(filter, dsOptions) {
29
+ function callFilterToDictionaryCondition(filter, addresses) {
39
30
  const txConditions = {};
40
31
  const toArray = [];
41
32
  const fromArray = [];
42
33
  const funcArray = [];
43
- if (filter.from) {
34
+ if (filter?.from) {
44
35
  fromArray.push(filter.from.toLowerCase());
45
36
  }
46
37
  const assignTo = (value) => {
@@ -51,17 +42,17 @@ function callFilterToDictionaryCondition(filter, dsOptions) {
51
42
  toArray.push(value.toLowerCase());
52
43
  }
53
44
  };
54
- const optionsAddresses = extractOptionAddresses(dsOptions);
55
- if (!optionsAddresses.length) {
56
- assignTo(filter.to);
45
+ const optionsAddresses = applyAddresses(addresses);
46
+ if (!optionsAddresses?.length) {
47
+ assignTo(filter?.to);
57
48
  }
58
49
  else {
59
- if (filter.to || filter.to === null) {
50
+ if (filter?.to || filter?.to === null) {
60
51
  logger.warn(`TransactionFilter 'to' conflicts with 'address' in data source options, using data source option`);
61
52
  }
62
53
  optionsAddresses.forEach(assignTo);
63
54
  }
64
- if (filter.function) {
55
+ if (filter?.function) {
65
56
  funcArray.push((0, string_1.functionToSighash)(filter.function));
66
57
  }
67
58
  if (toArray.length !== 0) {
@@ -75,10 +66,10 @@ function callFilterToDictionaryCondition(filter, dsOptions) {
75
66
  }
76
67
  return txConditions;
77
68
  }
78
- function eventFilterToDictionaryCondition(filter, dsOptions) {
69
+ function eventFilterToDictionaryCondition(filter, addresses) {
79
70
  const logConditions = {};
80
- logConditions.address = extractOptionAddresses(dsOptions);
81
- if (filter.topics) {
71
+ logConditions.address = applyAddresses(addresses);
72
+ if (filter?.topics) {
82
73
  for (let i = 0; i < Math.min(filter.topics.length, 4); i++) {
83
74
  const topic = filter.topics[i];
84
75
  if (!topic) {
@@ -119,51 +110,40 @@ function buildDictionaryV2QueryEntry(dataSources) {
119
110
  logs: [],
120
111
  transactions: [],
121
112
  };
122
- for (const ds of dataSources) {
123
- for (const handler of ds.mapping.handlers) {
124
- // No filters, cant use dictionary
125
- if (!handler.filter)
126
- return {};
127
- switch (handler.kind) {
128
- case types_ethereum_1.EthereumHandlerKind.Block:
129
- if (handler.filter.modulo === undefined) {
130
- return {};
131
- }
132
- break;
133
- case types_ethereum_1.EthereumHandlerKind.Call: {
134
- const filter = handler.filter;
135
- if (filter.from !== undefined ||
136
- filter.to !== undefined ||
137
- filter.function !== undefined) {
138
- dictionaryConditions.transactions ??= [];
139
- dictionaryConditions.transactions.push(callFilterToDictionaryCondition(filter, ds.options));
140
- }
141
- else {
142
- // do nothing;
143
- }
144
- break;
113
+ const groupedHandlers = (0, utils_1.groupedDataSources)(dataSources);
114
+ for (const [handler, addresses] of groupedHandlers) {
115
+ // No filters, cant use dictionary
116
+ if (!handler.filter && !addresses?.length)
117
+ return {};
118
+ switch (handler.kind) {
119
+ case types_ethereum_1.EthereumHandlerKind.Block:
120
+ if (handler.filter?.modulo === undefined) {
121
+ return {};
122
+ }
123
+ break;
124
+ case types_ethereum_1.EthereumHandlerKind.Call: {
125
+ if ((handler.filter &&
126
+ Object.values(handler.filter).filter((v) => v !== undefined)
127
+ .length) ||
128
+ (0, utils_1.validAddresses)(addresses).length) {
129
+ dictionaryConditions.transactions ??= [];
130
+ dictionaryConditions.transactions.push(callFilterToDictionaryCondition(handler.filter, addresses));
145
131
  }
146
- case types_ethereum_1.EthereumHandlerKind.Event: {
147
- const filter = handler.filter;
132
+ break;
133
+ }
134
+ case types_ethereum_1.EthereumHandlerKind.Event: {
135
+ if (handler.filter?.topics?.length ||
136
+ (0, utils_1.validAddresses)(addresses).length) {
148
137
  dictionaryConditions.logs ??= [];
149
- if (ds.groupedOptions) {
150
- dictionaryConditions.logs.push(eventFilterToDictionaryCondition(filter, ds.groupedOptions));
151
- }
152
- else if (ds.options?.address || filter.topics) {
153
- dictionaryConditions.logs.push(eventFilterToDictionaryCondition(filter, ds.options));
154
- }
155
- else {
156
- // do nothing;
157
- }
158
- break;
138
+ dictionaryConditions.logs.push(eventFilterToDictionaryCondition(handler.filter, addresses));
159
139
  }
160
- default:
140
+ break;
161
141
  }
142
+ default:
162
143
  }
163
144
  }
164
145
  return sanitiseDictionaryConditions(dictionaryConditions);
165
146
  }
166
- exports.buildDictionaryV2QueryEntry = buildDictionaryV2QueryEntry;
167
147
  class EthDictionaryV2 extends node_core_1.DictionaryV2 {
168
148
  api;
169
149
  #skipTransactions;
@@ -179,8 +159,7 @@ class EthDictionaryV2 extends node_core_1.DictionaryV2 {
179
159
  return dictionary;
180
160
  }
181
161
  buildDictionaryQueryEntries(dataSources) {
182
- const filteredDs = (0, utils_1.ethFilterDs)(dataSources);
183
- return buildDictionaryV2QueryEntry(filteredDs);
162
+ return buildDictionaryV2QueryEntry(dataSources);
184
163
  }
185
164
  // eslint-disable-next-line @typescript-eslint/require-await
186
165
  async getData(startBlock, endBlock, limit = MIN_FETCH_LIMIT) {
@@ -1 +1 @@
1
- {"version":3,"file":"ethDictionaryV2.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v2/ethDictionaryV2.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { BigNumber } from '@ethersproject/bignumber';\nimport { NOT_NULL_FILTER } from '@subql/common-ethereum';\nimport {\n NodeConfig,\n DictionaryV2,\n RawDictionaryResponseData,\n DictionaryResponse,\n getLogger,\n IBlock,\n} from '@subql/node-core';\nimport {\n EthereumBlock,\n EthereumHandlerKind,\n EthereumLogFilter,\n EthereumTransactionFilter,\n SubqlDatasource,\n SubqlEthereumProcessorOptions,\n} from '@subql/types-ethereum';\nimport { uniqBy } from 'lodash';\nimport { EthereumNodeConfig } from '../../../configure/NodeConfig';\nimport {\n EthereumProjectDs,\n EthereumProjectDsTemplate,\n SubqueryProject,\n} from '../../../configure/SubqueryProject';\nimport { EthereumApi } from '../../../ethereum';\nimport { eventToTopic, functionToSighash } from '../../../utils/string';\nimport { yargsOptions } from '../../../yargs';\nimport { ethFilterDs } from '../utils';\nimport { GroupedEthereumProjectDs } from '../v1';\nimport {\n RawEthBlock,\n EthDictionaryV2QueryEntry,\n EthDictionaryTxConditions,\n EthDictionaryLogConditions,\n} from './types';\nimport { rawBlockToEthBlock } from './utils';\n\nconst MIN_FETCH_LIMIT = 200;\n\nconst logger = getLogger('dictionary-v2');\n\nfunction extractOptionAddresses(\n dsOptions?: SubqlEthereumProcessorOptions | SubqlEthereumProcessorOptions[],\n): string[] {\n const queryAddressLimit = yargsOptions.argv['query-address-limit'];\n const addressArray: string[] = [];\n if (Array.isArray(dsOptions)) {\n const addresses = dsOptions\n .map((option) => option.address)\n .filter((address): address is string => Boolean(address));\n\n if (addresses.length > queryAddressLimit) {\n logger.debug(\n `Addresses length: ${addresses.length} is exceeding limit: ${queryAddressLimit}. Consider increasing this value with the flag --query-address-limit `,\n );\n }\n if (addresses.length !== 0 && addresses.length <= queryAddressLimit) {\n addressArray.push(...addresses);\n }\n } else {\n if (dsOptions?.address) {\n addressArray.push(dsOptions.address.toLowerCase());\n }\n }\n return addressArray;\n}\n\nfunction callFilterToDictionaryCondition(\n filter: EthereumTransactionFilter,\n dsOptions?: SubqlEthereumProcessorOptions,\n): EthDictionaryTxConditions {\n const txConditions: EthDictionaryTxConditions = {};\n const toArray: (string | null)[] = [];\n const fromArray: string[] = [];\n const funcArray: string[] = [];\n\n if (filter.from) {\n fromArray.push(filter.from.toLowerCase());\n }\n\n const assignTo = (value: string | null | undefined) => {\n if (value === null) {\n toArray.push(null);\n } else if (value !== undefined) {\n toArray.push(value.toLowerCase());\n }\n };\n\n const optionsAddresses = extractOptionAddresses(dsOptions);\n if (!optionsAddresses.length) {\n assignTo(filter.to);\n } else {\n if (filter.to || filter.to === null) {\n logger.warn(\n `TransactionFilter 'to' conflicts with 'address' in data source options, using data source option`,\n );\n }\n optionsAddresses.forEach(assignTo);\n }\n\n if (filter.function) {\n funcArray.push(functionToSighash(filter.function));\n }\n\n if (toArray.length !== 0) {\n txConditions.to = toArray;\n }\n if (fromArray.length !== 0) {\n txConditions.from = fromArray;\n }\n\n if (funcArray.length !== 0) {\n txConditions.data = funcArray;\n }\n\n return txConditions;\n}\n\nfunction eventFilterToDictionaryCondition(\n filter: EthereumLogFilter,\n dsOptions?: SubqlEthereumProcessorOptions | SubqlEthereumProcessorOptions[],\n): EthDictionaryLogConditions {\n const logConditions: EthDictionaryLogConditions = {};\n logConditions.address = extractOptionAddresses(dsOptions);\n if (filter.topics) {\n for (let i = 0; i < Math.min(filter.topics.length, 4); i++) {\n const topic = filter.topics[i];\n if (!topic) {\n continue;\n }\n const field = `topics${i}`;\n // Initialized\n if (!logConditions[field]) {\n logConditions[field] = [];\n }\n if (topic === NOT_NULL_FILTER) {\n logConditions[field] = []; // TODO, check if !null\n } else {\n logConditions[field].push(eventToTopic(topic));\n }\n }\n }\n return logConditions;\n}\n\nfunction sanitiseDictionaryConditions(\n dictionaryConditions: EthDictionaryV2QueryEntry,\n): EthDictionaryV2QueryEntry {\n if (!dictionaryConditions.logs?.length) {\n delete dictionaryConditions.logs;\n } else {\n dictionaryConditions.logs = uniqBy(dictionaryConditions.logs, (log) =>\n JSON.stringify(log),\n );\n }\n\n if (!dictionaryConditions.transactions?.length) {\n delete dictionaryConditions.transactions;\n } else {\n dictionaryConditions.transactions = uniqBy(\n dictionaryConditions.transactions,\n (tx) => JSON.stringify(tx),\n );\n }\n\n return dictionaryConditions;\n}\n\nexport function buildDictionaryV2QueryEntry(\n dataSources: GroupedEthereumProjectDs[],\n): EthDictionaryV2QueryEntry {\n const dictionaryConditions: EthDictionaryV2QueryEntry = {\n logs: [],\n transactions: [],\n };\n\n for (const ds of dataSources) {\n for (const handler of ds.mapping.handlers) {\n // No filters, cant use dictionary\n if (!handler.filter) return {};\n\n switch (handler.kind) {\n case EthereumHandlerKind.Block:\n if (handler.filter.modulo === undefined) {\n return {};\n }\n break;\n case EthereumHandlerKind.Call: {\n const filter = handler.filter as EthereumTransactionFilter;\n if (\n filter.from !== undefined ||\n filter.to !== undefined ||\n filter.function !== undefined\n ) {\n dictionaryConditions.transactions ??= [];\n dictionaryConditions.transactions.push(\n callFilterToDictionaryCondition(filter, ds.options),\n );\n } else {\n // do nothing;\n }\n break;\n }\n case EthereumHandlerKind.Event: {\n const filter = handler.filter as EthereumLogFilter;\n dictionaryConditions.logs ??= [];\n if (ds.groupedOptions) {\n dictionaryConditions.logs.push(\n eventFilterToDictionaryCondition(filter, ds.groupedOptions),\n );\n } else if (ds.options?.address || filter.topics) {\n dictionaryConditions.logs.push(\n eventFilterToDictionaryCondition(filter, ds.options),\n );\n } else {\n // do nothing;\n }\n break;\n }\n default:\n }\n }\n }\n\n return sanitiseDictionaryConditions(dictionaryConditions);\n}\n\nexport class EthDictionaryV2 extends DictionaryV2<\n EthereumBlock,\n SubqlDatasource,\n EthDictionaryV2QueryEntry\n> {\n #skipTransactions: boolean;\n\n constructor(\n endpoint: string,\n nodeConfig: NodeConfig,\n project: SubqueryProject,\n private api: EthereumApi,\n ) {\n super(endpoint, project.network.chainId, nodeConfig);\n this.#skipTransactions = !!new EthereumNodeConfig(nodeConfig)\n .skipTransactions;\n }\n\n static async create(\n endpoint: string,\n nodeConfig: NodeConfig,\n project: SubqueryProject,\n api: EthereumApi,\n ): Promise<EthDictionaryV2> {\n const dictionary = new EthDictionaryV2(endpoint, nodeConfig, project, api);\n await dictionary.init();\n return dictionary;\n }\n\n buildDictionaryQueryEntries(\n dataSources: (EthereumProjectDs | EthereumProjectDsTemplate)[],\n ): EthDictionaryV2QueryEntry {\n const filteredDs = ethFilterDs(dataSources);\n return buildDictionaryV2QueryEntry(filteredDs);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getData(\n startBlock: number,\n endBlock: number,\n limit: number = MIN_FETCH_LIMIT,\n ): Promise<DictionaryResponse<IBlock<EthereumBlock> | number> | undefined> {\n return super.getData(startBlock, endBlock, limit, {\n blockHeader: true,\n logs: { transaction: !this.#skipTransactions },\n transactions: { log: true },\n });\n }\n\n convertResponseBlocks<RFB = RawEthBlock>(\n data: RawDictionaryResponseData<RFB>,\n ): DictionaryResponse<IBlock<EthereumBlock>> | undefined {\n try {\n const blocks: IBlock<EthereumBlock>[] = (\n (data.blocks as RawEthBlock[]) || []\n ).map((b) => rawBlockToEthBlock(b, this.api));\n\n if (!blocks.length) {\n return {\n batchBlocks: [],\n lastBufferedHeight: undefined, // This will get set to the request end block in the base class.\n } as any;\n }\n return {\n batchBlocks: blocks,\n lastBufferedHeight: blocks[blocks.length - 1].block.number,\n };\n } catch (e: any) {\n logger.error(e, `Failed to handle block response}`);\n throw e;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ethDictionaryV2.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v2/ethDictionaryV2.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { NOT_NULL_FILTER } from '@subql/common-ethereum';\nimport {\n NodeConfig,\n DictionaryV2,\n RawDictionaryResponseData,\n DictionaryResponse,\n getLogger,\n IBlock,\n} from '@subql/node-core';\nimport {\n EthereumBlock,\n EthereumHandlerKind,\n EthereumLogFilter,\n EthereumTransactionFilter,\n SubqlDatasource,\n} from '@subql/types-ethereum';\nimport { uniqBy } from 'lodash';\nimport { EthereumNodeConfig } from '../../../configure/NodeConfig';\nimport {\n EthereumProjectDs,\n EthereumProjectDsTemplate,\n SubqueryProject,\n} from '../../../configure/SubqueryProject';\nimport { EthereumApi } from '../../../ethereum';\nimport { eventToTopic, functionToSighash } from '../../../utils/string';\nimport { yargsOptions } from '../../../yargs';\nimport { groupedDataSources, validAddresses } from '../utils';\nimport {\n RawEthBlock,\n EthDictionaryV2QueryEntry,\n EthDictionaryTxConditions,\n EthDictionaryLogConditions,\n} from './types';\nimport { rawBlockToEthBlock } from './utils';\n\nconst MIN_FETCH_LIMIT = 200;\n\nconst logger = getLogger('dictionary-v2');\n\nfunction applyAddresses(\n addresses?: (string | undefined | null)[],\n): string[] | undefined {\n const queryAddressLimit = yargsOptions.argv['query-address-limit'];\n if (\n !addresses ||\n !addresses.length ||\n addresses.length > queryAddressLimit ||\n addresses.filter((v) => !v).length // DONT use find because 'undefined' and 'null' as falsey\n ) {\n return [];\n }\n\n return validAddresses(addresses).map((a) => a.toLowerCase());\n}\n\nfunction callFilterToDictionaryCondition(\n filter?: EthereumTransactionFilter,\n addresses?: (string | undefined | null)[],\n): EthDictionaryTxConditions {\n const txConditions: EthDictionaryTxConditions = {};\n const toArray: (string | null)[] = [];\n const fromArray: string[] = [];\n const funcArray: string[] = [];\n\n if (filter?.from) {\n fromArray.push(filter.from.toLowerCase());\n }\n\n const assignTo = (value: string | null | undefined) => {\n if (value === null) {\n toArray.push(null);\n } else if (value !== undefined) {\n toArray.push(value.toLowerCase());\n }\n };\n\n const optionsAddresses = applyAddresses(addresses);\n if (!optionsAddresses?.length) {\n assignTo(filter?.to);\n } else {\n if (filter?.to || filter?.to === null) {\n logger.warn(\n `TransactionFilter 'to' conflicts with 'address' in data source options, using data source option`,\n );\n }\n optionsAddresses.forEach(assignTo);\n }\n\n if (filter?.function) {\n funcArray.push(functionToSighash(filter.function));\n }\n\n if (toArray.length !== 0) {\n txConditions.to = toArray;\n }\n if (fromArray.length !== 0) {\n txConditions.from = fromArray;\n }\n\n if (funcArray.length !== 0) {\n txConditions.data = funcArray;\n }\n\n return txConditions;\n}\n\nfunction eventFilterToDictionaryCondition(\n filter?: EthereumLogFilter,\n addresses?: (string | undefined | null)[],\n): EthDictionaryLogConditions {\n const logConditions: EthDictionaryLogConditions = {};\n logConditions.address = applyAddresses(addresses);\n if (filter?.topics) {\n for (let i = 0; i < Math.min(filter.topics.length, 4); i++) {\n const topic = filter.topics[i];\n if (!topic) {\n continue;\n }\n const field = `topics${i}`;\n // Initialized\n if (!logConditions[field]) {\n logConditions[field] = [];\n }\n if (topic === NOT_NULL_FILTER) {\n logConditions[field] = []; // TODO, check if !null\n } else {\n logConditions[field].push(eventToTopic(topic));\n }\n }\n }\n return logConditions;\n}\n\nfunction sanitiseDictionaryConditions(\n dictionaryConditions: EthDictionaryV2QueryEntry,\n): EthDictionaryV2QueryEntry {\n if (!dictionaryConditions.logs?.length) {\n delete dictionaryConditions.logs;\n } else {\n dictionaryConditions.logs = uniqBy(dictionaryConditions.logs, (log) =>\n JSON.stringify(log),\n );\n }\n\n if (!dictionaryConditions.transactions?.length) {\n delete dictionaryConditions.transactions;\n } else {\n dictionaryConditions.transactions = uniqBy(\n dictionaryConditions.transactions,\n (tx) => JSON.stringify(tx),\n );\n }\n\n return dictionaryConditions;\n}\n\nexport function buildDictionaryV2QueryEntry(\n dataSources: EthereumProjectDs[],\n): EthDictionaryV2QueryEntry {\n const dictionaryConditions: EthDictionaryV2QueryEntry = {\n logs: [],\n transactions: [],\n };\n\n const groupedHandlers = groupedDataSources(dataSources);\n for (const [handler, addresses] of groupedHandlers) {\n // No filters, cant use dictionary\n if (!handler.filter && !addresses?.length) return {};\n\n switch (handler.kind) {\n case EthereumHandlerKind.Block:\n if (handler.filter?.modulo === undefined) {\n return {};\n }\n break;\n case EthereumHandlerKind.Call: {\n if (\n (handler.filter &&\n Object.values(handler.filter).filter((v) => v !== undefined)\n .length) ||\n validAddresses(addresses).length\n ) {\n dictionaryConditions.transactions ??= [];\n dictionaryConditions.transactions.push(\n callFilterToDictionaryCondition(handler.filter, addresses),\n );\n }\n break;\n }\n case EthereumHandlerKind.Event: {\n if (\n handler.filter?.topics?.length ||\n validAddresses(addresses).length\n ) {\n dictionaryConditions.logs ??= [];\n dictionaryConditions.logs.push(\n eventFilterToDictionaryCondition(handler.filter, addresses),\n );\n }\n\n break;\n }\n default:\n }\n }\n\n return sanitiseDictionaryConditions(dictionaryConditions);\n}\n\nexport class EthDictionaryV2 extends DictionaryV2<\n EthereumBlock,\n SubqlDatasource,\n EthDictionaryV2QueryEntry\n> {\n #skipTransactions: boolean;\n\n constructor(\n endpoint: string,\n nodeConfig: NodeConfig,\n project: SubqueryProject,\n private api: EthereumApi,\n ) {\n super(endpoint, project.network.chainId, nodeConfig);\n this.#skipTransactions = !!new EthereumNodeConfig(nodeConfig)\n .skipTransactions;\n }\n\n static async create(\n endpoint: string,\n nodeConfig: NodeConfig,\n project: SubqueryProject,\n api: EthereumApi,\n ): Promise<EthDictionaryV2> {\n const dictionary = new EthDictionaryV2(endpoint, nodeConfig, project, api);\n await dictionary.init();\n return dictionary;\n }\n\n buildDictionaryQueryEntries(\n dataSources: (EthereumProjectDs | EthereumProjectDsTemplate)[],\n ): EthDictionaryV2QueryEntry {\n return buildDictionaryV2QueryEntry(dataSources);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getData(\n startBlock: number,\n endBlock: number,\n limit: number = MIN_FETCH_LIMIT,\n ): Promise<DictionaryResponse<IBlock<EthereumBlock> | number> | undefined> {\n return super.getData(startBlock, endBlock, limit, {\n blockHeader: true,\n logs: { transaction: !this.#skipTransactions },\n transactions: { log: true },\n });\n }\n\n convertResponseBlocks<RFB = RawEthBlock>(\n data: RawDictionaryResponseData<RFB>,\n ): DictionaryResponse<IBlock<EthereumBlock>> | undefined {\n try {\n const blocks: IBlock<EthereumBlock>[] = (\n (data.blocks as RawEthBlock[]) || []\n ).map((b) => rawBlockToEthBlock(b, this.api));\n\n if (!blocks.length) {\n return {\n batchBlocks: [],\n lastBufferedHeight: undefined, // This will get set to the request end block in the base class.\n } as any;\n }\n return {\n batchBlocks: blocks,\n lastBufferedHeight: blocks[blocks.length - 1].block.number,\n };\n } catch (e: any) {\n logger.error(e, `Failed to handle block response}`);\n throw e;\n }\n }\n}\n"]}
@@ -10,7 +10,6 @@ const node_core_1 = require("@subql/node-core");
10
10
  const types_ethereum_1 = require("@subql/types-ethereum");
11
11
  const eventemitter2_1 = __importDefault(require("eventemitter2"));
12
12
  const ethereum_1 = require("../../../ethereum");
13
- const utils_1 = require("../utils");
14
13
  const ethDictionaryV2_1 = require("./ethDictionaryV2");
15
14
  const DEFAULT_DICTIONARY = 'https://ethereum.node.subquery.network/public';
16
15
  const HTTP_ENDPOINT = 'https://ethereum.rpc.subquery.network/public';
@@ -298,6 +297,43 @@ describe('buildDictionaryV2QueryEntry', () => {
298
297
  ],
299
298
  });
300
299
  });
300
+ it('Creates a valid filter with a single event handler that has 0 filters but a contract address', () => {
301
+ const ds = {
302
+ kind: types_ethereum_1.EthereumDatasourceKind.Runtime,
303
+ assets: new Map(),
304
+ options: {
305
+ abi: 'erc20',
306
+ address: '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619',
307
+ },
308
+ startBlock: 1,
309
+ mapping: {
310
+ file: '',
311
+ handlers: [
312
+ {
313
+ handler: 'handleTransfer',
314
+ kind: types_ethereum_1.EthereumHandlerKind.Event,
315
+ },
316
+ {
317
+ handler: 'handleTransfer',
318
+ kind: types_ethereum_1.EthereumHandlerKind.Call,
319
+ },
320
+ ],
321
+ },
322
+ };
323
+ const result = (0, ethDictionaryV2_1.buildDictionaryV2QueryEntry)([ds]);
324
+ expect(result).toEqual({
325
+ transactions: [
326
+ {
327
+ to: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],
328
+ },
329
+ ],
330
+ logs: [
331
+ {
332
+ address: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],
333
+ },
334
+ ],
335
+ });
336
+ });
301
337
  it('build query entries for multiple ds', () => {
302
338
  const ds = [
303
339
  {
@@ -453,7 +489,7 @@ describe('buildDictionaryV2QueryEntry', () => {
453
489
  const tmp = global.structuredClone(templateTs);
454
490
  (tmp.options.address = `0x${i}`), ds.push(tmp);
455
491
  }
456
- const result = (0, ethDictionaryV2_1.buildDictionaryV2QueryEntry)((0, utils_1.ethFilterDs)(ds));
492
+ const result = (0, ethDictionaryV2_1.buildDictionaryV2QueryEntry)(ds);
457
493
  expect(result).toEqual({
458
494
  logs: [
459
495
  {
@@ -483,7 +519,7 @@ describe('buildDictionaryV2QueryEntry', () => {
483
519
  const tmp = global.structuredClone(templateTs);
484
520
  (tmp.options.address = `0x${i}`), ds.push(tmp);
485
521
  }
486
- const result = (0, ethDictionaryV2_1.buildDictionaryV2QueryEntry)((0, utils_1.ethFilterDs)(ds));
522
+ const result = (0, ethDictionaryV2_1.buildDictionaryV2QueryEntry)(ds);
487
523
  expect(result).toEqual({
488
524
  logs: [
489
525
  {
@@ -1 +1 @@
1
- {"version":3,"file":"ethDictionaryV2.spec.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v2/ethDictionaryV2.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { NOT_NULL_FILTER } from '@subql/common-ethereum';\nimport {\n BlockHeightMap,\n DictionaryResponse,\n IBlock,\n NodeConfig,\n} from '@subql/node-core';\nimport {\n EthereumBlock,\n EthereumDatasourceKind,\n EthereumHandlerKind,\n SubqlDatasource,\n SubqlRuntimeDatasource,\n} from '@subql/types-ethereum';\nimport EventEmitter2 from 'eventemitter2';\nimport {\n EthereumProjectDs,\n EthereumProjectDsTemplate,\n SubqueryProject,\n} from '../../../configure/SubqueryProject';\nimport { EthereumApi } from '../../../ethereum';\nimport { ethFilterDs } from '../utils';\nimport {\n buildDictionaryV2QueryEntry,\n EthDictionaryV2,\n} from './ethDictionaryV2';\n\nconst DEFAULT_DICTIONARY = 'https://ethereum.node.subquery.network/public';\nconst HTTP_ENDPOINT = 'https://ethereum.rpc.subquery.network/public';\nconst mockDs: EthereumProjectDs[] = [\n {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 19217803,\n mapping: {\n file: './dist/index.js',\n handlers: [\n {\n handler: 'handleTransaction',\n kind: EthereumHandlerKind.Call,\n filter: {\n function: 'approve(address spender, uint256 rawAmount)',\n },\n },\n {\n handler: 'handleLog',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: [\n 'Transfer(address indexed from, address indexed to, uint256 amount)',\n ],\n },\n },\n ],\n },\n },\n];\n\nconst templateTs: EthereumProjectDsTemplate = {\n name: 'template',\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n // address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n },\n // startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleLog',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: ['Transfer(address, address, uint256)'],\n },\n },\n ],\n },\n};\n\n// tx to is null\nconst mockDs2: EthereumProjectDs[] = [\n {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 19217803,\n mapping: {\n file: './dist/index.js',\n handlers: [\n {\n handler: 'handleTransaction',\n kind: EthereumHandlerKind.Call,\n filter: {\n to: null,\n },\n },\n ],\n },\n processor: { file: '' },\n },\n];\n\nconst nodeConfig = new NodeConfig({\n subquery: 'eth-starter',\n subqueryName: 'eth-starter',\n dictionaryTimeout: 10,\n networkEndpoint: { [HTTP_ENDPOINT]: {} },\n networkDictionary: [DEFAULT_DICTIONARY],\n});\n\nfunction makeBlockHeightMap(mockDs: SubqlDatasource[]): BlockHeightMap<any> {\n const m = new Map<number, any>();\n mockDs.forEach((ds, index, dataSources) => {\n m.set(ds.startBlock || 1, dataSources.slice(0, index + 1));\n });\n return new BlockHeightMap(m);\n}\n\n// enable this once dictionary v2 is online\ndescribe('eth dictionary v2', () => {\n let ethDictionaryV2: EthDictionaryV2;\n\n const dsMap = makeBlockHeightMap(mockDs);\n\n beforeAll(async () => {\n ethDictionaryV2 = await EthDictionaryV2.create(\n DEFAULT_DICTIONARY,\n nodeConfig,\n { network: { chainId: '1' } } as SubqueryProject,\n new EthereumApi(HTTP_ENDPOINT, 1, new EventEmitter2()),\n );\n }, 10000);\n\n beforeEach(() => {\n ethDictionaryV2.updateQueriesMap(dsMap);\n });\n\n it('converts ds to v2 dictionary queries', () => {\n const query = (ethDictionaryV2 as any).queriesMap.get(19217803);\n expect(query.logs.length).toBe(1);\n expect(query.transactions.length).toBe(1);\n });\n\n it('query response match with entries', async () => {\n const ethBlocks = (await ethDictionaryV2.getData(\n 19217803,\n (ethDictionaryV2 as any)._metadata.end,\n 2,\n )) as DictionaryResponse<IBlock<EthereumBlock>>;\n\n expect(ethBlocks.batchBlocks.map((b) => b.block.number)).toStrictEqual([\n 19217803, 19217804,\n ]);\n\n const ethBlock19217803 = ethBlocks.batchBlocks[0].block;\n const ethBlock19217804 = ethBlocks.batchBlocks[1].block;\n\n expect(ethBlock19217803.number).toBe(19217803);\n expect(ethBlock19217804.number).toBe(19217804);\n\n // Sighash of approval tx\n expect(\n ethBlock19217803.transactions.filter(\n (tx) => tx.input.indexOf('0x095ea7b3') === 0,\n ).length,\n ).toBe(4);\n\n expect(ethBlock19217804.logs.length).toBe(233);\n\n // This matches with dictionaryQueryEntries[0].topics\n expect(ethBlock19217804.logs[0].topics).toContain(\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n );\n }, 10000);\n\n // Geth currently throwing errors with this request\n it.skip('is able to get transaction with field to is null', async () => {\n const dsMap = makeBlockHeightMap(mockDs2);\n ethDictionaryV2.updateQueriesMap(dsMap);\n\n const { conditions } = (ethDictionaryV2 as any).getQueryConditions(\n 19217803,\n (ethDictionaryV2 as any)._metadata.end,\n );\n\n expect(conditions).toEqual({ transactions: [{ to: [null] }] });\n\n const ethBlocks = (await ethDictionaryV2.getData(\n 19217803,\n (ethDictionaryV2 as any)._metadata.end,\n 1,\n )) as DictionaryResponse<IBlock<EthereumBlock>>;\n\n const { hash, transactions } = ethBlocks.batchBlocks[0].block;\n\n expect(hash).toBe(\n '0xa9ba70126240a8418739a103527860948a2be32de2eb9a8f590591faa174c08b',\n );\n\n // https://etherscan.io/tx/0x57e8cd9483cb5d308151372b0cf33fdc615999283c80ee3c28e94f074dda61f1\n expect(\n transactions.find(\n (tx) =>\n tx.hash ===\n '0x57e8cd9483cb5d308151372b0cf33fdc615999283c80ee3c28e94f074dda61f1',\n ),\n ).toBeDefined();\n });\n\n it('is able to query with not null topics', async () => {\n /**\n * Dictionary v1 supported filtering logs where a topic was null or not null.\n * V2 doesn't yet support this but we should still be able to make a dictionary query that gets relevant logs.\n * It will just include events that will be filtered out later.\n * */\n\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n },\n startBlock: 19476187,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleLog',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: [\n 'Transfer(address, address, uint256)',\n undefined,\n undefined,\n NOT_NULL_FILTER,\n ],\n },\n },\n ],\n },\n };\n\n const dsMap = makeBlockHeightMap([ds]);\n ethDictionaryV2.updateQueriesMap(dsMap);\n\n const { conditions } = (ethDictionaryV2 as any).getQueryConditions(\n 19476187,\n (ethDictionaryV2 as any)._metadata.end,\n );\n\n expect(conditions).toEqual({\n logs: [\n {\n address: [],\n topics0: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n ],\n topics3: [],\n },\n ],\n });\n\n const ethBlocks = (await ethDictionaryV2.getData(\n 19476187,\n (ethDictionaryV2 as any)._metadata.end,\n 2,\n )) as DictionaryResponse<IBlock<EthereumBlock>>;\n\n const { hash, logs } = ethBlocks.batchBlocks[0].block;\n\n expect(hash).toEqual(\n '0xa798861151ed58ad67d80d1cf61dc30e65d003bc958e99a7969a05a67e69e0b2',\n );\n\n const log = logs.find((l) => l.logIndex === 184);\n expect(log).toBeDefined();\n expect(log!.transactionHash).toEqual(\n '0x5491f3f4b7ca6cc81f992a17e19bc9bafff408518c643c5a254de44b5a7b6d72',\n );\n\n // Uncomment this when not null filter supported\n // expect(logs.filter(l => !l.topics[3]).length).toEqual(6) // There are 6 events with no topic3\n }, 100000);\n\n it('returns a lastBufferedHeight if there are no block results', async () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n address: '0x30baa3ba9d7089fd8d020a994db75d14cf7ec83b',\n },\n startBlock: 18723210,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleLog',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: ['Transfer(address, address, uint256)'],\n },\n },\n ],\n },\n };\n\n const dsMap = makeBlockHeightMap([ds]);\n ethDictionaryV2.updateQueriesMap(dsMap);\n\n const res = await ethDictionaryV2.getData(18723210, 18733210, 100);\n\n expect(res?.batchBlocks.length).toEqual(0);\n expect(res?.lastBufferedHeight).toEqual(18733210);\n });\n});\n\ndescribe('buildDictionaryV2QueryEntry', () => {\n it('Build filter for !null', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n },\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleLog',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: [\n 'Transfer(address, address, uint256)',\n undefined,\n undefined,\n NOT_NULL_FILTER,\n ],\n },\n },\n ],\n },\n };\n const result = buildDictionaryV2QueryEntry([ds]);\n\n expect(result).toEqual({\n logs: [\n {\n address: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],\n topics0: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n ],\n topics3: [],\n },\n ],\n });\n });\n\n it('Build filter tx filter', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n },\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleTx',\n kind: EthereumHandlerKind.Call,\n filter: {\n function: 'setminimumStakingAmount(uint256 amount)',\n },\n },\n ],\n },\n };\n const result = buildDictionaryV2QueryEntry([ds]);\n\n expect(result).toEqual({\n transactions: [\n {\n to: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],\n data: ['0x7ef9ea98'],\n },\n ],\n });\n });\n\n it('build query entries for multiple ds', () => {\n const ds: SubqlRuntimeDatasource[] = [\n {\n kind: EthereumDatasourceKind.Runtime,\n startBlock: 3327417,\n options: {\n abi: 'EnsRegistry',\n address: '0x314159265dd8dbb310642f98f50c066173c1259b',\n },\n assets: new Map(),\n mapping: {\n file: './dist/index.js',\n handlers: [\n // one duplicate one\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleTransferOldRegistry',\n filter: {\n topics: ['Transfer(bytes32,address)'],\n },\n },\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleTransferOldRegistry',\n filter: {\n topics: ['Transfer(bytes32,address)'],\n },\n },\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleNewOwnerOldRegistry',\n filter: {\n topics: ['NewOwner(bytes32,bytes32,address)'],\n },\n },\n ],\n },\n },\n {\n kind: EthereumDatasourceKind.Runtime,\n startBlock: 3327417,\n options: {\n abi: 'Resolver',\n },\n assets: new Map(),\n mapping: {\n file: './dist/index.js',\n handlers: [\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleABIChanged',\n filter: {\n topics: ['ABIChanged(bytes32,uint256)'],\n },\n },\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleAddrChanged',\n filter: {\n topics: ['AddrChanged(bytes32,address)'],\n },\n },\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleMulticoinAddrChanged',\n filter: {\n topics: ['AddressChanged(bytes32,uint256,bytes)'],\n },\n },\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleAuthorisationChanged',\n filter: {\n topics: ['AuthorisationChanged(bytes32,address,address,bool)'],\n },\n },\n ],\n },\n },\n ];\n\n const queryEntry = buildDictionaryV2QueryEntry(ds);\n // Total 7 handlers were given, 1 is duplicate\n expect(queryEntry.logs!.length).toBe(6);\n });\n\n it('should unique QueryEntry for duplicate dataSources', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n },\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleLog',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: ['Transfer(address, address, uint256)'],\n },\n },\n {\n handler: 'handleLogSame',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: ['Transfer(address, address, uint256)'],\n },\n },\n {\n handler: 'handleTx',\n kind: EthereumHandlerKind.Call,\n filter: {\n function: 'setminimumStakingAmount(uint256 amount)',\n from: 'mockAddress',\n },\n },\n {\n handler: 'handleTxSame',\n kind: EthereumHandlerKind.Call,\n filter: {\n function: 'setminimumStakingAmount(uint256 amount)',\n from: 'mockAddress',\n },\n },\n ],\n },\n };\n const result = buildDictionaryV2QueryEntry([ds]);\n\n expect(result).toEqual({\n logs: [\n {\n address: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],\n topics0: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n ],\n },\n ],\n transactions: [\n {\n from: ['mockaddress'],\n to: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],\n data: ['0x7ef9ea98'],\n },\n ],\n });\n });\n\n it('should group a small number of dynamic ds', () => {\n const ds: SubqlRuntimeDatasource[] = [];\n\n for (let i = 0; i < 10; i++) {\n // Bad nodejs types\n const tmp = (global as any).structuredClone(templateTs);\n (tmp.options.address = `0x${i}`), ds.push(tmp);\n }\n\n const result = buildDictionaryV2QueryEntry(ethFilterDs(ds));\n\n expect(result).toEqual({\n logs: [\n {\n address: [\n '0x0',\n '0x1',\n '0x2',\n '0x3',\n '0x4',\n '0x5',\n '0x6',\n '0x7',\n '0x8',\n '0x9',\n ],\n topics0: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n ],\n },\n ],\n });\n });\n\n it('should remove address filter with large number of dynamic ds', () => {\n const ds: SubqlRuntimeDatasource[] = [];\n\n for (let i = 0; i < 200; i++) {\n // Bad nodejs types\n const tmp = (global as any).structuredClone(templateTs);\n (tmp.options.address = `0x${i}`), ds.push(tmp);\n }\n\n const result = buildDictionaryV2QueryEntry(ethFilterDs(ds));\n\n expect(result).toEqual({\n logs: [\n {\n address: [],\n topics0: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n ],\n },\n ],\n });\n });\n\n it('builds a filter when theres a block handler with modulo filter', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n },\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleBlock',\n kind: EthereumHandlerKind.Block,\n filter: {\n modulo: 100,\n },\n },\n {\n handler: 'handleTx',\n kind: EthereumHandlerKind.Call,\n filter: {\n function: 'setminimumStakingAmount(uint256 amount)',\n },\n },\n ],\n },\n };\n const result = buildDictionaryV2QueryEntry([ds]);\n\n expect(result).toEqual({\n transactions: [\n {\n to: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],\n data: ['0x7ef9ea98'],\n },\n ],\n });\n });\n});\n"]}
1
+ {"version":3,"file":"ethDictionaryV2.spec.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v2/ethDictionaryV2.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;AAEnC,4DAAyD;AACzD,gDAK0B;AAC1B,0DAM+B;AAC/B,kEAA0C;AAM1C,gDAAgD;AAChD,uDAG2B;AAE3B,MAAM,kBAAkB,GAAG,+CAA+C,CAAC;AAC3E,MAAM,aAAa,GAAG,8CAA8C,CAAC;AACrE,MAAM,MAAM,GAAwB;IAClC;QACE,IAAI,EAAE,uCAAsB,CAAC,OAAO;QACpC,MAAM,EAAE,IAAI,GAAG,EAAE;QACjB,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE;YACP,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE;gBACR;oBACE,OAAO,EAAE,mBAAmB;oBAC5B,IAAI,EAAE,oCAAmB,CAAC,IAAI;oBAC9B,MAAM,EAAE;wBACN,QAAQ,EAAE,6CAA6C;qBACxD;iBACF;gBACD;oBACE,OAAO,EAAE,WAAW;oBACpB,IAAI,EAAE,oCAAmB,CAAC,KAAK;oBAC/B,MAAM,EAAE;wBACN,MAAM,EAAE;4BACN,oEAAoE;yBACrE;qBACF;iBACF;aACF;SACF;KACF;CACF,CAAC;AAEF,MAAM,UAAU,GAA8B;IAC5C,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,uCAAsB,CAAC,OAAO;IACpC,MAAM,EAAE,IAAI,GAAG,EAAE;IACjB,OAAO,EAAE;QACP,GAAG,EAAE,OAAO;QACZ,yDAAyD;KAC1D;IACD,iBAAiB;IACjB,OAAO,EAAE;QACP,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE;YACR;gBACE,OAAO,EAAE,WAAW;gBACpB,IAAI,EAAE,oCAAmB,CAAC,KAAK;gBAC/B,MAAM,EAAE;oBACN,MAAM,EAAE,CAAC,qCAAqC,CAAC;iBAChD;aACF;SACF;KACF;CACF,CAAC;AAEF,gBAAgB;AAChB,MAAM,OAAO,GAAwB;IACnC;QACE,IAAI,EAAE,uCAAsB,CAAC,OAAO;QACpC,MAAM,EAAE,IAAI,GAAG,EAAE;QACjB,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE;YACP,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE;gBACR;oBACE,OAAO,EAAE,mBAAmB;oBAC5B,IAAI,EAAE,oCAAmB,CAAC,IAAI;oBAC9B,MAAM,EAAE;wBACN,EAAE,EAAE,IAAI;qBACT;iBACF;aACF;SACF;QACD,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;KACxB;CACF,CAAC;AAEF,MAAM,UAAU,GAAG,IAAI,sBAAU,CAAC;IAChC,QAAQ,EAAE,aAAa;IACvB,YAAY,EAAE,aAAa;IAC3B,iBAAiB,EAAE,EAAE;IACrB,eAAe,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE;IACxC,iBAAiB,EAAE,CAAC,kBAAkB,CAAC;CACxC,CAAC,CAAC;AAEH,SAAS,kBAAkB,CAAC,MAAyB;IACnD,MAAM,CAAC,GAAG,IAAI,GAAG,EAAe,CAAC;IACjC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;QACxC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,IAAI,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,0BAAc,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,2CAA2C;AAC3C,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,eAAgC,CAAC;IAErC,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAEzC,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,eAAe,GAAG,MAAM,iCAAe,CAAC,MAAM,CAC5C,kBAAkB,EAClB,UAAU,EACV,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAqB,EAChD,IAAI,sBAAW,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,uBAAa,EAAE,CAAC,CACvD,CAAC;IACJ,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,UAAU,CAAC,GAAG,EAAE;QACd,eAAe,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,KAAK,GAAI,eAAuB,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,SAAS,GAAG,CAAC,MAAM,eAAe,CAAC,OAAO,CAC9C,QAAQ,EACP,eAAuB,CAAC,SAAS,CAAC,GAAG,EACtC,CAAC,CACF,CAA8C,CAAC;QAEhD,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC;YACrE,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACxD,MAAM,gBAAgB,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAExD,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE/C,yBAAyB;QACzB,MAAM,CACJ,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAClC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAC7C,CAAC,MAAM,CACT,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEV,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE/C,qDAAqD;QACrD,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAC/C,oEAAoE,CACrE,CAAC;IACJ,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,mDAAmD;IACnD,EAAE,CAAC,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC1C,eAAe,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAExC,MAAM,EAAE,UAAU,EAAE,GAAI,eAAuB,CAAC,kBAAkB,CAChE,QAAQ,EACP,eAAuB,CAAC,SAAS,CAAC,GAAG,CACvC,CAAC;QAEF,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAE/D,MAAM,SAAS,GAAG,CAAC,MAAM,eAAe,CAAC,OAAO,CAC9C,QAAQ,EACP,eAAuB,CAAC,SAAS,CAAC,GAAG,EACtC,CAAC,CACF,CAA8C,CAAC;QAEhD,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAE9D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CACf,oEAAoE,CACrE,CAAC;QAEF,6FAA6F;QAC7F,MAAM,CACJ,YAAY,CAAC,IAAI,CACf,CAAC,EAAE,EAAE,EAAE,CACL,EAAE,CAAC,IAAI;YACP,oEAAoE,CACvE,CACF,CAAC,WAAW,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD;;;;aAIK;QAEL,MAAM,EAAE,GAA2B;YACjC,IAAI,EAAE,uCAAsB,CAAC,OAAO;YACpC,MAAM,EAAE,IAAI,GAAG,EAAE;YACjB,OAAO,EAAE;gBACP,GAAG,EAAE,OAAO;aACb;YACD,UAAU,EAAE,QAAQ;YACpB,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE;oBACR;wBACE,OAAO,EAAE,WAAW;wBACpB,IAAI,EAAE,oCAAmB,CAAC,KAAK;wBAC/B,MAAM,EAAE;4BACN,MAAM,EAAE;gCACN,qCAAqC;gCACrC,SAAS;gCACT,SAAS;gCACT,iCAAe;6BAChB;yBACF;qBACF;iBACF;aACF;SACF,CAAC;QAEF,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,eAAe,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAExC,MAAM,EAAE,UAAU,EAAE,GAAI,eAAuB,CAAC,kBAAkB,CAChE,QAAQ,EACP,eAAuB,CAAC,SAAS,CAAC,GAAG,CACvC,CAAC;QAEF,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;YACzB,IAAI,EAAE;gBACJ;oBACE,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE;wBACP,oEAAoE;qBACrE;oBACD,OAAO,EAAE,EAAE;iBACZ;aACF;SACF,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,CAAC,MAAM,eAAe,CAAC,OAAO,CAC9C,QAAQ,EACP,eAAuB,CAAC,SAAS,CAAC,GAAG,EACtC,CAAC,CACF,CAA8C,CAAC;QAEhD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAEtD,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAClB,oEAAoE,CACrE,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAClC,oEAAoE,CACrE,CAAC;QAEF,gDAAgD;QAChD,gGAAgG;IAClG,CAAC,EAAE,MAAM,CAAC,CAAC;IAEX,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,EAAE,GAA2B;YACjC,IAAI,EAAE,uCAAsB,CAAC,OAAO;YACpC,MAAM,EAAE,IAAI,GAAG,EAAE;YACjB,OAAO,EAAE;gBACP,GAAG,EAAE,OAAO;gBACZ,OAAO,EAAE,4CAA4C;aACtD;YACD,UAAU,EAAE,QAAQ;YACpB,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE;oBACR;wBACE,OAAO,EAAE,WAAW;wBACpB,IAAI,EAAE,oCAAmB,CAAC,KAAK;wBAC/B,MAAM,EAAE;4BACN,MAAM,EAAE,CAAC,qCAAqC,CAAC;yBAChD;qBACF;iBACF;aACF;SACF,CAAC;QAEF,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,eAAe,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAExC,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAEnE,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,EAAE,GAA2B;YACjC,IAAI,EAAE,uCAAsB,CAAC,OAAO;YACpC,MAAM,EAAE,IAAI,GAAG,EAAE;YACjB,OAAO,EAAE;gBACP,GAAG,EAAE,OAAO;gBACZ,OAAO,EAAE,4CAA4C;aACtD;YACD,UAAU,EAAE,CAAC;YACb,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE;oBACR;wBACE,OAAO,EAAE,WAAW;wBACpB,IAAI,EAAE,oCAAmB,CAAC,KAAK;wBAC/B,MAAM,EAAE;4BACN,MAAM,EAAE;gCACN,qCAAqC;gCACrC,SAAS;gCACT,SAAS;gCACT,iCAAe;6BAChB;yBACF;qBACF;iBACF;aACF;SACF,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,6CAA2B,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE;gBACJ;oBACE,OAAO,EAAE,CAAC,4CAA4C,CAAC;oBACvD,OAAO,EAAE;wBACP,oEAAoE;qBACrE;oBACD,OAAO,EAAE,EAAE;iBACZ;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,EAAE,GAA2B;YACjC,IAAI,EAAE,uCAAsB,CAAC,OAAO;YACpC,MAAM,EAAE,IAAI,GAAG,EAAE;YACjB,OAAO,EAAE;gBACP,GAAG,EAAE,OAAO;gBACZ,OAAO,EAAE,4CAA4C;aACtD;YACD,UAAU,EAAE,CAAC;YACb,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE;oBACR;wBACE,OAAO,EAAE,UAAU;wBACnB,IAAI,EAAE,oCAAmB,CAAC,IAAI;wBAC9B,MAAM,EAAE;4BACN,QAAQ,EAAE,yCAAyC;yBACpD;qBACF;iBACF;aACF;SACF,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,6CAA2B,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,YAAY,EAAE;gBACZ;oBACE,EAAE,EAAE,CAAC,4CAA4C,CAAC;oBAClD,IAAI,EAAE,CAAC,YAAY,CAAC;iBACrB;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8FAA8F,EAAE,GAAG,EAAE;QACtG,MAAM,EAAE,GAA2B;YACjC,IAAI,EAAE,uCAAsB,CAAC,OAAO;YACpC,MAAM,EAAE,IAAI,GAAG,EAAE;YACjB,OAAO,EAAE;gBACP,GAAG,EAAE,OAAO;gBACZ,OAAO,EAAE,4CAA4C;aACtD;YACD,UAAU,EAAE,CAAC;YACb,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE;oBACR;wBACE,OAAO,EAAE,gBAAgB;wBACzB,IAAI,EAAE,oCAAmB,CAAC,KAAK;qBAChC;oBACD;wBACE,OAAO,EAAE,gBAAgB;wBACzB,IAAI,EAAE,oCAAmB,CAAC,IAAI;qBAC/B;iBACF;aACF;SACF,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,6CAA2B,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,YAAY,EAAE;gBACZ;oBACE,EAAE,EAAE,CAAC,4CAA4C,CAAC;iBACnD;aACF;YACD,IAAI,EAAE;gBACJ;oBACE,OAAO,EAAE,CAAC,4CAA4C,CAAC;iBACxD;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,EAAE,GAA6B;YACnC;gBACE,IAAI,EAAE,uCAAsB,CAAC,OAAO;gBACpC,UAAU,EAAE,OAAO;gBACnB,OAAO,EAAE;oBACP,GAAG,EAAE,aAAa;oBAClB,OAAO,EAAE,4CAA4C;iBACtD;gBACD,MAAM,EAAE,IAAI,GAAG,EAAE;gBACjB,OAAO,EAAE;oBACP,IAAI,EAAE,iBAAiB;oBACvB,QAAQ,EAAE;wBACR,oBAAoB;wBACpB;4BACE,IAAI,EAAE,oCAAmB,CAAC,KAAK;4BAC/B,OAAO,EAAE,2BAA2B;4BACpC,MAAM,EAAE;gCACN,MAAM,EAAE,CAAC,2BAA2B,CAAC;6BACtC;yBACF;wBACD;4BACE,IAAI,EAAE,oCAAmB,CAAC,KAAK;4BAC/B,OAAO,EAAE,2BAA2B;4BACpC,MAAM,EAAE;gCACN,MAAM,EAAE,CAAC,2BAA2B,CAAC;6BACtC;yBACF;wBACD;4BACE,IAAI,EAAE,oCAAmB,CAAC,KAAK;4BAC/B,OAAO,EAAE,2BAA2B;4BACpC,MAAM,EAAE;gCACN,MAAM,EAAE,CAAC,mCAAmC,CAAC;6BAC9C;yBACF;qBACF;iBACF;aACF;YACD;gBACE,IAAI,EAAE,uCAAsB,CAAC,OAAO;gBACpC,UAAU,EAAE,OAAO;gBACnB,OAAO,EAAE;oBACP,GAAG,EAAE,UAAU;iBAChB;gBACD,MAAM,EAAE,IAAI,GAAG,EAAE;gBACjB,OAAO,EAAE;oBACP,IAAI,EAAE,iBAAiB;oBACvB,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,oCAAmB,CAAC,KAAK;4BAC/B,OAAO,EAAE,kBAAkB;4BAC3B,MAAM,EAAE;gCACN,MAAM,EAAE,CAAC,6BAA6B,CAAC;6BACxC;yBACF;wBACD;4BACE,IAAI,EAAE,oCAAmB,CAAC,KAAK;4BAC/B,OAAO,EAAE,mBAAmB;4BAC5B,MAAM,EAAE;gCACN,MAAM,EAAE,CAAC,8BAA8B,CAAC;6BACzC;yBACF;wBACD;4BACE,IAAI,EAAE,oCAAmB,CAAC,KAAK;4BAC/B,OAAO,EAAE,4BAA4B;4BACrC,MAAM,EAAE;gCACN,MAAM,EAAE,CAAC,uCAAuC,CAAC;6BAClD;yBACF;wBACD;4BACE,IAAI,EAAE,oCAAmB,CAAC,KAAK;4BAC/B,OAAO,EAAE,4BAA4B;4BACrC,MAAM,EAAE;gCACN,MAAM,EAAE,CAAC,oDAAoD,CAAC;6BAC/D;yBACF;qBACF;iBACF;aACF;SACF,CAAC;QAEF,MAAM,UAAU,GAAG,IAAA,6CAA2B,EAAC,EAAE,CAAC,CAAC;QACnD,8CAA8C;QAC9C,MAAM,CAAC,UAAU,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,EAAE,GAA2B;YACjC,IAAI,EAAE,uCAAsB,CAAC,OAAO;YACpC,MAAM,EAAE,IAAI,GAAG,EAAE;YACjB,OAAO,EAAE;gBACP,GAAG,EAAE,OAAO;gBACZ,OAAO,EAAE,4CAA4C;aACtD;YACD,UAAU,EAAE,CAAC;YACb,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE;oBACR;wBACE,OAAO,EAAE,WAAW;wBACpB,IAAI,EAAE,oCAAmB,CAAC,KAAK;wBAC/B,MAAM,EAAE;4BACN,MAAM,EAAE,CAAC,qCAAqC,CAAC;yBAChD;qBACF;oBACD;wBACE,OAAO,EAAE,eAAe;wBACxB,IAAI,EAAE,oCAAmB,CAAC,KAAK;wBAC/B,MAAM,EAAE;4BACN,MAAM,EAAE,CAAC,qCAAqC,CAAC;yBAChD;qBACF;oBACD;wBACE,OAAO,EAAE,UAAU;wBACnB,IAAI,EAAE,oCAAmB,CAAC,IAAI;wBAC9B,MAAM,EAAE;4BACN,QAAQ,EAAE,yCAAyC;4BACnD,IAAI,EAAE,aAAa;yBACpB;qBACF;oBACD;wBACE,OAAO,EAAE,cAAc;wBACvB,IAAI,EAAE,oCAAmB,CAAC,IAAI;wBAC9B,MAAM,EAAE;4BACN,QAAQ,EAAE,yCAAyC;4BACnD,IAAI,EAAE,aAAa;yBACpB;qBACF;iBACF;aACF;SACF,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,6CAA2B,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE;gBACJ;oBACE,OAAO,EAAE,CAAC,4CAA4C,CAAC;oBACvD,OAAO,EAAE;wBACP,oEAAoE;qBACrE;iBACF;aACF;YACD,YAAY,EAAE;gBACZ;oBACE,IAAI,EAAE,CAAC,aAAa,CAAC;oBACrB,EAAE,EAAE,CAAC,4CAA4C,CAAC;oBAClD,IAAI,EAAE,CAAC,YAAY,CAAC;iBACrB;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,GAA6B,EAAE,CAAC;QAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,mBAAmB;YACnB,MAAM,GAAG,GAAI,MAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACxD,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,6CAA2B,EAAC,EAAE,CAAC,CAAC;QAE/C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE;gBACJ;oBACE,OAAO,EAAE;wBACP,KAAK;wBACL,KAAK;wBACL,KAAK;wBACL,KAAK;wBACL,KAAK;wBACL,KAAK;wBACL,KAAK;wBACL,KAAK;wBACL,KAAK;wBACL,KAAK;qBACN;oBACD,OAAO,EAAE;wBACP,oEAAoE;qBACrE;iBACF;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,EAAE,GAA6B,EAAE,CAAC;QAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,mBAAmB;YACnB,MAAM,GAAG,GAAI,MAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACxD,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,6CAA2B,EAAC,EAAE,CAAC,CAAC;QAE/C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE;gBACJ;oBACE,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE;wBACP,oEAAoE;qBACrE;iBACF;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,EAAE,GAA2B;YACjC,IAAI,EAAE,uCAAsB,CAAC,OAAO;YACpC,MAAM,EAAE,IAAI,GAAG,EAAE;YACjB,OAAO,EAAE;gBACP,GAAG,EAAE,OAAO;gBACZ,OAAO,EAAE,4CAA4C;aACtD;YACD,UAAU,EAAE,CAAC;YACb,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE;oBACR;wBACE,OAAO,EAAE,aAAa;wBACtB,IAAI,EAAE,oCAAmB,CAAC,KAAK;wBAC/B,MAAM,EAAE;4BACN,MAAM,EAAE,GAAG;yBACZ;qBACF;oBACD;wBACE,OAAO,EAAE,UAAU;wBACnB,IAAI,EAAE,oCAAmB,CAAC,IAAI;wBAC9B,MAAM,EAAE;4BACN,QAAQ,EAAE,yCAAyC;yBACpD;qBACF;iBACF;aACF;SACF,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,6CAA2B,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,YAAY,EAAE;gBACZ;oBACE,EAAE,EAAE,CAAC,4CAA4C,CAAC;oBAClD,IAAI,EAAE,CAAC,YAAY,CAAC;iBACrB;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { NOT_NULL_FILTER } from '@subql/common-ethereum';\nimport {\n BlockHeightMap,\n DictionaryResponse,\n IBlock,\n NodeConfig,\n} from '@subql/node-core';\nimport {\n EthereumBlock,\n EthereumDatasourceKind,\n EthereumHandlerKind,\n SubqlDatasource,\n SubqlRuntimeDatasource,\n} from '@subql/types-ethereum';\nimport EventEmitter2 from 'eventemitter2';\nimport {\n EthereumProjectDs,\n EthereumProjectDsTemplate,\n SubqueryProject,\n} from '../../../configure/SubqueryProject';\nimport { EthereumApi } from '../../../ethereum';\nimport {\n buildDictionaryV2QueryEntry,\n EthDictionaryV2,\n} from './ethDictionaryV2';\n\nconst DEFAULT_DICTIONARY = 'https://ethereum.node.subquery.network/public';\nconst HTTP_ENDPOINT = 'https://ethereum.rpc.subquery.network/public';\nconst mockDs: EthereumProjectDs[] = [\n {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 19217803,\n mapping: {\n file: './dist/index.js',\n handlers: [\n {\n handler: 'handleTransaction',\n kind: EthereumHandlerKind.Call,\n filter: {\n function: 'approve(address spender, uint256 rawAmount)',\n },\n },\n {\n handler: 'handleLog',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: [\n 'Transfer(address indexed from, address indexed to, uint256 amount)',\n ],\n },\n },\n ],\n },\n },\n];\n\nconst templateTs: EthereumProjectDsTemplate = {\n name: 'template',\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n // address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n },\n // startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleLog',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: ['Transfer(address, address, uint256)'],\n },\n },\n ],\n },\n};\n\n// tx to is null\nconst mockDs2: EthereumProjectDs[] = [\n {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 19217803,\n mapping: {\n file: './dist/index.js',\n handlers: [\n {\n handler: 'handleTransaction',\n kind: EthereumHandlerKind.Call,\n filter: {\n to: null,\n },\n },\n ],\n },\n processor: { file: '' },\n },\n];\n\nconst nodeConfig = new NodeConfig({\n subquery: 'eth-starter',\n subqueryName: 'eth-starter',\n dictionaryTimeout: 10,\n networkEndpoint: { [HTTP_ENDPOINT]: {} },\n networkDictionary: [DEFAULT_DICTIONARY],\n});\n\nfunction makeBlockHeightMap(mockDs: SubqlDatasource[]): BlockHeightMap<any> {\n const m = new Map<number, any>();\n mockDs.forEach((ds, index, dataSources) => {\n m.set(ds.startBlock || 1, dataSources.slice(0, index + 1));\n });\n return new BlockHeightMap(m);\n}\n\n// enable this once dictionary v2 is online\ndescribe('eth dictionary v2', () => {\n let ethDictionaryV2: EthDictionaryV2;\n\n const dsMap = makeBlockHeightMap(mockDs);\n\n beforeAll(async () => {\n ethDictionaryV2 = await EthDictionaryV2.create(\n DEFAULT_DICTIONARY,\n nodeConfig,\n { network: { chainId: '1' } } as SubqueryProject,\n new EthereumApi(HTTP_ENDPOINT, 1, new EventEmitter2()),\n );\n }, 10000);\n\n beforeEach(() => {\n ethDictionaryV2.updateQueriesMap(dsMap);\n });\n\n it('converts ds to v2 dictionary queries', () => {\n const query = (ethDictionaryV2 as any).queriesMap.get(19217803);\n expect(query.logs.length).toBe(1);\n expect(query.transactions.length).toBe(1);\n });\n\n it('query response match with entries', async () => {\n const ethBlocks = (await ethDictionaryV2.getData(\n 19217803,\n (ethDictionaryV2 as any)._metadata.end,\n 2,\n )) as DictionaryResponse<IBlock<EthereumBlock>>;\n\n expect(ethBlocks.batchBlocks.map((b) => b.block.number)).toStrictEqual([\n 19217803, 19217804,\n ]);\n\n const ethBlock19217803 = ethBlocks.batchBlocks[0].block;\n const ethBlock19217804 = ethBlocks.batchBlocks[1].block;\n\n expect(ethBlock19217803.number).toBe(19217803);\n expect(ethBlock19217804.number).toBe(19217804);\n\n // Sighash of approval tx\n expect(\n ethBlock19217803.transactions.filter(\n (tx) => tx.input.indexOf('0x095ea7b3') === 0,\n ).length,\n ).toBe(4);\n\n expect(ethBlock19217804.logs.length).toBe(233);\n\n // This matches with dictionaryQueryEntries[0].topics\n expect(ethBlock19217804.logs[0].topics).toContain(\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n );\n }, 10000);\n\n // Geth currently throwing errors with this request\n it.skip('is able to get transaction with field to is null', async () => {\n const dsMap = makeBlockHeightMap(mockDs2);\n ethDictionaryV2.updateQueriesMap(dsMap);\n\n const { conditions } = (ethDictionaryV2 as any).getQueryConditions(\n 19217803,\n (ethDictionaryV2 as any)._metadata.end,\n );\n\n expect(conditions).toEqual({ transactions: [{ to: [null] }] });\n\n const ethBlocks = (await ethDictionaryV2.getData(\n 19217803,\n (ethDictionaryV2 as any)._metadata.end,\n 1,\n )) as DictionaryResponse<IBlock<EthereumBlock>>;\n\n const { hash, transactions } = ethBlocks.batchBlocks[0].block;\n\n expect(hash).toBe(\n '0xa9ba70126240a8418739a103527860948a2be32de2eb9a8f590591faa174c08b',\n );\n\n // https://etherscan.io/tx/0x57e8cd9483cb5d308151372b0cf33fdc615999283c80ee3c28e94f074dda61f1\n expect(\n transactions.find(\n (tx) =>\n tx.hash ===\n '0x57e8cd9483cb5d308151372b0cf33fdc615999283c80ee3c28e94f074dda61f1',\n ),\n ).toBeDefined();\n });\n\n it('is able to query with not null topics', async () => {\n /**\n * Dictionary v1 supported filtering logs where a topic was null or not null.\n * V2 doesn't yet support this but we should still be able to make a dictionary query that gets relevant logs.\n * It will just include events that will be filtered out later.\n * */\n\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n },\n startBlock: 19476187,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleLog',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: [\n 'Transfer(address, address, uint256)',\n undefined,\n undefined,\n NOT_NULL_FILTER,\n ],\n },\n },\n ],\n },\n };\n\n const dsMap = makeBlockHeightMap([ds]);\n ethDictionaryV2.updateQueriesMap(dsMap);\n\n const { conditions } = (ethDictionaryV2 as any).getQueryConditions(\n 19476187,\n (ethDictionaryV2 as any)._metadata.end,\n );\n\n expect(conditions).toEqual({\n logs: [\n {\n address: [],\n topics0: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n ],\n topics3: [],\n },\n ],\n });\n\n const ethBlocks = (await ethDictionaryV2.getData(\n 19476187,\n (ethDictionaryV2 as any)._metadata.end,\n 2,\n )) as DictionaryResponse<IBlock<EthereumBlock>>;\n\n const { hash, logs } = ethBlocks.batchBlocks[0].block;\n\n expect(hash).toEqual(\n '0xa798861151ed58ad67d80d1cf61dc30e65d003bc958e99a7969a05a67e69e0b2',\n );\n\n const log = logs.find((l) => l.logIndex === 184);\n expect(log).toBeDefined();\n expect(log!.transactionHash).toEqual(\n '0x5491f3f4b7ca6cc81f992a17e19bc9bafff408518c643c5a254de44b5a7b6d72',\n );\n\n // Uncomment this when not null filter supported\n // expect(logs.filter(l => !l.topics[3]).length).toEqual(6) // There are 6 events with no topic3\n }, 100000);\n\n it('returns a lastBufferedHeight if there are no block results', async () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n address: '0x30baa3ba9d7089fd8d020a994db75d14cf7ec83b',\n },\n startBlock: 18723210,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleLog',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: ['Transfer(address, address, uint256)'],\n },\n },\n ],\n },\n };\n\n const dsMap = makeBlockHeightMap([ds]);\n ethDictionaryV2.updateQueriesMap(dsMap);\n\n const res = await ethDictionaryV2.getData(18723210, 18733210, 100);\n\n expect(res?.batchBlocks.length).toEqual(0);\n expect(res?.lastBufferedHeight).toEqual(18733210);\n });\n});\n\ndescribe('buildDictionaryV2QueryEntry', () => {\n it('Build filter for !null', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n },\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleLog',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: [\n 'Transfer(address, address, uint256)',\n undefined,\n undefined,\n NOT_NULL_FILTER,\n ],\n },\n },\n ],\n },\n };\n const result = buildDictionaryV2QueryEntry([ds]);\n\n expect(result).toEqual({\n logs: [\n {\n address: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],\n topics0: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n ],\n topics3: [],\n },\n ],\n });\n });\n\n it('Build filter tx filter', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n },\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleTx',\n kind: EthereumHandlerKind.Call,\n filter: {\n function: 'setminimumStakingAmount(uint256 amount)',\n },\n },\n ],\n },\n };\n const result = buildDictionaryV2QueryEntry([ds]);\n\n expect(result).toEqual({\n transactions: [\n {\n to: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],\n data: ['0x7ef9ea98'],\n },\n ],\n });\n });\n\n it('Creates a valid filter with a single event handler that has 0 filters but a contract address', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n address: '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619',\n },\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleTransfer',\n kind: EthereumHandlerKind.Event,\n },\n {\n handler: 'handleTransfer',\n kind: EthereumHandlerKind.Call,\n },\n ],\n },\n };\n const result = buildDictionaryV2QueryEntry([ds]);\n\n expect(result).toEqual({\n transactions: [\n {\n to: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],\n },\n ],\n logs: [\n {\n address: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],\n },\n ],\n });\n });\n\n it('build query entries for multiple ds', () => {\n const ds: SubqlRuntimeDatasource[] = [\n {\n kind: EthereumDatasourceKind.Runtime,\n startBlock: 3327417,\n options: {\n abi: 'EnsRegistry',\n address: '0x314159265dd8dbb310642f98f50c066173c1259b',\n },\n assets: new Map(),\n mapping: {\n file: './dist/index.js',\n handlers: [\n // one duplicate one\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleTransferOldRegistry',\n filter: {\n topics: ['Transfer(bytes32,address)'],\n },\n },\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleTransferOldRegistry',\n filter: {\n topics: ['Transfer(bytes32,address)'],\n },\n },\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleNewOwnerOldRegistry',\n filter: {\n topics: ['NewOwner(bytes32,bytes32,address)'],\n },\n },\n ],\n },\n },\n {\n kind: EthereumDatasourceKind.Runtime,\n startBlock: 3327417,\n options: {\n abi: 'Resolver',\n },\n assets: new Map(),\n mapping: {\n file: './dist/index.js',\n handlers: [\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleABIChanged',\n filter: {\n topics: ['ABIChanged(bytes32,uint256)'],\n },\n },\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleAddrChanged',\n filter: {\n topics: ['AddrChanged(bytes32,address)'],\n },\n },\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleMulticoinAddrChanged',\n filter: {\n topics: ['AddressChanged(bytes32,uint256,bytes)'],\n },\n },\n {\n kind: EthereumHandlerKind.Event,\n handler: 'handleAuthorisationChanged',\n filter: {\n topics: ['AuthorisationChanged(bytes32,address,address,bool)'],\n },\n },\n ],\n },\n },\n ];\n\n const queryEntry = buildDictionaryV2QueryEntry(ds);\n // Total 7 handlers were given, 1 is duplicate\n expect(queryEntry.logs!.length).toBe(6);\n });\n\n it('should unique QueryEntry for duplicate dataSources', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n },\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleLog',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: ['Transfer(address, address, uint256)'],\n },\n },\n {\n handler: 'handleLogSame',\n kind: EthereumHandlerKind.Event,\n filter: {\n topics: ['Transfer(address, address, uint256)'],\n },\n },\n {\n handler: 'handleTx',\n kind: EthereumHandlerKind.Call,\n filter: {\n function: 'setminimumStakingAmount(uint256 amount)',\n from: 'mockAddress',\n },\n },\n {\n handler: 'handleTxSame',\n kind: EthereumHandlerKind.Call,\n filter: {\n function: 'setminimumStakingAmount(uint256 amount)',\n from: 'mockAddress',\n },\n },\n ],\n },\n };\n const result = buildDictionaryV2QueryEntry([ds]);\n\n expect(result).toEqual({\n logs: [\n {\n address: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],\n topics0: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n ],\n },\n ],\n transactions: [\n {\n from: ['mockaddress'],\n to: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],\n data: ['0x7ef9ea98'],\n },\n ],\n });\n });\n\n it('should group a small number of dynamic ds', () => {\n const ds: SubqlRuntimeDatasource[] = [];\n\n for (let i = 0; i < 10; i++) {\n // Bad nodejs types\n const tmp = (global as any).structuredClone(templateTs);\n (tmp.options.address = `0x${i}`), ds.push(tmp);\n }\n\n const result = buildDictionaryV2QueryEntry(ds);\n\n expect(result).toEqual({\n logs: [\n {\n address: [\n '0x0',\n '0x1',\n '0x2',\n '0x3',\n '0x4',\n '0x5',\n '0x6',\n '0x7',\n '0x8',\n '0x9',\n ],\n topics0: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n ],\n },\n ],\n });\n });\n\n it('should remove address filter with large number of dynamic ds', () => {\n const ds: SubqlRuntimeDatasource[] = [];\n\n for (let i = 0; i < 200; i++) {\n // Bad nodejs types\n const tmp = (global as any).structuredClone(templateTs);\n (tmp.options.address = `0x${i}`), ds.push(tmp);\n }\n\n const result = buildDictionaryV2QueryEntry(ds);\n\n expect(result).toEqual({\n logs: [\n {\n address: [],\n topics0: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n ],\n },\n ],\n });\n });\n\n it('builds a filter when theres a block handler with modulo filter', () => {\n const ds: SubqlRuntimeDatasource = {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n options: {\n abi: 'erc20',\n address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',\n },\n startBlock: 1,\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'handleBlock',\n kind: EthereumHandlerKind.Block,\n filter: {\n modulo: 100,\n },\n },\n {\n handler: 'handleTx',\n kind: EthereumHandlerKind.Call,\n filter: {\n function: 'setminimumStakingAmount(uint256 amount)',\n },\n },\n ],\n },\n };\n const result = buildDictionaryV2QueryEntry([ds]);\n\n expect(result).toEqual({\n transactions: [\n {\n to: ['0x7ceb23fd6bc0add59e62ac25578270cff1b9f619'],\n data: ['0x7ef9ea98'],\n },\n ],\n });\n });\n});\n"]}
@@ -2,7 +2,7 @@
2
2
  // Copyright 2020-2024 SubQuery Pte Ltd authors & contributors
3
3
  // SPDX-License-Identifier: GPL-3.0
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.rawBlockToEthBlock = void 0;
5
+ exports.rawBlockToEthBlock = rawBlockToEthBlock;
6
6
  const providers_1 = require("@ethersproject/providers");
7
7
  const utils_ethereum_1 = require("../../../ethereum/utils.ethereum");
8
8
  function rawBlockToEthBlock(block, api) {
@@ -25,5 +25,4 @@ function rawBlockToEthBlock(block, api) {
25
25
  throw new Error(`Convert raw block to Eth block failed at ${block.header.number},${e.message}`);
26
26
  }
27
27
  }
28
- exports.rawBlockToEthBlock = rawBlockToEthBlock;
29
28
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v2/utils.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAEnC,wDAAqD;AAIrD,qEAM0C;AAG1C,SAAgB,kBAAkB,CAChC,KAAkB,EAClB,GAAgB;IAEhB,IAAI;QACF,gFAAgF;QAChF,MAAM,SAAS,GAAG,GAAG,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,qBAAS,EAAE,CAAC;QAExD,MAAM,QAAQ,GAAG,IAAA,4BAAW,EAAC;YAC3B,GAAG,KAAK,CAAC,MAAM;YACf,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;QAEH,QAAQ,CAAC,IAAI,GAAG,qBAAS,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CACpE,KAAK,CAAC,IAAI,IAAI,EAAE,CACjB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,0BAAS,EAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QAErC,QAAQ,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9D,GAAG,IAAA,kCAAiB,EAAC,EAAE,EAAE,QAAQ,CAAC;YAClC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,EAAE,CAAC,IAAI,CAAC;YAChE,OAAO,EAAE,GAA0C,EAAE,CACnD,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,8BAAa,EAAI,CAAC,CAAC,CAAC;SACtE,CAAC,CAAC,CAAC;QAEJ,OAAO,IAAA,gCAAe,EAAC,QAAQ,CAAC,CAAC;KAClC;IAAC,OAAO,CAAM,EAAE;QACf,MAAM,IAAI,KAAK,CACb,4CAA4C,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,CAC/E,CAAC;KACH;AACH,CAAC;AA9BD,gDA8BC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Formatter } from '@ethersproject/providers';\nimport { IBlock } from '@subql/node-core';\nimport { EthereumBlock, EthereumReceipt } from '@subql/types-ethereum';\nimport { EthereumApi } from '../../../ethereum';\nimport {\n formatBlock,\n formatBlockUtil,\n formatLog,\n formatReceipt,\n formatTransaction,\n} from '../../../ethereum/utils.ethereum';\nimport { RawEthBlock } from './types';\n\nexport function rawBlockToEthBlock(\n block: RawEthBlock,\n api: EthereumApi,\n): IBlock<EthereumBlock> {\n try {\n // Use the formatter from the api, it could have custom formats e.g l1Gas fields\n const formatter = api?.api.formatter ?? new Formatter();\n\n const ethBlock = formatBlock({\n ...block.header,\n transactions: [],\n });\n\n ethBlock.logs = Formatter.arrayOf(formatter.filterLog.bind(formatter))(\n block.logs ?? [],\n ).map((l) => formatLog(l, ethBlock));\n\n ethBlock.transactions = (block.transactions ?? []).map((tx) => ({\n ...formatTransaction(tx, ethBlock),\n logs: ethBlock.logs.filter((l) => l.transactionHash === tx.hash),\n receipt: <R extends EthereumReceipt>(): Promise<R> =>\n api.getTransactionReceipt(tx.hash).then((r) => formatReceipt<R>(r)),\n }));\n\n return formatBlockUtil(ethBlock);\n } catch (e: any) {\n throw new Error(\n `Convert raw block to Eth block failed at ${block.header.number},${e.message}`,\n );\n }\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v2/utils.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAenC,gDA8BC;AA3CD,wDAAqD;AAIrD,qEAM0C;AAG1C,SAAgB,kBAAkB,CAChC,KAAkB,EAClB,GAAgB;IAEhB,IAAI,CAAC;QACH,gFAAgF;QAChF,MAAM,SAAS,GAAG,GAAG,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,qBAAS,EAAE,CAAC;QAExD,MAAM,QAAQ,GAAG,IAAA,4BAAW,EAAC;YAC3B,GAAG,KAAK,CAAC,MAAM;YACf,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;QAEH,QAAQ,CAAC,IAAI,GAAG,qBAAS,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CACpE,KAAK,CAAC,IAAI,IAAI,EAAE,CACjB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,0BAAS,EAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QAErC,QAAQ,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9D,GAAG,IAAA,kCAAiB,EAAC,EAAE,EAAE,QAAQ,CAAC;YAClC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,EAAE,CAAC,IAAI,CAAC;YAChE,OAAO,EAAE,GAA0C,EAAE,CACnD,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,8BAAa,EAAI,CAAC,CAAC,CAAC;SACtE,CAAC,CAAC,CAAC;QAEJ,OAAO,IAAA,gCAAe,EAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,4CAA4C,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,CAC/E,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Formatter } from '@ethersproject/providers';\nimport { IBlock } from '@subql/node-core';\nimport { EthereumBlock, EthereumReceipt } from '@subql/types-ethereum';\nimport { EthereumApi } from '../../../ethereum';\nimport {\n formatBlock,\n formatBlockUtil,\n formatLog,\n formatReceipt,\n formatTransaction,\n} from '../../../ethereum/utils.ethereum';\nimport { RawEthBlock } from './types';\n\nexport function rawBlockToEthBlock(\n block: RawEthBlock,\n api: EthereumApi,\n): IBlock<EthereumBlock> {\n try {\n // Use the formatter from the api, it could have custom formats e.g l1Gas fields\n const formatter = api?.api.formatter ?? new Formatter();\n\n const ethBlock = formatBlock({\n ...block.header,\n transactions: [],\n });\n\n ethBlock.logs = Formatter.arrayOf(formatter.filterLog.bind(formatter))(\n block.logs ?? [],\n ).map((l) => formatLog(l, ethBlock));\n\n ethBlock.transactions = (block.transactions ?? []).map((tx) => ({\n ...formatTransaction(tx, ethBlock),\n logs: ethBlock.logs.filter((l) => l.transactionHash === tx.hash),\n receipt: <R extends EthereumReceipt>(): Promise<R> =>\n api.getTransactionReceipt(tx.hash).then((r) => formatReceipt<R>(r)),\n }));\n\n return formatBlockUtil(ethBlock);\n } catch (e: any) {\n throw new Error(\n `Convert raw block to Eth block failed at ${block.header.number},${e.message}`,\n );\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.spec.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v2/utils.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;AAInC,kEAA0C;AAC1C,4DAA+B;AAC/B,gDAAgD;AAEhD,mCAA6C;AAE7C,MAAM,cAAc,GAAG,+CAA+C,CAAC;AACvE,MAAM,OAAO,GAAG,8CAA8C,CAAC;AAE/D,KAAK,UAAU,oBAAoB;IACjC,MAAM,GAAG,GAAG,MAAM,IAAA,oBAAK,EAAC,cAAc,EAAE;QACtC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,CAAC;YACL,MAAM,EAAE,oBAAoB;YAC5B,MAAM,EAAE;gBACN;oBACE,SAAS,EAAE,UAAU;oBACrB,OAAO,EAAE,UAAU;oBACnB,KAAK,EAAE,KAAK;oBACZ,WAAW,EAAE;wBACX,IAAI,EAAE;4BACJ;gCACE,OAAO,EAAE,CAAC,4CAA4C,CAAC;gCACvD,OAAO,EAAE;oCACP,oEAAoE;iCACrE;6BACF;yBACF;qBACF;oBACD,aAAa,EAAE;wBACb,WAAW,EAAE,IAAI;wBACjB,IAAI,EAAE;4BACJ,WAAW,EAAE,IAAI;yBAClB;wBACD,YAAY,EAAE;4BACZ,GAAG,EAAE,IAAI;yBACV;qBACF;iBACF;aACF;SACF,CAAC;KACH,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,MAAM,GAAG,GAAG,IAAI,sBAAW,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,uBAAa,EAAE,CAAC,CAAC;IAC7D,IAAI,GAAgB,CAAC;IACrB,IAAI,QAA+B,CAAC;IAEpC,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAClC,oBAAoB,EAAE;YACtB,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;SACxB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,KAAK,GAAG,IAAA,0BAAkB,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAE3C,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC;YAChC,SAAS,EACP,oEAAoE;YACtE,WAAW,EAAE,OAAO;YACpB,UAAU,EACR,oEAAoE;SACvE,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEnD,+FAA+F;QAC/F,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;YAClC,sBAAsB;YACtB,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,CAAC;YACvD,MAAM,EACJ,KAAK,EAAE,EAAE,EACT,WAAW,EAAE,EAAE,EACf,GAAG,UAAU,EACd,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;SACrE;QAED,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE;YACzC,oEAAoE;YACpE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,EAAS,CAAC;YACnE,MAAM,EACJ,IAAI,EAAE,EAAE,EACR,OAAO,EAAE,EAAE,EACX,MAAM,EAAE,EAAE,EACV,GAAG,SAAS,EACb,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAQ,CAAC;YAEpE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;SACnC;IACH,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,KAAK,GAAG,IAAA,0BAAkB,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAE3C,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { IBlock } from '@subql/node-core';\nimport { EthereumBlock } from '@subql/types-ethereum';\nimport EventEmitter2 from 'eventemitter2';\nimport fetch from 'node-fetch';\nimport { EthereumApi } from '../../../ethereum';\nimport { RawEthBlock } from './types';\nimport { rawBlockToEthBlock } from './utils';\n\nconst DICTIONARY_URL = 'https://ethereum.node.subquery.network/public';\nconst RPC_URL = 'https://ethereum.rpc.subquery.network/public';\n\nasync function fetchDictionaryBlock(): Promise<RawEthBlock> {\n const res = await fetch(DICTIONARY_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'subql_filterBlocks',\n params: [\n {\n fromBlock: '0x3e579e',\n toBlock: '0x3e579e',\n limit: '0x1',\n blockFilter: {\n logs: [\n {\n address: ['0x6f28B146804dBa2D6f944C03528A8FDbc673df2C'],\n topics0: [\n '0xb76d0edd90c6a07aa3ff7a222d7f5933e29c6acc660c059c97837f05c4ca1a84',\n ],\n },\n ],\n },\n fieldSelector: {\n blockHeader: true,\n logs: {\n transaction: true,\n },\n transactions: {\n log: true,\n },\n },\n },\n ],\n }),\n });\n\n return (await res.json()).result.blocks[0];\n}\n\ndescribe('rawBlockToEthBlock', () => {\n const api = new EthereumApi(RPC_URL, 1, new EventEmitter2());\n let raw: RawEthBlock;\n let rpcBlock: IBlock<EthereumBlock>;\n\n beforeAll(async () => {\n [raw, rpcBlock] = await Promise.all([\n fetchDictionaryBlock(),\n api.fetchBlock(4085662),\n ]);\n });\n\n it('successfully converts a block', () => {\n const block = rawBlockToEthBlock(raw, api);\n\n expect(block.getHeader()).toEqual({\n blockHash:\n '0xde8e614cc05b483fe092fd0aff435011138c15c9ede862579074218d4aff5132',\n blockHeight: 4085662,\n parentHash:\n '0x669c7a2c66e38c144ad1e2845ec345b6ce7e2107edbdb331ab88d355982126a7',\n });\n\n expect(block.block.transactions.length).toBeGreaterThan(0);\n expect(block.block.logs.length).toBeGreaterThan(0);\n\n // Dictionry is going to return a subset of events/transactions so we base off dictionary block\n for (const log of block.block.logs) {\n // Remove linked types\n const { block: _1, transaction: _2, ...logRest } = log;\n const {\n block: _3,\n transaction: _4,\n ...rpcLogRest\n } = rpcBlock.block.logs[log.logIndex];\n expect(JSON.stringify(logRest)).toEqual(JSON.stringify(rpcLogRest));\n }\n\n for (const tx of block.block.transactions) {\n // Cast to any to remove toJSON which results in different key order\n const { logs: _1, receipt: _3, toJSON: _5, ...txRest } = tx as any;\n const {\n logs: _2,\n receipt: _4,\n toJSON: _6,\n ...rpcTxRest\n } = rpcBlock.block.transactions[Number(tx.transactionIndex)] as any;\n\n expect(txRest).toEqual(rpcTxRest);\n }\n }, 15000);\n\n it('can fetch receipts', async () => {\n const block = rawBlockToEthBlock(raw, api);\n\n await expect(block.block.transactions[0].receipt()).resolves.not.toThrow();\n });\n});\n"]}
1
+ {"version":3,"file":"utils.spec.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v2/utils.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { IBlock } from '@subql/node-core';\nimport { EthereumBlock } from '@subql/types-ethereum';\nimport EventEmitter2 from 'eventemitter2';\nimport fetch from 'node-fetch';\nimport { EthereumApi } from '../../../ethereum';\nimport { RawEthBlock } from './types';\nimport { rawBlockToEthBlock } from './utils';\n\nconst DICTIONARY_URL = 'https://ethereum.node.subquery.network/public';\nconst RPC_URL = 'https://ethereum.rpc.subquery.network/public';\n\nasync function fetchDictionaryBlock(): Promise<RawEthBlock> {\n const res = await fetch(DICTIONARY_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'subql_filterBlocks',\n params: [\n {\n fromBlock: '0x3e579e',\n toBlock: '0x3e579e',\n limit: '0x1',\n blockFilter: {\n logs: [\n {\n address: ['0x6f28B146804dBa2D6f944C03528A8FDbc673df2C'],\n topics0: [\n '0xb76d0edd90c6a07aa3ff7a222d7f5933e29c6acc660c059c97837f05c4ca1a84',\n ],\n },\n ],\n },\n fieldSelector: {\n blockHeader: true,\n logs: {\n transaction: true,\n },\n transactions: {\n log: true,\n },\n },\n },\n ],\n }),\n });\n\n return (await res.json()).result.blocks[0];\n}\n\ndescribe('rawBlockToEthBlock', () => {\n const api = new EthereumApi(RPC_URL, 1, new EventEmitter2());\n let raw: RawEthBlock;\n let rpcBlock: IBlock<EthereumBlock>;\n\n beforeAll(async () => {\n [raw, rpcBlock] = await Promise.all([\n fetchDictionaryBlock(),\n api.fetchBlock(4085662),\n ]);\n });\n\n it('successfully converts a block', () => {\n const block = rawBlockToEthBlock(raw, api);\n\n expect(block.getHeader()).toEqual({\n blockHash:\n '0xde8e614cc05b483fe092fd0aff435011138c15c9ede862579074218d4aff5132',\n blockHeight: 4085662,\n parentHash:\n '0x669c7a2c66e38c144ad1e2845ec345b6ce7e2107edbdb331ab88d355982126a7',\n });\n\n expect(block.block.transactions.length).toBeGreaterThan(0);\n expect(block.block.logs.length).toBeGreaterThan(0);\n\n // Dictionry is going to return a subset of events/transactions so we base off dictionary block\n for (const log of block.block.logs) {\n // Remove linked types\n const { block: _1, transaction: _2, ...logRest } = log;\n const {\n block: _3,\n transaction: _4,\n ...rpcLogRest\n } = rpcBlock.block.logs[log.logIndex];\n expect(JSON.stringify(logRest)).toEqual(JSON.stringify(rpcLogRest));\n }\n\n for (const tx of block.block.transactions) {\n // Cast to any to remove toJSON which results in different key order\n const { logs: _1, receipt: _3, toJSON: _5, ...txRest } = tx as any;\n const {\n logs: _2,\n receipt: _4,\n toJSON: _6,\n ...rpcTxRest\n } = rpcBlock.block.transactions[Number(tx.transactionIndex)] as any;\n\n expect(txRest).toEqual(rpcTxRest);\n }\n }, 15000);\n\n it('can fetch receipts', async () => {\n const block = rawBlockToEthBlock(raw, api);\n\n await expect(block.block.transactions[0].receipt()).resolves.not.toThrow();\n });\n});\n"]}
@@ -15,8 +15,8 @@ const node_core_1 = require("@subql/node-core");
15
15
  let DsProcessorService = class DsProcessorService extends node_core_1.BaseDsProcessorService {
16
16
  isCustomDs = common_ethereum_1.isCustomDs;
17
17
  };
18
- DsProcessorService = __decorate([
18
+ exports.DsProcessorService = DsProcessorService;
19
+ exports.DsProcessorService = DsProcessorService = __decorate([
19
20
  (0, common_1.Injectable)()
20
21
  ], DsProcessorService);
21
- exports.DsProcessorService = DsProcessorService;
22
22
  //# sourceMappingURL=ds-processor.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ds-processor.service.js","sourceRoot":"","sources":["../../src/indexer/ds-processor.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAA4C;AAC5C,4DAKgC;AAChC,gDAA0D;AAGnD,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,kCAIvC;IACW,UAAU,GAAG,4BAAU,CAAC;CACnC,CAAA;AANY,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;GACA,kBAAkB,CAM9B;AANY,gDAAkB","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Injectable } from '@nestjs/common';\nimport {\n isCustomDs,\n SubqlEthereumCustomDataSource,\n SubqlEthereumDataSource,\n SubqlDatasourceProcessor,\n} from '@subql/common-ethereum';\nimport { BaseDsProcessorService } from '@subql/node-core';\n\n@Injectable()\nexport class DsProcessorService extends BaseDsProcessorService<\n SubqlEthereumDataSource,\n SubqlEthereumCustomDataSource<string>,\n SubqlDatasourceProcessor<string, Record<string, unknown>>\n> {\n protected isCustomDs = isCustomDs;\n}\n"]}
1
+ {"version":3,"file":"ds-processor.service.js","sourceRoot":"","sources":["../../src/indexer/ds-processor.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAA4C;AAC5C,4DAKgC;AAChC,gDAA0D;AAGnD,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,kCAIvC;IACW,UAAU,GAAG,4BAAU,CAAC;CACnC,CAAA;AANY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;GACA,kBAAkB,CAM9B","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Injectable } from '@nestjs/common';\nimport {\n isCustomDs,\n SubqlEthereumCustomDataSource,\n SubqlEthereumDataSource,\n SubqlDatasourceProcessor,\n} from '@subql/common-ethereum';\nimport { BaseDsProcessorService } from '@subql/node-core';\n\n@Injectable()\nexport class DsProcessorService extends BaseDsProcessorService<\n SubqlEthereumDataSource,\n SubqlEthereumCustomDataSource<string>,\n SubqlDatasourceProcessor<string, Record<string, unknown>>\n> {\n protected isCustomDs = isCustomDs;\n}\n"]}
@@ -60,10 +60,10 @@ let DynamicDsService = class DynamicDsService extends node_core_1.DynamicDsServi
60
60
  }
61
61
  }
62
62
  };
63
- DynamicDsService = __decorate([
63
+ exports.DynamicDsService = DynamicDsService;
64
+ exports.DynamicDsService = DynamicDsService = __decorate([
64
65
  (0, common_1.Injectable)(),
65
66
  __param(1, (0, common_1.Inject)('ISubqueryProject')),
66
67
  __metadata("design:paramtypes", [ds_processor_service_1.DsProcessorService, Object])
67
68
  ], DynamicDsService);
68
- exports.DynamicDsService = DynamicDsService;
69
69
  //# sourceMappingURL=dynamic-ds.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-ds.service.js","sourceRoot":"","sources":["../../src/indexer/dynamic-ds.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,4DAIgC;AAChC,gDAG0B;AAC1B,yDAAiD;AACjD,qDAA+C;AAK/C,iEAA4D;AAGrD,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,4BAGrC;IAEoB;IADnB,YACmB,kBAAsC,EAC3B,OAAwB;QAEpD,KAAK,CAAC,OAAO,CAAC,CAAC;QAHE,uBAAkB,GAAlB,kBAAkB,CAAoB;IAIzD,CAAC;IAES,KAAK,CAAC,aAAa,CAC3B,MAAwB;QAExB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAC5B,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,UAAU,CAClB,CAAC;QAEF,IAAI;YACF,IAAI,IAAA,4BAAU,EAAC,KAAK,CAAC,EAAE;gBACrB,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG;oBACxB,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO;oBAC1B,GAAG,MAAM,CAAC,IAAI;iBACf,CAAC;gBACF,MAAM,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;aACzD;iBAAM,IAAI,IAAA,6BAAW,EAAC,KAAK,CAAC,EAAE;gBAC7B,KAAK,CAAC,OAAO,GAAG;oBACd,GAAG,KAAK,CAAC,OAAO;oBAChB,GAAG,MAAM,CAAC,IAAI;iBACf,CAAC;gBAEF,MAAM,QAAQ,GAAG,IAAA,gCAAY,EAAC,+CAA6B,EAAE,KAAK,CAAC,CAAC;gBAEpE,MAAM,MAAM,GAAG,IAAA,8BAAY,EAAC,QAAQ,EAAE;oBACpC,SAAS,EAAE,IAAI;oBACf,oBAAoB,EAAE,KAAK;iBAC5B,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,MAAM,EAAE;oBACjB,MAAM,IAAI,KAAK,CACb,0BAA0B,MAAM;yBAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;yBACxB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;iBACH;aACF;YACD,OAAO,KAAK,CAAC;SACd;QAAC,OAAO,CAAM,EAAE;YACf,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;SACxE;IACH,CAAC;CACF,CAAA;AAnDY,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;IAOR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCADU,yCAAkB;GAL9C,gBAAgB,CAmD5B;AAnDY,4CAAgB","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n EthereumRuntimeDataSourceImpl,\n isCustomDs,\n isRuntimeDs,\n} from '@subql/common-ethereum';\nimport {\n DatasourceParams,\n DynamicDsService as BaseDynamicDsService,\n} from '@subql/node-core';\nimport { plainToClass } from 'class-transformer';\nimport { validateSync } from 'class-validator';\nimport {\n EthereumProjectDs,\n SubqueryProject,\n} from '../configure/SubqueryProject';\nimport { DsProcessorService } from './ds-processor.service';\n\n@Injectable()\nexport class DynamicDsService extends BaseDynamicDsService<\n EthereumProjectDs,\n SubqueryProject\n> {\n constructor(\n private readonly dsProcessorService: DsProcessorService,\n @Inject('ISubqueryProject') project: SubqueryProject,\n ) {\n super(project);\n }\n\n protected async getDatasource(\n params: DatasourceParams,\n ): Promise<EthereumProjectDs> {\n const dsObj = this.getTemplate<EthereumProjectDs>(\n params.templateName,\n params.startBlock,\n );\n\n try {\n if (isCustomDs(dsObj)) {\n dsObj.processor.options = {\n ...dsObj.processor.options,\n ...params.args,\n };\n await this.dsProcessorService.validateCustomDs([dsObj]);\n } else if (isRuntimeDs(dsObj)) {\n dsObj.options = {\n ...dsObj.options,\n ...params.args,\n };\n\n const parsedDs = plainToClass(EthereumRuntimeDataSourceImpl, dsObj);\n\n const errors = validateSync(parsedDs, {\n whitelist: true,\n forbidNonWhitelisted: false,\n });\n if (errors.length) {\n throw new Error(\n `Dynamic ds is invalid\\n${errors\n .map((e) => e.toString())\n .join('\\n')}`,\n );\n }\n }\n return dsObj;\n } catch (e: any) {\n throw new Error(`Unable to create dynamic datasource.\\n ${e.message}`);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"dynamic-ds.service.js","sourceRoot":"","sources":["../../src/indexer/dynamic-ds.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,4DAIgC;AAChC,gDAG0B;AAC1B,yDAAiD;AACjD,qDAA+C;AAK/C,iEAA4D;AAGrD,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,4BAGrC;IAEoB;IADnB,YACmB,kBAAsC,EAC3B,OAAwB;QAEpD,KAAK,CAAC,OAAO,CAAC,CAAC;QAHE,uBAAkB,GAAlB,kBAAkB,CAAoB;IAIzD,CAAC;IAES,KAAK,CAAC,aAAa,CAC3B,MAAwB;QAExB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAC5B,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,UAAU,CAClB,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,IAAA,4BAAU,EAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG;oBACxB,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO;oBAC1B,GAAG,MAAM,CAAC,IAAI;iBACf,CAAC;gBACF,MAAM,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1D,CAAC;iBAAM,IAAI,IAAA,6BAAW,EAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,KAAK,CAAC,OAAO,GAAG;oBACd,GAAG,KAAK,CAAC,OAAO;oBAChB,GAAG,MAAM,CAAC,IAAI;iBACf,CAAC;gBAEF,MAAM,QAAQ,GAAG,IAAA,gCAAY,EAAC,+CAA6B,EAAE,KAAK,CAAC,CAAC;gBAEpE,MAAM,MAAM,GAAG,IAAA,8BAAY,EAAC,QAAQ,EAAE;oBACpC,SAAS,EAAE,IAAI;oBACf,oBAAoB,EAAE,KAAK;iBAC5B,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClB,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;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;CACF,CAAA;AAnDY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;IAOR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCADU,yCAAkB;GAL9C,gBAAgB,CAmD5B","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n EthereumRuntimeDataSourceImpl,\n isCustomDs,\n isRuntimeDs,\n} from '@subql/common-ethereum';\nimport {\n DatasourceParams,\n DynamicDsService as BaseDynamicDsService,\n} from '@subql/node-core';\nimport { plainToClass } from 'class-transformer';\nimport { validateSync } from 'class-validator';\nimport {\n EthereumProjectDs,\n SubqueryProject,\n} from '../configure/SubqueryProject';\nimport { DsProcessorService } from './ds-processor.service';\n\n@Injectable()\nexport class DynamicDsService extends BaseDynamicDsService<\n EthereumProjectDs,\n SubqueryProject\n> {\n constructor(\n private readonly dsProcessorService: DsProcessorService,\n @Inject('ISubqueryProject') project: SubqueryProject,\n ) {\n super(project);\n }\n\n protected async getDatasource(\n params: DatasourceParams,\n ): Promise<EthereumProjectDs> {\n const dsObj = this.getTemplate<EthereumProjectDs>(\n params.templateName,\n params.startBlock,\n );\n\n try {\n if (isCustomDs(dsObj)) {\n dsObj.processor.options = {\n ...dsObj.processor.options,\n ...params.args,\n };\n await this.dsProcessorService.validateCustomDs([dsObj]);\n } else if (isRuntimeDs(dsObj)) {\n dsObj.options = {\n ...dsObj.options,\n ...params.args,\n };\n\n const parsedDs = plainToClass(EthereumRuntimeDataSourceImpl, dsObj);\n\n const errors = validateSync(parsedDs, {\n whitelist: true,\n forbidNonWhitelisted: false,\n });\n if (errors.length) {\n throw new Error(\n `Dynamic ds is invalid\\n${errors\n .map((e) => e.toString())\n .join('\\n')}`,\n );\n }\n }\n return dsObj;\n } catch (e: any) {\n throw new Error(`Unable to create dynamic datasource.\\n ${e.message}`);\n }\n }\n}\n"]}