一、准备
在合约代码中通常要设置不同的买卖手续费,同时要区分买入和撤销流动性,卖出和添加流动性。单纯通过交易的流向不能区分买入和撤销流动性,卖出和添加流动性。因为,买入时代币从流动池地址流出,进入用户账户地址,撤销流动性的代币也是相同的流向。卖出时是代币进入流动性池,和添加流动性的代币流向相同。因此不能通过代币的流向来区分。
但是通常手续费的设置只设置交易,对添加流动性和撤销流动性不设置手续费。基于此需求,要在合约中区分买入和撤池,卖出和加池。
基本的区分思路就是通过routerv2地址来判断,根据代币的流向,再借助routerv2来实现撤池和加池无手续费。
二、操作流程
合约代码如下:
1、构造函数中增加routerv2的白名单
_feeWhiteList[address(swapRouter)] = true;
2、transfer函数按照如下条件区分:买入,卖出,转账,添加流动性(加池),撤销流动性(撤池)
function _transferStandard(address sender, address recipient, uint256 tAmount) private { (uint256 tTransferAmount, uint256 tFund) = _getValues(tAmount); _balances[sender] = _balances[sender].sub(tAmount); _balances[recipient] = _balances[recipient].add(tTransferAmount); if( !_isExcludedFromFee[sender] && !_isExcludedFromFee[recipient] && (sender != _exchangePool && recipient != _exchangePool) ) { _balances[_tfundAddress] = _balances[_tfundAddress].add(tFund); _tfundFeeTotal = _tfundFeeTotal.add(tFund); emit Transfer(sender, _tfundAddress, tFund); } else if( !_isExcludedFromFee[sender] && !_isExcludedFromFee[recipient] && (recipient == _exchangePool && !isRoute[sender]) ) { _balances[_sfundAddress] = _balances[_sfundAddress].add(tFund); _sfundFeeTotal = _sfundFeeTotal.add(tFund); emit Transfer(sender, _sfundAddress, tFund); } else if ( !_isExcludedFromFee[sender] && !_isExcludedFromFee[recipient] && (sender == _exchangePool && isRoute[recipient]) ){ _balances[_sfundAddress] = _balances[_sfundAddress].add(tFund); _sfundFeeTotal = _sfundFeeTotal.add(tFund); emit Transfer(sender, _sfundAddress, tFund); } emit Transfer(sender, recipient, tTransferAmount); }
通过以上对isRoute mapping的逻辑判断来区分撤池和加池,通过_feeWhiteList[address(swapRouter)] = true;设置添加和撤销流动性无手续费。
至此,完成区分买入和撤销流动性,卖出和添加流动性的代码实现。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册