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;
}
}
Das Problem ist, dass Sie versuchen, ein Javascript-Array coords
an eine Solidity-Funktion zu übergeben loopCoords
. Die Solidity-Funktion kann nicht coords
als 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 loopCoords
wie folgt übergeben:
await coordsContract.loopCoords.getData(coords)
phil.p
Soham Lawar