如何为未发布的ABI调用balanceOf方法

问题描述

我正在尝试在特定的Tron合同(TYukBQZ2XXCcRCRCReAUguyXnccwNY9CEiDQ)上调用balanceOf()方法,但是得到的是Failed to execute 。如果我不提供参数,则会得到Invalid argument count provided -在某种程度上说,它适用于此合同。

有趣的是,它与除JustSwap Factory合同所创建的合同以外的其他合同同样有效。 https://tronscan.io/#/contract/TYukBQZ2XXCcRCReAUguyXncCWNY9CEiDQ/code。 该代码包含标准的TRC20方法-包括balanceOf()-我被困在一边,尝试了所有可能的方法,但是我们只能说我不太熟练tronweb api。

我的代码

export const getDataToken = async (contractAddress,account,account2) => {
  try {
  
    const instance = await window.tronWeb.contract(
      [
        {
          constant: true,inputs: [{ name: "owner",type: "address" }],name: "balanceOf",outputs: [{ name: "",type: "uint256" }],payable: false,stateMutability: "view",type: "function"
        }
      ],contractAddress
    );
    console.log(instance);
    if (instance.balanceOf) {
      console.log("dadadad if");
      const tokenBalance = await instance.balanceOf(account).call();
      const tokenBalance2 = await instance.balanceOf(account2).call();
      return {
        tokenBalance: (tokenBalance / Math.pow(10,18)).toString(),tokenContract: instance,tokenBalance2: (tokenBalance2 / Math.pow(10,18)).toString()
      };
    }
  } catch (message) {
    console.log("error  getData  :" + message);
  }
};

const { tokenBalance,tokenContract,tokenBalance2 } = getDataToken(
  "TYukBQZ2XXCcRCReAUguyXnccwNY9CEiDQ","TL4HzzxGMc1LMfs3XCi4yTJikaBVubz5y4","TTFp171XD4Jdub33sDq2ydXJyUEEZjNhLD"
);

解决方法

此功能可以提供帮助(例如获取JustSwap货币对价格的示例):

        async function takePrice(contractAddress,token){
            var functionSelector = 'getTokenToTrxInputPrice(uint256)';
            var parameter = [
                {
                    type: 'uint256',value: token
                }
            ]
            var options = {};
            transaction = await window.tronWeb.transactionBuilder.triggerConstantContract(contractAddress,functionSelector,options,parameter);
            return window.tronWeb.BigNumber("0x"+transaction['constant_result'][0]);
        }
        priceUSDTTRX =  window.tronWeb.fromSun(await takePrice(USDTTRX_ADDRESS,"1000000"));
        priceSomeTone18TRX = window.tronWeb.fromSun(await takePrice(SomeTone18TRX_ADDRESS,"1"+"0".repeat(18)));
,

我有好的结果:

  const TronWeb = require("tronweb");
  const ethers = require('ethers')
 
  const MAINNET_RPC = "https://api.trongrid.io";
 
  const PLACEHOLDER_PRIVATE_KEY = "YOUR_PRIVATE_KEY";
  
  const HttpProvider = TronWeb.providers.HttpProvider;
  const fullNode = new HttpProvider(MAINNET_RPC);
  const solidityNode = new HttpProvider(MAINNET_RPC);
  const eventServer = new HttpProvider(MAINNET_RPC);

  const tronWeb = new TronWeb(fullNode,solidityNode,eventServer,PLACEHOLDER_PRIVATE_KEY);

  const startJustSwap = async () => {

    try {

      const contractTokenExchangeUSDT = 'TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE'; //S-USDT-TRX Token
      const parameter = [{type:`uint256`,value: 10000000}];
      const tx = await tronWebLocal.transactionBuilder.triggerConstantContract(contractToken,`trxToTokenSwapInput(uint256,uint256)`,{},parameter);

      console.log(tx);

    } catch (e) {
      console.log(e);
    }
  };

  startJustSwap();
,

试试const tokenBalance = await instance.balanceOf(account).call({ _isConstant: true });

它对我有用。

transactionBuilder.triggerConstantContract 也可以,但我的更简单

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...