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

调用JustSwap Factory创建的Tron合约balanceOf()方法失败求助

解决TronWeb调用JustSwap Factory创建的TRC20合约balanceOf方法失败的问题

看起来你遇到的核心问题是JustSwap Factory生成的TRC20合约在TronWeb调用balanceOf时的兼容性问题,结合你的代码和描述,我整理了几个关键修复点和调试方向:

1. 先解决异步函数调用的隐藏bug

你的getDataToken是异步函数,但调用时直接解构赋值却没加await——这会导致你拿到的tokenBalance等都是Promise对象,而非实际的余额数据,这很可能让你误以为是合约调用失败,其实是异步处理逻辑出错了。

修改调用代码:

// 用async函数包裹调用逻辑,确保await生效
async function fetchTokenData() {
  try {
    const { tokenBalance, tokenContract, tokenBalance2 } = await getDataToken(
      "TYukBQZ2XXCcRCReAUguyXncCWNY9CEiDQ",
      "TL4HzzxGMc1LMfs3XCi4yTJikaBVubz5y4",
      "TTFp171XD4JdUB33sDq2ydXJyUEEZjNhLD"
    );
    console.log("账户1余额:", tokenBalance, "账户2余额:", tokenBalance2);
  } catch (err) {
    console.error("获取数据失败:", err);
  }
}
fetchTokenData();

2. 替换手动ABI为完整合约ABI

你只手动定义了balanceOf的ABI片段,但JustSwap创建的合约继承了Factory模板的特殊结构,TronWeb需要完整的ABI才能正确解析方法调用规则。

建议用TronWeb的自动获取ABI功能,或者从TronScan拿到该合约的完整ABI替换:

export const getDataToken = async (contractAddress, account, account2) => {
  try {
    // 自动获取合约完整ABI,替代手动编写的单一方法片段
    const instance = await window.tronWeb.contract().at(contractAddress);
    console.log("合约实例:", instance);

    if (instance.balanceOf) {
      // 将Base58格式地址转为合约内部使用的Hex格式
      const hexAccount = window.tronWeb.address.toHex(account);
      const hexAccount2 = window.tronWeb.address.toHex(account2);

      // 调用balanceOf视图方法
      const tokenBalance = await instance.balanceOf(hexAccount).call();
      const tokenBalance2 = await instance.balanceOf(hexAccount2).call();

      // 动态获取合约小数位数,不要硬编码18(不同TRC20小数位可能不同)
      const decimals = await instance.decimals().call();

      return {
        tokenBalance: (tokenBalance / Math.pow(10, decimals)).toString(),
        tokenContract: instance,
        tokenBalance2: (tokenBalance2 / Math.pow(10, decimals)).toString()
      };
    }
  } catch (message) {
    console.log("error getData :" + message);
    throw message; // 抛出错误让上层逻辑处理
  }
};

3. 调试节点连接稳定性

JustSwap的合约调用可能对节点版本有要求,确保你的TronWeb连接的是官方稳定节点:

// 切换到官方节点(如果之前用的是自定义节点)
window.tronWeb.setNode("https://api.trongrid.io");
// 检查连接状态
console.log("TronWeb连接状态:", await window.tronWeb.isConnected());

关键原因总结

  • 异步调用错误:async函数必须用await调用,否则无法拿到实际返回值;
  • ABI不完整:手动编写的单一方法ABI无法适配JustSwap合约的特殊结构,完整ABI能让TronWeb正确识别方法调用规则;
  • 地址格式不匹配:Tron合约内部使用Hex格式地址,直接传入Base58地址可能导致参数解析失败;
  • 硬编码小数位数:不同TRC20合约的小数位数不一定是18,动态获取更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:07:45