Web3js

swapTokensForExactETH,執行恢復:null

  • May 24, 2022

swapTokensForExactETH我正在嘗試使用 pancakeswap 合約(類似於 uniswap 合約)估算交易的 gas

當我這樣做時,我收到以下錯誤:Error: Returned error: execution reverted null

經過一些研究value,在使用這種契約方法建構交易時,我似乎不應該給出該欄位。但是當我不提供此欄位時,我收到以下錯誤:Error: Returned error: execution reverted: PancakeRouter: EXCESSIVE_INPUT_AMOUNT如果我輸入 0 也是如此value

以供參考:

  • 使用幣安智能鏈
  • 0.00024 BNB = 1 個代幣。
  • 我的錢包裡有 10 個代幣 + 1 個 BNB。
  • 我已經在 Pancakeswap 上批准了代幣
  • 我確實swapExactETHForTokens已經成功使用了,但還swapTokensForExactETH沒有

// For your information:
// `CNF.wallet` = My wallet address
// `config.token.contract`= `0x00e1656e45f18ec6747f5a8496fd39b50b38396d` (BCOIN)
// `config.crypto.bnb.contract` = `0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c`
// `config.crypto.pancake.router.contract` = `0x10ED43C718714eb63d5aA57B78B54704E256024E` 



var amountToGet = 0.00024; //exact amount of BNB that i want (equal to 1 token)
var amountOutMax = 5; //max amount of tokens i m willing to use to get above BNB amount

var data = contract.methods.swapTokensForExactETH(
   web3_bsc.utils.toHex(amountToGet), 
   web3_bsc.utils.toHex(amountOutMax),
   [config.token.contract, config.crypto.bnb.contract],
   CNF.wallet,
   web3_bsc.utils.toHex(Math.round(Date.now() / 1000) + 60 * 20), //deadline
);

var count = await web3_bsc.eth.getTransactionCount(CNF.wallet);
var rawTransaction = {
   "from": CNF.wallet,
   "gasLimit": web3_bsc.utils.toHex(CNF.gasmax),
   "to": config.crypto.pancake.router.contract,
   // "value":web3_bsc.utils.toHex(amountToGet),
   // "value": 0,
   "data": data.encodeABI(),
   "nonce": web3_bsc.utils.toHex(count)
};


web3_bsc.eth.estimateGas(rawTransaction, (error, gasEstimate) => {

  if (!error && gasEstimate) {
  
       //continue...
  }
  else {
  
       //error
  }
  
});

您忘記將金額從 ether 轉換為 wei。

https://web3js.readthedocs.io/en/v1.2.11/web3-utils.html#towei

在乙太坊合約中發送的金額是uint256,您必須將您的浮點ether值轉換為wei單位,這是通過乘以代幣的小數點數來完成的。

WBNB並且您的令牌使用 18 位小數,因此請致電

web3_bsc.utils.toHex(web3_bsc.utils.toWei(amountToGet)),
web3_bsc.utils.toHex(web3_bsc.utils.toWei(amountOutMax)),

amountInMax是“5”,這意味著 0.00000000000000005 BCOIN,因此EXCESSIVE_INPUT_AMOUNT被拋出。


swapTokensForExactETH將未知數量的 Token 兌換成確切的 ETH。

您不應該指定value,因為您正在接收 ETH(在這種情況下為 BNB)value並將 ETH 發送到合約。

根據文件-

function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
 external
 returns (uint[] memory amounts);
  • amountOut是要接收的 ETH 數量。
  • amountInMax是交易恢復之前可能需要的最大輸入令牌數量。

EXCESSIVE_INPUT_AMOUNT錯誤意味著要匹配您請求的amountOut(確切的 ETH),您必須支付過多的 Token,超過amountInMax. 這意味著您沒有計算足夠的滑點amountInMax來維持正常的價格波動。

如果您希望它實時工作,您應該使用 UniswapSDKinputAmount使用Trade對象進行計算,然後添加 0.1% 的滑點並將其用於maxInputAmount.

確保您的錢包中有足夠的 Token 來支付此費用。

引用自:https://ethereum.stackexchange.com/questions/128815