El recibo de la transacción contiene todas las entradas del registro, pero solo las dos últimas son decodificadas por web3

Tengo un flujo que produce 4 eventos.

Cuando obtengo el hash de la transacción a través de web3.js, puedo ver que los 4 eventos están incluidos en los registros de recepción, pero solo los últimos 2 eventos están en los registros decodificados (lo que significa que tengo que decodificar los primeros 2 eventos yo mismo):

{
    "receipt": {
        ...
        "logs": [
            {
                "logIndex": 0,
                ...
            },
            {
                "logIndex": 1,
                ...
            },
            {
                "logIndex": 2,
                ...
            },
            {
                "logIndex": 3,
                ...
            }
        ],
        ...
    },
    "logs": [
        {
            "logIndex": 2,
            ...
        },
        {
            "logIndex": 3,
            ...
        }
    ]
}

¿Cuál es la razón para esto?

Podría ser útil si explicara más detalladamente el flujo que menciona. Supongo que hay algo en el flujo (fuera de web3) que está causando esto, pero sin contexto, es difícil saberlo. Quizás estoy malinterpretando tu pregunta.
@ThomasJayRush: Puedo agregar mi lado en cadena (código Solidity), pero creo que solo sería TMI. Desde web3, estoy invocando una función de contrato que llama a otra función de contrato, etc. Al final de este flujo, se generan 4 eventos. La receiptparte lo muestra claramente, pero la parte del registro decodificado contiene solo información parcial. Cuando ejecuto flujos similares con solo 2 eventos, todos se decodifican. Tal vez haya una limitación de web3 en la cantidad de eventos decodificados, pero claramente se siente como un problema en el lado de web3. ¡¡¡Gracias!!!
¿Has probado el canal gitter?
@ThomasJayRush: ¿Quiere decir preguntar en GitHub?
@ThomasJayRush: Creo que tengo la respuesta, véase más abajo.

Respuestas (1)

OK, entiendo la razón:

Todos los eventos generados durante la ejecución de la función llamada por web3 se incluyen en los registros de recepción, pero solo los eventos generados en el ámbito del contrato en el que se implementa la función se incluyen en los registros decodificados.

Por ejemplo, dado el siguiente código en cadena:

Archivo IContract1.sol:

pragma solidity ^0.4.18;

interface IContract1 {
    function func(uint256 x) external returns (uint256);
}

Archivo Contract1.sol:

pragma solidity ^0.4.18;
import "./IContract1.sol";

contract Contract1 is IContract1{
    event Event1(uint256 x);
    function func(uint256 x) external returns (uint256) {
        Event1(x);
        return x;
    }
}

Archivo Contract2.sol:

pragma solidity ^0.4.18;
import "./IContract1.sol";

contract Contract2 {
    IContract1 private contract1;
    function Contract2(IContract1 _contract1) public {
        contract1 = _contract1;
    }
    event Event2(uint256 x);
    function func(uint256 x) external returns (uint256) {
        Event2(x);
        return contract1.func(x);
    }
}

Si ejecuto el siguiente código fuera de la cadena:

let contract1 = await artifacts.require("Contract1.sol").new();
let contract2 = await artifacts.require("Contract2.sol").new(contract1.address);

let hash = await contract2.func(42);

Entonces hash.receipt.logsincluirá tanto Event1como Event2.

Pero hash.logsincluirá solamente Event2.