Okay i have googled did not find solution
Below is my code
RGNToken.sol
// SPDX-License-Identifier: MIT
//pragma solidity >=0.4.22 <0.9.0;
pragma solidity ^0.8.0;
import "./ERC20.sol";
import "./AccessControl.sol";
import "./SafeMath.sol";
interface Tkn{
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);
}
contract RagnafiToken is ERC20, AccessControl {
using SafeMath for uint256;
bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE");
bytes32 public constant GOVERNANCE_ROLE = keccak256("GOVERNANCE_ROLE");
address contractOwner;
uint256 burnLimit;
event TknWithDraw(address indexed Spender, uint Amount, address contractAdr);
modifier onlyOwner (){
require(hasRole(GOVERNANCE_ROLE, msg.sender), "Caller is not an admin");
_;
}
modifier onlyAdmin (){
require(hasRole(GOVERNANCE_ROLE, msg.sender), "Caller is not an admin");
_;
}
constructor(address payable routerAddress) ERC20("Ragnafi", "RGN",payable(routerAddress)) {
_mint(_msgSender(), 1000000000000 * 10**18);
burnLimit = 100000000 * 10**18;
contractOwner = _msgSender();
_isExcludedFromFee[_msgSender()] = true;
_isExcludedFromFee[address(this)] = true;
_setupRole(BURNER_ROLE, _msgSender());
_setupRole(GOVERNANCE_ROLE, _msgSender());
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
}
function returnsHolder() public view returns (address[] memory){
return(holders);
}
function ReturnFee(uint256 amount) public pure returns(uint256){
uint256 fee = amount * 10;
fee = fee / 100;
uint256 Tamount = amount + fee;
return(Tamount);
}
function excludeFromFeeView(address account) public view returns(bool){
return(_isExcludedFromFee[account]);
}
function WBNBFn(address routerAddress) public pure returns(address){
IPancakeRouter02 pancakeRouter = IPancakeRouter02(routerAddress);
return(pancakeRouter.WETH());
}
function excludeFromFee(address account) public onlyOwner{
_isExcludedFromFee[account] = true;
}
function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
swapAndLiquifyEnabled = _enabled;
}
function addNewGovernance(address newGov) public onlyAdmin{
grantRole(GOVERNANCE_ROLE, newGov);
}
function removeGovernance(address newGov) public onlyAdmin{
revokeRole(GOVERNANCE_ROLE, newGov);
}
function addNewBurner(address newBurner) public onlyOwner{
grantRole(BURNER_ROLE, newBurner);
}
function removeCurrentBurner(address rejectedBurner) public onlyAdmin{
revokeRole(BURNER_ROLE, rejectedBurner);
}
function burnTokens(uint256 amount) public {
require(hasRole(BURNER_ROLE, _msgSender()), "Caller is not a burner");
require(_msgSender() != address(0), "unknown address");
require(totalSupply() > burnLimit, "you cant burn any further");
amount = (amount) * (10 ** uint256(18));
burn(amount);
}
function burn(uint256 amount) internal virtual {
super._burn(contractOwner, amount);
}
function SetComWallets(
address payable __companyWallet,
address payable __companyPoolWallet,
address payable __companyBuyBackBurn,
address payable __companyRewardHolders) public onlyOwner {
companyRewardHolders = __companyRewardHolders;
companyBuyBackBurn = __companyBuyBackBurn;
companyPoolWallet = __companyPoolWallet;
companyWallet = __companyWallet;
}
function getComWallets() public view onlyOwner returns(address __companyWallet,
address __companyPoolWallet,
address __companyBuyBackBurn,
address __companyRewardHolders){
return(companyWallet,companyPoolWallet,companyBuyBackBurn,companyRewardHolders);
}
function withdrawBNB() public onlyOwner returns(uint){
uint conBal = address(this).balance;
payable(msg.sender).transfer(conBal);
emit TknWithDraw(msg.sender,conBal, address(this));
return conBal;
}
function withdrawERC(uint amt, address contractAdr) public onlyOwner {
Tkn Token = Tkn(contractAdr);
uint256 sndtk = (amt) * (10 ** uint256(18 ));
Token.transfer(msg.sender,sndtk);
emit TknWithDraw(msg.sender,sndtk, contractAdr);
}
receive() external payable{
}
fallback() external payable{
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";
import "./SafeMath.sol";
import "./IPancakeRouter02.sol";
import "./Utils.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
using SafeMath for uint256;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
address[] public holders;
mapping(address => bool) internal _isExcludedFromFee;
string private _name;
string private _symbol;
IPancakeRouter02 public immutable pancakeRouter;
address public immutable pancakePair;
uint256 minTokenNumberToSell = 1000000 * (10 ** 18);
address payable internal companyWallet;
address payable internal companyPoolWallet;
address payable internal companyBuyBackBurn;
address payable internal companyRewardHolders;
address internal _owner;
bool public swapAndLiquifyEnabled = false; // should be true
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_, address payable routerAddress) {
_name = name_;
_symbol = symbol_;
_isExcludedFromFee[address(this)] = true;
address msgSender = _msgSender();
_owner = msgSender;
IPancakeRouter02 _pancakeRouter = IPancakeRouter02(routerAddress);
//Create a pancake pair for this new token
pancakePair = IPancakeFactory(_pancakeRouter.factory())
.createPair(address(this), _pancakeRouter.WETH());
// set the rest of the contract variables
pancakeRouter = _pancakeRouter;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
function ownerFn() public view returns (address) {
return _owner;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
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;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `sender` to `recipient`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "BEP20: transfer from the zero address");
require(recipient != address(0), "BEP20: transfer to the zero address");
uint256 senderBalance = _balances[sender];
if(balanceOf(companyRewardHolders) > 0){
RewardHolders();
}
if(!_isExcludedFromFee[sender]){
_beforeTokenTransfer(sender, recipient, amount);
uint256 fee = amount * 10;
fee = fee / 100;
uint256 Tamount = amount + fee;
require(senderBalance >= Tamount, "BEP20: transfer amount exceeds balance plus fees");
Tamount = 0;
unchecked {
_balances[sender] = senderBalance - fee;
}
_balances[address(this)] += fee;
senderBalance = _balances[sender];
require(senderBalance >= amount, "BEP20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
emit Transfer(sender, address(this), fee);
_afterTokenTransfer(sender, recipient, amount);
}else{
_beforeTokenTransfer(sender, recipient, amount);
senderBalance = _balances[sender];
require(senderBalance >= amount, "BEP20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
_afterTokenTransfer(sender, recipient, amount);
}
swapAndLiquify(sender,recipient);
//swapAndLiquify();
}
function __transfer(
address sender,
address recipient,
uint256 amount
) internal {
require(sender != address(0), "BEP20: transfer from the zero address");
require(recipient != address(0), "BEP20: transfer to the zero address");
uint256 senderBalance = _balances[sender];
_beforeTokenTransfer(sender, recipient, amount);
senderBalance = _balances[sender];
require(senderBalance >= amount, "BEP20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
_afterTokenTransfer(sender, recipient, amount);
}
function RewardHolders() private{
uint256 walletAmt;
uint256 percentage;
uint256 amtToSend;
for(uint i = 0; i < holders.length -1; i++){
walletAmt = balanceOf(holders[i]);
percentage = ((walletAmt / totalSupply() ) * (100));
amtToSend = balanceOf(companyRewardHolders) * percentage;
__transfer(companyRewardHolders,holders[i],amtToSend);
}
}
//function swapAndLiquify() private {
function swapAndLiquify(address from, address to ) private {
uint256 contractTokenBalance = balanceOf(address(this));
if (contractTokenBalance >= _totalSupply) {
contractTokenBalance = _totalSupply;
}
bool shouldSell = contractTokenBalance >= minTokenNumberToSell;
if (
shouldSell &&
from != pancakePair &&
swapAndLiquifyEnabled
&& !(from == address(this) && to == address(pancakePair)) // swap 1 time
){
// only sell for minTokenNumberToSell, decouple from _maxTxAmount
//contractTokenBalance = minTokenNumberToSell;
uint256 tenP = contractTokenBalance * 10;
tenP = tenP / 100;
uint256 fourtyP = contractTokenBalance * 40;
fourtyP = fourtyP / 100;
uint256 _companyWallet = tenP;
uint256 _companyPoolWallet = fourtyP;
uint256 _companyBuyBackBurn = tenP;
uint256 _companyRewardHolders = fourtyP;
_burn(address(this), _companyBuyBackBurn);
__transfer(address(this), companyWallet, _companyWallet);
__transfer(address(this), companyRewardHolders, _companyRewardHolders);
//__transfer(address(this), companyBuyBackBurn, _companyBuyBackBurn);
__transfer(address(this), companyPoolWallet, _companyPoolWallet);
//RewardHolders();
//uint256 Piece = _companyPoolWallet.div(2);
//uint256 initialBalance = address(this).balance;
//Utils.swapTokensForEth(address(pancakeRouter), Piece);
//uint256 deltaBalance = address(this).balance.sub(initialBalance);
//uint256 bnbToBeAddedToLiquidity = deltaBalance;
//Utils.addLiquidity(address(pancakeRouter), ownerFn(), Piece, bnbToBeAddedToLiquidity);
}
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
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;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
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);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
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);
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {
uint256 index = 0;
if( _balances[to] == amount ){
holders.push(to);
}
if(_balances[from] == 0 ){
///Get index of address array
for(uint i = 0; i < holders.length -1; i++){
if(holders[i] == from){
index = i;
i = holders.length -1;
}
}
///Remove address from the array
holders[index] = holders[holders.length -1];
holders.pop();
}
}
}