Solidity

使用 ABIEncoderV2 將結構數組傳遞給 truffle

  • September 7, 2018

如何將 Truffle (javascript) 中的結構數組傳遞給智能合約 (Solidity)?

有一些類似的問題(例如this onethis 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)

引用自:https://ethereum.stackexchange.com/questions/58252