You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web3调用ERC20合约报错:eth_sendTransaction不存在/不可用(Ropsten)

问题原因

  • Provider配置不匹配:你当前初始化Web3实例时使用的是独立HttpProvider,该Provider仅支持无需签名的链上读取操作,调用转账这类需要用户私钥签名的写入操作时,无法调用MetaMask的签名能力,所以会触发报错。
  • 调用语法版本不匹配:你使用的合约实例化、方法调用语法是Web3 0.2.x的旧版本语法,若你引入的是1.x版本的Web3,语法不兼容也会导致写入方法调用失败。
  • 参数未做精度处理:ERC20合约的金额单位是最小单位(和decimals配置挂钩),你直接传入页面输入的展示金额,和合约要求的参数单位不匹配,也会导致调用异常。

修复方案

1. 替换Web3初始化逻辑

删除原有的HttpProvider初始化代码,改为使用MetaMask注入的window.ethereum作为Provider:

// 替换原有web3初始化代码
if (window.ethereum) {
  web3 = new Web3(window.ethereum);
} else {
  alert("请先安装MetaMask钱包插件");
}

2. 修正合约实例化语法

适配Web3 1.x的标准语法,修改合约实例化代码:

// 替换原有合约实例化代码
var tokenContractAddress = "你的合约地址";
var tokenContract = new web3.eth.Contract(coinABI, tokenContractAddress);

3. 重写转账方法

改为异步调用逻辑,添加金额精度处理,指定签名地址触发MetaMask弹窗:

async function sendTokens(){
  const targetAddr = $("#targetAddr").val().toString();
  const inputAmt = $("#amt").val();
  // 获取合约小数位数,转换为合约要求的最小单位金额
  const decimals = await tokenContract.methods.decimals().call();
  const amount = web3.utils.toBN(inputAmt).mul(web3.utils.toBN(10 ** decimals));
  
  try {
    // 调用transfer方法,指定当前钱包地址作为签名方,自动唤起MetaMask签名弹窗
    const txRes = await tokenContract.methods.transfer(targetAddr, amount).send({
      from: web3.eth.defaultAccount
    });
    console.log("转账成功,交易哈希:", txRes.transactionHash);
    alert("转账已完成");
  } catch (err) {
    console.error("转账失败:", err);
    alert("转账失败:" + err.message);
  }
}

4. 同步修正读取方法(可选)

原有读取方法也适配异步语法,避免后续出现异常:

async function viewBalance(){
  const Addr = $('#viewAddr').val();
  const decimals = await tokenContract.methods.decimals().call();
  const balance = await tokenContract.methods.balanceOf(Addr).call();
  $("#balance").html(Number(balance) / (10 ** decimals));
}

async function viewCurrBalance(){
  const decimals = await tokenContract.methods.decimals().call();
  const balance = await tokenContract.methods.balanceOf(window.userWalletAddress).call();
  $("#balance").html(Number(balance) / (10 ** decimals));
}

额外注意事项

  • 要确保loginWithMetaMask方法执行完成、web3.eth.defaultAccount已经成功赋值后,再调用合约的写入方法,避免签名地址为空导致报错。
  • 传入的收款地址要做合法性校验,避免传入不符合以太坊地址格式的内容触发合约调用失败。

内容的提问来源于stack exchange,提问作者DemonDia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:45:02