文件 1 的 1:Angel.sol
pragma solidity ^0.8.20;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
constructor() {
_transferOwnership(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, 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 from,
address to,
uint256 amount
) external returns (bool);
}
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
contract ERC20 is Context, IERC20Metadata {
mapping(address => uint256) internal _balances;
mapping(address => mapping(address => uint256)) internal _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account)
public
view
virtual
override
returns (uint256)
{
return _balances[account];
}
function transfer(address to, uint256 amount)
public
virtual
override
returns (bool)
{
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
function allowance(address owner, address spender)
public
view
virtual
override
returns (uint256)
{
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount)
public
virtual
override
returns (bool)
{
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue)
public
virtual
returns (bool)
{
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue)
public
virtual
returns (bool)
{
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(
currentAllowance >= subtractedValue,
"ERC20: decreased allowance below zero"
);
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(
fromBalance >= amount,
"ERC20: transfer amount exceeds balance"
);
unchecked {
_balances[from] = fromBalance - amount;
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
unchecked {
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(
currentAllowance >= amount,
"ERC20: insufficient allowance"
);
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
interface IUniswapV2Pair {
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event Transfer(address indexed from, address indexed to, uint256 value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint256);
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
event Burn(
address indexed sender,
uint256 amount0,
uint256 amount1,
address indexed to
);
event Swap(
address indexed sender,
uint256 amount0In,
uint256 amount1In,
uint256 amount0Out,
uint256 amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint256);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves()
external
view
returns (
uint112 reserve0,
uint112 reserve1,
uint32 blockTimestampLast
);
function price0CumulativeLast() external view returns (uint256);
function price1CumulativeLast() external view returns (uint256);
function kLast() external view returns (uint256);
function burn(address to)
external
returns (uint256 amount0, uint256 amount1);
function swap(
uint256 amount0Out,
uint256 amount1Out,
address to,
bytes calldata data
) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
interface IUniswapV2Factory {
event PairCreated(
address indexed token0,
address indexed token1,
address pair,
uint256
);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB)
external
view
returns (address pair);
function allPairs(uint256) external view returns (address pair);
function allPairsLength() external view returns (uint256);
function createPair(address tokenA, address tokenB)
external
returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
external
returns (
uint256 amountA,
uint256 amountB,
uint256 liquidity
);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
);
function removeLiquidity(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETH(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountToken, uint256 amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETHWithPermit(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountToken, uint256 amountETH);
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapTokensForExactETH(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactTokensForETH(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) external pure returns (uint256 amountB);
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountOut);
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountIn);
function getAmountsOut(uint256 amountIn, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function getAmountsIn(uint256 amountOut, address[] calldata path)
external
view
returns (uint256[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
}
contract Angel is ERC20, Ownable {
address payable public marketingWallet;
address payable public developmentWallet;
address payable public treasuryWallet;
address payable public investmentWallet;
uint256 public maxTxLimit;
uint256 public maxWalletAmount;
uint256 public buyTax;
uint256 public sellTax;
uint256 public swapThreshold;
bool private swapping;
IUniswapV2Router02 public uniswapRouter;
address public uniswapPair;
mapping(address => bool) public excludedFromFees;
event TaxesUpdated(uint256 buyTax, uint256 sellTax);
event MarketingWalletUpdated(address indexed oldWallet, address indexed newWallet);
event DevelopmentWalletUpdated(address indexed oldWallet, address indexed newWallet);
event TreasuryWalletUpdated(address indexed oldWallet, address indexed newWallet);
event InvestmentWalletUpdated(address indexed oldWallet, address indexed newWallet);
event SwapThresholdUpdated(uint256 threshold);
event ExcludedFromFees(address indexed account, bool excluded);
event MaxTxLimitUpdated(uint256 amount);
event MaxWalletAmountUpdated(uint256 amount);
event FeesDistributed(uint256 ethForInvestment, uint256 ethForMarketing, uint256 ethForDevelopment, uint256 ethForTreasury);
constructor() ERC20("Angelverse", "ANGEL") {
uint256 SUPPLY = 100_000_000 * 10 ** decimals();
_mint(msg.sender, SUPPLY);
developmentWallet = payable(0x7556C283Eeb4bBecAFf761cB9EE04D659dd7F28a);
marketingWallet = payable(0xB0fF9086165Fba3F21161E34e7c4EEdAb3E2679e);
treasuryWallet = payable(0x0b69532DD3531eF9295b0C6f01fE234322879788);
investmentWallet = payable(0x09c8Ee07DDc00a9AFa06d6FbCeb00214dd29e907);
maxTxLimit = totalSupply() / 100;
maxWalletAmount = (totalSupply() * 2) / 100;
buyTax = 25;
sellTax = 25;
swapThreshold = 10_000 * 10 ** decimals();
uniswapRouter = IUniswapV2Router02(
0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24
);
uniswapPair = IUniswapV2Factory(uniswapRouter.factory()).createPair(
address(this),
uniswapRouter.WETH()
);
excludedFromFees[msg.sender] = true;
excludedFromFees[address(this)] = true;
excludedFromFees[marketingWallet] = true;
excludedFromFees[treasuryWallet] = true;
excludedFromFees[developmentWallet] = true;
excludedFromFees[investmentWallet] = true;
}
function decimals() public pure override returns (uint8) {
return 9;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal override {
require(amount > 0, "Angel: Transfer amount must be greater than zero");
if (!excludedFromFees[recipient] && !excludedFromFees[sender]) {
if(recipient != uniswapPair){
require(balanceOf(recipient) + amount <= maxWalletAmount, "Angel: Wallet balance exceeds max wallet limit");
}
require(amount <= maxTxLimit, "Angel: Amount exceeds max Transection limit");
}
uint256 fee = 0;
bool applyFees = true;
if (!swapping && sender != uniswapPair && balanceOf(address(this)) >= swapThreshold) {
swapping = true;
swapAndDistributeFees();
swapping = false;
}
if(excludedFromFees[sender] || excludedFromFees[recipient]){
applyFees = false;
}
if (applyFees) {
if (recipient == uniswapPair) {
fee = (amount * sellTax) / 100;
} else if (sender == uniswapPair) {
fee = (amount * buyTax) / 100;
}
if (fee > 0) {
super._transfer(sender, address(this), fee);
amount -= fee;
}
}
super._transfer(sender, recipient, amount);
}
function swapAndDistributeFees() private {
uint256 contractTokenBalance = balanceOf(address(this));
if (contractTokenBalance == 0) return;
uint256 initialETHBalance = address(this).balance;
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapRouter.WETH();
_approve(address(this), address(uniswapRouter), contractTokenBalance);
uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
contractTokenBalance,
0,
path,
address(this),
block.timestamp
);
uint256 totalETHReceived = address(this).balance - initialETHBalance;
uint256 ethForInvestment = (totalETHReceived * 50) / 100;
uint256 ethForMarketing = (totalETHReceived * 25) / 100;
uint256 ethForDevelopment = (totalETHReceived * 15) / 100;
uint256 ethForTreasury = (totalETHReceived * 10) / 100;
payable(investmentWallet).transfer(ethForInvestment);
payable(marketingWallet).transfer(ethForMarketing);
payable(developmentWallet).transfer(ethForDevelopment);
payable(treasuryWallet).transfer(ethForTreasury);
emit FeesDistributed(ethForInvestment, ethForMarketing, ethForDevelopment, ethForTreasury);
}
function burn(uint256 amount) external {
require(amount > 0, "Angel: Burn amount must be greater than zero");
_burn(msg.sender, amount);
}
function setTaxes(uint256 _buyTax, uint256 _sellTax) external onlyOwner {
require(_buyTax <= 25, "Angel: Buy tax can't exceed 25%");
require(_sellTax <= 25, "Angel: Sell tax can't exceed 25%");
buyTax = _buyTax;
sellTax = _sellTax;
emit TaxesUpdated(buyTax, sellTax);
}
function setMaxTxLimit(uint256 amount) external onlyOwner {
require(amount >= totalSupply() / 100, "Angel: Max TX must be at least 1% tokens");
maxTxLimit = amount;
emit MaxTxLimitUpdated(amount);
}
function setMaxWalletAmount(uint256 amount) external onlyOwner {
require(amount >= totalSupply() / 100, "Angel: Max wallet must be at least 1% tokens");
maxWalletAmount = amount;
emit MaxWalletAmountUpdated(amount);
}
function setMarketingWallet(address payable newWallet) external onlyOwner {
require(newWallet != address(0), "Angel: Invalid address");
emit MarketingWalletUpdated(marketingWallet, newWallet);
marketingWallet = newWallet;
excludeFromFees(newWallet, true);
}
function setDevelopmentWallet(address payable newWallet) external onlyOwner {
require(newWallet != address(0), "Angel: Invalid address");
emit DevelopmentWalletUpdated(developmentWallet, newWallet);
developmentWallet = newWallet;
excludeFromFees(newWallet, true);
}
function setTreasuryWallet(address payable newWallet) external onlyOwner {
require(newWallet != address(0), "Angel: Invalid address");
emit TreasuryWalletUpdated(treasuryWallet, newWallet);
treasuryWallet = newWallet;
excludeFromFees(newWallet, true);
}
function setInvestmentWallet(address payable newWallet) external onlyOwner {
require(newWallet != address(0), "Angel: Invalid address");
emit InvestmentWalletUpdated(investmentWallet, newWallet);
investmentWallet = newWallet;
excludeFromFees(newWallet, true);
}
function setSwapThreshold(uint256 threshold) external onlyOwner {
require(threshold <= totalSupply(), "Angel: Threshold too high");
swapThreshold = threshold;
emit SwapThresholdUpdated(threshold);
}
function excludeFromFees(address account, bool excluded) public onlyOwner {
excludedFromFees[account] = excluded;
emit ExcludedFromFees(account, excluded);
}
function withdrawEther() external onlyOwner {
uint256 contractBalance = address(this).balance;
require(contractBalance > 0, "Angel: No Ether to withdraw");
payable(owner()).transfer(contractBalance);
}
receive() external payable {}
fallback() external payable {}
}