Ethereum вычисляет проскальзывание блинов по оценкам, которые всегда бросают TransferHelper: TRANSFER_FROM_FAILED

#javascript #ethereum #solidity #web3 #web3js

#язык JavaScript #эфириум #прочность #web3 #web3js

Вопрос:

Я был с этой ошибкой в течение нескольких дней, я пытаюсь автоматически рассчитать необходимое проскальзывание в блинах, для этого я пробую разные проценты и вызываю estimateGas, чтобы узнать, не завершится ли транзакция неудачно. Но я получаю только ошибку «TransferHelper: TRANSFER_FROM_FAILED». Я перепробовал множество методов, и ни один из них не работает для меня. Я уверен, что контракт одобрен и что он должен работать на стороне блокчейна. В pancakeswap это работает для меня, тот же кошелек, те же токены и те же суммы. Я не понимаю, что он может потерпеть неудачу.

 const Web3 = require("web3"); const abi = require("./abi.json");   const web3 = new Web3("https://bsc-dataseed.binance.org/"); const contract = new web3.eth.Contract(abi, "0x10ed43c718714eb63d5aa57b78b54704e256024e");  function isValid(res) {  return new Promise((resolve, reject) =gt; {  contract.methods.swapExactTokensForTokens(res[0], res[1], ["TOKEN_A", "TOKEN_B" ], "MI_WALLET", 1639969436 ).estimateGas(function(error, result) {  console.log(error.message)  if(error.message.includes("INSUFFICIENT_OUTPUT_AMOUNT")) {   console.log("Bad slippage")  reject()  }  else if(error) {  reject()  }  else {  resolve()  }    });  })    }  (async () =gt; {    contract.methods.getAmountsOut("20000000000", ["TOKEN_A", "TOKEN_B" ]).call().then(async res =gt; {  const data = res;  let slippage = 0;  while (true) {  try {  await isValid(data);  break;  }  catch(e) {  slippage  ;  console.log(slippage / 100 * data[1])  let newS = data[1] - (slippage / 100 * data[1])  console.log(slippage, newS);  if(slippage == 20) {  break;  }  }    }  console.log(slippage)  }) })();      

Спасибо вам всем!