Actualmente estoy tratando de probar un contrato inteligente usando el traje de trufa (con 'prueba de trufa'). Mi contrato es de un token ERC20 simple que incluye el evento de transferencia estándar:
event Transfer(address indexed from, address indexed to, uint256 value);
A continuación se muestra mi código que intenta suscribirse a todos los eventos de "Transferencia" que solo provienen de la cuenta [0] a la cuenta [1]. Aunque los 2 parámetros se declaran como "indexados", el filtro no parece funcionar y obtengo todos los eventos de transferencia sin importar el remitente/receptor. Intenté modificar el código de varias maneras, pero nada parece funcionar hasta ahora.
const EnergyToken = artifacts.require("EnergyToken");
const assert = require('assert');
const truffleAssert = require('truffle-assertions');
const { performance } = require('perf_hooks');
contract("Energy Heavy Load Test", async accounts => {
const numberOfTransactions = 10;
let startTime = 0;
let finishTime = 0;
let subscription;
let contract;
let i = 0;
console.log(web3.version);
// Function for rounding numbers
function round(value, precision) {
var multiplier = Math.pow(10, precision || 0);
return Math.round(value * multiplier) / multiplier;
}
// executed before each test
before(async () => {
contract = await EnergyToken.at("0x5BbD383bD43aC3896B86207eFe88cf0628ad06F0");
});
// Test mining time of 2500 transaction calls on the EnergyToken smart contract's transfer() method
it("send " + numberOfTransactions + " transactions of 1 EnergyToken from account 0 to account 1", (done) => {
// contract.Transfer(function(error, event) {
// i++;
// console.log(event)
// if(i == 1)
// startTime = performance.now();
// if (i == numberOfTransactions) {
// finishTime = performance.now();
// console.log("Transactions confirmed!" + " It took " + round((finishTime - startTime)/1000,2) + " seconds to confirm " + numberOfTransactions + " transactions");
// . done();
// }
// });
// contract.getPastEvents('Transfer', {
// filter: { from: accounts[0], to: accounts[1] },
// fromBlock: 0,
// toBlock: 'latest'
// }, function(error, result) {
// if(error) {
// console.log(error, 'error');
// } else {
// console.log(result, 'result');
// }
// });
for (let j = 0; j < numberOfTransactions; j++) {
contract.transfer(accounts[0], 1, { from:accounts[1] });
}
console.log("Finished sending " + numberOfTransactions + " transactions from account 1!!" + accounts[1] + " to " + accounts[0]);
});
it("Calculate average gas used by the transfer() function", async () => {
let result = await contract.transfer(accounts[1], 1);
let hash = await result.tx;
let tx = await web3.eth.getTransactionReceipt(hash);
let gasUsed = await tx.gasUsed;
console.log(" Gas used for a 'Transfer' transaction: " + gasUsed);
});
it("Calculate average gas used by the approve() function", async () => {
let result = await contract.approve(accounts[1], 1000);
let hash = await result.tx;
let tx = await web3.eth.getTransactionReceipt(hash);
let gasUsed = await tx.gasUsed;
console.log(" Gas used for an 'Approve' transaction: " + gasUsed);
});
it("Calculate average gas used by the transferFrom() function", async () => {
await contract.approve(accounts[1], 100, { from: accounts[0] });
let result = await contract.transferFrom(accounts[0], accounts[1], 100, { from: accounts[1] });
let hash = await result.tx;
let tx = await web3.eth.getTransactionReceipt(hash);
let gasUsed = await tx.gasUsed;
console.log(" Gas used for an 'Approve' transaction: " + gasUsed);
});
});
Nota: Mi versión de web3 es 1.2.6
Le sugiero que verifique su versión web3 nuevamente ejecutando en la terminal npm view web3 version
en la raíz de su proyecto. Y luego, nuevamente, puede verificar la versión en javascript haciendo console.log(web3.version);
. Si es realmente 1.xx, entonces debería poder filtrar los eventos de esta manera:
contract.getPastEvents('Transfer', {
filter: {'from': accounts[0], 'to': accounts[1]},
fromBlock: 0,
toBlock: 'latest'
}, function(error, result) {
if(error) {
console.log(error, 'error');
} else {
console.log(result, 'result');
}
});
Tampoco es un comportamiento normal contract.events
devolver un valor nulo para web3 1.xx Aquí están los documentos sobre cómo web3 1.xx se ocupa de los eventos. Si el problema persiste, publique su código de contrato inteligente aquí para que podamos probarlo.
buena vibración
contract.events.Transfer
en lugar decontract.Transfer
. El hecho de que su código se ejecute e incluso obtenga eventos, me lleva a la conclusión lógica de que su versión web3 es 0.x. Para verificar esto, ejecuteconsole.log(web3.version)
su programa. Y después de verificar esto, consulte la documentación oficial de esa versión específica. Nota al margen: si está en Truffle 4.x, entonces el web3 utilizado dentro de sus pruebas de Truffle ES 0.x.Aleksi Daskalov