Как передать массив структур из 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;
}
}
Проблема в том, что вы пытаетесь передать массив javascript coords
в функцию солидности loopCoords
. Функция Solidity не может интерпретировать coords
как массив и интерпретирует его как отображение.
Я не уверен, но я думаю, что ваша проблема заключается в том, как передать массив в качестве параметра из javascript web3 в функцию твердости. Вам нужно передать аргумент loopCoords
следующим образом:
await coordsContract.loopCoords.getData(coords)
Фил.п
Сохам Лавар