Skip to content
This repository was archived by the owner on Feb 26, 2024. It is now read-only.

Commit e02c536

Browse files
author
Andres Adjimann
committed
test: add tests and some fixes
1 parent 6d0170f commit e02c536

File tree

4 files changed

+366
-19
lines changed

4 files changed

+366
-19
lines changed

src/chains/ethereum/ethereum/src/data-managers/block-manager.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ export default class BlockManager extends Manager<Block> {
173173
return Quantity.from(tagOrBlockNumber);
174174
}
175175

176+
// TODO: This won't work when we have a fallback/fork and it is
177+
// TODO: called from api.eth_getBlockTransactionCountByHash
176178
async getNumberFromHash(hash: string | Buffer | Tag) {
177179
return this.#blockIndexes.get(Data.toBuffer(hash)).catch(e => {
178180
if (e.status === NOTFOUND) return null;
@@ -295,6 +297,7 @@ export default class BlockManager extends Manager<Block> {
295297
this.#blockIndexes.get(LATEST_INDEX_KEY).catch(e => null)
296298
]);
297299

300+
// TODO: this must take into account fallback/fork.
298301
if (earliest) this.earliest = earliest;
299302

300303
if (latestBlockNumber) {

src/chains/ethereum/ethereum/src/data-managers/blocklog-manager.ts

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
import { BlockLogs, FilterArgs } from "@ganache/ethereum-utils";
1+
import { BlockLogs, FilterArgs, RangeFilterArgs, Tag } from "@ganache/ethereum-utils";
22
import { LevelUp } from "levelup";
33
import Manager from "./manager";
44
import { Quantity } from "@ganache/utils";
55
import Blockchain from "../blockchain";
6-
import { parseFilter, parseFilterDetails } from "../helpers/filter-parsing";
6+
import { parseFilter, parseFilterDetails, parseFilterRange } from "../helpers/filter-parsing";
77
import { Ethereum } from "../api-types";
88

99
export default class BlockLogManager extends Manager<BlockLogs> {
1010
#blockchain: Blockchain;
11+
1112
constructor(base: LevelUp, blockchain: Blockchain) {
1213
super(base, BlockLogs);
1314
this.#blockchain = blockchain;
@@ -31,38 +32,51 @@ export default class BlockLogManager extends Manager<BlockLogs> {
3132
async getLogs(filter: FilterArgs): Promise<Ethereum.Logs> {
3233
const blockchain = this.#blockchain;
3334
if ("blockHash" in filter) {
35+
// TODO: revert back to getNumberFromHash (when they add support for fallback/forks)
36+
const block = await blockchain.blocks.getByHash(filter.blockHash);
37+
if (!block) return [];
38+
const blockNumber = block.header.number;
39+
const logs = await this.get(blockNumber.toBuffer());
3440
const { addresses, topics } = parseFilterDetails(filter);
35-
const blockNumber = await blockchain.blocks.getNumberFromHash(
36-
filter.blockHash
37-
);
38-
if (!blockNumber) return [];
39-
40-
const logs = await this.get(blockNumber);
4141
return logs ? [...logs.filter(addresses, topics)] : [];
4242
}
43-
const { addresses, topics, fromBlock, toBlock } = parseFilter(
44-
filter,
45-
blockchain
46-
);
47-
const from = Quantity.min(fromBlock, toBlock);
43+
const rangeFilter = filter as RangeFilterArgs;
44+
45+
let { fromBlock, toBlock } = parseFilterRange(rangeFilter, blockchain);
4846
const fork = this.#blockchain.fallback;
4947
if (!fork) {
50-
return await this.getLocal(from.toNumber(), toBlock.toNumber(), filter);
48+
return await this.getLocal(fromBlock, toBlock, filter);
49+
}
50+
if (rangeFilter.fromBlock == Tag.earliest) {
51+
fromBlock = await this.forkEarliest();
5152
}
53+
if (rangeFilter.toBlock == Tag.earliest) {
54+
toBlock = await this.forkEarliest();
55+
}
56+
fromBlock = Quantity.min(fromBlock, toBlock);
57+
5258
const ret: Ethereum.Logs = [];
53-
if (fork.isValidForkBlockNumber(from)) {
54-
ret.push(...await this.getFromFork(from, Quantity.min(toBlock, fork.blockNumber), filter));
59+
if (fork.isValidForkBlockNumber(fromBlock)) {
60+
ret.push(...await this.getFromFork(fromBlock, Quantity.min(toBlock, fork.blockNumber), filter));
5561
}
5662
if (!fork.isValidForkBlockNumber(toBlock)) {
57-
ret.push(...await this.getLocal(fork.blockNumber.toNumber() + 1, toBlock.toNumber(), filter));
63+
const blockNumberPlusOne = Quantity.from(fork.blockNumber.toNumber() + 1);
64+
ret.push(...await this.getLocal(Quantity.max(fromBlock, blockNumberPlusOne), toBlock, filter));
5865
}
5966
return ret;
6067
}
6168

62-
getLocal(from: number, toBlockNumber: number, filter: FilterArgs): Promise<Ethereum.Logs> {
69+
// TODO: Use block-manager earliest when fixed (currently it doesn't support fallback/fork correctly)
70+
async forkEarliest() {
71+
const fork = this.#blockchain.fallback;
72+
const block = await fork.request<any>("eth_getBlockByNumber", [Tag.earliest, false], { disableCache: true });
73+
return Quantity.from(block.number);
74+
}
75+
76+
getLocal(from: Quantity, to: Quantity, filter: FilterArgs): Promise<Ethereum.Logs> {
6377
const { addresses, topics } = parseFilter(filter, this.#blockchain);
6478
const pendingLogsPromises: Promise<BlockLogs>[] = [];
65-
for (let i = from; i <= toBlockNumber; i++) {
79+
for (let i = from.toNumber(); i <= to.toNumber(); i++) {
6680
pendingLogsPromises.push(this.get(Quantity.toBuffer(i)));
6781
}
6882
return Promise.all(pendingLogsPromises).then(blockLogsRange => {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.11;
3+
4+
contract Logs {
5+
event Event(uint256 indexed first, uint256 indexed second);
6+
7+
constructor() {
8+
emit Event(1, 2);
9+
}
10+
11+
function logNTimes(uint8 n) public {
12+
for (uint8 i = 0; i < n; i++) {
13+
emit Event(i, i);
14+
}
15+
}
16+
}

0 commit comments

Comments
 (0)