Pase una matriz de estructuras para contratar desde truffe usando ABIEncoderV2

¿Cómo pasa una serie de estructuras de Truffle (javascript) a un contrato inteligente (Solidity)?

Hay algunas preguntas similares (como esta y esta ) cuyas respuestas dicen que no puede pasar una estructura a una función pública en Solidity o que está usando una versión de Solidity anterior a la 4.0.19. Sin embargo, estoy usando ABIEncoderV2, donde esto no es un problema.

Recibo el siguiente error:

Error: invalid solidity type!: tuple[]

Conjunto de pruebas de trufas:

const foo = artifacts.require('./FOO.sol');
it('test', async () => {
    let coordsContract = await foo.new();
    const coord0 = {x: 100, y: 200};
    const coords = [coord0];
    const worked = await coordsContract.loopCoords(coords);
    assert.isTrue(worked);
});

Contrato de solidez:

pragma solidity ^0.4.23;
pragma experimental ABIEncoderV2;

contract FOO {
    struct Coordinates {
        uint256 x;
        uint256 y;
    }

    function loopCoords(Coordinates[] coords) public returns (bool) {
        for (uint i = 0; i < coords.length; i++) {
            //do stuff
        }
        return true;
    }
}

Respuestas (1)

El problema es que está tratando de pasar una matriz de javascript coordsa una función de solidez loopCoords. La función de solidez no puede interpretarse coordscomo una matriz y la interpreta como un mapeo.

No estoy seguro, pero creo que su problema es cómo pasar una matriz como parámetro de javascript web3 a una función de solidez. Debe pasar un argumento de loopCoordsla siguiente manera:

await coordsContract.loopCoords.getData(coords)
¡Gracias! ¿Conoce algún lugar donde se pueda documentar contract.method.getData(params)? No puedo encontrar cómo usar este método en ninguna parte.
¡Bienvenidos! Encantado de ayudarle. Puede consultar el siguiente blog medium.com/@k3no/ethereum-tokens-smart-contracts-743b8b634e7a . Aparte de esto, no obtuve ninguna documentación para el método getData