问题描述
我正在尝试在特定的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
也可以,但我的更简单