Solidity
在 Pancakeswap 上,Solidity 功能無法通過滑點出售
我在 Solidity 中有一個簡單的交換功能,可以為代幣數量設置自定義滑點。我的問題是它不適用於具有銷售稅的代幣。例如,如果一個代幣有 5% 的銷售稅,下面的程式碼將失敗,我設置的值無關緊要
percent
。我正在使用getAmountsOut
Uniswap V2 函式的返回值,它返回要退出的最小可用令牌,我什至低於這個值 30%。其他讓我感到困惑的是,我可以通過將滑點設置為 3070
%percentage
,但它不會工作。但是,當我嘗試在 Pancakeswap 網站上手動出售相同的代幣時,它們可以以 25% 或更少的滑點出售。所以 30% 的滑點超過 25%,我不明白為什麼滑點較小的 tx 會通過而價值較大的交易會失敗。使用沒有稅費的代幣,程式碼可以正常工作。我的第一個想法是滑點計算是不正確的,但我直接從 DEX 的智能合約中獲得了價值,並且下降了負 30%,所以我無法想像它為什麼不起作用。也許我的實現有一個我無法辨識的微不足道的錯誤。
function swapTokensWithSlippagePercent(address tokenToSellAddr, address ethAddr, uint deadline, uint percent) external { IBEP20 tokenContractObj = IBEP20(tokenToSellAddr); uint256 myBalance = tokenContractObj.balanceOf(address(this)); tokenContractObj.approve(_pancakeSwapRouterAddress, myBalance); require(myBalance > 0); address[] memory path = new address[](2); path[0] = tokenToSellAddr; path[1] = ethAddr; uint[] memory tokenAmountToSwap; uint[] memory amounts; tokenAmountToSwap = _pancakeRouter.getAmountsOut(myBalance, path); uint toGet; toGet = tokenAmountToSwap[1].div(100).mul(percent); amounts = _pancakeRouter.swapExactTokensForETH(myBalance, toGet, path, address(this), deadline); }
那是因為對於這些令牌,您需要呼叫
swapExactTokensForETHSupportingFeeOnTransferTokens
orswapExactETHForTokensSupportingFeeOnTransferTokens
。您始終可以使用這些方法而不是
swapExactTokensForETH
同時支持這兩種代幣,請記住,如果這樣,可能會扣除額外費用。