You need to enable JavaScript to run this app. 在web3中调用Solidity合约函数时如何传入ETH/BNB作为参数
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 15:54:07