@subql/node-ethereum 3.11.1-1 → 3.11.1-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/indexer/dictionary/v2/ethDictionaryV2.js +2 -2
- package/dist/indexer/dictionary/v2/ethDictionaryV2.js.map +1 -1
- package/dist/indexer/dictionary/v2/ethDictionaryV2.spec.js +84 -0
- package/dist/indexer/dictionary/v2/ethDictionaryV2.spec.js.map +1 -1
- package/package.json +2 -2
|
@@ -136,13 +136,13 @@ function buildDictionaryV2QueryEntry(dataSources) {
|
|
|
136
136
|
delete dictionaryConditions.logs;
|
|
137
137
|
}
|
|
138
138
|
else {
|
|
139
|
-
dictionaryConditions.logs = (0, lodash_1.uniqBy)(dictionaryConditions.logs,
|
|
139
|
+
dictionaryConditions.logs = (0, lodash_1.uniqBy)(dictionaryConditions.logs, (log) => JSON.stringify(log));
|
|
140
140
|
}
|
|
141
141
|
if (!dictionaryConditions.transactions.length) {
|
|
142
142
|
delete dictionaryConditions.transactions;
|
|
143
143
|
}
|
|
144
144
|
else {
|
|
145
|
-
dictionaryConditions.transactions = (0, lodash_1.uniqBy)(dictionaryConditions.transactions,
|
|
145
|
+
dictionaryConditions.transactions = (0, lodash_1.uniqBy)(dictionaryConditions.transactions, (tx) => JSON.stringify(tx));
|
|
146
146
|
}
|
|
147
147
|
return dictionaryConditions;
|
|
148
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ethDictionaryV2.js","sourceRoot":"","sources":["../../../../src/indexer/dictionary/v2/ethDictionaryV2.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAEnC,gDAO0B;AAC1B,0DAO+B;AAC/B,mCAAyC;AAOzC,kDAAwE;AACxE,0CAA8C;AAC9C,oCAAuC;AAQvC,mCAA6C;AAE7C,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,mBAAmB,CAAC,CAAC;AAE9C,SAAS,sBAAsB,CAC7B,SAA0E;IAE1E,MAAM,iBAAiB,GAAG,oBAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACnE,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QAC5B,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE5E,IAAI,SAAS,CAAC,MAAM,GAAG,iBAAiB,EAAE;YACxC,MAAM,CAAC,KAAK,CACV,qBAAqB,SAAS,CAAC,MAAM,wBAAwB,iBAAiB,wEAAwE,CACvJ,CAAC;SACH;QACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,IAAI,iBAAiB,EAAE;YACnE,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;SACjC;KACF;SAAM;QACL,IAAI,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,OAAO,EAAE;YACtB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;SACpD;KACF;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,+BAA+B,CACtC,MAAiC,EACjC,SAAwC;IAExC,MAAM,YAAY,GAA8B,EAAE,CAAC;IACnD,MAAM,OAAO,GAAG,EAAE,CAAC;IACnB,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,MAAM,SAAS,GAAG,EAAE,CAAC;IAErB,IAAI,MAAM,CAAC,IAAI,EAAE;QACf,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;KAC3C;IACD,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC3D,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE;QAC5B,IAAI,MAAM,CAAC,EAAE,EAAE;YACb,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;SACvC;aAAM,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE;YAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;SAC7C;KACF;SAAM,IAAI,CAAC,CAAC,gBAAgB,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;QACzE,MAAM,CAAC,IAAI,CACT,uEAAuE,CACxE,CAAC;KACH;IACD,IAAI,MAAM,CAAC,QAAQ,EAAE;QACnB,SAAS,CAAC,IAAI,CAAC,IAAA,0BAAiB,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;KACpD;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,YAAY,CAAC,EAAE,GAAG,OAAO,CAAC;KAC3B;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;QAC1B,YAAY,CAAC,IAAI,GAAG,SAAS,CAAC;KAC/B;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;QAC1B,YAAY,CAAC,QAAQ,GAAG,SAAS,CAAC;KACnC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,gCAAgC,CACvC,MAAyB,EACzB,SAA0E;IAE1E,MAAM,aAAa,GAA+B,EAAE,CAAC;IACrD,aAAa,CAAC,OAAO,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,EAAE;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,KAAK,EAAE;gBACV,SAAS;aACV;YACD,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,CAAC;YAC3B,cAAc;YACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;gBACzB,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;aAC3B;YACD,IAAI,KAAK,KAAK,OAAO,EAAE;gBACrB,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,uBAAuB;aACnD;iBAAM;gBACL,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAA,qBAAY,EAAC,KAAK,CAAC,CAAC,CAAC;aAChD;SACF;KACF;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAgB,2BAA2B,CACzC,WAAuC;;IAEvC,MAAM,oBAAoB,GAA8B;QACtD,IAAI,EAAE,EAAE;QACR,YAAY,EAAE,EAAE;KACjB,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE;QAC5B,KAAK,MAAM,OAAO,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE;YACzC,kCAAkC;YAClC,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,oBAAoB,CAAC;YAEjD,QAAQ,OAAO,CAAC,IAAI,EAAE;gBACpB,KAAK,oCAAmB,CAAC,KAAK;oBAC5B,OAAO,oBAAoB,CAAC;gBAC9B,KAAK,oCAAmB,CAAC,IAAI,CAAC,CAAC;oBAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAmC,CAAC;oBAC3D,IACE,MAAM,CAAC,IAAI,KAAK,SAAS;wBACzB,MAAM,CAAC,EAAE,KAAK,SAAS;wBACvB,MAAM,CAAC,QAAQ,KAAK,SAAS,EAC7B;wBACA,oBAAoB,CAAC,YAAY,CAAC,IAAI,CACpC,+BAA+B,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,CACpD,CAAC;qBACH;yBAAM;wBACL,cAAc;qBACf;oBACD,MAAM;iBACP;gBACD,KAAK,oCAAmB,CAAC,KAAK,CAAC,CAAC;oBAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAA2B,CAAC;oBACnD,IAAI,EAAE,CAAC,cAAc,EAAE;wBACrB,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAC5B,gCAAgC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,CAC5D,CAAC;qBACH;yBAAM,IAAI,CAAA,MAAA,EAAE,CAAC,OAAO,0CAAE,OAAO,KAAI,MAAM,CAAC,MAAM,EAAE;wBAC/C,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAC5B,gCAAgC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,CACrD,CAAC;qBACH;yBAAM;wBACL,cAAc;qBACf;oBACD,MAAM;iBACP;gBACD,QAAQ;aACT;SACF;KACF;IAED,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE;QACrC,OAAO,oBAAoB,CAAC,IAAI,CAAC;KAClC;SAAM;QACL,oBAAoB,CAAC,IAAI,GAAG,IAAA,eAAM,EAAC,oBAAoB,CAAC,IAAI,EAAE,gBAAO,CAAC,CAAC;KACxE;IAED,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,MAAM,EAAE;QAC7C,OAAO,oBAAoB,CAAC,YAAY,CAAC;KAC1C;SAAM;QACL,oBAAoB,CAAC,YAAY,GAAG,IAAA,eAAM,EACxC,oBAAoB,CAAC,YAAY,EACjC,gBAAO,CACR,CAAC;KACH;IACD,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAlED,kEAkEC;AAED,MAAa,eAAgB,SAAQ,wBAIpC;IACC,YACE,QAAgB,EAChB,UAAsB,EACtB,OAAwB,EAChB,GAAgB;QAExB,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAF7C,QAAG,GAAH,GAAG,CAAa;IAG1B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,QAAgB,EAChB,UAAsB,EACtB,OAAwB,EACxB,GAAgB;QAEhB,MAAM,UAAU,GAAG,IAAI,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3E,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,2BAA2B,CACzB,WAA8D;QAE9D,MAAM,UAAU,GAAG,IAAA,mBAAW,EAAC,WAAW,CAAC,CAAC;QAC5C,OAAO,2BAA2B,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,OAAO,CACX,UAAkB,EAClB,QAAgB,EAChB,QAAgB,eAAe;QAE/B,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE;YAChD,WAAW,EAAE,IAAI;YACjB,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;YAC3B,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB,CACnB,IAAoC;QAEpC,IAAI;YACF,MAAM,MAAM,GAA4B,CACrC,IAAI,CAAC,MAAwB,IAAI,EAAE,CACrC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,0BAAkB,EAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,OAAO;gBACL,WAAW,EAAE,MAAM;gBACnB,kBAAkB,EAAE,MAAM,CAAC,MAAM;oBAC/B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;oBACxC,CAAC,CAAC,SAAS;aACd,CAAC;SACH;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,kCAAkC,CAAC,CAAC;YACpD,MAAM,CAAC,CAAC;SACT;IACH,CAAC;CACF;AA/DD,0CA+DC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\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 { isEqual, uniqBy } from 'lodash';\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('eth-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.map((option) => option.address).filter(Boolean);\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 = [];\n const fromArray = [];\n const funcArray = [];\n\n if (filter.from) {\n fromArray.push(filter.from.toLowerCase());\n }\n const optionsAddresses = extractOptionAddresses(dsOptions);\n if (!optionsAddresses.length) {\n if (filter.to) {\n toArray.push(filter.to.toLowerCase());\n } else if (filter.to === null) {\n toArray.push(null); //TODO, is this correct?\n }\n } else if (!!optionsAddresses.length && (filter.to || filter.to === null)) {\n logger.warn(\n `TransactionFilter 'to' conflict with 'address' in data source options`,\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.function = 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 === '!null') {\n logConditions[field] = []; // TODO, check if !null\n } else {\n logConditions[field].push(eventToTopic(topic));\n }\n }\n }\n return logConditions;\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 dictionaryConditions;\n\n switch (handler.kind) {\n case EthereumHandlerKind.Block:\n return dictionaryConditions;\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.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 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 if (!dictionaryConditions.logs.length) {\n delete dictionaryConditions.logs;\n } else {\n dictionaryConditions.logs = uniqBy(dictionaryConditions.logs, isEqual);\n }\n\n if (!dictionaryConditions.transactions.length) {\n delete dictionaryConditions.transactions;\n } else {\n dictionaryConditions.transactions = uniqBy(\n dictionaryConditions.transactions,\n isEqual,\n );\n }\n return dictionaryConditions;\n}\n\nexport class EthDictionaryV2 extends DictionaryV2<\n EthereumBlock,\n SubqlDatasource,\n EthDictionaryV2QueryEntry\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 }\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: true },\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 return {\n batchBlocks: blocks,\n lastBufferedHeight: blocks.length\n ? blocks[blocks.length - 1].block.number\n : undefined,\n };\n } catch (e) {\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 {\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 { isEqual, uniqBy } from 'lodash';\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('eth-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.map((option) => option.address).filter(Boolean);\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 = [];\n const fromArray = [];\n const funcArray = [];\n\n if (filter.from) {\n fromArray.push(filter.from.toLowerCase());\n }\n const optionsAddresses = extractOptionAddresses(dsOptions);\n if (!optionsAddresses.length) {\n if (filter.to) {\n toArray.push(filter.to.toLowerCase());\n } else if (filter.to === null) {\n toArray.push(null); //TODO, is this correct?\n }\n } else if (!!optionsAddresses.length && (filter.to || filter.to === null)) {\n logger.warn(\n `TransactionFilter 'to' conflict with 'address' in data source options`,\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.function = 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 === '!null') {\n logConditions[field] = []; // TODO, check if !null\n } else {\n logConditions[field].push(eventToTopic(topic));\n }\n }\n }\n return logConditions;\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 dictionaryConditions;\n\n switch (handler.kind) {\n case EthereumHandlerKind.Block:\n return dictionaryConditions;\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.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 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 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 return dictionaryConditions;\n}\n\nexport class EthDictionaryV2 extends DictionaryV2<\n EthereumBlock,\n SubqlDatasource,\n EthDictionaryV2QueryEntry\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 }\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: true },\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 return {\n batchBlocks: blocks,\n lastBufferedHeight: blocks.length\n ? blocks[blocks.length - 1].block.number\n : undefined,\n };\n } catch (e) {\n logger.error(e, `Failed to handle block response}`);\n throw e;\n }\n }\n}\n"]}
|
|
@@ -169,6 +169,90 @@ describe('buildDictionaryV2QueryEntry', () => {
|
|
|
169
169
|
],
|
|
170
170
|
});
|
|
171
171
|
});
|
|
172
|
+
it('build query entries for multiple ds', () => {
|
|
173
|
+
const ds = [
|
|
174
|
+
{
|
|
175
|
+
kind: types_ethereum_1.EthereumDatasourceKind.Runtime,
|
|
176
|
+
startBlock: 3327417,
|
|
177
|
+
options: {
|
|
178
|
+
abi: 'EnsRegistry',
|
|
179
|
+
address: '0x314159265dd8dbb310642f98f50c066173c1259b',
|
|
180
|
+
},
|
|
181
|
+
assets: new Map(),
|
|
182
|
+
mapping: {
|
|
183
|
+
file: './dist/index.js',
|
|
184
|
+
handlers: [
|
|
185
|
+
// one duplicate one
|
|
186
|
+
{
|
|
187
|
+
kind: types_ethereum_1.EthereumHandlerKind.Event,
|
|
188
|
+
handler: 'handleTransferOldRegistry',
|
|
189
|
+
filter: {
|
|
190
|
+
topics: ['Transfer(bytes32,address)'],
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
kind: types_ethereum_1.EthereumHandlerKind.Event,
|
|
195
|
+
handler: 'handleTransferOldRegistry',
|
|
196
|
+
filter: {
|
|
197
|
+
topics: ['Transfer(bytes32,address)'],
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
kind: types_ethereum_1.EthereumHandlerKind.Event,
|
|
202
|
+
handler: 'handleNewOwnerOldRegistry',
|
|
203
|
+
filter: {
|
|
204
|
+
topics: ['NewOwner(bytes32,bytes32,address)'],
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
],
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
kind: types_ethereum_1.EthereumDatasourceKind.Runtime,
|
|
212
|
+
startBlock: 3327417,
|
|
213
|
+
options: {
|
|
214
|
+
abi: 'Resolver',
|
|
215
|
+
},
|
|
216
|
+
assets: new Map(),
|
|
217
|
+
mapping: {
|
|
218
|
+
file: './dist/index.js',
|
|
219
|
+
handlers: [
|
|
220
|
+
{
|
|
221
|
+
kind: types_ethereum_1.EthereumHandlerKind.Event,
|
|
222
|
+
handler: 'handleABIChanged',
|
|
223
|
+
filter: {
|
|
224
|
+
topics: ['ABIChanged(bytes32,uint256)'],
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
kind: types_ethereum_1.EthereumHandlerKind.Event,
|
|
229
|
+
handler: 'handleAddrChanged',
|
|
230
|
+
filter: {
|
|
231
|
+
topics: ['AddrChanged(bytes32,address)'],
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
kind: types_ethereum_1.EthereumHandlerKind.Event,
|
|
236
|
+
handler: 'handleMulticoinAddrChanged',
|
|
237
|
+
filter: {
|
|
238
|
+
topics: ['AddressChanged(bytes32,uint256,bytes)'],
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
kind: types_ethereum_1.EthereumHandlerKind.Event,
|
|
243
|
+
handler: 'handleAuthorisationChanged',
|
|
244
|
+
filter: {
|
|
245
|
+
topics: ['AuthorisationChanged(bytes32,address,address,bool)'],
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
],
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
];
|
|
252
|
+
const queryEntry = (0, ethDictionaryV2_1.buildDictionaryV2QueryEntry)(ds);
|
|
253
|
+
// Total 7 handlers were given, 1 is duplicate
|
|
254
|
+
expect(queryEntry.logs.length).toBe(6);
|
|
255
|
+
});
|
|
172
256
|
it('should unique QueryEntry for duplicate dataSources', () => {
|
|
173
257
|
const ds = {
|
|
174
258
|
kind: types_ethereum_1.EthereumDatasourceKind.Runtime,
|
|
@@ -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 {\n NodeConfig,\n BlockHeightMap,\n IBlock,\n DictionaryResponse,\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 SubqueryProject,\n} from '../../../configure/SubqueryProject';\nimport { EthereumApi } from '../../../ethereum';\nimport {\n buildDictionaryV2QueryEntry,\n EthDictionaryV2,\n} from './ethDictionaryV2';\n\nconst DEFAULT_DICTIONARY = 'http://localhost:3000/rpc/eth-mainnet';\n\nconst HTTP_ENDPOINT = 'https://polygon.api.onfinality.io/public';\nconst mockDs: EthereumProjectDs[] = [\n {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 3678215,\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\n// tx to is null\nconst mockDs2: EthereumProjectDs[] = [\n {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 3678215,\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 },\n];\n\nconst nodeConfig = new NodeConfig({\n subquery: 'polygon-starter',\n subqueryName: 'polygon-starter',\n dictionaryTimeout: 10,\n networkEndpoint: [HTTP_ENDPOINT],\n networkDictionary: [`${DEFAULT_DICTIONARY}/polygon`],\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, 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 let ethBlock3678215: EthereumBlock;\n let ethBlock3678250: EthereumBlock;\n\n const dsMap = makeBlockHeightMap(mockDs);\n\n beforeEach(async () => {\n ethDictionaryV2 = await EthDictionaryV2.create(\n DEFAULT_DICTIONARY,\n nodeConfig,\n { network: { chainId: '10' } } as SubqueryProject,\n new EthereumApi(HTTP_ENDPOINT, 1, new EventEmitter2()),\n );\n\n ethDictionaryV2.updateQueriesMap(dsMap);\n });\n\n it('convert ds to v2 dictionary queries', () => {\n //Polygon\n const query = (ethDictionaryV2 as any).queriesMap.get(3678215);\n expect(query.logs.length).toBe(1);\n expect(query.transactions.length).toBe(1);\n }, 100000);\n\n it('query response match with entries', async () => {\n //Polygon\n const ethBlocks = (await ethDictionaryV2.getData(\n 3678215,\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 3678215, 3678250,\n ]);\n\n ethBlock3678215 = ethBlocks.batchBlocks[0].block;\n ethBlock3678250 = ethBlocks.batchBlocks[1].block;\n\n expect(ethBlock3678215.number).toBe(3678215);\n expect(ethBlock3678250.number).toBe(3678250);\n\n // To match with dictionaryQueryEntries[0].func\n expect(ethBlock3678215.transactions[0].input.indexOf('0x60806040')).toBe(0);\n\n expect(ethBlock3678250.logs.length).toBe(1);\n // This matches with dictionaryQueryEntries[0].topics\n expect(ethBlock3678250.logs[0].topics).toContain(\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n );\n }, 100000);\n\n it('able to convert raw v2 Blocks into eth blocks when getData', async () => {\n //Polygon\n const ethBlocks = (await ethDictionaryV2.getData(\n 3678215,\n (ethDictionaryV2 as any)._metadata.end,\n 2,\n )) as DictionaryResponse<IBlock<EthereumBlock>>;\n\n expect(ethBlocks.batchBlocks[0].block.number).toStrictEqual(3678215);\n expect(ethBlocks.lastBufferedHeight).toStrictEqual(3678250);\n\n // Can include input and hash\n // https://polygonscan.com/tx/0xb1b5f7882fa8d62d3650948c08066e928b7b5c9d607d2fe8c7e6ce57caf06774\n expect(ethBlocks.batchBlocks[1].block.transactions[1].hash).toBe(\n `0xb1b5f7882fa8d62d3650948c08066e928b7b5c9d607d2fe8c7e6ce57caf06774`,\n );\n expect(ethBlocks.batchBlocks[1].block.transactions[1].input).toBe(\n `0x23b872dd000000000000000000000000244a79a2e79e8d884d9c9cc425d88f9e2ed988ca000000000000000000000000d22c4c383ce5efa0364d5fab5ce1313c24a52bda0000000000000000000000000000000000000000000000000000000000000159`,\n );\n\n // relate logs\n // https://polygonscan.com/tx/0xb1b5f7882fa8d62d3650948c08066e928b7b5c9d607d2fe8c7e6ce57caf06774#eventlog\n expect(ethBlocks.batchBlocks[1].block.logs[0].data).toBe(`0x`);\n }, 500000);\n\n // TODO, check this\n it.skip('able to get transaction with field to is null', async () => {\n const dsMap = makeBlockHeightMap(mockDs2);\n ethDictionaryV2.updateQueriesMap(dsMap);\n\n const { conditions, queryEndBlock } = (\n ethDictionaryV2 as any\n ).getQueryConditions(3678215, (ethDictionaryV2 as any)._metadata.end);\n\n expect(conditions).toBe({ transactions: [{ to: null }] });\n const ethBlocks = (await ethDictionaryV2.getData(\n 3678215,\n (ethDictionaryV2 as any)._metadata.end,\n 2,\n )) as DictionaryResponse<IBlock<EthereumBlock>>;\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 '!null',\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('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 function: ['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":"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","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\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 SubqueryProject,\n} from '../../../configure/SubqueryProject';\nimport { EthereumApi } from '../../../ethereum';\nimport {\n buildDictionaryV2QueryEntry,\n EthDictionaryV2,\n} from './ethDictionaryV2';\n\nconst DEFAULT_DICTIONARY = 'http://localhost:3000/rpc/eth-mainnet';\n\nconst HTTP_ENDPOINT = 'https://polygon.api.onfinality.io/public';\nconst mockDs: EthereumProjectDs[] = [\n {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 3678215,\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\n// tx to is null\nconst mockDs2: EthereumProjectDs[] = [\n {\n kind: EthereumDatasourceKind.Runtime,\n assets: new Map(),\n startBlock: 3678215,\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 },\n];\n\nconst nodeConfig = new NodeConfig({\n subquery: 'polygon-starter',\n subqueryName: 'polygon-starter',\n dictionaryTimeout: 10,\n networkEndpoint: [HTTP_ENDPOINT],\n networkDictionary: [`${DEFAULT_DICTIONARY}/polygon`],\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, 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 let ethBlock3678215: EthereumBlock;\n let ethBlock3678250: EthereumBlock;\n\n const dsMap = makeBlockHeightMap(mockDs);\n\n beforeEach(async () => {\n ethDictionaryV2 = await EthDictionaryV2.create(\n DEFAULT_DICTIONARY,\n nodeConfig,\n { network: { chainId: '10' } } as SubqueryProject,\n new EthereumApi(HTTP_ENDPOINT, 1, new EventEmitter2()),\n );\n\n ethDictionaryV2.updateQueriesMap(dsMap);\n });\n\n it('convert ds to v2 dictionary queries', () => {\n //Polygon\n const query = (ethDictionaryV2 as any).queriesMap.get(3678215);\n expect(query.logs.length).toBe(1);\n expect(query.transactions.length).toBe(1);\n }, 100000);\n\n it('query response match with entries', async () => {\n //Polygon\n const ethBlocks = (await ethDictionaryV2.getData(\n 3678215,\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 3678215, 3678250,\n ]);\n\n ethBlock3678215 = ethBlocks.batchBlocks[0].block;\n ethBlock3678250 = ethBlocks.batchBlocks[1].block;\n\n expect(ethBlock3678215.number).toBe(3678215);\n expect(ethBlock3678250.number).toBe(3678250);\n\n // To match with dictionaryQueryEntries[0].func\n expect(ethBlock3678215.transactions[0].input.indexOf('0x60806040')).toBe(0);\n\n expect(ethBlock3678250.logs.length).toBe(1);\n // This matches with dictionaryQueryEntries[0].topics\n expect(ethBlock3678250.logs[0].topics).toContain(\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n );\n }, 100000);\n\n it('able to convert raw v2 Blocks into eth blocks when getData', async () => {\n //Polygon\n const ethBlocks = (await ethDictionaryV2.getData(\n 3678215,\n (ethDictionaryV2 as any)._metadata.end,\n 2,\n )) as DictionaryResponse<IBlock<EthereumBlock>>;\n\n expect(ethBlocks.batchBlocks[0].block.number).toStrictEqual(3678215);\n expect(ethBlocks.lastBufferedHeight).toStrictEqual(3678250);\n\n // Can include input and hash\n // https://polygonscan.com/tx/0xb1b5f7882fa8d62d3650948c08066e928b7b5c9d607d2fe8c7e6ce57caf06774\n expect(ethBlocks.batchBlocks[1].block.transactions[1].hash).toBe(\n `0xb1b5f7882fa8d62d3650948c08066e928b7b5c9d607d2fe8c7e6ce57caf06774`,\n );\n expect(ethBlocks.batchBlocks[1].block.transactions[1].input).toBe(\n `0x23b872dd000000000000000000000000244a79a2e79e8d884d9c9cc425d88f9e2ed988ca000000000000000000000000d22c4c383ce5efa0364d5fab5ce1313c24a52bda0000000000000000000000000000000000000000000000000000000000000159`,\n );\n\n // relate logs\n // https://polygonscan.com/tx/0xb1b5f7882fa8d62d3650948c08066e928b7b5c9d607d2fe8c7e6ce57caf06774#eventlog\n expect(ethBlocks.batchBlocks[1].block.logs[0].data).toBe(`0x`);\n }, 500000);\n\n // TODO, check this\n it.skip('able to get transaction with field to is null', async () => {\n const dsMap = makeBlockHeightMap(mockDs2);\n ethDictionaryV2.updateQueriesMap(dsMap);\n\n const { conditions, queryEndBlock } = (\n ethDictionaryV2 as any\n ).getQueryConditions(3678215, (ethDictionaryV2 as any)._metadata.end);\n\n expect(conditions).toBe({ transactions: [{ to: null }] });\n const ethBlocks = (await ethDictionaryV2.getData(\n 3678215,\n (ethDictionaryV2 as any)._metadata.end,\n 2,\n )) as DictionaryResponse<IBlock<EthereumBlock>>;\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 '!null',\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 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 function: ['0x7ef9ea98'],\n },\n ],\n });\n });\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@subql/node-ethereum",
|
|
3
|
-
"version": "3.11.1-
|
|
3
|
+
"version": "3.11.1-2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "Ian He",
|
|
6
6
|
"license": "GPL-3.0",
|
|
@@ -66,5 +66,5 @@
|
|
|
66
66
|
"/dist",
|
|
67
67
|
"/bin"
|
|
68
68
|
],
|
|
69
|
-
"stableVersion": "3.11.1-
|
|
69
|
+
"stableVersion": "3.11.1-1"
|
|
70
70
|
}
|