Solidity
使用 ABIEncoderV2 將結構數組傳遞給 truffle
如何將 Truffle (javascript) 中的結構數組傳遞給智能合約 (Solidity)?
有一些類似的問題(例如this one和this one),其回答說您不能將結構傳遞給solidity 中的公共函式,或者使用的是4.0.19 之前的Solidity 版本。但是,我使用的是 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); });
Solidity 合約:
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
傳遞給 solidity 函式loopCoords
。Solidity 函式無法解釋coords
為數組,而是將其解釋為映射。我不確定,但我認為您的問題是如何將數組作為參數從javascript web3傳遞給solidity函式 您需要傳遞如下參數
loopCoords
:await coordsContract.loopCoords.getData(coords)