目录
一、solidity简单代币到销毁机制,分红机制,防机器人,营销手续费等一个完整代币(bsc链)
二、代币的销毁机制
四、代币营销手续费
五、一个完整项目代币,包括以往未实现的分红,添加流动性等
solidity防机器人有两种方式一种是根据判断在几区块,另外一种是根据时间来检测
先用第一种判断时间来检测机器人,照例用以前的代码再新加判断机器人的逻辑
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;
import "./ERC20.sol";
contract Token is ERC20{
string private _name; //币名字
string private _symbol; //币符号
address public deadwallet = 0x0000000000000000000000000000000000000000; //销毁地址
address public LiquityWallet; //铸币钱包
mapping(address => bool) public _isBlacklisted; //是否是黑名单,true表示这个地址是黑名单
uint256 public tradingEnabledTimestamp = 1627779600; //10:00pm //2021-08-1 9:00:00的时间戳,这里设置开盘时间,开盘时间逻辑后面再提,这里先注重防机器人
/*
* @dev 返回代币的名字
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev 返回代币的符号
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* 返回代币精度
*/
function decimals() public pure virtual returns (uint8) {
return 18;
}
constructor() public{
_name='Token';
_symbol='Tk';
_mint(msg.sender, 10000000000000 * (10 ** 18)); //铸币给连接此合约的账号于10000000000000个币;
LiquityWallet=msg.sender;
}
//交易函数
function _transfer(address recipient, uint256 amount) public returns (bool) {
require(!_isBlacklisted[msg.sender], 'Blacklisted address'); //如果发送方是黑名单则禁止交易
if(LiquityWallet!=msg.sender) return super.transfer(recipient, amount); //如果铸币方是发送方则不需要销毁
if(block.timestamp <= tradingEnabledTimestamp + 9 seconds) { //当前块的时间戳小于等于 可交易时间戳+9秒。
addBot(msg.sender); //把当前地址添加黑名单
}
uint256 BurnWallet = amount.mul(5).div(100); //销毁百分之5
uint256 trueAmount = amount.sub(BurnWallet); //剩下的95%就是要发送的
super.transfer(deadwallet, BurnWallet); //销毁这百分之5
return super.transfer(recipient, trueAmount); //发送那95%的代币
}
function _transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
require(!_isBlacklisted[msg.sender], 'Blacklisted address'); //如果发送方是黑名单则禁止交易
if(LiquityWallet!=msg.sender) return super.transfer(recipient, amount); //如果铸币方是发送方则不需要销毁
if(block.timestamp <= tradingEnabledTimestamp + 9 seconds) { //当前块的时间戳小于等于 可交易时间戳+9秒。
addBot(msg.sender); //把当前地址添加黑名单
}
uint256 BurnWallet = amount.mul(5).div(100); //销毁百分之5
uint256 trueAmount = amount.sub(BurnWallet); //剩下的95就是要发送的
super.transferFrom(sender, deadwallet, BurnWallet); //销毁这百分之5
return super.transferFrom(sender, recipient, trueAmount); //发送那95%的代币
}
//设置黑名单地址
function blacklistAddress(address account, bool value) public {
_isBlacklisted[account] = value; //如果是true就是黑名单
}
//添加黑名单的函数
function addBot(address recipient) private {
if (!_isBlacklisted[recipient]) _isBlacklisted[recipient] = true;
}
}
在上面的代码中防机器人逻辑主要是如果机器人在开盘9秒内买的就拉进黑名单,不给交易。
第二种方式代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;
import "./ERC20.sol";
contract Token is ERC20{
string private _name; //币名字
string private _symbol; //币符号
address public deadwallet = 0x0000000000000000000000000000000000000000; //销毁地址
address public LiquityWallet; //铸币钱包
mapping(address => bool) public _isBlacklisted; //是否是黑名单,true表示这个地址是黑名单
uint256 public tradingEnabledTimestamp = 1627779600; //2021-08-1 9:00:00的时间戳,这里设置开盘时间,开盘时间逻辑后面再提,这里先注重防机器人
uint256 public launchedAt=0;
/*
* @dev 返回代币的名字
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev 返回代币的符号
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* 返回代币精度
*/
function decimals() public pure virtual returns (uint8) {
return 18;
}
constructor() public{
_name='Token';
_symbol='Tk';
_mint(msg.sender, 10000000000000 * (10 ** 18)); //铸币给连接此合约的账号于10000000000000个币;
LiquityWallet=msg.sender;
}
//交易函数
function _transfer(address recipient, uint256 amount) public returns (bool) {
require(!_isBlacklisted[msg.sender], 'Blacklisted address'); //如果发送方是黑名单则禁止交易
if(LiquityWallet!=msg.sender) return super.transfer(recipient, amount); //如果铸币方是发送方则不需要销毁
if (launchedAt == 0) {
launchedAt = block.number; //初始化lauchAt赋值当前块的数量
}
if (block.number < launchedAt + 3) { //如果在3个区间内抢到
addBot(msg.sender); //则添加黑名单
}
uint256 BurnWallet = amount.mul(5).div(100); //销毁百分之5
uint256 trueAmount = amount.sub(BurnWallet); //剩下的95%就是要发送的
super.transfer(deadwallet, BurnWallet); //销毁这百分之5
return super.transfer(recipient, trueAmount); //发送那95%的代币
}
function _transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
require(!_isBlacklisted[msg.sender], 'Blacklisted address'); //如果发送方是黑名单则禁止交易
if(LiquityWallet!=msg.sender) return super.transfer(recipient, amount); //如果铸币方是发送方则不需要销毁
if (launchedAt == 0) {
launchedAt = block.number; //初始化lauchAt赋值当前块的数量
}
if (block.number < launchedAt + 3) { //如果在3个区间内抢到
addBot(msg.sender); //则添加黑名单
}
uint256 BurnWallet = amount.mul(5).div(100); //销毁百分之5
uint256 trueAmount = amount.sub(BurnWallet); //剩下的95就是要发送的
super.transferFrom(sender, deadwallet, BurnWallet); //销毁这百分之5
return super.transferFrom(sender, recipient, trueAmount); //发送那95%的代币
}
//设置黑名单地址
function blacklistAddress(address account, bool value) public {
_isBlacklisted[account] = value; //如果是true就是黑名单
}
//添加黑名单的函数
function addBot(address recipient) private {
if (!_isBlacklisted[recipient]) _isBlacklisted[recipient] = true;
}
}
这种方式主要根据机器人在几区间内抢到则添加黑名单,禁止交易