Solidity

在 Pancakeswap 上,Solidity 功能無法通過滑點出售

  • May 3, 2022

我在 Solidity 中有一個簡單的交換功能,可以為代幣數量設置自定義滑點。我的問題是它不適用於具有銷售稅的代幣。例如,如果一個代幣有 5% 的銷售稅,下面的程式碼將失敗,我設置的值無關緊要percent。我正在使用getAmountsOutUniswap V2 函式的返回值,它返回要退出的最小可用令牌,我什至低於這個值 30%。其他讓我感到困惑的是,我可以通過將滑點設置為 30 70%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);

}

那是因為對於這些令牌,您需要呼叫swapExactTokensForETHSupportingFeeOnTransferTokensor swapExactETHForTokensSupportingFeeOnTransferTokens

您始終可以使用這些方法而不是swapExactTokensForETH同時支持這兩種代幣,請記住,如果這樣,可能會扣除額外費用。

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