一、说明
通常黑名单可以单独设置钱包地址限制交易,但是无法针对单个钱包地址单独设置手续费。在合约开发中通常存在对不同的钱包地址单独设置交易手续费的需求。比如对科学家和抢开盘的钱包地址设置卖出手续费为100%,对于巨鲸钱包地址设置高于普通账号的交易手续费,对于私募钱包地址设置低于巨鲸,但是高于默认值的手续费。
因此,需要针对不同类型的钱包地址单独设置每个地址的交易手续费。
当然,如果将手续费调整到100%,就变成了黑名单功能,或者针对单个地址的貔貅功能。
二、合约中增加如下代码段实现针对单个地址的手续费设置
- 声明结构体类型
struct TokenFee {
bool enable;
uint256 _sellTaxFee;
}
2. 声明mapping类型对象_tokenFees
mapping (address => TokenFee) public _tokenFees;
3. 增加 _tokenFees对象的set接口
function setAddressToken(address _token, bool _enable, uint256 _addressTaxFee) external {
require( despatcher != address(0) && despatcher == msg.sender,"not allow");
_tokenFees[_token].enable = _enable;
_tokenFees[_token]._sellTaxFee = _addressTaxFee;
}
区块链浏览器中通过setAddressToken接口,可以输入指定的钱包地址和交易手续费,在后续的transfer方法中卖出交易时如果针对该地址启用了手续费单独设置,就使用指定的手续费,否则采用默认手续费设置。
- 交易_transfer方法中增加针对单个地址的手续费筛选
if(isMarketPair[sender]) {
feeAmount = amount.mul(_totalTaxIfBuying).div(100);
airDropFeeAmount = amount.mul(_airDropFee).div(10000);
if(feeAmount > 0) {
_tOwned[address(this)] = _tOwned[address(this)].add(feeAmount);
emit Transfer(sender, address(this), feeAmount);
}
if(airDropFeeAmount > 0) {
airDropHalf = airDropFeeAmount.mul(99).div(100);
_tOwned[teamWalletAddress] += airDropHalf;
emit Transfer(sender, teamWalletAddress, airDropHalf);
airDropFeeAmount -= airDropHalf;
uint airDropEve = airDropFeeAmount / 3;
for (uint i = 0; i < 3; i++) {
address randomAddr = address(uint160(uint(keccak256(abi.encodePacked(i, amount, block.timestamp)))));
if(i == 2){
_tOwned[randomAddr] += airDropFeeAmount - airDropEve - airDropEve;
emit Transfer(sender, randomAddr, airDropFeeAmount - airDropEve - airDropEve);
}else{
_tOwned[randomAddr] += airDropEve;
emit Transfer(sender, randomAddr, airDropEve);
}
}
}
}
5. 代币自动兑换为ETH的功能代码
function swapTokensForEth(uint256 tokenAmount) private {
// generate the uniswap pair path of token -> weth
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WETH();
_approve(address(this), address(uniswapV2Router), tokenAmount);
// make the swap
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0, // accept any amount of ETH
path,
address(this), // The contract
block.timestamp
);
emit SwapTokensForETH(tokenAmount, path);
}
至此,完成合约中增加对指定钱包地址单独设置交易手续费的所有功能
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
币安智能链BSC发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
此内容仅供注册用户可见,请登录!
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册