Solidity函数传递嵌套数组参数:Truffle中如何传入Price[][]类型参数
Truffle调用Solidity二维结构体参数的传递方法
核心逻辑
Truffle与EVM交互时,Solidity的结构体类型直接映射为键名和结构体字段完全对应的JavaScript对象即可,二维结构体数组就是嵌套的JS数组结构。
具体实现步骤
- 明确字段映射规则
- 枚举
AssetType直接传递对应枚举项的索引值(从0开始,和Solidity中枚举定义的顺序保持一致) - 地址类字段传十六进制字符串格式的地址
- uint256类字段可以传数字字符串、BN实例,避免超出JS安全整数范围导致精度错误
- 构造
_prices参数示例
// 构造单个Price结构体实例 const priceItem1 = { assetType: 0, // 假设对应AssetType的第一个枚举值,按实际定义调整 asset: "0x5FbDB2315678afecb367f032d93F642f64180aa3", price: web3.utils.toWei("1", "ether") // 按实际精度要求调整数值 }; const priceItem2 = { assetType: 1, // 假设对应AssetType的第二个枚举值 asset: "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", price: web3.utils.toBN("100000000000000000000") }; const priceItem3 = { assetType: 0, asset: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa9aa", price: "500000000000000000" }; // 组装为二维数组,对应Solidity的Price[][]类型 const _prices = [ [priceItem1, priceItem2], // 第一组Price数组 [priceItem3] // 第二组Price数组,可按业务需求增减子数组数量和长度 ];
- 调用函数时直接传入构造好的
_prices即可
const poolContract = await YourContractName.deployed(); await poolContract.addPool( _pool, // PoolInput类型参数同样用JS对象构造即可 _groupIds, // uint256数组直接传普通JS数组 _issueNumberOffsets, _caps, _prices, { from: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" } // 调用者地址需持有对应POOL权限 );
注意事项
- 结构体的键名必须和Solidity中的定义完全一致,不能拼写错误或者修改字段名
- 不要直接传递超过
Number.MAX_SAFE_INTEGER的数值,建议统一转为字符串或者BN实例处理 - 如果传参报错可以先检查子数组的长度是否符合合约的业务校验规则
内容的提问来源于stack exchange,提问作者Victor Fernandez
相关产品推荐
相关产品推荐

