swapTokensForExactETH,執行恢復:null
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
來維持正常的價格波動。如果您希望它實時工作,您應該使用 UniswapSDK
inputAmount
使用Trade對象進行計算,然後添加 0.1% 的滑點並將其用於maxInputAmount
.確保您的錢包中有足夠的 Token 來支付此費用。