文件 1 的 1:SIGMA.sol
pragma solidity ^0.8.10;
interface ERC20 {
function totalSupply() external view returns (uint256);
function decimals() external view returns (uint8);
function symbol() external view returns (string memory);
function name() external view returns (string memory);
function getOwner() external view returns (address);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address _owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
abstract contract Ownable {
address internal owner;
address private _previousOwner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address _owner) {
owner = _owner;
}
modifier onlyOwner() {
require(isOwner(msg.sender), "!YOU ARE NOT THE OWNER"); _;
}
function isOwner(address account) public view returns (bool) {
return account == owner;
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(owner, address(0));
owner = address(0);
}
}
interface IDEXFactory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IDEXRouter {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
contract SIGMA is ERC20, Ownable {
mapping(address => bool) private _whitelisted;
mapping(address => bool) public _automatedMarketMakers;
mapping(address => bool) private _isLimitless;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
string constant _name = "Sigma University";
string constant _symbol = "SIGMA";
uint8 constant _decimals = 18;
uint256 private _totalSupply = 1_000_000_000 * 10 ** _decimals;
uint256 public maxBuyPercentage;
uint256 public maxSellPercentage;
uint256 public maxWalletPercentage;
uint256 private maxBuyAmount;
uint256 private maxSellAmount;
uint256 private maxWalletAmount;
address[] private sniperList;
uint256 tokenTax;
uint256 transferFee=0;
struct BuyFee {
uint256 liquidityFee;
uint256 developmentFee;
uint256 marketingFee;
uint256 total;
}
struct SellFee {
uint256 liquidityFee;
uint256 developmentFee;
uint256 marketingFee;
uint256 total;
}
BuyFee public buyFee;
SellFee public sellFee;
address public _exchangeRouterAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
address private constant ZERO = 0x0000000000000000000000000000000000000000;
address public developmentReceiver = 0x659b976BF1716c7A576C60F1385E50dC87f61868;
address public marketingReceiver = 0x94990B2Fd44151cFaD0755BEd44f291D61f12Cf9;
IDEXRouter public router;
address public pair;
bool private _addingLP;
bool private inSwap;
bool private _initialDistributionFinished;
bool public swapEnabled = true;
uint256 private swapThreshold = _totalSupply / 1000;
modifier swapping() {
inSwap = true;
_;
inSwap = false;
}
constructor () Ownable(msg.sender) {
router = IDEXRouter(_exchangeRouterAddress);
pair = IDEXFactory(router.factory()).createPair(router.WETH(), address(this));
_allowances[address(this)][address(router)] = type(uint256).max;
_automatedMarketMakers[pair]=true;
buyFee.liquidityFee = 100;
buyFee.developmentFee = 400;
buyFee.marketingFee = 400;
buyFee.total = buyFee.liquidityFee + buyFee.developmentFee + buyFee.marketingFee;
sellFee.liquidityFee = 100;
sellFee.developmentFee = 400;
sellFee.marketingFee = 400;
sellFee.total = sellFee.liquidityFee + sellFee.developmentFee + sellFee.marketingFee;
maxBuyPercentage = 20; maxBuyAmount = _totalSupply /1000 * maxBuyPercentage;
maxSellPercentage = 20; maxSellAmount = _totalSupply /1000 * maxSellPercentage;
maxWalletPercentage = 20; maxWalletAmount = _totalSupply /1000 * maxWalletPercentage;
_isLimitless[owner] = _isLimitless[address(this)] = true;
_balances[owner] = _totalSupply;
emit Transfer(address(0x0), owner, _totalSupply);
}
function ownerSetLimits(uint256 _maxBuyPercentage, uint256 _maxSellPercentage) external onlyOwner {
maxBuyPercentage = _maxBuyPercentage;
maxBuyAmount = _totalSupply /1000 * maxBuyPercentage;
maxSellPercentage = _maxSellPercentage;
maxSellAmount = _totalSupply /1000 * maxSellPercentage;
}
function ownerSetInitialDistributionFinished() external onlyOwner {
_initialDistributionFinished = true;
}
function ownerSetSwapBackSettings(bool _enabled, uint256 _percentageBase1000) external onlyOwner {
swapEnabled = _enabled;
swapThreshold = _totalSupply / 1000 * _percentageBase1000;
}
function ownerUpdateBuyFees (uint256 _liquidityFee, uint256 _developmentFee, uint256 _marketingFee) external onlyOwner {
buyFee.liquidityFee = _liquidityFee;
buyFee.developmentFee = _developmentFee;
buyFee.marketingFee = _marketingFee;
buyFee.total = buyFee.liquidityFee + buyFee.developmentFee + buyFee.marketingFee;
}
function ownerUpdateSellFees (uint256 _liquidityFee, uint256 _developmentFee, uint256 _marketingFee) external onlyOwner {
sellFee.liquidityFee = _liquidityFee;
sellFee.developmentFee = _developmentFee;
sellFee.marketingFee = _marketingFee;
sellFee.total = sellFee.liquidityFee + sellFee.developmentFee + sellFee.marketingFee;
}
function ownerAirDropWallets(address[] memory airdropWallets, uint256[] memory amounts) external onlyOwner{
require(airdropWallets.length < 100, "Can only airdrop 100 wallets per txn due to gas limits");
for(uint256 i = 0; i < airdropWallets.length; i++){
address wallet = airdropWallets[i];
uint256 amount = (amounts[i] * 10**_decimals);
_transfer(msg.sender, wallet, amount);
}
}
function getCirculatingSupply() public view returns (uint256) {
return _totalSupply - balanceOf(DEAD) - balanceOf(ZERO);
}
function _transfer(address sender,address recipient,uint256 amount) private {
require(sender!=address(0)&&recipient!=address(0),"Cannot be address(0).");
bool isBuy=_automatedMarketMakers[sender];
bool isSell=_automatedMarketMakers[recipient];
bool isExcluded=_isLimitless[sender]||_isLimitless[recipient]||_addingLP;
if(isExcluded)_transferExcluded(sender,recipient,amount);
else { require(_initialDistributionFinished);
if(isBuy)_buyTokens(sender,recipient,amount);
else if(isSell) {
if (shouldSwapBack()) {swapBack();}
_sellTokens(sender,recipient,amount);
} else {
require(balanceOf(recipient)+amount<=maxWalletAmount, "Total amount exceed wallet limit");
_P2PTransfer(sender,recipient,amount);
}
}
}
function _buyTokens(address sender,address recipient,uint256 amount) private {
require(amount <= maxBuyAmount, "Buy exceeds limit");
require(balanceOf(recipient)+amount<=maxWalletAmount, "Total amount exceed wallet limit");
if(!_whitelisted[recipient]){
tokenTax = amount*buyFee.total/1000;}
else tokenTax = 0;
_transferIncluded(sender,recipient,amount,tokenTax);
}
function _sellTokens(address sender,address recipient,uint256 amount) private {
require(amount <= maxSellAmount);
if(!_whitelisted[sender]){
tokenTax = amount*sellFee.total/1000;}
else tokenTax = 0;
_transferIncluded(sender,recipient,amount,tokenTax);
}
function _P2PTransfer(address sender,address recipient,uint256 amount) private {
tokenTax = amount * transferFee/1000;
if( tokenTax > 0) {_transferIncluded(sender,recipient,amount,tokenTax);}
else {_transferExcluded(sender,recipient,amount);}
}
function _transferExcluded(address sender,address recipient,uint256 amount) private {
_updateBalance(sender,_balances[sender]-amount);
_updateBalance(recipient,_balances[recipient]+amount);
emit Transfer(sender,recipient,amount);
}
function _transferIncluded(address sender,address recipient,uint256 amount,uint256 taxAmount) private {
uint256 newAmount = amount-tokenTax;
_updateBalance(sender,_balances[sender]-amount);
_updateBalance(address(this),_balances[address(this)]+taxAmount);
_updateBalance(recipient,_balances[recipient]+newAmount);
emit Transfer(sender,recipient,newAmount);
emit Transfer(sender,address(this),taxAmount);
}
function _updateBalance(address account,uint256 newBalance) private {
_balances[account] = newBalance;
}
function shouldSwapBack() private view returns (bool) {
return
!inSwap &&
swapEnabled &&
_balances[address(this)] >= swapThreshold;
}
function swapBack() private swapping {
uint256 toSwap = balanceOf(address(this));
uint256 totalLPTokens=toSwap*(sellFee.liquidityFee + buyFee.liquidityFee)/(sellFee.total + buyFee.total);
uint256 tokensLeft=toSwap-totalLPTokens;
uint256 LPTokens=totalLPTokens/2;
uint256 LPETHTokens=totalLPTokens-LPTokens;
toSwap=tokensLeft+LPETHTokens;
uint256 oldETH=address(this).balance;
_swapTokensForETH(toSwap);
uint256 newETH=address(this).balance-oldETH;
uint256 LPETH=(newETH*LPETHTokens)/toSwap;
_addLiquidity(LPTokens,LPETH);
uint256 remainingETH=address(this).balance-oldETH;
_distributeETH(remainingETH);
}
function _distributeETH(uint256 remainingETH) private {
uint256 marketingFee = (buyFee.marketingFee + sellFee.marketingFee);
uint256 developmentFee = (buyFee.developmentFee + sellFee.developmentFee);
uint256 totalFee = (marketingFee + developmentFee);
uint256 amountETHmarketing = remainingETH * (marketingFee) / (totalFee);
uint256 amountETHdevelopment = remainingETH * (developmentFee) / (totalFee);
if(amountETHdevelopment > 0){
(bool developmentSuccess, ) = payable(developmentReceiver).call{value: amountETHdevelopment, gas: 30000}("");
require(developmentSuccess, "receiver rejected ETH transfer"); }
if(amountETHmarketing > 0){
(bool marketingSuccess, ) = payable(marketingReceiver).call{value: amountETHmarketing, gas: 30000}("");
require(marketingSuccess, "receiver rejected ETH transfer"); }
}
function _swapTokensForETH(uint256 amount) private {
address[] memory path=new address[](2);
path[0] = address(this);
path[1] = router.WETH();
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
amount,
0,
path,
address(this),
block.timestamp
);
}
function _addLiquidity(uint256 amountTokens,uint256 amountETH) private {
_addingLP=true;
router.addLiquidityETH{value: amountETH}(
address(this),
amountTokens,
0,
0,
developmentReceiver,
block.timestamp
);
_addingLP=false;
}
receive() external payable { }
function totalSupply() external view override returns (uint256) { return _totalSupply; }
function decimals() external pure override returns (uint8) { return _decimals; }
function symbol() external pure override returns (string memory) { return _symbol; }
function name() external pure override returns (string memory) { return _name; }
function getOwner() external view override returns (address) { return owner; }
function balanceOf(address account) public view override returns (uint256) { return _balances[account];}
function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender];}
function approve(address spender, uint256 amount) public override returns (bool) {
_allowances[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function transfer(address recipient, uint256 amount) public override returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
uint256 allowance_ = _allowances[sender][msg.sender];
require(allowance_ >= amount);
if (_allowances[sender][msg.sender] != type(uint256).max) {
_allowances[sender][msg.sender] = _allowances[sender][msg.sender] - amount;
}
_transfer(sender, recipient, amount);
return true;
}
}