Передайте массив структур для контракта с truffe с помощью ABIEncoderV2

Как передать массив структур из Truffle (javascript) в смарт-контракт (Solidity)?

Есть несколько похожих вопросов (например, этот и этот ), в ответах на которые говорится, что вы не можете передать структуру публичной функции в Solidity или используете версию Solidity до 4.0.19. Однако я использую ABIEncoderV2, где это не проблема.

Я получаю следующую ошибку:

Error: invalid solidity type!: tuple[]

Набор тестов для трюфелей:

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

Контракт солидности:

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

Ответы (1)

Проблема в том, что вы пытаетесь передать массив javascript coordsв функцию солидности loopCoords. Функция Solidity не может интерпретировать coordsкак массив и интерпретирует его как отображение.

Я не уверен, но я думаю, что ваша проблема заключается в том, как передать массив в качестве параметра из javascript web3 в функцию твердости. Вам нужно передать аргумент loopCoordsследующим образом:

await coordsContract.loopCoords.getData(coords)
Спасибо! Знаете ли вы место, где может быть документирован contract.method.getData(params)? Я нигде не могу найти, как использовать этот метод.
Добро пожаловать! Рад помочь вам. Вы можете обратиться к следующему блогу medium.com/@k3no/ethereum-tokens-smart-contracts-743b8b634e7a . Кроме этого, я не получил никакой документации по методу getData.