Skip to content

Commit 494bdb6

Browse files
authored
Fix getLogs mapping to retrieve unique execution logs (2.0) (#273)
Cherry pick #270 `eth-getLogs` logic was grouping transactions via `contractId-timestamp`. This resulted in logs getting missed since the contractId of logs from called contracts differ from the caller - Update `eth_getLogs` call to group log results via timestamp to determine unique executions - Update integration tests - Updated acceptance test image versions Signed-off-by: Nana-EC <[email protected]>
1 parent d5a7739 commit 494bdb6

File tree

3 files changed

+17
-15
lines changed

3 files changed

+17
-15
lines changed

packages/relay/src/lib/eth.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -970,22 +970,22 @@ export class EthImpl implements Eth {
970970
}
971971
const logs = result.logs;
972972

973-
// Find all unique contractId and timestamp pairs and for each one make mirror node request
973+
// Find unique contract execution timestamp and for each one make mirror node request
974974
const promises: Promise<any>[] = [];
975975
const uniquePairs = {};
976976

977977
for (let i = 0; i < logs.length; i++) {
978978
const log = logs[i];
979-
const pair = `${log.contract_id}-${log.timestamp}`;
980-
if (uniquePairs[pair] === undefined) {
981-
uniquePairs[pair] = [i];
979+
const timestamp = `${log.timestamp}`;
980+
if (uniquePairs[timestamp] === undefined) {
981+
uniquePairs[timestamp] = [i];
982982
promises.push(this.mirrorNodeClient.getContractResultsDetails(
983983
log.contract_id,
984984
log.timestamp
985985
));
986986
}
987987
else {
988-
uniquePairs[pair].push(i);
988+
uniquePairs[timestamp].push(i);
989989
}
990990
}
991991

@@ -994,8 +994,9 @@ export class EthImpl implements Eth {
994994
const contractsResultsDetails = await Promise.all(promises);
995995
for (let i = 0; i < contractsResultsDetails.length; i++) {
996996
const detail = contractsResultsDetails[i];
997-
const pair = `${detail.contract_id}-${detail.timestamp}`;
998-
const uPair = uniquePairs[pair] || [];
997+
// retrieve set of logs for each timestamp
998+
const timestamp = `${detail.timestamp}`;
999+
const uPair = uniquePairs[timestamp] || [];
9991000
for (let p = 0; p < uPair.length; p++) {
10001001
const logIndex = uPair[p];
10011002
const log = logs[logIndex];

packages/relay/tests/lib/eth.spec.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ describe('Eth calls using MirrorNode', async function () {
121121
const contractHash3 = '0x4a563af33c4871b51a8b108aa2fe1dd5280a30dfb7236170ae5e5e7957eb6394';
122122
const contractAddress2 = '0x000000000000000000000000000000000000055e';
123123
const contractTimestamp2 = '1653077542.701408897';
124+
const contractTimestamp3 = '1653088542.123456789';
124125
const contractId1 = '0.0.5001';
125126
const contractId2 = '0.0.5002';
126127

@@ -242,7 +243,7 @@ describe('Eth calls using MirrorNode', async function () {
242243

243244
const defaultDetailedContractResults3 = {
244245
...defaultDetailedContractResults, ...{
245-
'timestamp': contractTimestamp2,
246+
'timestamp': contractTimestamp3,
246247
'block_hash': blockHash3,
247248
'block_number': blockNumber3,
248249
'hash': contractHash3,
@@ -300,7 +301,7 @@ describe('Eth calls using MirrorNode', async function () {
300301
"bloom": logBloom3,
301302
"contract_id": contractId1,
302303
"data": "0x",
303-
"index": 1,
304+
"index": 0,
304305
"topics": [],
305306
"root_contract_id": "0.0.34806097",
306307
"timestamp": contractTimestamp2
@@ -310,10 +311,10 @@ describe('Eth calls using MirrorNode', async function () {
310311
"bloom": logBloom4,
311312
"contract_id": contractId2,
312313
"data": "0x",
313-
"index": 1,
314+
"index": 0,
314315
"topics": [],
315316
"root_contract_id": "0.0.34806097",
316-
"timestamp": contractTimestamp2
317+
"timestamp": contractTimestamp3
317318
}
318319
]
319320
};
@@ -844,7 +845,7 @@ describe('Eth calls using MirrorNode', async function () {
844845
mock.onGet(`contracts/results/logs`).reply(200, defaultLogs);
845846
mock.onGet(`contracts/${contractId1}/results/${contractTimestamp1}`).reply(200, defaultDetailedContractResults);
846847
mock.onGet(`contracts/${contractId1}/results/${contractTimestamp2}`).reply(200, defaultDetailedContractResults2);
847-
mock.onGet(`contracts/${contractId2}/results/${contractTimestamp2}`).reply(200, defaultDetailedContractResults3);
848+
mock.onGet(`contracts/${contractId2}/results/${contractTimestamp3}`).reply(200, defaultDetailedContractResults3);
848849

849850
const result = await ethImpl.getLogs(null, null, null, null, null);
850851
expect(result).to.exist;

packages/server/tests/acceptance/rpc.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -688,9 +688,9 @@ describe('RPC Server Acceptance Tests', function () {
688688

689689
function runLocalHederaNetwork() {
690690
// set env variables for docker images until local-node is updated
691-
process.env['NETWORK_NODE_IMAGE_TAG'] = '0.26.2';
692-
process.env['HAVEGED_IMAGE_TAG'] = '0.26.2';
693-
process.env['MIRROR_IMAGE_TAG'] = '0.58.0';
691+
process.env['NETWORK_NODE_IMAGE_TAG'] = '0.26.3';
692+
process.env['HAVEGED_IMAGE_TAG'] = '0.26.3';
693+
process.env['MIRROR_IMAGE_TAG'] = '0.59.0-rc1';
694694
logger.trace(`Docker container versions, services: ${process.env['NETWORK_NODE_IMAGE_TAG']}, mirror: ${process.env['MIRROR_IMAGE_TAG']}`);
695695

696696
// start local-node

0 commit comments

Comments
 (0)