调用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
相关产品推荐
相关产品推荐

