Übergeben Sie ein Array von Strukturen zum Kontrahieren von truffe mit ABIEncoderV2

Wie übergeben Sie ein Array von Strukturen von Truffle (Javascript) an einen Smart Contract (Solidity)?

Es gibt ein paar ähnliche Fragen (wie diese und diese ), deren Antworten besagen, dass Sie eine Struktur nicht an eine öffentliche Funktion in Solidity übergeben können oder eine Version von Solidity vor 4.0.19 verwenden. Ich verwende jedoch ABIEncoderV2, wo dies kein Problem darstellt.

Ich erhalte den folgenden Fehler:

Error: invalid solidity type!: tuple[]

Trüffel-Testsuite:

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);
});

Soliditätsvertrag:

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;
    }
}

Antworten (1)

Das Problem ist, dass Sie versuchen, ein Javascript-Array coordsan eine Solidity-Funktion zu übergeben loopCoords. Die Solidity-Funktion kann nicht coordsals Array interpretiert werden und interpretiert sie als Mapping.

Ich bin mir nicht sicher, aber ich denke, Ihr Problem besteht darin , wie Sie ein Array als Parameter von Javascript web3 an eine Solidity-Funktion übergeben. Sie müssen ein Argument loopCoordswie folgt übergeben:

await coordsContract.loopCoords.getData(coords)
Vielen Dank! Kennen Sie einen Ort, an dem contract.method.getData(params) dokumentiert werden könnte? Ich kann nirgendwo finden, wie man diese Methode anwendet.
Herzlich willkommen! Froh dir zu helfen. Sie können auf den folgenden Blog verweisen: medium.com/@k3no/ethereum-tokens-smart-contracts-743b8b634e7a . Abgesehen davon habe ich keine Dokumentation für die getData-Methode erhalten