commit
da7864efab
@ -0,0 +1,122 @@ |
||||
/* global describe, before, it */ |
||||
import Web3 from 'web3' |
||||
import { Provider } from '../src/index' |
||||
const web3 = new Web3() |
||||
import * as assert from 'assert' |
||||
|
||||
describe('Events', () => { |
||||
before(async function () { |
||||
const provider = new Provider() |
||||
await provider.init() |
||||
web3.setProvider(provider as any) |
||||
}) |
||||
|
||||
describe('eth_getLogs', () => { |
||||
it('should deploy 2 contracts which emit events and retrieve these events using different block ranges', async function () { |
||||
const accounts: string[] = await web3.eth.getAccounts() |
||||
// deploy the contract "test".
|
||||
const receiptTest = await web3.eth.sendTransaction({ |
||||
from: accounts[0], |
||||
gas: 1000000, |
||||
data: '0x608060405234801561001057600080fd5b506101ea806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80632801617e14610030575b600080fd5b61004a6004803603810190610045919061015d565b61004c565b005b8073ffffffffffffffffffffffffffffffffffffffff1663a6f9dae1306040518263ffffffff1660e01b81526004016100859190610199565b600060405180830381600087803b15801561009f57600080fd5b505af11580156100b3573d6000803e3d6000fd5b50505050607b7fdcd9c7fa0342f01013bd0bf2bec103a81936162dcebd1f0c38b1d4164c17e0fc60405160405180910390a250565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610118826100ed565b9050919050565b600061012a8261010d565b9050919050565b61013a8161011f565b811461014557600080fd5b50565b60008135905061015781610131565b92915050565b600060208284031215610173576101726100e8565b5b600061018184828501610148565b91505092915050565b6101938161010d565b82525050565b60006020820190506101ae600083018461018a565b9291505056fea2646970667358221220cf5368dd204d44a75752e8ba7512b73d2f54b09f6ca6147e376dd3cf2942b96464736f6c63430008120033' |
||||
}) |
||||
// deploy the contract "owner", this will trigger an event.
|
||||
const receiptOwner = await web3.eth.sendTransaction({ |
||||
from: accounts[0], |
||||
gas: 1000000, |
||||
data: '0x608060405234801561001057600080fd5b5061005a6040518060400160405280601b81526020017f4f776e657220636f6e7472616374206465706c6f7965642062793a00000000008152503361011a60201b61015b1760201c565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a361034d565b6101b882826040516024016101309291906102ee565b6040516020818303038152906040527f319af333000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506101bc60201b60201c565b5050565b6101dd816101d86101e060201b6101f71761020160201b60201c565b60201c565b50565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b61021360201b61023d17819050919050565b61021b61031e565b565b600081519050919050565b600082825260208201905092915050565b60005b8381101561025757808201518184015260208101905061023c565b60008484015250505050565b6000601f19601f8301169050919050565b600061027f8261021d565b6102898185610228565b9350610299818560208601610239565b6102a281610263565b840191505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102d8826102ad565b9050919050565b6102e8816102cd565b82525050565b600060408201905081810360008301526103088185610274565b905061031760208301846102df565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fd5b6104268061035c6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063893d20e81461003b578063a6f9dae114610059575b600080fd5b610043610075565b6040516100509190610288565b60405180910390f35b610073600480360381019061006e91906102d4565b61009e565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6101f38282604051602401610171929190610391565b6040516020818303038152906040527f319af333000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610218565b5050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b61022f816102276101f7610232565b63ffffffff16565b50565b61023d819050919050565b6102456103c1565b565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061027282610247565b9050919050565b61028281610267565b82525050565b600060208201905061029d6000830184610279565b92915050565b600080fd5b6102b181610267565b81146102bc57600080fd5b50565b6000813590506102ce816102a8565b92915050565b6000602082840312156102ea576102e96102a3565b5b60006102f8848285016102bf565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561033b578082015181840152602081019050610320565b60008484015250505050565b6000601f19601f8301169050919050565b600061036382610301565b61036d818561030c565b935061037d81856020860161031d565b61038681610347565b840191505092915050565b600060408201905081810360008301526103ab8185610358565b90506103ba6020830184610279565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfea2646970667358221220cb7beb012e0831cc632ed85a11a8652f72efc03360c81beb1fcd842a7782c3cb64736f6c63430008120033' |
||||
}) |
||||
// call function set(Owner p) from "test", this will trigger 2 events, one from each contract.
|
||||
await web3.eth.sendTransaction({ |
||||
from: accounts[0], |
||||
to: receiptTest.contractAddress, |
||||
gas: 1000000, |
||||
data: '0x2801617e' + web3.utils.padLeft(receiptOwner.contractAddress, 64).replace('0x', '') |
||||
}) |
||||
|
||||
const testLogs = await web3.eth.getPastLogs({ |
||||
address: receiptTest.contractAddress, |
||||
fromBlock: 3, |
||||
toBlock: 'latest', |
||||
topics: ['0xdcd9c7fa0342f01013bd0bf2bec103a81936162dcebd1f0c38b1d4164c17e0fc', '0x342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735'] |
||||
}) |
||||
|
||||
let ownerLogs = await web3.eth.getPastLogs({ |
||||
address: receiptOwner.contractAddress, |
||||
fromBlock: 3, |
||||
toBlock: 'latest', |
||||
topics: ['0x342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735', '0xdcd9c7fa0342f01013bd0bf2bec103a81936162dcebd1f0c38b1d4164c17e0fc'] |
||||
}) |
||||
// this should include the event triggered by the "set" transaction call.
|
||||
assert.equal(testLogs.length, 1) |
||||
assert.equal(ownerLogs.length, 1) |
||||
|
||||
ownerLogs = await web3.eth.getPastLogs({ |
||||
address: receiptOwner.contractAddress, |
||||
fromBlock: 2, |
||||
toBlock: 'latest', |
||||
topics: ['0x342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735', '0xdcd9c7fa0342f01013bd0bf2bec103a81936162dcebd1f0c38b1d4164c17e0fc'] |
||||
}) |
||||
// this should include the event triggered from the ctor.
|
||||
assert.equal(ownerLogs.length, 2) |
||||
|
||||
ownerLogs = await web3.eth.getPastLogs({ |
||||
address: receiptOwner.contractAddress, |
||||
fromBlock: 1, |
||||
toBlock: 2, |
||||
topics: ['0x342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a735', '0xdcd9c7fa0342f01013bd0bf2bec103a81936162dcebd1f0c38b1d4164c17e0fc'] |
||||
}) |
||||
// this should only include the event triggered from the ctor.
|
||||
assert.equal(ownerLogs.length, 1) |
||||
}) |
||||
}) |
||||
}) |
||||
|
||||
/* |
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0; |
||||
|
||||
import "hardhat/console.sol"; |
||||
|
||||
contract test {
|
||||
event testEvent(uint indexed value);
|
||||
function set(Owner p) public { |
||||
p.changeOwner(address(this)); |
||||
emit testEvent(123); |
||||
} |
||||
} |
||||
contract Owner { |
||||
|
||||
address private owner; |
||||
|
||||
// event for EVM logging
|
||||
event OwnerSet(address indexed oldOwner, address indexed newOwner); |
||||
|
||||
// modifier to check if caller is owner
|
||||
modifier isOwner() { |
||||
// If the first argument of 'require' evaluates to 'false', execution terminates and all
|
||||
// changes to the state and to Ether balances are reverted.
|
||||
// This used to consume all gas in old EVM versions, but not anymore.
|
||||
// It is often a good idea to use 'require' to check if functions are called correctly.
|
||||
// As a second argument, you can also provide an explanation about what went wrong.
|
||||
require(msg.sender == owner, "Caller is not owner"); |
||||
_; |
||||
} |
||||
|
||||
constructor() { |
||||
console.log("Owner contract deployed by:", msg.sender); |
||||
owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor
|
||||
emit OwnerSet(address(0), owner); |
||||
} |
||||
|
||||
function changeOwner(address newOwner) public { |
||||
emit OwnerSet(owner, newOwner); |
||||
owner = newOwner; |
||||
} |
||||
|
||||
function getOwner() external view returns (address) { |
||||
return owner; |
||||
} |
||||
}
|
||||
*/ |
@ -0,0 +1,40 @@ |
||||
/* global describe, before, it */ |
||||
import Web3 from 'web3' |
||||
import { Provider } from '../src/index' |
||||
const web3 = new Web3() |
||||
import * as assert from 'assert' |
||||
|
||||
describe('Transactions', () => { |
||||
before(async function () { |
||||
const provider = new Provider({ fork: 'shanghai'}) |
||||
await provider.init() |
||||
web3.setProvider(provider as any) |
||||
}) |
||||
|
||||
describe('eth_sendTransaction', () => { |
||||
it('should deploy Storage contract, save a number and retrieve it', async function () { |
||||
const accounts: string[] = await web3.eth.getAccounts() |
||||
let receipt = await web3.eth.sendTransaction({ |
||||
from: accounts[0], |
||||
gas: 1000000, |
||||
data: '0x608060405234801561000f575f80fd5b506101438061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c80632e64cec1146100385780636057361d14610056575b5f80fd5b610040610072565b60405161004d919061009b565b60405180910390f35b610070600480360381019061006b91906100e2565b61007a565b005b5f8054905090565b805f8190555050565b5f819050919050565b61009581610083565b82525050565b5f6020820190506100ae5f83018461008c565b92915050565b5f80fd5b6100c181610083565b81146100cb575f80fd5b50565b5f813590506100dc816100b8565b92915050565b5f602082840312156100f7576100f66100b4565b5b5f610104848285016100ce565b9150509291505056fea2646970667358221220bfa7ddc6d937b635c7a8ad020080923800f04f6b0a685c47330306fd5267626b64736f6c63430008150033' |
||||
}) |
||||
const storageAddress = receipt.contractAddress |
||||
const receiptPull = await web3.eth.getTransactionReceipt(receipt.transactionHash) |
||||
assert.equal(receiptPull.contractAddress, receipt.contractAddress) |
||||
receipt = await web3.eth.sendTransaction({ |
||||
from: accounts[0], |
||||
to: storageAddress, |
||||
gas: 1000000, |
||||
data: '0x6057361d000000000000000000000000000000000000000000000000000000000000000e' |
||||
}) |
||||
const value = await web3.eth.call({ |
||||
from: accounts[0], |
||||
to: storageAddress, |
||||
data: '0x2e64cec1' |
||||
}) |
||||
assert.notEqual(value, 15) |
||||
assert.equal(value, 14) |
||||
}) |
||||
}) |
||||
}) |
Loading…
Reference in new issue