Skip to content

Instantly share code, notes, and snippets.

@thexeromin
Last active May 8, 2023 10:38
Show Gist options
  • Save thexeromin/5ff61da83f95f9ef1843b78ebf247e5b to your computer and use it in GitHub Desktop.
Save thexeromin/5ff61da83f95f9ef1843b78ebf247e5b 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';
import '@openzeppelin/contracts/access/Ownable.sol';
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) _isFeeExempt;
constructor() ERC20('Pepe Funds', 'PEPE') {
_isFeeExempt[msg.sender] = true;
_isFeeExempt[address(this)] = true;
_isFeeExempt[liquidityFeeReceiver] = true;
_isFeeExempt[stakingFeeReceiver] = true;
_isFeeExempt[devFeeReceiver] = true;
_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 {
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 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