No se pueden filtrar eventos con valores específicos de parámetros indexados

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

Si su "web3 es 1.2.6" como dice, entonces debería usar menos contract.events.Transferen lugar de contract.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, ejecute console.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.
@goodvibration Gracias por la rápida respuesta. Mi versión de truffle es Truffle v5.1.9 y ejecuté el código para verificar la versión web3: es 1.2.1. Leí la documentación anteriormente y, de hecho, dice que debo usar contract.events.Transfer pero contract.events devuelve indefinido por alguna razón. Es por eso que intenté cambiar un poco el código y usar contract. Transfer Logré al menos recuperar algunos eventos. Sin embargo, no hubo suerte al tratar de filtrarlos hasta ahora.

Respuestas (1)

Le sugiero que verifique su versión web3 nuevamente ejecutando en la terminal npm view web3 versionen 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.eventsdevolver 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.

Gracias por la respuesta. Cuando ejecuto npm view web3, la versión es 1.2.6. Sin embargo, al usar console.log(web3.version) en mi código de prueba de trufa dice 1.2.1 (podría ser algo relacionado con la trufa). En cuanto a contract.events, no estoy seguro de por qué devuelve indefinido. Cuando ejecuto EnergyToken.events, devuelve la lista de eventos. Sin embargo, cuando asigno la instancia del contrato a una variable con: let contract = await EnergyToken.at("0x5BbD383bD43aC3896B86207eFe88cf0628ad06F0"); entonces contract.events no está definido. Según la documentación, esto debería funcionar en ambas versiones ya que son 1.xx
Adjunte su javascript completo o al menos la lógica donde define la instancia. ¿También trabaja localmente o en algunas de las redes de prueba?
Agregué todo mi código de prueba. El filtrado de eventos que estoy tratando de implementar debe incluirse en la primera cláusula it(). Y sí, estoy ejecutando una red privada de nodos usando geth y truffle para la implementación/prueba del contrato.
Este es mi archivo JS de prueba de trufa => pastebin.com/xAC44PpX . Por favor, revíselo cuidadosamente y adáptelo a su lógica. Desafortunadamente, el código que compartiste arriba parece estar roto. Probé mi ejemplo ahora mismo con web3 1.2.6 y todo salió bien.