【问题标题】:Solidity swap and liquify BUSD instead of BNBSolidity 交换和液化 BUSD 代替 BNB
【发布时间】:2022-08-06 14:26:53
【问题描述】:

当有费用时,通常合约会将代币或 BNB 发送到钱包(即营销钱包)并在 BNB 中自动添加流动性(swapandliquify)。我正在尝试用 BUSD 替换两者的 BNB。这需要从 IPancakeRouter01、02 和 IPancakeFactory 中获取几个不同的函数。发生了一些事情,要么我的交换和液化没有触发,要么只是没有交换,我完全被难住了。一切都可以正常编译和部署,但显然有些东西没有指向正确的合约地址或流动性对。我的 _transfer 函数都很好,我很确定。我将发布与此问题相关的代码的相关部分。

//BUSD Contract Address
    address constant public BUSD = 0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56;

    IPancakeRouter02 _pancakeRouter = IPancakeRouter02(_pancakeRouterAddress);
    // Create a pancake pair for this new token
    pancakePair = IPancakeFactory(_pancakeRouter.factory()).createPair(address(this), BUSD);
    // set the rest of the contract variables
    pancakeRouter = _pancakeRouter;

function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        
        uint256 totalFees = _buyLiquidityFee + _sellLiquidityFee + _buyMarketingFee + _sellMarketingFee + _buyWhaleBuybackFee + _sellWhaleBuybackFee;

        uint256 _totalMarketingFee = _buyMarketingFee + _sellMarketingFee;
        uint256 marketingPercent = _totalMarketingFee.div(totalFees);
        uint256 marketingQuota = marketingPercent.mul(contractTokenBalance);

        uint256 _totalWhaleBuybackFee = _buyWhaleBuybackFee + _sellWhaleBuybackFee;
        uint256 whaleBuybackPercent = _totalWhaleBuybackFee.div(totalFees);
        uint256 whaleBuybackQuota = whaleBuybackPercent.mul(contractTokenBalance);        
        
        // capture the contract\'s current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;     
        swapTokensForBNB(marketingQuota); 
        swapBNBForBUSD(address(this).balance);
        transferOutBUSD(marketingWallet, address(this).balance.sub(initialBalance));
        
        //transferOutBNB(marketingWallet, address(this).balance.sub(initialBalance));

        uint256 initialBalance2 = address(this).balance;     
        swapTokensForBNB(whaleBuybackQuota); 
        transferOutBUSD(whaleBuybackWallet, address(this).balance.sub(initialBalance2));
        
        //transferOutBNB(whaleBuybackWallet, address(this).balance.sub(initialBalance2));


        // split the contract balance into halves
        uint256 initialBalanceAfterUtility = address(this).balance;
        uint256 half = initialBalanceAfterUtility.div(2);
        uint256 otherHalf = initialBalanceAfterUtility.sub(half);

        swapTokensForBNB(half);
        swapBNBForBUSD(address(this).balance); 
        uint256 newBalance = address(this).balance.sub(initialBalanceAfterUtility);
        addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForBNB(uint256 tokenAmount) private {
        // generate the pancake pair path of token -> wbnb
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = pancakeRouter.WETH();

        _approve(address(this), address(pancakeRouter), tokenAmount);

        // make the swap
        pancakeRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of BNB
            path,
            address(this),
            block.timestamp
        );
    }

    function transferOutBNB(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }

    function swapBNBForBUSD(uint256 tokenAmount) private{

        _approve(address(this), address(pancakeRouter), tokenAmount);

        address[] memory path = new address[](2);
        path[0] = pancakeRouter.WETH();
        path[1] = BUSD;  //pancakeRouter.BUSD();

        pancakeRouter.swapExactETHForTokensSupportingFeeOnTransferTokens(
            tokenAmount, 
            path, 
            address(this), 
            block.timestamp
            );
    }

    function transferOutBUSD(address payable recipient, uint256 amount) private{
        recipient.transfer(amount);
    }

    function addLiquidity(uint256 tokenAmount, uint256 bnbAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(pancakeRouter), tokenAmount);

        // add the liquidity
        pancakeRouter.addLiquidity( // the return values of function not will are handled
            address(this),
            BUSD,
            tokenAmount,
            bnbAmount,
            0, 
            0, 
            owner(), 
            block.timestamp
        );
    }

    标签: solidity smartcontracts binance remix


    【解决方案1】:

    寻找相同的你实现了吗?

    【讨论】:

      【解决方案2】:

      取而代之的是,

      //BUSD Contract Address
          address constant public BUSD = 0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56;
      

      尝试这个,

      IERC20 public immutable BUSD =
          IERC20(0x78867BbEeF44f2326bF8DDd1941a4439382EF2A7);
      

      【讨论】:

      • 一个好的答案将始终包括解释为什么这会解决问题,以便 OP 和任何未来的读者可以从中学习。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多