在web3中调用Solidity合约函数时如何传入ETH/BNB作为参数
你遇到的报错是因为调用payable修饰的合约方法时,没有在send方法的参数中传入对应金额导致的,按以下两个修改点调整即可:
1. 修正调用的合约方法名
你合约中定义的方法名为putOrder,但当前前端代码调用的是orderStuff(),方法名不匹配会直接导致调用失败,需要先统一。
2. 在send参数中添加value字段
web3.js调用合约payable方法时,发送的原生代币金额需要放在send的配置对象的value字段中,单位必须和合约保持一致(合约默认使用wei作为金额单位)。
你可以直接读取合约公开的itemPrice值传入,避免两边金额不一致,修改后的代码示例如下:
const putOrder = async () => { // ... 其他逻辑 // 读取合约中定义的itemPrice(如果itemPrice是public状态变量可直接调用) const itemPriceWei = await window.contract.methods.itemPrice().call(); // 若你提前知道对应ETH/BNB金额,也可以手动转成wei: // const itemPriceWei = web3.utils.toWei('对应金额数值', 'ether') window.contract.methods.putOrder().send({ from: accounts[0], value: itemPriceWei // 新增该行传入对应金额 }).on('receipt', function(){ processOrder(); }); // ... 其他逻辑 }
额外注意事项
- 务必保证传入的
value单位为wei,如果你拿到的是ETH/BNB为单位的数值,一定要用web3.utils.toWei()方法转换后再传入 - 如果合约的
itemPrice不是公开变量,你需要保证前端硬编码的金额和合约内的数值完全一致,否则还是会触发require校验失败
内容的提问来源于stack exchange,提问作者Saulius
相关产品推荐
相关产品推荐

