Skip to content

Commit 82e0c6a

Browse files
yann300Aniket-Engg
authored andcommitted
add events test
1 parent c9ded5d commit 82e0c6a

File tree

2 files changed

+128
-3
lines changed

2 files changed

+128
-3
lines changed

libs/remix-lib/src/execution/logsManager.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,12 @@ export class LogsManager {
5656
if (queryFilter.topics.filter((logTopic) => changeEvent.log.topics.indexOf(logTopic) >= 0).length === 0) return false
5757

5858
if (queryType === 'logs') {
59-
const fromBlock = queryFilter.fromBlock || '0x0'
60-
const toBlock = queryFilter.toBlock || this.oldLogs.length ? this.oldLogs[this.oldLogs.length - 1].blockNumber : '0x0'
59+
const fromBlock = parseInt(queryFilter.fromBlock || '0x0')
60+
let toBlock
61+
if (queryFilter.toBlock === 'latest' || !queryFilter.toBlock) toBlock = Number.MAX_VALUE
62+
else toBlock = parseInt(queryFilter.toBlock)
6163
const targetAddress = toChecksumAddress(queryFilter.address)
62-
if ((parseInt(toBlock) >= parseInt(changeEvent.blockNumber)) && (parseInt(fromBlock) <= parseInt(changeEvent.blockNumber))) {
64+
if ((toBlock >= parseInt(changeEvent.blockNumber)) && (fromBlock <= parseInt(changeEvent.blockNumber))) {
6365
if (changeEvent.log && changeEvent.log.address === targetAddress) {
6466
return true
6567
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/* global describe, before, it */
2+
import Web3 from 'web3'
3+
import { Provider } from '../src/index'
4+
const web3 = new Web3()
5+
import * as assert from 'assert'
6+
7+
describe('Events', () => {
8+
before(async function () {
9+
const provider = new Provider()
10+
await provider.init()
11+
web3.setProvider(provider as any)
12+
})
13+
14+
describe('eth_getLogs', () => {
15+
it('should deploy 2 contracts which emit events and retrieve these events using different block frame', async function () {
16+
const accounts: string[] = await web3.eth.getAccounts()
17+
// deploy the contract "test".
18+
const receiptTest = await web3.eth.sendTransaction({
19+
from: accounts[0],
20+
gas: 1000000,
21+
data: '0x608060405234801561001057600080fd5b506101ea806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80632801617e14610030575b600080fd5b61004a6004803603810190610045919061015d565b61004c565b005b8073ffffffffffffffffffffffffffffffffffffffff1663a6f9dae1306040518263ffffffff1660e01b81526004016100859190610199565b600060405180830381600087803b15801561009f57600080fd5b505af11580156100b3573d6000803e3d6000fd5b50505050607b7fdcd9c7fa0342f01013bd0bf2bec103a81936162dcebd1f0c38b1d4164c17e0fc60405160405180910390a250565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610118826100ed565b9050919050565b600061012a8261010d565b9050919050565b61013a8161011f565b811461014557600080fd5b50565b60008135905061015781610131565b92915050565b600060208284031215610173576101726100e8565b5b600061018184828501610148565b91505092915050565b6101938161010d565b82525050565b60006020820190506101ae600083018461018a565b9291505056fea2646970667358221220cf5368dd204d44a75752e8ba7512b73d2f54b09f6ca6147e376dd3cf2942b96464736f6c63430008120033'
22+
})
23+
// deploy the contract "owner", this will trigger an event.
24+
const receiptOwner = await web3.eth.sendTransaction({
25+
from: accounts[0],
26+
gas: 1000000,
27+
data: '0x608060405234801561001057600080fd5b5061005a6040518060400160405280601b81526020017f4f776e657220636f6e7472616374206465706c6f7965642062793a00000000008152503361011a60201b61015b1760201c565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a361034d565b6101b882826040516024016101309291906102ee565b6040516020818303038152906040527f319af333000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506101bc60201b60201c565b5050565b6101dd816101d86101e060201b6101f71761020160201b60201c565b60201c565b50565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b61021360201b61023d17819050919050565b61021b61031e565b565b600081519050919050565b600082825260208201905092915050565b60005b8381101561025757808201518184015260208101905061023c565b60008484015250505050565b6000601f19601f8301169050919050565b600061027f8261021d565b6102898185610228565b9350610299818560208601610239565b6102a281610263565b840191505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102d8826102ad565b9050919050565b6102e8816102cd565b82525050565b600060408201905081810360008301526103088185610274565b905061031760208301846102df565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fd5b6104268061035c6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063893d20e81461003b578063a6f9dae114610059575b600080fd5b610043610075565b6040516100509190610288565b60405180910390f35b610073600480360381019061006e91906102d4565b61009e565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6101f38282604051602401610171929190610391565b6040516020818303038152906040527f319af333000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610218565b5050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b61022f816102276101f7610232565b63ffffffff16565b50565b61023d819050919050565b6102456103c1565b565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061027282610247565b9050919050565b61028281610267565b82525050565b600060208201905061029d6000830184610279565b92915050565b600080fd5b6102b181610267565b81146102bc57600080fd5b50565b6000813590506102ce816102a8565b92915050565b6000602082840312156102ea576102e96102a3565b5b60006102f8848285016102bf565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561033b578082015181840152602081019050610320565b60008484015250505050565b6000601f19601f8301169050919050565b600061036382610301565b61036d818561030c565b935061037d81856020860161031d565b61038681610347565b840191505092915050565b600060408201905081810360008301526103ab8185610358565b90506103ba6020830184610279565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfea2646970667358221220cb7beb012e0831cc632ed85a11a8652f72efc03360c81beb1fcd842a7782c3cb64736f6c63430008120033'
28+
})
29+
// call function set(Owner p) from "test", this will trigger 2 events, one from each contract.
30+
await web3.eth.sendTransaction({
31+
from: accounts[0],
32+
to: receiptTest.contractAddress,
33+
gas: 1000000,
34+
data: '0x2801617e' + web3.utils.padLeft(receiptOwner.contractAddress, 64).replace('0x', '')
35+
})
36+
37+
const testLogs = await web3.eth.getPastLogs({
38+
address: receiptTest.contractAddress,
39+
fromBlock: 3,
40+
toBlock: 'latest',
41+
topics: ['0xdcd9c7fa0342f01013bd0bf2bec103a81936162dcebd1f0c38b1d4164c17e0fc', '0x342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735']
42+
})
43+
44+
let ownerLogs = await web3.eth.getPastLogs({
45+
address: receiptOwner.contractAddress,
46+
fromBlock: 3,
47+
toBlock: 'latest',
48+
topics: ['0x342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735', '0xdcd9c7fa0342f01013bd0bf2bec103a81936162dcebd1f0c38b1d4164c17e0fc']
49+
})
50+
// this should include the event triggered by the "set" transaction call.
51+
assert.equal(testLogs.length, 1)
52+
assert.equal(ownerLogs.length, 1)
53+
54+
ownerLogs = await web3.eth.getPastLogs({
55+
address: receiptOwner.contractAddress,
56+
fromBlock: 2,
57+
toBlock: 'latest',
58+
topics: ['0x342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735', '0xdcd9c7fa0342f01013bd0bf2bec103a81936162dcebd1f0c38b1d4164c17e0fc']
59+
})
60+
// this should include the event triggered from the ctor.
61+
assert.equal(ownerLogs.length, 2)
62+
63+
ownerLogs = await web3.eth.getPastLogs({
64+
address: receiptOwner.contractAddress,
65+
fromBlock: 1,
66+
toBlock: 2,
67+
topics: ['0x342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735', '0xdcd9c7fa0342f01013bd0bf2bec103a81936162dcebd1f0c38b1d4164c17e0fc']
68+
})
69+
// this should only include the event triggered from the ctor.
70+
assert.equal(ownerLogs.length, 1)
71+
})
72+
})
73+
74+
})
75+
76+
/*
77+
// SPDX-License-Identifier: GPL-3.0
78+
79+
pragma solidity >=0.7.0 <0.9.0;
80+
81+
import "hardhat/console.sol";
82+
83+
contract test {
84+
event testEvent(uint indexed value);
85+
function set(Owner p) public {
86+
p.changeOwner(address(this));
87+
emit testEvent(123);
88+
}
89+
}
90+
contract Owner {
91+
92+
address private owner;
93+
94+
// event for EVM logging
95+
event OwnerSet(address indexed oldOwner, address indexed newOwner);
96+
97+
// modifier to check if caller is owner
98+
modifier isOwner() {
99+
// If the first argument of 'require' evaluates to 'false', execution terminates and all
100+
// changes to the state and to Ether balances are reverted.
101+
// This used to consume all gas in old EVM versions, but not anymore.
102+
// It is often a good idea to use 'require' to check if functions are called correctly.
103+
// As a second argument, you can also provide an explanation about what went wrong.
104+
require(msg.sender == owner, "Caller is not owner");
105+
_;
106+
}
107+
108+
constructor() {
109+
console.log("Owner contract deployed by:", msg.sender);
110+
owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor
111+
emit OwnerSet(address(0), owner);
112+
}
113+
114+
function changeOwner(address newOwner) public {
115+
emit OwnerSet(owner, newOwner);
116+
owner = newOwner;
117+
}
118+
119+
function getOwner() external view returns (address) {
120+
return owner;
121+
}
122+
}
123+
*/

0 commit comments

Comments
 (0)