@subql/node-ethereum 3.11.1-2 → 3.11.1-4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/ethereum/api.ethereum.js +6 -3
- package/dist/ethereum/api.ethereum.js.map +1 -1
- package/dist/ethereum/api.ethereum.test.js +8 -5
- package/dist/ethereum/api.ethereum.test.js.map +1 -1
- package/dist/indexer/dictionary/ethDictionary.service.js +8 -2
- package/dist/indexer/dictionary/ethDictionary.service.js.map +1 -1
- package/dist/indexer/dictionary/v2/ethDictionaryV2.spec.js +167 -41
- package/dist/indexer/dictionary/v2/ethDictionaryV2.spec.js.map +1 -1
- package/package.json +3 -3
|
@@ -6,7 +6,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
6
6
|
};
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
exports.EthereumApi = void 0;
|
|
9
|
-
const assert_1 = __importDefault(require("assert"));
|
|
10
9
|
const fs_1 = __importDefault(require("fs"));
|
|
11
10
|
const http_1 = __importDefault(require("http"));
|
|
12
11
|
const https_1 = __importDefault(require("https"));
|
|
@@ -137,7 +136,7 @@ class EthereumApi {
|
|
|
137
136
|
}
|
|
138
137
|
async getSupportsTag(tag) {
|
|
139
138
|
try {
|
|
140
|
-
// We set the timeout here because
|
|
139
|
+
// We set the timeout here because there is a bug in ethers where it will never resolve
|
|
141
140
|
// It was happening with arbitrum on a syncing node
|
|
142
141
|
const result = await (0, node_core_1.timeout)(this.client.getBlock(tag), 2);
|
|
143
142
|
return true;
|
|
@@ -233,7 +232,11 @@ class EthereumApi {
|
|
|
233
232
|
});
|
|
234
233
|
// Certain RPC may not accommodate for blockHash, and would return wrong logs
|
|
235
234
|
if (logsRaw.length) {
|
|
236
|
-
|
|
235
|
+
logsRaw.forEach((l) => {
|
|
236
|
+
if (l.blockHash.toLowerCase() !== block.hash.toLowerCase()) {
|
|
237
|
+
throw new Error(`Log BlockHash does not match block: ${blockNumber}, blockHash ${block.hash}. Log ${(0, utils_ethereum_1.handleNumber)(l.logIndex).toNumber()} got block ${(0, utils_ethereum_1.handleNumber)(l.blockNumber).toNumber()} blockHash ${l.blockHash}. Please check with rpc provider`);
|
|
238
|
+
}
|
|
239
|
+
});
|
|
237
240
|
}
|
|
238
241
|
block.logs = logsRaw.map((l) => (0, utils_ethereum_1.formatLog)(l, block));
|
|
239
242
|
block.transactions = block.transactions.map((tx) => (Object.assign(Object.assign({}, (0, utils_ethereum_1.formatTransaction)(tx, block)), { receipt: () => this.getTransactionReceipt(tx.hash).then((r) => (0, utils_ethereum_1.formatReceipt)(r, block)), logs: block.logs.filter((l) => l.transactionHash === tx.hash) })));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.ethereum.js","sourceRoot":"","sources":["../../src/ethereum/api.ethereum.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 assert from 'assert';\nimport fs from 'fs';\nimport http from 'http';\nimport https from 'https';\nimport { Interface } from '@ethersproject/abi';\nimport {\n BlockTag,\n Provider,\n Block,\n TransactionReceipt,\n} from '@ethersproject/abstract-provider';\nimport { WebSocketProvider, BaseProvider } from '@ethersproject/providers';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { getLogger, IBlock, timeout } from '@subql/node-core';\nimport {\n ApiWrapper,\n EthereumBlock,\n EthereumTransaction,\n EthereumResult,\n EthereumLog,\n SubqlRuntimeDatasource,\n LightEthereumBlock,\n LightEthereumLog,\n} from '@subql/types-ethereum';\nimport CacheableLookup from 'cacheable-lookup';\nimport { hexDataSlice, hexValue } from 'ethers/lib/utils';\nimport { retryOnFailEth } from '../utils/project';\nimport {\n CeloJsonRpcBatchProvider,\n CeloJsonRpcProvider,\n CeloWsProvider,\n} from './ethers/celo/celo-provider';\nimport { JsonRpcBatchProvider } from './ethers/json-rpc-batch-provider';\nimport { JsonRpcProvider } from './ethers/json-rpc-provider';\nimport { OPFormatterMixin } from './ethers/op/op-provider';\nimport { ConnectionInfo } from './ethers/web';\nimport SafeEthProvider from './safe-api';\nimport {\n formatBlock,\n formatBlockUtil,\n formatLog,\n formatReceipt,\n formatTransaction,\n} from './utils.ethereum';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../../package.json');\n\nconst logger = getLogger('api.ethereum');\n\nasync function loadAssets(\n ds: SubqlRuntimeDatasource,\n): Promise<Record<string, string>> {\n if (!ds.assets) {\n return {};\n }\n const res: Record<string, string> = {};\n\n for (const [name, { file }] of ds.assets.entries()) {\n try {\n res[name] = await fs.promises.readFile(file, { encoding: 'utf8' });\n } catch (e) {\n throw new Error(`Failed to load datasource asset ${file}`);\n }\n }\n\n return res;\n}\n\nfunction getHttpAgents() {\n // By default Nodejs doesn't cache DNS lookups\n // https://httptoolkit.com/blog/configuring-nodejs-dns/\n const lookup = new CacheableLookup();\n\n const options: http.AgentOptions = {\n keepAlive: true,\n /*, maxSockets: 100*/\n };\n\n const httpAgent = new http.Agent(options);\n const httpsAgent = new https.Agent(options);\n\n lookup.install(httpAgent);\n lookup.install(httpsAgent);\n\n return {\n http: httpAgent,\n https: httpsAgent,\n };\n}\n\nexport class EthereumApi implements ApiWrapper {\n private client: JsonRpcProvider;\n\n // This is used within the sandbox when HTTP is used\n private nonBatchClient?: JsonRpcProvider;\n private genesisBlock: Record<string, any>;\n private contractInterfaces: Record<string, Interface> = {};\n private chainId: number;\n private name: string;\n\n // Ethereum POS\n private _supportsFinalization = true;\n\n get supportsFinalization(): boolean {\n return this._supportsFinalization;\n }\n\n /**\n * @param {string} endpoint - The endpoint of the RPC provider\n * @param {number} blockConfirmations - Used to determine how many blocks behind the head a block is considered finalized. Not used if the network has a concrete finalization mechanism.\n * @param {object} eventEmitter - Used to monitor the number of RPC requests\n */\n constructor(\n private endpoint: string,\n private blockConfirmations: number,\n private eventEmitter: EventEmitter2,\n private unfinalizedBlocks = false,\n ) {\n const { hostname, protocol, searchParams } = new URL(endpoint);\n\n const protocolStr = protocol.replace(':', '');\n\n logger.info(`Api host: ${hostname}, method: ${protocolStr}`);\n if (protocolStr === 'https' || protocolStr === 'http') {\n const connection: ConnectionInfo = {\n url: this.endpoint.split('?')[0],\n headers: {\n 'User-Agent': `Subquery-Node ${packageVersion}`,\n },\n allowGzip: true,\n throttleLimit: 5,\n throttleSlotInterval: 1,\n agents: getHttpAgents(),\n };\n searchParams.forEach((value, name, searchParams) => {\n (connection.headers as any)[name] = value;\n });\n this.client = new (OPFormatterMixin(JsonRpcBatchProvider))(connection);\n this.nonBatchClient = new (OPFormatterMixin(JsonRpcProvider))(connection);\n } else if (protocolStr === 'ws' || protocolStr === 'wss') {\n this.client = new (OPFormatterMixin(WebSocketProvider))(this.endpoint);\n } else {\n throw new Error(`Unsupported protocol: ${protocol}`);\n }\n }\n\n async init(): Promise<void> {\n this.injectClient();\n\n const network = await this.client.getNetwork();\n\n //celo\n if (network.chainId === 42220) {\n if (this.client instanceof WebSocketProvider) {\n this.client = new CeloWsProvider(this.client.connection.url);\n } else {\n this.client = new CeloJsonRpcBatchProvider(this.client.connection);\n this.nonBatchClient = new CeloJsonRpcProvider(this.client.connection);\n }\n }\n\n try {\n const [genesisBlock, supportsFinalization, supportsSafe] =\n await Promise.all([\n this.getGenesisBlock(network.chainId),\n this.getSupportsTag('finalized'),\n this.getSupportsTag('safe'),\n ]);\n\n this.genesisBlock = genesisBlock;\n this._supportsFinalization = supportsFinalization && supportsSafe;\n this.chainId = network.chainId;\n this.name = network.name;\n } catch (e) {\n if ((e as Error).message.startsWith('Invalid response')) {\n this.client = this.nonBatchClient;\n\n logger.warn(\n `The RPC Node at ${this.endpoint} cannot process batch requests. ` +\n `Switching to non-batch mode for subsequent requests. Please consider checking if batch processing is supported on the RPC node.`,\n );\n\n return this.init();\n }\n\n throw e;\n }\n }\n\n private async getSupportsTag(tag: BlockTag): Promise<boolean> {\n try {\n // We set the timeout here because theres a bug in ethers where it will never resolve\n // It was happening with arbitrum on a syncing node\n const result = await timeout(this.client.getBlock(tag), 2);\n\n return true;\n } catch (e) {\n logger.info(`Chain doesnt support ${tag} tag`);\n return false;\n }\n }\n\n private injectClient(): void {\n const orig = this.client.send.bind(this.client);\n Object.defineProperty(this.client, 'send', {\n value: (...args) => {\n this.eventEmitter.emit('rpcCall');\n return orig(...args);\n },\n });\n }\n\n private async getGenesisBlock(chainId: number): Promise<Block> {\n const tag = () => {\n switch (chainId) {\n // BEVM Canary\n case 1501:\n return 4157986;\n default:\n return 'earliest';\n }\n };\n\n return this.client.getBlock(tag());\n }\n\n async getFinalizedBlock(): Promise<Block> {\n const height = this.supportsFinalization\n ? 'finalized'\n : (await this.getBestBlockHeight()) - this.blockConfirmations;\n\n const block = await this.client.getBlock(height);\n // The finalized block could sometimes fail to fetch,\n // due to some nodes on the network falling behind the synced node.\n if (!block) {\n throw new Error(`get finalized block \"${height}\" failed `);\n }\n return block;\n }\n\n async getFinalizedBlockHeight(): Promise<number> {\n return (await this.getFinalizedBlock()).number;\n }\n\n async getBestBlockHeight(): Promise<number> {\n // Cronos \"safe\" tag doesn't currently work as indended\n const tag =\n !this.unfinalizedBlocks &&\n this.supportsFinalization &&\n this.chainId !== 25\n ? 'safe'\n : 'latest';\n return (await this.client.getBlock(tag)).number;\n }\n\n getRuntimeChain(): string {\n return this.name;\n }\n\n getChainId(): number {\n return this.chainId;\n }\n\n getGenesisHash(): string {\n return this.genesisBlock.hash;\n }\n\n getSpecName(): string {\n return 'ethereum';\n }\n\n async getBlockByHeightOrHash(heightOrHash: number | string): Promise<Block> {\n if (typeof heightOrHash === 'number') {\n heightOrHash = hexValue(heightOrHash);\n }\n return this.client.getBlock(heightOrHash);\n }\n\n private async getBlockPromise(num: number, includeTx = true): Promise<any> {\n const rawBlock = await this.client.send('eth_getBlockByNumber', [\n hexValue(num),\n includeTx,\n ]);\n\n if (!rawBlock) {\n throw new Error(`Failed to fetch block ${num}`);\n }\n\n const block = formatBlock(rawBlock);\n\n block.stateRoot = this.client.formatter.hash(block.stateRoot);\n\n return block;\n }\n async getTransactionReceipt(\n transactionHash: string | Promise<string>,\n ): Promise<TransactionReceipt> {\n return retryOnFailEth<TransactionReceipt>(\n this.client.getTransactionReceipt.bind(this.client, transactionHash),\n );\n }\n\n async fetchBlock(blockNumber: number): Promise<IBlock<EthereumBlock>> {\n try {\n const block = await this.getBlockPromise(blockNumber, true);\n const logsRaw = await this.client.getLogs({\n blockHash: block.hash,\n });\n\n // Certain RPC may not accommodate for blockHash, and would return wrong logs\n if (logsRaw.length) {\n assert(\n logsRaw.every((l) => l.blockHash === block.hash),\n `Log BlockHash does not match block: ${blockNumber}`,\n );\n }\n\n block.logs = logsRaw.map((l) => formatLog(l, block));\n block.transactions = block.transactions.map((tx) => ({\n ...formatTransaction(tx, block),\n receipt: () =>\n this.getTransactionReceipt(tx.hash).then((r) =>\n formatReceipt(r, block),\n ),\n logs: block.logs.filter((l) => l.transactionHash === tx.hash),\n }));\n\n this.eventEmitter.emit('fetchBlock');\n return formatBlockUtil(block);\n } catch (e) {\n throw this.handleError(e);\n }\n }\n\n private async fetchLightBlock(\n blockNumber: number,\n ): Promise<IBlock<LightEthereumBlock>> {\n const block = await this.getBlockPromise(blockNumber, false);\n const logs = await this.client.getLogs({ blockHash: block.hash });\n\n const lightBlock: LightEthereumBlock = {\n ...block,\n logs: logs.map((l) => formatLog(l, block)),\n };\n return formatBlockUtil<LightEthereumBlock>(lightBlock);\n }\n\n async fetchBlocks(bufferBlocks: number[]): Promise<IBlock<EthereumBlock>[]> {\n return Promise.all(bufferBlocks.map(async (num) => this.fetchBlock(num)));\n }\n\n async fetchBlocksLight(\n bufferBlocks: number[],\n ): Promise<IBlock<LightEthereumBlock>[]> {\n return Promise.all(\n bufferBlocks.map(async (num) => this.fetchLightBlock(num)),\n );\n }\n\n get api(): BaseProvider {\n return this.client;\n }\n\n getSafeApi(blockHeight: number): SafeEthProvider {\n // We cannot use a batch http client because OnF don't support routing historical queries in batches to an archive nodes\n const client =\n this.client instanceof WebSocketProvider\n ? this.client\n : this.nonBatchClient;\n\n return new SafeEthProvider(client, blockHeight);\n }\n\n private buildInterface(\n abiName: string,\n assets: Record<string, string>,\n ): Interface | undefined {\n if (!assets[abiName]) {\n throw new Error(`ABI named \"${abiName}\" not referenced in assets`);\n }\n\n // This assumes that all datasources have a different abi name or they are the same abi\n if (!this.contractInterfaces[abiName]) {\n // Constructing the interface validates the ABI\n try {\n let abiObj = JSON.parse(assets[abiName]);\n\n /*\n * Allows parsing JSON artifacts as well as ABIs\n * https://trufflesuite.github.io/artifact-updates/background.html#what-are-artifacts\n */\n if (!Array.isArray(abiObj) && abiObj.abi) {\n abiObj = abiObj.abi;\n }\n\n this.contractInterfaces[abiName] = new Interface(abiObj);\n } catch (e) {\n logger.error(`Unable to parse ABI: ${e.message}`);\n throw new Error('ABI is invalid');\n }\n }\n\n return this.contractInterfaces[abiName];\n }\n\n async parseLog<T extends EthereumResult = EthereumResult>(\n log: EthereumLog | LightEthereumLog,\n ds: SubqlRuntimeDatasource,\n ): Promise<\n EthereumLog | LightEthereumLog | EthereumLog<T> | LightEthereumLog<T>\n > {\n try {\n if (!ds?.options?.abi) {\n logger.warn('No ABI provided for datasource');\n return log;\n }\n const iface = this.buildInterface(ds.options.abi, await loadAssets(ds));\n\n log.args = iface?.parseLog(log).args as T;\n\n return log;\n } catch (e) {\n logger.warn(`Failed to parse log data: ${e.message}`);\n return log;\n }\n }\n\n async parseTransaction<T extends EthereumResult = EthereumResult>(\n transaction: EthereumTransaction,\n ds: SubqlRuntimeDatasource,\n ): Promise<EthereumTransaction<T> | EthereumTransaction> {\n try {\n if (!ds?.options?.abi) {\n if (transaction.input !== '0x') {\n logger.warn('No ABI provided for datasource');\n }\n return transaction;\n }\n const assets = await loadAssets(ds);\n const iface = this.buildInterface(ds.options.abi, assets);\n const func = iface.getFunction(hexDataSlice(transaction.input, 0, 4));\n const args = iface.decodeFunctionData(func, transaction.input) as T;\n\n transaction.logs =\n transaction.logs &&\n ((await Promise.all(\n transaction.logs.map(async (log) => this.parseLog(log, ds)),\n )) as Array<EthereumLog | EthereumLog<T>>);\n\n transaction.args = args;\n return transaction;\n } catch (e) {\n logger.warn(`Failed to parse transaction data: ${e.message}`);\n return transaction;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async connect(): Promise<void> {\n logger.error('Ethereum API connect is not implemented');\n throw new Error('Not implemented');\n }\n\n async disconnect(): Promise<void> {\n if (this.client instanceof WebSocketProvider) {\n await this.client.destroy();\n } else {\n logger.warn('Disconnect called on HTTP provider');\n }\n }\n\n handleError(e: Error): Error {\n if ((e as any)?.status === 429) {\n const { hostname } = new URL(this.endpoint);\n return new Error(`Rate Limited at endpoint: ${hostname}`);\n }\n\n return e;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"api.ethereum.js","sourceRoot":"","sources":["../../src/ethereum/api.ethereum.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 fs from 'fs';\nimport http from 'http';\nimport https from 'https';\nimport { Interface } from '@ethersproject/abi';\nimport {\n BlockTag,\n Block,\n TransactionReceipt,\n} from '@ethersproject/abstract-provider';\nimport { WebSocketProvider, BaseProvider } from '@ethersproject/providers';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { getLogger, IBlock, timeout } from '@subql/node-core';\nimport {\n ApiWrapper,\n EthereumBlock,\n EthereumTransaction,\n EthereumResult,\n EthereumLog,\n SubqlRuntimeDatasource,\n LightEthereumBlock,\n LightEthereumLog,\n} from '@subql/types-ethereum';\nimport CacheableLookup from 'cacheable-lookup';\nimport { hexDataSlice, hexValue } from 'ethers/lib/utils';\nimport { retryOnFailEth } from '../utils/project';\nimport {\n CeloJsonRpcBatchProvider,\n CeloJsonRpcProvider,\n CeloWsProvider,\n} from './ethers/celo/celo-provider';\nimport { JsonRpcBatchProvider } from './ethers/json-rpc-batch-provider';\nimport { JsonRpcProvider } from './ethers/json-rpc-provider';\nimport { OPFormatterMixin } from './ethers/op/op-provider';\nimport { ConnectionInfo } from './ethers/web';\nimport SafeEthProvider from './safe-api';\nimport {\n formatBlock,\n formatBlockUtil,\n formatLog,\n formatReceipt,\n formatTransaction,\n handleNumber,\n} from './utils.ethereum';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../../package.json');\n\nconst logger = getLogger('api.ethereum');\n\nasync function loadAssets(\n ds: SubqlRuntimeDatasource,\n): Promise<Record<string, string>> {\n if (!ds.assets) {\n return {};\n }\n const res: Record<string, string> = {};\n\n for (const [name, { file }] of ds.assets.entries()) {\n try {\n res[name] = await fs.promises.readFile(file, { encoding: 'utf8' });\n } catch (e) {\n throw new Error(`Failed to load datasource asset ${file}`);\n }\n }\n\n return res;\n}\n\nfunction getHttpAgents() {\n // By default Nodejs doesn't cache DNS lookups\n // https://httptoolkit.com/blog/configuring-nodejs-dns/\n const lookup = new CacheableLookup();\n\n const options: http.AgentOptions = {\n keepAlive: true,\n /*, maxSockets: 100*/\n };\n\n const httpAgent = new http.Agent(options);\n const httpsAgent = new https.Agent(options);\n\n lookup.install(httpAgent);\n lookup.install(httpsAgent);\n\n return {\n http: httpAgent,\n https: httpsAgent,\n };\n}\n\nexport class EthereumApi implements ApiWrapper {\n private client: JsonRpcProvider;\n\n // This is used within the sandbox when HTTP is used\n private nonBatchClient?: JsonRpcProvider;\n private genesisBlock: Record<string, any>;\n private contractInterfaces: Record<string, Interface> = {};\n private chainId: number;\n private name: string;\n\n // Ethereum POS\n private _supportsFinalization = true;\n\n get supportsFinalization(): boolean {\n return this._supportsFinalization;\n }\n\n /**\n * @param {string} endpoint - The endpoint of the RPC provider\n * @param {number} blockConfirmations - Used to determine how many blocks behind the head a block is considered finalized. Not used if the network has a concrete finalization mechanism.\n * @param {object} eventEmitter - Used to monitor the number of RPC requests\n */\n constructor(\n private endpoint: string,\n private blockConfirmations: number,\n private eventEmitter: EventEmitter2,\n private unfinalizedBlocks = false,\n ) {\n const { hostname, protocol, searchParams } = new URL(endpoint);\n\n const protocolStr = protocol.replace(':', '');\n\n logger.info(`Api host: ${hostname}, method: ${protocolStr}`);\n if (protocolStr === 'https' || protocolStr === 'http') {\n const connection: ConnectionInfo = {\n url: this.endpoint.split('?')[0],\n headers: {\n 'User-Agent': `Subquery-Node ${packageVersion}`,\n },\n allowGzip: true,\n throttleLimit: 5,\n throttleSlotInterval: 1,\n agents: getHttpAgents(),\n };\n searchParams.forEach((value, name, searchParams) => {\n (connection.headers as any)[name] = value;\n });\n this.client = new (OPFormatterMixin(JsonRpcBatchProvider))(connection);\n this.nonBatchClient = new (OPFormatterMixin(JsonRpcProvider))(connection);\n } else if (protocolStr === 'ws' || protocolStr === 'wss') {\n this.client = new (OPFormatterMixin(WebSocketProvider))(this.endpoint);\n } else {\n throw new Error(`Unsupported protocol: ${protocol}`);\n }\n }\n\n async init(): Promise<void> {\n this.injectClient();\n\n const network = await this.client.getNetwork();\n\n //celo\n if (network.chainId === 42220) {\n if (this.client instanceof WebSocketProvider) {\n this.client = new CeloWsProvider(this.client.connection.url);\n } else {\n this.client = new CeloJsonRpcBatchProvider(this.client.connection);\n this.nonBatchClient = new CeloJsonRpcProvider(this.client.connection);\n }\n }\n\n try {\n const [genesisBlock, supportsFinalization, supportsSafe] =\n await Promise.all([\n this.getGenesisBlock(network.chainId),\n this.getSupportsTag('finalized'),\n this.getSupportsTag('safe'),\n ]);\n\n this.genesisBlock = genesisBlock;\n this._supportsFinalization = supportsFinalization && supportsSafe;\n this.chainId = network.chainId;\n this.name = network.name;\n } catch (e) {\n if ((e as Error).message.startsWith('Invalid response')) {\n this.client = this.nonBatchClient;\n\n logger.warn(\n `The RPC Node at ${this.endpoint} cannot process batch requests. ` +\n `Switching to non-batch mode for subsequent requests. Please consider checking if batch processing is supported on the RPC node.`,\n );\n\n return this.init();\n }\n\n throw e;\n }\n }\n\n private async getSupportsTag(tag: BlockTag): Promise<boolean> {\n try {\n // We set the timeout here because there is a bug in ethers where it will never resolve\n // It was happening with arbitrum on a syncing node\n const result = await timeout(this.client.getBlock(tag), 2);\n\n return true;\n } catch (e) {\n logger.info(`Chain doesnt support ${tag} tag`);\n return false;\n }\n }\n\n private injectClient(): void {\n const orig = this.client.send.bind(this.client);\n Object.defineProperty(this.client, 'send', {\n value: (...args) => {\n this.eventEmitter.emit('rpcCall');\n return orig(...args);\n },\n });\n }\n\n private async getGenesisBlock(chainId: number): Promise<Block> {\n const tag = () => {\n switch (chainId) {\n // BEVM Canary\n case 1501:\n return 4157986;\n default:\n return 'earliest';\n }\n };\n\n return this.client.getBlock(tag());\n }\n\n async getFinalizedBlock(): Promise<Block> {\n const height = this.supportsFinalization\n ? 'finalized'\n : (await this.getBestBlockHeight()) - this.blockConfirmations;\n\n const block = await this.client.getBlock(height);\n // The finalized block could sometimes fail to fetch,\n // due to some nodes on the network falling behind the synced node.\n if (!block) {\n throw new Error(`get finalized block \"${height}\" failed `);\n }\n return block;\n }\n\n async getFinalizedBlockHeight(): Promise<number> {\n return (await this.getFinalizedBlock()).number;\n }\n\n async getBestBlockHeight(): Promise<number> {\n // Cronos \"safe\" tag doesn't currently work as indended\n const tag =\n !this.unfinalizedBlocks &&\n this.supportsFinalization &&\n this.chainId !== 25\n ? 'safe'\n : 'latest';\n return (await this.client.getBlock(tag)).number;\n }\n\n getRuntimeChain(): string {\n return this.name;\n }\n\n getChainId(): number {\n return this.chainId;\n }\n\n getGenesisHash(): string {\n return this.genesisBlock.hash;\n }\n\n getSpecName(): string {\n return 'ethereum';\n }\n\n async getBlockByHeightOrHash(heightOrHash: number | string): Promise<Block> {\n if (typeof heightOrHash === 'number') {\n heightOrHash = hexValue(heightOrHash);\n }\n return this.client.getBlock(heightOrHash);\n }\n\n private async getBlockPromise(num: number, includeTx = true): Promise<any> {\n const rawBlock = await this.client.send('eth_getBlockByNumber', [\n hexValue(num),\n includeTx,\n ]);\n\n if (!rawBlock) {\n throw new Error(`Failed to fetch block ${num}`);\n }\n\n const block = formatBlock(rawBlock);\n\n block.stateRoot = this.client.formatter.hash(block.stateRoot);\n\n return block;\n }\n async getTransactionReceipt(\n transactionHash: string | Promise<string>,\n ): Promise<TransactionReceipt> {\n return retryOnFailEth<TransactionReceipt>(\n this.client.getTransactionReceipt.bind(this.client, transactionHash),\n );\n }\n\n async fetchBlock(blockNumber: number): Promise<IBlock<EthereumBlock>> {\n try {\n const block = await this.getBlockPromise(blockNumber, true);\n const logsRaw = await this.client.getLogs({\n blockHash: block.hash,\n });\n\n // Certain RPC may not accommodate for blockHash, and would return wrong logs\n if (logsRaw.length) {\n logsRaw.forEach((l) => {\n if (l.blockHash.toLowerCase() !== block.hash.toLowerCase()) {\n throw new Error(\n `Log BlockHash does not match block: ${blockNumber}, blockHash ${\n block.hash\n }. Log ${handleNumber(\n l.logIndex,\n ).toNumber()} got block ${handleNumber(\n l.blockNumber,\n ).toNumber()} blockHash ${\n l.blockHash\n }. Please check with rpc provider`,\n );\n }\n });\n }\n\n block.logs = logsRaw.map((l) => formatLog(l, block));\n block.transactions = block.transactions.map((tx) => ({\n ...formatTransaction(tx, block),\n receipt: () =>\n this.getTransactionReceipt(tx.hash).then((r) =>\n formatReceipt(r, block),\n ),\n logs: block.logs.filter((l) => l.transactionHash === tx.hash),\n }));\n\n this.eventEmitter.emit('fetchBlock');\n return formatBlockUtil(block);\n } catch (e) {\n throw this.handleError(e);\n }\n }\n\n private async fetchLightBlock(\n blockNumber: number,\n ): Promise<IBlock<LightEthereumBlock>> {\n const block = await this.getBlockPromise(blockNumber, false);\n const logs = await this.client.getLogs({ blockHash: block.hash });\n\n const lightBlock: LightEthereumBlock = {\n ...block,\n logs: logs.map((l) => formatLog(l, block)),\n };\n return formatBlockUtil<LightEthereumBlock>(lightBlock);\n }\n\n async fetchBlocks(bufferBlocks: number[]): Promise<IBlock<EthereumBlock>[]> {\n return Promise.all(bufferBlocks.map(async (num) => this.fetchBlock(num)));\n }\n\n async fetchBlocksLight(\n bufferBlocks: number[],\n ): Promise<IBlock<LightEthereumBlock>[]> {\n return Promise.all(\n bufferBlocks.map(async (num) => this.fetchLightBlock(num)),\n );\n }\n\n get api(): BaseProvider {\n return this.client;\n }\n\n getSafeApi(blockHeight: number): SafeEthProvider {\n // We cannot use a batch http client because OnF don't support routing historical queries in batches to an archive nodes\n const client =\n this.client instanceof WebSocketProvider\n ? this.client\n : this.nonBatchClient;\n\n return new SafeEthProvider(client, blockHeight);\n }\n\n private buildInterface(\n abiName: string,\n assets: Record<string, string>,\n ): Interface | undefined {\n if (!assets[abiName]) {\n throw new Error(`ABI named \"${abiName}\" not referenced in assets`);\n }\n\n // This assumes that all datasources have a different abi name or they are the same abi\n if (!this.contractInterfaces[abiName]) {\n // Constructing the interface validates the ABI\n try {\n let abiObj = JSON.parse(assets[abiName]);\n\n /*\n * Allows parsing JSON artifacts as well as ABIs\n * https://trufflesuite.github.io/artifact-updates/background.html#what-are-artifacts\n */\n if (!Array.isArray(abiObj) && abiObj.abi) {\n abiObj = abiObj.abi;\n }\n\n this.contractInterfaces[abiName] = new Interface(abiObj);\n } catch (e) {\n logger.error(`Unable to parse ABI: ${e.message}`);\n throw new Error('ABI is invalid');\n }\n }\n\n return this.contractInterfaces[abiName];\n }\n\n async parseLog<T extends EthereumResult = EthereumResult>(\n log: EthereumLog | LightEthereumLog,\n ds: SubqlRuntimeDatasource,\n ): Promise<\n EthereumLog | LightEthereumLog | EthereumLog<T> | LightEthereumLog<T>\n > {\n try {\n if (!ds?.options?.abi) {\n logger.warn('No ABI provided for datasource');\n return log;\n }\n const iface = this.buildInterface(ds.options.abi, await loadAssets(ds));\n\n log.args = iface?.parseLog(log).args as T;\n\n return log;\n } catch (e) {\n logger.warn(`Failed to parse log data: ${e.message}`);\n return log;\n }\n }\n\n async parseTransaction<T extends EthereumResult = EthereumResult>(\n transaction: EthereumTransaction,\n ds: SubqlRuntimeDatasource,\n ): Promise<EthereumTransaction<T> | EthereumTransaction> {\n try {\n if (!ds?.options?.abi) {\n if (transaction.input !== '0x') {\n logger.warn('No ABI provided for datasource');\n }\n return transaction;\n }\n const assets = await loadAssets(ds);\n const iface = this.buildInterface(ds.options.abi, assets);\n const func = iface.getFunction(hexDataSlice(transaction.input, 0, 4));\n const args = iface.decodeFunctionData(func, transaction.input) as T;\n\n transaction.logs =\n transaction.logs &&\n ((await Promise.all(\n transaction.logs.map(async (log) => this.parseLog(log, ds)),\n )) as Array<EthereumLog | EthereumLog<T>>);\n\n transaction.args = args;\n return transaction;\n } catch (e) {\n logger.warn(`Failed to parse transaction data: ${e.message}`);\n return transaction;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async connect(): Promise<void> {\n logger.error('Ethereum API connect is not implemented');\n throw new Error('Not implemented');\n }\n\n async disconnect(): Promise<void> {\n if (this.client instanceof WebSocketProvider) {\n await this.client.destroy();\n } else {\n logger.warn('Disconnect called on HTTP provider');\n }\n }\n\n handleError(e: Error): Error {\n if ((e as any)?.status === 429) {\n const { hostname } = new URL(this.endpoint);\n return new Error(`Rate Limited at endpoint: ${hostname}`);\n }\n\n return e;\n }\n}\n"]}
|
|
@@ -224,12 +224,15 @@ describe('Api.ethereum', () => {
|
|
|
224
224
|
hash: mockBlockHash,
|
|
225
225
|
transactions: [],
|
|
226
226
|
});
|
|
227
|
-
jest
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
227
|
+
jest.spyOn(ethApi.client, 'getLogs').mockResolvedValueOnce([
|
|
228
|
+
{
|
|
229
|
+
blockNumber: '0x1831a96',
|
|
230
|
+
blockHash: mockIncorrectBlockHash,
|
|
231
|
+
transactionHash: 'tx1',
|
|
232
|
+
logIndex: '0x0',
|
|
233
|
+
},
|
|
231
234
|
]);
|
|
232
|
-
await expect(ethApi.fetchBlock(mockBlockNumber)).rejects.toThrow(`Log BlockHash does not match block:
|
|
235
|
+
await expect(ethApi.fetchBlock(mockBlockNumber)).rejects.toThrow(`Log BlockHash does not match block: 72194336, blockHash mockBlockHash. Log 0 got block 25369238 blockHash mockIncorrectBlockHash. Please check with rpc provider`);
|
|
233
236
|
});
|
|
234
237
|
it('Should able to check is fullBlock', async () => {
|
|
235
238
|
// block with transactions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.ethereum.test.js","sourceRoot":"","sources":["../../src/ethereum/api.ethereum.test.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 path from 'path';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n EthereumBlock,\n EthereumDatasourceKind,\n EthereumHandlerKind,\n EthereumLogFilter,\n SubqlRuntimeDatasource,\n} from '@subql/types-ethereum';\nimport { EthereumApi } from './api.ethereum';\nimport {\n filterLogsProcessor,\n filterTransactionsProcessor,\n isFullBlock,\n} from './block.ethereum';\n\n// Add api key to work\n// const HTTP_ENDPOINT = 'https://eth.api.onfinality.io/public';\nconst HTTP_ENDPOINT = 'https://eth.llamarpc.com';\nconst BLOCK_CONFIRMATIONS = 20;\n\nconst ds: SubqlRuntimeDatasource = {\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'test',\n kind: EthereumHandlerKind.Call,\n filter: { function: '0x23b872dd' },\n },\n ],\n },\n kind: EthereumDatasourceKind.Runtime,\n startBlock: 16258633,\n options: { abi: 'erc721' },\n assets: new Map([\n ['erc721', { file: path.join(__dirname, '../../test/erc721.json') }],\n ]),\n};\n\njest.setTimeout(90000);\ndescribe('Api.ethereum', () => {\n let ethApi: EthereumApi;\n const eventEmitter = new EventEmitter2();\n let blockData: EthereumBlock;\n\n const fetchBlock = async (height: number) => {\n const block = await ethApi.fetchBlock(height);\n\n return block.block as EthereumBlock;\n };\n\n beforeEach(async () => {\n ethApi = new EthereumApi(HTTP_ENDPOINT, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(16258633);\n });\n\n it('Should format transaction in logs, and the transaction gas should be bigInt type', () => {\n expect(typeof blockData.logs[0].transaction.gas).toBe('bigint');\n expect(typeof blockData.logs[0].transaction.blockNumber).toBe('number');\n expect(typeof blockData.logs[0].transaction.gasPrice).toBe('bigint');\n expect(typeof blockData.logs[0].transaction.maxPriorityFeePerGas).toBe(\n 'bigint',\n );\n expect(typeof blockData.logs[0].transaction.transactionIndex).toBe(\n 'bigint',\n );\n });\n\n it('should have the ability to get receipts via transactions from all types', () => {\n expect(typeof blockData.transactions[0].receipt).toEqual('function');\n expect(typeof blockData.logs[0].transaction.receipt).toEqual('function');\n expect(typeof blockData.logs[0].transaction.from).toEqual('string');\n expect(typeof blockData.transactions[81].logs[0].transaction.from).toEqual(\n 'string',\n );\n expect(\n typeof blockData.transactions[81].logs[0].transaction.receipt,\n ).toEqual('function');\n });\n\n it('Decode nested logs in transactions', async () => {\n // Erc721\n const tx = blockData.transactions.find(\n (e) =>\n e.hash ===\n '0x8e419d0e36d7f9c099a001fded516bd168edd9d27b4aec2bcd56ba3b3b955ccc',\n );\n const parsedTx = await ethApi.parseTransaction(tx, ds);\n expect(parsedTx.logs[0].args).toBeTruthy();\n });\n\n it('Should decode transaction data and not clone object', async () => {\n const tx = blockData.transactions.find(\n (e) =>\n e.hash ===\n '0x8e419d0e36d7f9c099a001fded516bd168edd9d27b4aec2bcd56ba3b3b955ccc',\n );\n const parsedTx = await ethApi.parseTransaction(tx, ds);\n\n expect(parsedTx).toBe(tx);\n });\n\n it('Should return raw logs, if decode fails', async () => {\n // not Erc721\n const tx = blockData.transactions.find(\n (e) =>\n e.hash ===\n '0xed62f7a7720fe6ae05dec45ad9dd4f53034a0aae2c140d229b1151504ee9a6c9',\n );\n const parsedLog = await ethApi.parseLog(tx.logs[0], ds);\n expect(parsedLog).not.toHaveProperty('args');\n expect(parsedLog).toBeTruthy();\n });\n\n // This test is here to ensure getters aren't removed\n it('Should not clone logs when parsing args', async () => {\n const log = blockData.transactions.find(\n (e) =>\n e.hash ===\n '0x8e419d0e36d7f9c099a001fded516bd168edd9d27b4aec2bcd56ba3b3b955ccc',\n ).logs[1];\n\n const parsedLog = await ethApi.parseLog(log, ds);\n expect(parsedLog).toBe(log);\n });\n\n it('Null filter support', async () => {\n const beamEndpoint = 'https://rpc.api.moonbeam.network';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(2847447);\n const result = blockData.transactions.filter((tx) => {\n if (\n filterTransactionsProcessor(\n tx,\n { to: null },\n '0x72a33394f0652e2bf15d7901f3cd46863d968424',\n )\n ) {\n return tx.hash;\n }\n });\n expect(result[0].hash).toBe(\n '0x24bef923522a4d6a79f9ab9242a74fb987dce94002c0f107c2a7d0b7e24bcf05',\n );\n expect(result.length).toBe(1);\n });\n\n it('!null filter support for logs, expect to filter out', async () => {\n const beamEndpoint = 'https://rpc.api.moonbeam.network';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n const filter_1: EthereumLogFilter = {\n topics: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n undefined,\n undefined,\n '!null',\n ],\n };\n\n const filter_2: EthereumLogFilter = {\n topics: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n ],\n };\n\n blockData = await fetchBlock(4015990);\n const transaction = blockData.transactions.find(\n (tx) =>\n tx.hash ===\n '0xeb2e443f2d4e784193fa13bbbae2b85e6ee459e7b7b53f8ca098ffae9b25b059',\n );\n\n const erc20Transfers = transaction.logs.filter((log) =>\n filterLogsProcessor(log, filter_2),\n );\n const erc721Transfers = transaction.logs.filter((log) =>\n filterLogsProcessor(log, filter_1),\n );\n\n expect(erc20Transfers.length).toBe(7);\n expect(erc721Transfers.length).toBe(2);\n });\n\n it('Null and 0x (empty) filter support for transaction data', async () => {\n const beamEndpoint = 'https://mainnet.base.org/';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(1104962);\n // blockData.transactions[0].to = undefined;\n const result = blockData.transactions.filter((tx) => {\n if (filterTransactionsProcessor(tx, { function: null })) {\n return tx.hash;\n }\n });\n expect(result.length).toBe(1);\n expect(result[0].hash).toBe(\n '0x182c5381f8fa3332a7bd676b1c819a15119972db52bd5210afead88f18fff642',\n );\n\n const result2 = blockData.transactions.filter((tx) => {\n if (filterTransactionsProcessor(tx, { function: '0x' })) {\n return tx.hash;\n }\n });\n expect(result2.length).toBe(1);\n expect(result2[0].hash).toBe(\n '0x182c5381f8fa3332a7bd676b1c819a15119972db52bd5210afead88f18fff642',\n );\n });\n\n it('Null filter support, for undefined transaction.to', async () => {\n const beamEndpoint = 'https://rpc.api.moonbeam.network';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(2847447);\n blockData.transactions[1].to = undefined;\n const result = blockData.transactions.filter((tx) => {\n if (\n filterTransactionsProcessor(\n tx,\n { to: null },\n '0x72a33394f0652e2bf15d7901f3cd46863d968424',\n )\n ) {\n return tx.hash;\n }\n });\n expect(result[0].hash).toBe(\n '0x24bef923522a4d6a79f9ab9242a74fb987dce94002c0f107c2a7d0b7e24bcf05',\n );\n expect(result.length).toBe(1);\n });\n\n it('Should return all tx if filter.to is not defined', async () => {\n const beamEndpoint = 'https://rpc.api.moonbeam.network';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(2847447);\n const result = blockData.transactions.filter((tx) => {\n if (\n filterTransactionsProcessor(\n tx,\n undefined,\n '0x72a33394f0652e2bf15d7901f3cd46863d968424',\n )\n ) {\n return tx.hash;\n }\n });\n expect(result.length).toBe(2);\n });\n\n it('filter.to Should support only null not undefined', async () => {\n const beamEndpoint = 'https://rpc.api.moonbeam.network';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(2847447);\n const result = blockData.transactions.filter((tx) => {\n if (\n filterTransactionsProcessor(\n tx,\n { to: undefined },\n '0x72a33394f0652e2bf15d7901f3cd46863d968424',\n )\n ) {\n return tx.hash;\n }\n });\n expect(result.length).toBe(0);\n });\n\n it('If transaction is undefined, with null filter, should be supported', async () => {\n const beamEndpoint = 'https://rpc.api.moonbeam.network';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(2847447);\n const result = blockData.transactions.filter((tx) => {\n tx.to = undefined;\n if (\n filterTransactionsProcessor(\n tx,\n { to: null },\n '0x72a33394f0652e2bf15d7901f3cd46863d968424',\n )\n ) {\n return tx.hash;\n }\n });\n expect(result.length).toBe(2);\n });\n\n it('Resolves the correct tags for finalization', async () => {\n // Ethereum\n expect((ethApi as any).supportsFinalization).toBeTruthy();\n\n // Moonbeam\n ethApi = new EthereumApi(\n 'https://rpc.api.moonbeam.network',\n BLOCK_CONFIRMATIONS,\n eventEmitter,\n );\n await ethApi.init();\n\n expect((ethApi as any).supportsFinalization).toBeTruthy();\n\n // BSC\n ethApi = new EthereumApi(\n 'https://bsc-dataseed.binance.org',\n BLOCK_CONFIRMATIONS,\n eventEmitter,\n );\n await ethApi.init();\n\n expect((ethApi as any).supportsFinalized).toBeFalsy();\n\n // Polygon\n ethApi = new EthereumApi(\n 'https://polygon.llamarpc.com',\n BLOCK_CONFIRMATIONS,\n eventEmitter,\n );\n await ethApi.init();\n\n expect((ethApi as any).supportsFinalized).toBeFalsy();\n });\n it('Assert blockHash on logs and block', async () => {\n ethApi = new EthereumApi(\n 'https://rpc.ankr.com/xdc',\n BLOCK_CONFIRMATIONS,\n eventEmitter,\n );\n await ethApi.init();\n\n const mockBlockNumber = 72194336;\n const mockBlockHash = 'mockBlockHash';\n const mockIncorrectBlockHash = 'mockIncorrectBlockHash';\n\n jest.spyOn(ethApi as any, 'getBlockPromise').mockResolvedValueOnce({\n hash: mockBlockHash,\n transactions: [],\n });\n\n jest\n .spyOn((ethApi as any).client, 'getLogs')\n .mockResolvedValueOnce([\n { blockHash: mockIncorrectBlockHash, transactionHash: 'tx1' },\n ]);\n\n await expect(ethApi.fetchBlock(mockBlockNumber)).rejects.toThrow(\n `Log BlockHash does not match block: ${mockBlockNumber}`,\n );\n });\n\n it('Should able to check is fullBlock', async () => {\n // block with transactions\n const lightBlock = (await (ethApi as any).fetchLightBlock(16258633)).block;\n expect(isFullBlock(blockData)).toBeTruthy();\n expect(isFullBlock(lightBlock)).toBeFalsy();\n\n // block without transaction\n const block10001 = (await (ethApi as any).fetchBlock(10001)).block;\n const lightBlock10001 = (await (ethApi as any).fetchLightBlock(10001))\n .block;\n expect(isFullBlock(block10001)).toBeFalsy();\n expect(isFullBlock(lightBlock10001)).toBeFalsy();\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"api.ethereum.test.js","sourceRoot":"","sources":["../../src/ethereum/api.ethereum.test.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 path from 'path';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n EthereumBlock,\n EthereumDatasourceKind,\n EthereumHandlerKind,\n EthereumLogFilter,\n SubqlRuntimeDatasource,\n} from '@subql/types-ethereum';\nimport { EthereumApi } from './api.ethereum';\nimport {\n filterLogsProcessor,\n filterTransactionsProcessor,\n isFullBlock,\n} from './block.ethereum';\n\n// Add api key to work\n// const HTTP_ENDPOINT = 'https://eth.api.onfinality.io/public';\nconst HTTP_ENDPOINT = 'https://eth.llamarpc.com';\nconst BLOCK_CONFIRMATIONS = 20;\n\nconst ds: SubqlRuntimeDatasource = {\n mapping: {\n file: '',\n handlers: [\n {\n handler: 'test',\n kind: EthereumHandlerKind.Call,\n filter: { function: '0x23b872dd' },\n },\n ],\n },\n kind: EthereumDatasourceKind.Runtime,\n startBlock: 16258633,\n options: { abi: 'erc721' },\n assets: new Map([\n ['erc721', { file: path.join(__dirname, '../../test/erc721.json') }],\n ]),\n};\n\njest.setTimeout(90000);\ndescribe('Api.ethereum', () => {\n let ethApi: EthereumApi;\n const eventEmitter = new EventEmitter2();\n let blockData: EthereumBlock;\n\n const fetchBlock = async (height: number) => {\n const block = await ethApi.fetchBlock(height);\n\n return block.block as EthereumBlock;\n };\n\n beforeEach(async () => {\n ethApi = new EthereumApi(HTTP_ENDPOINT, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(16258633);\n });\n\n it('Should format transaction in logs, and the transaction gas should be bigInt type', () => {\n expect(typeof blockData.logs[0].transaction.gas).toBe('bigint');\n expect(typeof blockData.logs[0].transaction.blockNumber).toBe('number');\n expect(typeof blockData.logs[0].transaction.gasPrice).toBe('bigint');\n expect(typeof blockData.logs[0].transaction.maxPriorityFeePerGas).toBe(\n 'bigint',\n );\n expect(typeof blockData.logs[0].transaction.transactionIndex).toBe(\n 'bigint',\n );\n });\n\n it('should have the ability to get receipts via transactions from all types', () => {\n expect(typeof blockData.transactions[0].receipt).toEqual('function');\n expect(typeof blockData.logs[0].transaction.receipt).toEqual('function');\n expect(typeof blockData.logs[0].transaction.from).toEqual('string');\n expect(typeof blockData.transactions[81].logs[0].transaction.from).toEqual(\n 'string',\n );\n expect(\n typeof blockData.transactions[81].logs[0].transaction.receipt,\n ).toEqual('function');\n });\n\n it('Decode nested logs in transactions', async () => {\n // Erc721\n const tx = blockData.transactions.find(\n (e) =>\n e.hash ===\n '0x8e419d0e36d7f9c099a001fded516bd168edd9d27b4aec2bcd56ba3b3b955ccc',\n );\n const parsedTx = await ethApi.parseTransaction(tx, ds);\n expect(parsedTx.logs[0].args).toBeTruthy();\n });\n\n it('Should decode transaction data and not clone object', async () => {\n const tx = blockData.transactions.find(\n (e) =>\n e.hash ===\n '0x8e419d0e36d7f9c099a001fded516bd168edd9d27b4aec2bcd56ba3b3b955ccc',\n );\n const parsedTx = await ethApi.parseTransaction(tx, ds);\n\n expect(parsedTx).toBe(tx);\n });\n\n it('Should return raw logs, if decode fails', async () => {\n // not Erc721\n const tx = blockData.transactions.find(\n (e) =>\n e.hash ===\n '0xed62f7a7720fe6ae05dec45ad9dd4f53034a0aae2c140d229b1151504ee9a6c9',\n );\n const parsedLog = await ethApi.parseLog(tx.logs[0], ds);\n expect(parsedLog).not.toHaveProperty('args');\n expect(parsedLog).toBeTruthy();\n });\n\n // This test is here to ensure getters aren't removed\n it('Should not clone logs when parsing args', async () => {\n const log = blockData.transactions.find(\n (e) =>\n e.hash ===\n '0x8e419d0e36d7f9c099a001fded516bd168edd9d27b4aec2bcd56ba3b3b955ccc',\n ).logs[1];\n\n const parsedLog = await ethApi.parseLog(log, ds);\n expect(parsedLog).toBe(log);\n });\n\n it('Null filter support', async () => {\n const beamEndpoint = 'https://rpc.api.moonbeam.network';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(2847447);\n const result = blockData.transactions.filter((tx) => {\n if (\n filterTransactionsProcessor(\n tx,\n { to: null },\n '0x72a33394f0652e2bf15d7901f3cd46863d968424',\n )\n ) {\n return tx.hash;\n }\n });\n expect(result[0].hash).toBe(\n '0x24bef923522a4d6a79f9ab9242a74fb987dce94002c0f107c2a7d0b7e24bcf05',\n );\n expect(result.length).toBe(1);\n });\n\n it('!null filter support for logs, expect to filter out', async () => {\n const beamEndpoint = 'https://rpc.api.moonbeam.network';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n const filter_1: EthereumLogFilter = {\n topics: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n undefined,\n undefined,\n '!null',\n ],\n };\n\n const filter_2: EthereumLogFilter = {\n topics: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n ],\n };\n\n blockData = await fetchBlock(4015990);\n const transaction = blockData.transactions.find(\n (tx) =>\n tx.hash ===\n '0xeb2e443f2d4e784193fa13bbbae2b85e6ee459e7b7b53f8ca098ffae9b25b059',\n );\n\n const erc20Transfers = transaction.logs.filter((log) =>\n filterLogsProcessor(log, filter_2),\n );\n const erc721Transfers = transaction.logs.filter((log) =>\n filterLogsProcessor(log, filter_1),\n );\n\n expect(erc20Transfers.length).toBe(7);\n expect(erc721Transfers.length).toBe(2);\n });\n\n it('Null and 0x (empty) filter support for transaction data', async () => {\n const beamEndpoint = 'https://mainnet.base.org/';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(1104962);\n // blockData.transactions[0].to = undefined;\n const result = blockData.transactions.filter((tx) => {\n if (filterTransactionsProcessor(tx, { function: null })) {\n return tx.hash;\n }\n });\n expect(result.length).toBe(1);\n expect(result[0].hash).toBe(\n '0x182c5381f8fa3332a7bd676b1c819a15119972db52bd5210afead88f18fff642',\n );\n\n const result2 = blockData.transactions.filter((tx) => {\n if (filterTransactionsProcessor(tx, { function: '0x' })) {\n return tx.hash;\n }\n });\n expect(result2.length).toBe(1);\n expect(result2[0].hash).toBe(\n '0x182c5381f8fa3332a7bd676b1c819a15119972db52bd5210afead88f18fff642',\n );\n });\n\n it('Null filter support, for undefined transaction.to', async () => {\n const beamEndpoint = 'https://rpc.api.moonbeam.network';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(2847447);\n blockData.transactions[1].to = undefined;\n const result = blockData.transactions.filter((tx) => {\n if (\n filterTransactionsProcessor(\n tx,\n { to: null },\n '0x72a33394f0652e2bf15d7901f3cd46863d968424',\n )\n ) {\n return tx.hash;\n }\n });\n expect(result[0].hash).toBe(\n '0x24bef923522a4d6a79f9ab9242a74fb987dce94002c0f107c2a7d0b7e24bcf05',\n );\n expect(result.length).toBe(1);\n });\n\n it('Should return all tx if filter.to is not defined', async () => {\n const beamEndpoint = 'https://rpc.api.moonbeam.network';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(2847447);\n const result = blockData.transactions.filter((tx) => {\n if (\n filterTransactionsProcessor(\n tx,\n undefined,\n '0x72a33394f0652e2bf15d7901f3cd46863d968424',\n )\n ) {\n return tx.hash;\n }\n });\n expect(result.length).toBe(2);\n });\n\n it('filter.to Should support only null not undefined', async () => {\n const beamEndpoint = 'https://rpc.api.moonbeam.network';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(2847447);\n const result = blockData.transactions.filter((tx) => {\n if (\n filterTransactionsProcessor(\n tx,\n { to: undefined },\n '0x72a33394f0652e2bf15d7901f3cd46863d968424',\n )\n ) {\n return tx.hash;\n }\n });\n expect(result.length).toBe(0);\n });\n\n it('If transaction is undefined, with null filter, should be supported', async () => {\n const beamEndpoint = 'https://rpc.api.moonbeam.network';\n ethApi = new EthereumApi(beamEndpoint, BLOCK_CONFIRMATIONS, eventEmitter);\n await ethApi.init();\n blockData = await fetchBlock(2847447);\n const result = blockData.transactions.filter((tx) => {\n tx.to = undefined;\n if (\n filterTransactionsProcessor(\n tx,\n { to: null },\n '0x72a33394f0652e2bf15d7901f3cd46863d968424',\n )\n ) {\n return tx.hash;\n }\n });\n expect(result.length).toBe(2);\n });\n\n it('Resolves the correct tags for finalization', async () => {\n // Ethereum\n expect((ethApi as any).supportsFinalization).toBeTruthy();\n\n // Moonbeam\n ethApi = new EthereumApi(\n 'https://rpc.api.moonbeam.network',\n BLOCK_CONFIRMATIONS,\n eventEmitter,\n );\n await ethApi.init();\n\n expect((ethApi as any).supportsFinalization).toBeTruthy();\n\n // BSC\n ethApi = new EthereumApi(\n 'https://bsc-dataseed.binance.org',\n BLOCK_CONFIRMATIONS,\n eventEmitter,\n );\n await ethApi.init();\n\n expect((ethApi as any).supportsFinalized).toBeFalsy();\n\n // Polygon\n ethApi = new EthereumApi(\n 'https://polygon.llamarpc.com',\n BLOCK_CONFIRMATIONS,\n eventEmitter,\n );\n await ethApi.init();\n\n expect((ethApi as any).supportsFinalized).toBeFalsy();\n });\n it('Assert blockHash on logs and block', async () => {\n ethApi = new EthereumApi(\n 'https://rpc.ankr.com/xdc',\n BLOCK_CONFIRMATIONS,\n eventEmitter,\n );\n await ethApi.init();\n\n const mockBlockNumber = 72194336;\n const mockBlockHash = 'mockBlockHash';\n const mockIncorrectBlockHash = 'mockIncorrectBlockHash';\n\n jest.spyOn(ethApi as any, 'getBlockPromise').mockResolvedValueOnce({\n hash: mockBlockHash,\n transactions: [],\n });\n\n jest.spyOn((ethApi as any).client, 'getLogs').mockResolvedValueOnce([\n {\n blockNumber: '0x1831a96',\n blockHash: mockIncorrectBlockHash,\n transactionHash: 'tx1',\n logIndex: '0x0',\n },\n ]);\n\n await expect(ethApi.fetchBlock(mockBlockNumber)).rejects.toThrow(\n `Log BlockHash does not match block: 72194336, blockHash mockBlockHash. Log 0 got block 25369238 blockHash mockIncorrectBlockHash. Please check with rpc provider`,\n );\n });\n\n it('Should able to check is fullBlock', async () => {\n // block with transactions\n const lightBlock = (await (ethApi as any).fetchLightBlock(16258633)).block;\n expect(isFullBlock(blockData)).toBeTruthy();\n expect(isFullBlock(lightBlock)).toBeFalsy();\n\n // block without transaction\n const block10001 = (await (ethApi as any).fetchBlock(10001)).block;\n const lightBlock10001 = (await (ethApi as any).fetchLightBlock(10001))\n .block;\n expect(isFullBlock(block10001)).toBeFalsy();\n expect(isFullBlock(lightBlock10001)).toBeFalsy();\n });\n});\n"]}
|
|
@@ -23,6 +23,7 @@ const SubqueryProject_1 = require("../../configure/SubqueryProject");
|
|
|
23
23
|
const ethereum_1 = require("../../ethereum");
|
|
24
24
|
const v1_1 = require("./v1");
|
|
25
25
|
const v2_1 = require("./v2");
|
|
26
|
+
const logger = (0, node_core_1.getLogger)('eth-dictionary');
|
|
26
27
|
let EthDictionaryService = class EthDictionaryService extends node_core_1.DictionaryService {
|
|
27
28
|
constructor(project, nodeConfig, eventEmitter, apiService) {
|
|
28
29
|
super(project.network.chainId, nodeConfig, eventEmitter);
|
|
@@ -42,8 +43,13 @@ let EthDictionaryService = class EthDictionaryService extends node_core_1.Dictio
|
|
|
42
43
|
dictionariesV2.push(dictionaryV2);
|
|
43
44
|
}
|
|
44
45
|
catch (e) {
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
try {
|
|
47
|
+
const dictionaryV1 = await v1_1.EthDictionaryV1.create(this.project, this.nodeConfig, endpoint);
|
|
48
|
+
dictionariesV1.push(dictionaryV1);
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
logger.warn(`Dictionary endpoint "${endpoint}" is not a valid dictionary`);
|
|
52
|
+
}
|
|
47
53
|
}
|
|
48
54
|
}
|
|
49
55
|
// v2 should be prioritised
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ethDictionary.service.js","sourceRoot":"","sources":["../../../src/indexer/dictionary/ethDictionary.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,0CAA+C;AAC/C,
|
|
1
|
+
{"version":3,"file":"ethDictionary.service.js","sourceRoot":"","sources":["../../../src/indexer/dictionary/ethDictionary.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,0CAA+C;AAC/C,gDAK0B;AAE1B,qEAAkE;AAClE,6CAAoD;AACpD,6BAAuC;AACvC,6BAAuC;AAEvC,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,gBAAgB,CAAC,CAAC;AAGpC,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,6BAGzC;IACC,YACwC,OAAwB,EAC9D,UAAsB,EACtB,YAA2B,EACC,UAA8B;QAE1D,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QALnB,YAAO,GAAP,OAAO,CAAiB;QAGlC,eAAU,GAAV,UAAU,CAAoB;IAG5D,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,cAAc,GAAsB,EAAE,CAAC;QAC7C,MAAM,cAAc,GAAsB,EAAE,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;SACnE;QAED,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAC3D,uBAAc,CAAC,QAAQ,EACvB,IAAI,CAAC,OAAO,CAAC,OAAO,CACrB,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,mBAAmB,EAAE;YAC1C,IAAI;gBACF,MAAM,YAAY,GAAG,MAAM,oBAAe,CAAC,MAAM,CAC/C,QAAQ,EACR,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,UAAU,CAAC,GAAG,CACpB,CAAC;gBACF,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;aACnC;YAAC,OAAO,CAAC,EAAE;gBACV,IAAI;oBACF,MAAM,YAAY,GAAG,MAAM,oBAAe,CAAC,MAAM,CAC/C,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,UAAU,EACf,QAAQ,CACT,CAAC;oBACF,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBACnC;gBAAC,OAAO,CAAC,EAAE;oBACV,MAAM,CAAC,IAAI,CACT,wBAAwB,QAAQ,6BAA6B,CAC9D,CAAC;iBACH;aACF;SACF;QACD,2BAA2B;QAC3B,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;IACpD,CAAC;CACF,CAAA;AArDY,oBAAoB;IADhC,IAAA,mBAAU,GAAE;IAMR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;IAG1B,WAAA,IAAA,eAAM,EAAC,sBAAU,CAAC,CAAA;qCAH4B,iCAAe;QAClD,sBAAU;QACR,6BAAa;QACa,6BAAkB;GARjD,oBAAoB,CAqDhC;AArDY,oDAAoB","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { NETWORK_FAMILY } from '@subql/common';\nimport {\n NodeConfig,\n DictionaryService,\n ApiService,\n getLogger,\n} from '@subql/node-core';\nimport { EthereumBlock, SubqlDatasource } from '@subql/types-ethereum';\nimport { SubqueryProject } from '../../configure/SubqueryProject';\nimport { EthereumApiService } from '../../ethereum';\nimport { EthDictionaryV1 } from './v1';\nimport { EthDictionaryV2 } from './v2';\n\nconst logger = getLogger('eth-dictionary');\n\n@Injectable()\nexport class EthDictionaryService extends DictionaryService<\n SubqlDatasource,\n EthereumBlock\n> {\n constructor(\n @Inject('ISubqueryProject') protected project: SubqueryProject,\n nodeConfig: NodeConfig,\n eventEmitter: EventEmitter2,\n @Inject(ApiService) private apiService: EthereumApiService,\n ) {\n super(project.network.chainId, nodeConfig, eventEmitter);\n }\n\n async initDictionaries(): Promise<void> {\n const dictionariesV1: EthDictionaryV1[] = [];\n const dictionariesV2: EthDictionaryV2[] = [];\n\n if (!this.project) {\n throw new Error(`Project in Dictionary service not initialized `);\n }\n\n const dictionaryEndpoints = await this.getDictionaryEndpoints(\n NETWORK_FAMILY.ethereum,\n this.project.network,\n );\n\n for (const endpoint of dictionaryEndpoints) {\n try {\n const dictionaryV2 = await EthDictionaryV2.create(\n endpoint,\n this.nodeConfig,\n this.project,\n this.apiService.api,\n );\n dictionariesV2.push(dictionaryV2);\n } catch (e) {\n try {\n const dictionaryV1 = await EthDictionaryV1.create(\n this.project,\n this.nodeConfig,\n endpoint,\n );\n dictionariesV1.push(dictionaryV1);\n } catch (e) {\n logger.warn(\n `Dictionary endpoint \"${endpoint}\" is not a valid dictionary`,\n );\n }\n }\n }\n // v2 should be prioritised\n this.init([...dictionariesV2, ...dictionariesV1]);\n }\n}\n"]}
|
|
@@ -9,14 +9,15 @@ const node_core_1 = require("@subql/node-core");
|
|
|
9
9
|
const types_ethereum_1 = require("@subql/types-ethereum");
|
|
10
10
|
const eventemitter2_1 = __importDefault(require("eventemitter2"));
|
|
11
11
|
const ethereum_1 = require("../../../ethereum");
|
|
12
|
+
const utils_1 = require("../utils");
|
|
12
13
|
const ethDictionaryV2_1 = require("./ethDictionaryV2");
|
|
13
|
-
const DEFAULT_DICTIONARY = 'http://localhost:3000/rpc/eth-mainnet';
|
|
14
|
-
const HTTP_ENDPOINT = 'https://
|
|
14
|
+
const DEFAULT_DICTIONARY = 'http://localhost:3000/rpc/eth-mainnet'; // Takoyaki returning incorrect results so these will fail
|
|
15
|
+
const HTTP_ENDPOINT = 'https://eth.llamarpc.com';
|
|
15
16
|
const mockDs = [
|
|
16
17
|
{
|
|
17
18
|
kind: types_ethereum_1.EthereumDatasourceKind.Runtime,
|
|
18
19
|
assets: new Map(),
|
|
19
|
-
startBlock:
|
|
20
|
+
startBlock: 19217803,
|
|
20
21
|
mapping: {
|
|
21
22
|
file: './dist/index.js',
|
|
22
23
|
handlers: [
|
|
@@ -40,12 +41,34 @@ const mockDs = [
|
|
|
40
41
|
},
|
|
41
42
|
},
|
|
42
43
|
];
|
|
44
|
+
const templateTs = {
|
|
45
|
+
name: 'template',
|
|
46
|
+
kind: types_ethereum_1.EthereumDatasourceKind.Runtime,
|
|
47
|
+
assets: new Map(),
|
|
48
|
+
options: {
|
|
49
|
+
abi: 'erc20',
|
|
50
|
+
// address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619',
|
|
51
|
+
},
|
|
52
|
+
// startBlock: 1,
|
|
53
|
+
mapping: {
|
|
54
|
+
file: '',
|
|
55
|
+
handlers: [
|
|
56
|
+
{
|
|
57
|
+
handler: 'handleLog',
|
|
58
|
+
kind: types_ethereum_1.EthereumHandlerKind.Event,
|
|
59
|
+
filter: {
|
|
60
|
+
topics: ['Transfer(address, address, uint256)'],
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
};
|
|
43
66
|
// tx to is null
|
|
44
67
|
const mockDs2 = [
|
|
45
68
|
{
|
|
46
69
|
kind: types_ethereum_1.EthereumDatasourceKind.Runtime,
|
|
47
70
|
assets: new Map(),
|
|
48
|
-
startBlock:
|
|
71
|
+
startBlock: 19217803,
|
|
49
72
|
mapping: {
|
|
50
73
|
file: './dist/index.js',
|
|
51
74
|
handlers: [
|
|
@@ -61,11 +84,11 @@ const mockDs2 = [
|
|
|
61
84
|
},
|
|
62
85
|
];
|
|
63
86
|
const nodeConfig = new node_core_1.NodeConfig({
|
|
64
|
-
subquery: '
|
|
65
|
-
subqueryName: '
|
|
87
|
+
subquery: 'eth-starter',
|
|
88
|
+
subqueryName: 'eth-starter',
|
|
66
89
|
dictionaryTimeout: 10,
|
|
67
90
|
networkEndpoint: [HTTP_ENDPOINT],
|
|
68
|
-
networkDictionary: [
|
|
91
|
+
networkDictionary: [DEFAULT_DICTIONARY],
|
|
69
92
|
});
|
|
70
93
|
function makeBlockHeightMap(mockDs) {
|
|
71
94
|
const m = new Map();
|
|
@@ -77,56 +100,110 @@ function makeBlockHeightMap(mockDs) {
|
|
|
77
100
|
// enable this once dictionary v2 is online
|
|
78
101
|
describe('eth dictionary v2', () => {
|
|
79
102
|
let ethDictionaryV2;
|
|
80
|
-
let ethBlock3678215;
|
|
81
|
-
let ethBlock3678250;
|
|
82
103
|
const dsMap = makeBlockHeightMap(mockDs);
|
|
83
|
-
|
|
84
|
-
ethDictionaryV2 = await ethDictionaryV2_1.EthDictionaryV2.create(DEFAULT_DICTIONARY, nodeConfig, { network: { chainId: '
|
|
104
|
+
beforeAll(async () => {
|
|
105
|
+
ethDictionaryV2 = await ethDictionaryV2_1.EthDictionaryV2.create(DEFAULT_DICTIONARY, nodeConfig, { network: { chainId: '1' } }, new ethereum_1.EthereumApi(HTTP_ENDPOINT, 1, new eventemitter2_1.default()));
|
|
106
|
+
}, 10000);
|
|
107
|
+
beforeEach(() => {
|
|
85
108
|
ethDictionaryV2.updateQueriesMap(dsMap);
|
|
86
109
|
});
|
|
87
|
-
it('
|
|
88
|
-
|
|
89
|
-
const query = ethDictionaryV2.queriesMap.get(3678215);
|
|
110
|
+
it('converts ds to v2 dictionary queries', () => {
|
|
111
|
+
const query = ethDictionaryV2.queriesMap.get(19217803);
|
|
90
112
|
expect(query.logs.length).toBe(1);
|
|
91
113
|
expect(query.transactions.length).toBe(1);
|
|
92
|
-
}
|
|
114
|
+
});
|
|
93
115
|
it('query response match with entries', async () => {
|
|
94
|
-
|
|
95
|
-
const ethBlocks = (await ethDictionaryV2.getData(3678215, ethDictionaryV2._metadata.end, 2));
|
|
116
|
+
const ethBlocks = (await ethDictionaryV2.getData(19217803, ethDictionaryV2._metadata.end, 2));
|
|
96
117
|
expect(ethBlocks.batchBlocks.map((b) => b.block.number)).toStrictEqual([
|
|
97
|
-
|
|
118
|
+
19217803, 19217804,
|
|
98
119
|
]);
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
expect(
|
|
102
|
-
expect(
|
|
120
|
+
const ethBlock19217803 = ethBlocks.batchBlocks[0].block;
|
|
121
|
+
const ethBlock19217804 = ethBlocks.batchBlocks[1].block;
|
|
122
|
+
expect(ethBlock19217803.number).toBe(19217803);
|
|
123
|
+
expect(ethBlock19217804.number).toBe(19217804);
|
|
103
124
|
// To match with dictionaryQueryEntries[0].func
|
|
104
|
-
expect(
|
|
105
|
-
expect(
|
|
125
|
+
expect(ethBlock19217803.transactions[0].input.indexOf('0xdb3e2198')).toBe(0);
|
|
126
|
+
expect(ethBlock19217804.logs.length).toBe(233);
|
|
106
127
|
// This matches with dictionaryQueryEntries[0].topics
|
|
107
|
-
expect(
|
|
108
|
-
},
|
|
109
|
-
it('able to convert raw v2 Blocks into eth blocks when getData', async () => {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
expect(ethBlocks.
|
|
113
|
-
expect(ethBlocks.lastBufferedHeight).toStrictEqual(3678250);
|
|
128
|
+
expect(ethBlock19217804.logs[0].topics).toContain('0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef');
|
|
129
|
+
}, 10000);
|
|
130
|
+
it('is able to convert raw v2 Blocks into eth blocks when getData', async () => {
|
|
131
|
+
const ethBlocks = (await ethDictionaryV2.getData(19217803, ethDictionaryV2._metadata.end, 2));
|
|
132
|
+
expect(ethBlocks.batchBlocks[0].block.number).toStrictEqual(19217803);
|
|
133
|
+
expect(ethBlocks.lastBufferedHeight).toStrictEqual(19217804);
|
|
114
134
|
// Can include input and hash
|
|
115
|
-
|
|
116
|
-
expect(ethBlocks.batchBlocks[1].block.transactions[1].
|
|
117
|
-
expect(ethBlocks.batchBlocks[1].block.transactions[1].input).toBe(`0x23b872dd000000000000000000000000244a79a2e79e8d884d9c9cc425d88f9e2ed988ca000000000000000000000000d22c4c383ce5efa0364d5fab5ce1313c24a52bda0000000000000000000000000000000000000000000000000000000000000159`);
|
|
135
|
+
expect(ethBlocks.batchBlocks[1].block.transactions[1].hash).toBe(`0x3620616acae2c3050e7b993e207338803ceba628141b063430cb321da746c1ec`);
|
|
136
|
+
expect(ethBlocks.batchBlocks[1].block.transactions[1].input).toBe(`0xa9059cbb0000000000000000000000008ba631c37ce91a2d303be09907f496220a153d6a000000000000000000000000000000000000000000000000000000000c748d43`);
|
|
118
137
|
// relate logs
|
|
119
|
-
// https://polygonscan.com/tx/0xb1b5f7882fa8d62d3650948c08066e928b7b5c9d607d2fe8c7e6ce57caf06774#eventlog
|
|
120
138
|
expect(ethBlocks.batchBlocks[1].block.logs[0].data).toBe(`0x`);
|
|
121
|
-
},
|
|
122
|
-
//
|
|
123
|
-
it.skip('able to get transaction with field to is null', async () => {
|
|
139
|
+
}, 10000);
|
|
140
|
+
// Geth currently throwing errors with this request
|
|
141
|
+
it.skip('is able to get transaction with field to is null', async () => {
|
|
124
142
|
const dsMap = makeBlockHeightMap(mockDs2);
|
|
125
143
|
ethDictionaryV2.updateQueriesMap(dsMap);
|
|
126
|
-
const { conditions
|
|
127
|
-
expect(conditions).
|
|
128
|
-
const ethBlocks = (await ethDictionaryV2.getData(
|
|
144
|
+
const { conditions } = ethDictionaryV2.getQueryConditions(19217803, ethDictionaryV2._metadata.end);
|
|
145
|
+
expect(conditions).toEqual({ transactions: [{ to: [null] }] });
|
|
146
|
+
const ethBlocks = (await ethDictionaryV2.getData(19217803, ethDictionaryV2._metadata.end, 1));
|
|
147
|
+
const { hash, transactions } = ethBlocks.batchBlocks[0].block;
|
|
148
|
+
expect(hash).toBe('0xa9ba70126240a8418739a103527860948a2be32de2eb9a8f590591faa174c08b');
|
|
149
|
+
// https://etherscan.io/tx/0x57e8cd9483cb5d308151372b0cf33fdc615999283c80ee3c28e94f074dda61f1
|
|
150
|
+
expect(transactions.find((tx) => tx.hash ===
|
|
151
|
+
'0x57e8cd9483cb5d308151372b0cf33fdc615999283c80ee3c28e94f074dda61f1')).toBeDefined();
|
|
129
152
|
});
|
|
153
|
+
it('is able to query with not null topics', async () => {
|
|
154
|
+
/**
|
|
155
|
+
* Dictionary v1 supported filtering logs where a topic was null or not null.
|
|
156
|
+
* V2 doesn't yet support this but we should still be able to make a dictionary query that gets relevant logs.
|
|
157
|
+
* It will just include events that will be filtered out later.
|
|
158
|
+
* */
|
|
159
|
+
const ds = {
|
|
160
|
+
kind: types_ethereum_1.EthereumDatasourceKind.Runtime,
|
|
161
|
+
assets: new Map(),
|
|
162
|
+
options: {
|
|
163
|
+
abi: 'erc20',
|
|
164
|
+
},
|
|
165
|
+
startBlock: 19476187,
|
|
166
|
+
mapping: {
|
|
167
|
+
file: '',
|
|
168
|
+
handlers: [
|
|
169
|
+
{
|
|
170
|
+
handler: 'handleLog',
|
|
171
|
+
kind: types_ethereum_1.EthereumHandlerKind.Event,
|
|
172
|
+
filter: {
|
|
173
|
+
topics: [
|
|
174
|
+
'Transfer(address, address, uint256)',
|
|
175
|
+
undefined,
|
|
176
|
+
undefined,
|
|
177
|
+
'!null',
|
|
178
|
+
],
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
const dsMap = makeBlockHeightMap([ds]);
|
|
185
|
+
ethDictionaryV2.updateQueriesMap(dsMap);
|
|
186
|
+
const { conditions } = ethDictionaryV2.getQueryConditions(19476187, ethDictionaryV2._metadata.end);
|
|
187
|
+
expect(conditions).toEqual({
|
|
188
|
+
logs: [
|
|
189
|
+
{
|
|
190
|
+
address: [],
|
|
191
|
+
topics0: [
|
|
192
|
+
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
|
|
193
|
+
],
|
|
194
|
+
topics3: [],
|
|
195
|
+
},
|
|
196
|
+
],
|
|
197
|
+
});
|
|
198
|
+
const ethBlocks = (await ethDictionaryV2.getData(19476187, ethDictionaryV2._metadata.end, 2));
|
|
199
|
+
const { hash, logs } = ethBlocks.batchBlocks[0].block;
|
|
200
|
+
expect(hash).toEqual('0xa798861151ed58ad67d80d1cf61dc30e65d003bc958e99a7969a05a67e69e0b2');
|
|
201
|
+
const log = logs.find((l) => l.logIndex === 184);
|
|
202
|
+
expect(log).toBeDefined();
|
|
203
|
+
expect(log.transactionHash).toEqual('0x5491f3f4b7ca6cc81f992a17e19bc9bafff408518c643c5a254de44b5a7b6d72');
|
|
204
|
+
// Uncomment this when not null filter supported
|
|
205
|
+
// expect(logs.filter(l => !l.topics[3]).length).toEqual(6) // There are 6 events with no topic3
|
|
206
|
+
}, 100000);
|
|
130
207
|
});
|
|
131
208
|
describe('buildDictionaryV2QueryEntry', () => {
|
|
132
209
|
it('Build filter for !null', () => {
|
|
@@ -316,5 +393,54 @@ describe('buildDictionaryV2QueryEntry', () => {
|
|
|
316
393
|
],
|
|
317
394
|
});
|
|
318
395
|
});
|
|
396
|
+
it('should group a small number of dynamic ds', () => {
|
|
397
|
+
const ds = [];
|
|
398
|
+
for (let i = 0; i < 10; i++) {
|
|
399
|
+
// Bad nodejs types
|
|
400
|
+
const tmp = global.structuredClone(templateTs);
|
|
401
|
+
(tmp.options.address = `0x${i}`), ds.push(tmp);
|
|
402
|
+
}
|
|
403
|
+
const result = (0, ethDictionaryV2_1.buildDictionaryV2QueryEntry)((0, utils_1.ethFilterDs)(ds));
|
|
404
|
+
expect(result).toEqual({
|
|
405
|
+
logs: [
|
|
406
|
+
{
|
|
407
|
+
address: [
|
|
408
|
+
'0x0',
|
|
409
|
+
'0x1',
|
|
410
|
+
'0x2',
|
|
411
|
+
'0x3',
|
|
412
|
+
'0x4',
|
|
413
|
+
'0x5',
|
|
414
|
+
'0x6',
|
|
415
|
+
'0x7',
|
|
416
|
+
'0x8',
|
|
417
|
+
'0x9',
|
|
418
|
+
],
|
|
419
|
+
topics0: [
|
|
420
|
+
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
|
|
421
|
+
],
|
|
422
|
+
},
|
|
423
|
+
],
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
it('should remove address filter with large number of dynamic ds', () => {
|
|
427
|
+
const ds = [];
|
|
428
|
+
for (let i = 0; i < 200; i++) {
|
|
429
|
+
// Bad nodejs types
|
|
430
|
+
const tmp = global.structuredClone(templateTs);
|
|
431
|
+
(tmp.options.address = `0x${i}`), ds.push(tmp);
|
|
432
|
+
}
|
|
433
|
+
const result = (0, ethDictionaryV2_1.buildDictionaryV2QueryEntry)((0, utils_1.ethFilterDs)(ds));
|
|
434
|
+
expect(result).toEqual({
|
|
435
|
+
logs: [
|
|
436
|
+
{
|
|
437
|
+
address: [],
|
|
438
|
+
topics0: [
|
|
439
|
+
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
|
|
440
|
+
],
|
|
441
|
+
},
|
|
442
|
+
],
|
|
443
|
+
});
|
|
444
|
+
});
|
|
319
445
|
});
|
|
320
446
|
//# sourceMappingURL=ethDictionaryV2.spec.js.map
|