与Solidity智能合约交互时遇invalid type(struct)错误求助
解决Solidity struct类型无效错误的方案
错误原因
当前用嵌套数组[[address, proof]]传递Proof结构体数组,但ethers.js等Web3库要求结构体参数必须匹配字段名的对象格式,而非按顺序的数组。另外,getMerkelProof返回的proof格式也不符合Soliditybytes32[]的要求。
修正步骤
1. 调整Merkle Proof格式
MerkleTree.getProof返回的是包含data属性的对象数组,需要提取其中的data值转换成纯bytes32数组,适配Solidity的bytes32[]类型:
const getMerkelProof = (addresses: string[]) => { const leaf = keccak256(addresses[0]); const leaves = addresses.map((x: any) => keccak256(x)); const tree = new MerkleTree(leaves, keccak256, { sortPairs: true }); // 提取proof中的data字段,转换成bytes32数组 const proof = tree.getProof(leaf, 0).map(item => item.data); const root = tree.getRoot().toString("hex"); return { proof, root, }; };
2. 以对象格式传递结构体数组
把原来的嵌套数组改成包含nftAddress和proof字段的对象数组,严格匹配Solidity中Proof结构体的字段名:
// 生成请求方的Proof对象 const requestedProof = { nftAddress: counter_party_nfts_addresses[0], proof: getMerkelProof(counter_party_nfts_addresses).proof }; // 生成提供方的Proof对象 const offeredProof = { nftAddress: my_nft_addresses[0], proof: getMerkelProof(my_nft_addresses).proof }; // 调用合约函数 const tx = await contractWithSigner.createOffer( address, [counter_party_nfts_addresses[0]], [counter_party_nft_ids[0]], [my_nft_addresses[0]], [my_nft_ids[0]], [requestedProof], // Proof[] 数组,每个元素是匹配字段的对象 [offeredProof] );
关键说明
- Web3库(如ethers.js)解析Solidity结构体时,依赖字段名匹配而非参数顺序,必须用对象格式传递。
- 必须确保Merkle Proof的每个元素都是
bytes32类型,避免因格式不匹配触发类型错误。
内容的提问来源于stack exchange,提问作者Rashid Iqbal
相关产品推荐
相关产品推荐

