Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save thexeromin/be721936ab536350d8510169c1d8fe1e to your computer and use it in GitHub Desktop.
Save thexeromin/be721936ab536350d8510169c1d8fe1e to your computer and use it in GitHub Desktop.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
contract Ownable {
mapping(address => bool) public owner;
event AddedOwner(address newOwner);
event RemovedOwner(address removedOwner);
constructor() {
owner[msg.sender] = true;
}
modifier onlyOwner() {
require(owner[msg.sender], 'You are not an owner');
_;
}
function addOwner(address _newOwner) public onlyOwner {
owner[_newOwner] = true;
emit AddedOwner(_newOwner);
}
function removeOwner(address _toRemove) public onlyOwner {
owner[_toRemove] = false;
emit RemovedOwner(_toRemove);
}
}
contract Pepe is ERC20, Ownable {
uint256 private constant INITIAL_SUPPLY = 4 * 10**9 * 10**18;
// Addresses of tax recipients
address public liquidityFeeReceiver =
0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2;
address public stakingFeeReceiver =
0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db;
address public devFeeReceiver = 0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB;
bool public feesOnNormalTransfers = false;
uint256 public _liquidityPercentage = 1;
uint256 public _stakingPercentage = 1;
uint256 public _devPercentage = 1;
mapping(address => bool) public _isFeeExempt;
mapping(address => bool) public blacklist;
constructor() ERC20('Pepe Funds', 'PEPE') {
_isFeeExempt[msg.sender] = true;
_isFeeExempt[address(this)] = true;
_isFeeExempt[liquidityFeeReceiver] = true;
_isFeeExempt[stakingFeeReceiver] = true;
_isFeeExempt[devFeeReceiver] = true;
addOwner(msg.sender);
_mint(msg.sender, INITIAL_SUPPLY);
}
function checkFeeExempt(address _addr) external view returns (bool) {
return _isFeeExempt[_addr];
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal override {
require(!blacklist[sender] && !blacklist[recipient], 'in_blacklist');
bool _shouldTakeFee = shouldTakeFee(sender, recipient);
if (_shouldTakeFee) {
uint256 liquidityAmount = (amount * _liquidityPercentage) / 100;
uint256 stakingAmount = (amount * _stakingPercentage) / 100;
uint256 devAmount = (amount * _devPercentage) / 100;
uint256 totalAmount = liquidityAmount + stakingAmount + devAmount;
uint256 netAmount = amount - totalAmount;
super._transfer(sender, recipient, netAmount);
// Distribute taxes
super._transfer(sender, liquidityFeeReceiver, liquidityAmount);
super._transfer(sender, stakingFeeReceiver, stakingAmount);
super._transfer(sender, devFeeReceiver, devAmount);
} else {
super._transfer(sender, recipient, amount);
}
}
function updateTaxReceiver(
address _liquidityFeeReceiver,
address _stakingFeeReceiver,
address _devFeeReceiver
) public onlyOwner {
liquidityFeeReceiver = _liquidityFeeReceiver;
stakingFeeReceiver = _stakingFeeReceiver;
devFeeReceiver = _devFeeReceiver;
}
function updateTaxPercentage(
uint256 liquidityPercentage,
uint256 stakingPercentage,
uint256 devPercentage
) public onlyOwner {
_liquidityPercentage = liquidityPercentage;
_stakingPercentage = stakingPercentage;
_devPercentage = devPercentage;
}
function setFeeExempt(address _addr, bool _value) external onlyOwner {
require(_isFeeExempt[_addr] != _value, 'Not changed');
_isFeeExempt[_addr] = _value;
}
function updateBlacklist(address _user, bool _flag) public onlyOwner {
blacklist[_user] = _flag;
}
function shouldTakeFee(address from, address to)
internal
view
returns (bool)
{
if (_isFeeExempt[from] || _isFeeExempt[to]) {
return false;
} else if (feesOnNormalTransfers) {
return true;
} else {
return false;
}
}
function setFeesOnNormalTransfers(bool _enabled) external onlyOwner {
require(feesOnNormalTransfers != _enabled, 'Not changed');
feesOnNormalTransfers = _enabled;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment