如何使用web3.js向Solidity函数传递IERC20类型参数?
问题解决指南
1. 先修正调用逻辑:view函数用call(),别用send()
你的Solidity函数check是internal view类型,这里有两个关键错误:
internal函数只能在合约内部或继承它的合约里调用,外部通过web3.js根本调不了,必须把修饰符改成public view或者external view。view是只读函数,不需要发交易,用send()纯属浪费gas(而且根本没必要),正确姿势是用call(),它不会触发链上状态变更,只是查询数据。
2. 关于IERC20参数的传递
别想复杂了,Solidity里的IERC20本质就是个合约地址的抽象——你只需要把目标ERC20代币的合约地址字符串直接传进去就行,完全不需要创建什么“IERC20类型变量”。
给你修正后的完整示例代码:
// 先初始化合约实例,注意要填合约的部署地址 const contractInst = new web3.eth.Contract(contractABI, "你的合约部署地址"); // 替换成你要传入的ERC20代币合约地址 const erc20Addr = "0x123456..."; // 获取当前连接的钱包地址 const connectedAddr = await web3.eth.getAccounts().then(accs => accs[0]); // 调用check函数,用call() const checkResult = await contractInst.methods.check(erc20Addr).call({ from: connectedAddr }); console.log("调用结果:", checkResult);
3. 最后补个Solidity函数的修改
把原来的internal改成public或者external,不然外部调用会报错:
// 修改后的函数声明 function check(IERC20 _token) public view returns (/* 这里填你的返回值类型 */) { // 函数逻辑不变 }
内容的提问来源于stack exchange,提问作者dede
相关产品推荐
相关产品推荐

