Token 10X: Africa's First Cryptocurrency Hub
Opkee.tech Token
The Opkee system is a complete payment protocol. The Opkee token contains additional features to the ERC20 that can help you in many situations, including managing subscriptions and unlocking paid content (an article, a video, a file or any other media).
...
About Opkee.tech
The Opkee system is a complete payment protocol. The Opkee token contains additional features to the ERC20 that can help you in many situations, including managing subscriptions and unlocking paid content (an article, a video, a file or any other media).
41 total visits
Token information and links
Circulating Supply
1649267441664000000000000
Token Contract (BSC Chain)
0X5CBB515DF4B32F6693B32E29000F2127EE7DE340
Contract license:
Launch Date
21/02/2022
KYC Information
No
Audit Information
None
Team Information
Team leader: None
Team leader contact: None
Contract source code
{{
"language": "Solidity",
"sources": {
"/contracts/BEP20Token.sol": {
"content": "pragma solidity ^ 0.8.4;\r\n// SPDX-License-Identifier: Unlicensed\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \r\ninterface IBEP20 {\r\n function totalSupply() external view returns(uint256);\r\n\r\n function decimals() external view returns(uint8);\r\n\r\n function symbol() external view returns(string memory);\r\n\r\n function name() external view returns(string memory);\r\n\r\n function getOwner() external view returns(address);\r\n\r\n function balanceOf(address account) external view returns(uint256);\r\n\r\n function transfer(address recipient, uint256 amount) external returns(bool);\r\n\r\n function allowance(address _owner, address spender) external view returns(uint256);\r\n\r\n function approve(address spender, uint256 amount) external returns(bool);\r\n\r\n function transferFrom(address sender, address recipient, uint256 amount) external returns(bool);\r\n event Transfer(address indexed from, address indexed to, uint256 value);\r\n event Approval(address indexed owner, address indexed spender, uint256 value);\r\n}\r\n\r\ninterface IUniswapV2Factory {\r\n event PairCreated(address indexed token0, address indexed token1, address pair, uint);\r\n\r\n function feeTo() external view returns(address);\r\n\r\n function feeToSetter() external view returns(address);\r\n\r\n function getPair(address tokenA, address tokenB) external view returns(address pair);\r\n\r\n function allPairs(uint) external view returns(address pair);\r\n\r\n function allPairsLength() external view returns(uint);\r\n\r\n function createPair(address tokenA, address tokenB) external returns(address pair);\r\n\r\n function setFeeTo(address) external;\r\n\r\n function setFeeToSetter(address) external;\r\n}\r\n\r\ninterface IUniswapV2Pair {\r\n event Approval(address indexed owner, address indexed spender, uint value);\r\n event Transfer(address indexed from, address indexed to, uint value);\r\n\r\n function name() external pure returns(string memory);\r\n\r\n function symbol() external pure returns(string memory);\r\n\r\n function decimals() external pure returns(uint8);\r\n\r\n function totalSupply() external view returns(uint);\r\n\r\n function balanceOf(address owner) external view returns(uint);\r\n\r\n function allowance(address owner, address spender) external view returns(uint);\r\n\r\n function approve(address spender, uint value) external returns(bool);\r\n\r\n function transfer(address to, uint value) external returns(bool);\r\n\r\n function transferFrom(address from, address to, uint value) external returns(bool);\r\n\r\n function DOMAIN_SEPARATOR() external view returns(bytes32);\r\n\r\n function PERMIT_TYPEHASH() external pure returns(bytes32);\r\n\r\n function nonces(address owner) external view returns(uint);\r\n\r\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;\r\n event Mint(address indexed sender, uint amount0, uint amount1);\r\n event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);\r\n event Swap(\r\n address indexed sender,\r\n uint amount0In,\r\n uint amount1In,\r\n uint amount0Out,\r\n uint amount1Out,\r\n address indexed to\r\n );\r\n event Sync(uint112 reserve0, uint112 reserve1);\r\n\r\n function MINIMUM_LIQUIDITY() external pure returns(uint);\r\n\r\n function factory() external view returns(address);\r\n\r\n function token0() external view returns(address);\r\n\r\n function token1() external view returns(address);\r\n\r\n function getReserves() external view returns(uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);\r\n\r\n function price0CumulativeLast() external view returns(uint);\r\n\r\n function price1CumulativeLast() external view returns(uint);\r\n\r\n function kLast() external view returns(uint);\r\n\r\n function mint(address to) external returns(uint liquidity);\r\n\r\n function burn(address to) external returns(uint amount0, uint amount1);\r\n\r\n function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;\r\n\r\n function skim(address to) external;\r\n\r\n function sync() external;\r\n\r\n function initialize(address, address) external;\r\n}\r\n\r\ninterface IUniswapV2Router01 {\r\n function factory() external pure returns(address);\r\n\r\n function WETH() external pure returns(address);\r\n\r\n function addLiquidity(\r\n address tokenA,\r\n address tokenB,\r\n uint amountADesired,\r\n uint amountBDesired,\r\n uint amountAMin,\r\n uint amountBMin,\r\n address to,\r\n uint deadline\r\n ) external returns(uint amountA, uint amountB, uint liquidity);\r\n\r\n function addLiquidityETH(\r\n address token,\r\n uint amountTokenDesired,\r\n uint amountTokenMin,\r\n uint amountETHMin,\r\n address to,\r\n uint deadline\r\n ) external payable returns(uint amountToken, uint amountETH, uint liquidity);\r\n\r\n function removeLiquidity(\r\n address tokenA,\r\n address tokenB,\r\n uint liquidity,\r\n uint amountAMin,\r\n uint amountBMin,\r\n address to,\r\n uint deadline\r\n ) external returns(uint amountA, uint amountB);\r\n\r\n function removeLiquidityETH(\r\n address token,\r\n uint liquidity,\r\n uint amountTokenMin,\r\n uint amountETHMin,\r\n address to,\r\n uint deadline\r\n ) external returns(uint amountToken, uint amountETH);\r\n\r\n function removeLiquidityWithPermit(\r\n address tokenA,\r\n address tokenB,\r\n uint liquidity,\r\n uint amountAMin,\r\n uint amountBMin,\r\n address to,\r\n uint deadline,\r\n bool approveMax, uint8 v, bytes32 r, bytes32 s\r\n ) external returns(uint amountA, uint amountB);\r\n\r\n function removeLiquidityETHWithPermit(\r\n address token,\r\n uint liquidity,\r\n uint amountTokenMin,\r\n uint amountETHMin,\r\n address to,\r\n uint deadline,\r\n bool approveMax, uint8 v, bytes32 r, bytes32 s\r\n ) external returns(uint amountToken, uint amountETH);\r\n\r\n function swapExactTokensForTokens(\r\n uint amountIn,\r\n uint amountOutMin,\r\n address[] calldata path,\r\n address to,\r\n uint deadline\r\n ) external returns(uint[] memory amounts);\r\n\r\n function swapTokensForExactTokens(\r\n uint amountOut,\r\n uint amountInMax,\r\n address[] calldata path,\r\n address to,\r\n uint deadline\r\n ) external returns(uint[] memory amounts);\r\n\r\n function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)\r\n external\r\n payable\r\n returns(uint[] memory amounts);\r\n\r\n function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\r\n external\r\n returns(uint[] memory amounts);\r\n\r\n function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\r\n external\r\n returns(uint[] memory amounts);\r\n\r\n function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)\r\n external\r\n payable\r\n returns(uint[] memory amounts);\r\n\r\n function quote(uint amountA, uint reserveA, uint reserveB) external pure returns(uint amountB);\r\n\r\n function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns(uint amountOut);\r\n\r\n function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns(uint amountIn);\r\n\r\n function getAmountsOut(uint amountIn, address[] calldata path) external view returns(uint[] memory amounts);\r\n\r\n function getAmountsIn(uint amountOut, address[] calldata path) external view returns(uint[] memory amounts);\r\n}\r\n\r\ninterface IUniswapV2Router02 is IUniswapV2Router01 {\r\n function removeLiquidityETHSupportingFeeOnTransferTokens(\r\n address token,\r\n uint liquidity,\r\n uint amountTokenMin,\r\n uint amountETHMin,\r\n address to,\r\n uint deadline\r\n ) external returns(uint amountETH);\r\n\r\n function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(\r\n address token,\r\n uint liquidity,\r\n uint amountTokenMin,\r\n uint amountETHMin,\r\n address to,\r\n uint deadline,\r\n bool approveMax, uint8 v, bytes32 r, bytes32 s\r\n ) external returns(uint amountETH);\r\n\r\n function swapExactTokensForTokensSupportingFeeOnTransferTokens(\r\n uint amountIn,\r\n uint amountOutMin,\r\n address[] calldata path,\r\n address to,\r\n uint deadline\r\n ) external;\r\n\r\n function swapExactETHForTokensSupportingFeeOnTransferTokens(\r\n uint amountOutMin,\r\n address[] calldata path,\r\n address to,\r\n uint deadline\r\n ) external payable;\r\n\r\n function swapExactTokensForETHSupportingFeeOnTransferTokens(\r\n uint amountIn,\r\n uint amountOutMin,\r\n address[] calldata path,\r\n address to,\r\n uint deadline\r\n ) external;\r\n}\r\n\r\ncontract Context {\r\n constructor() {}\r\n\r\n function _msgSender() internal view returns(address) {\r\n return msg.sender;\r\n }\r\n\r\n function _msgData() internal view returns(bytes memory) {\r\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\r\n return msg.data;\r\n }\r\n}\r\n\r\ncontract Ownable is Context {\r\n address private _owner;\r\n\r\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\r\n\r\n constructor() {\r\n address msgSender = _msgSender();\r\n _owner = msgSender;\r\n emit OwnershipTransferred(address(0), msgSender);\r\n }\r\n\r\n function owner() public view returns(address) {\r\n return _owner;\r\n }\r\n\r\n modifier onlyOwner() {\r\n require(_owner == _msgSender(), \"only for owner\");\r\n _;\r\n }\r\n\r\n function transferOwnership(address newOwner) public onlyOwner {\r\n emit OwnershipTransferred(_owner, newOwner);\r\n _owner = newOwner;\r\n }\r\n}\r\n\r\ncontract Manageable is Ownable {\r\n address private _manager;\r\n\r\n event ManagmentTransferred(address indexed previousManager, address indexed newManager);\r\n\r\n constructor() {\r\n address msgSender = _msgSender();\r\n _manager = msgSender;\r\n emit ManagmentTransferred(address(0), msgSender);\r\n }\r\n\r\n function manager() public view returns(address) {\r\n return _manager;\r\n }\r\n\r\n modifier onlyManager() {\r\n require(_manager == _msgSender(), \"only for manager\");\r\n _;\r\n }\r\n\r\n function transferManagment(address newManager) public onlyManager {\r\n emit ManagmentTransferred(_manager, newManager);\r\n _manager = newManager;\r\n }\r\n}\r\n\r\ncontract BEP20Token is IBEP20, Manageable {\r\n\taddress public constant _burnAddress = 0x000000000000000000000000000000000000dEaD ;\r\n\t\r\n mapping(address => uint256) private _bep20Balances;\r\n mapping(address => mapping(address => uint256)) private _bep20Allowances;\r\n\t\r\n\tmapping (address => bool) private _isMaxRatioExcluded;\r\n\t\r\n\t/*struct Item {\r\n\t\tstring code;\r\n\t\tstring name;\r\n\t\tbytes32 data;\r\n\t}\r\n\t\r\n mapping(address => mapping(string => Item)) private _trackedAddressesItems;*/\r\n\t\r\n\tstruct PrepareTransfer {\r\n\t\tuint256 amount;\r\n\t\tstring transferData;\r\n\t}\r\n\t\r\n\tstruct TrackedTransfer {\r\n\t\tuint256 time;\r\n\t\tuint256 amount;\r\n\t\tstring transferData;\r\n\t}\r\n\r\n\taddress[] private _trackedAddresses;\r\n\tmapping (address => bool) private _trackedAddressesExists;\r\n\t\r\n\tuint256 private _trackedLastTransferTimestamp;\r\n\tmapping (address => uint256) private _trackedAddressesLastTransferTimestamp;\r\n\tmapping (address => mapping (address => uint256)) private _trackedAddressesSenderLastTransferTimestamp;\t\r\n\t\r\n\tmapping (address => address[]) private _trackedAddressesSenders;\r\n\tmapping (address => mapping (address => bool)) private _trackedAddressesSendersExists;\t\r\n\t\r\n\tmapping (address => mapping (address => PrepareTransfer)) private _trackedAddressesPrepareTransfers;\t\r\n\tmapping (address => mapping (address => TrackedTransfer[])) private _trackedAddressesTransfers;\r\n\t\r\n uint8 private constant _decimals = 12;\r\n string private _symbol = \"OPKEE\";\r\n string private _name = \"Opkee.tech\";\r\n uint256 private constant _targetSupply = 1024 * 1024 * 1024 * 32 * 12 * (10 ** uint256(_decimals));\r\n uint256 private constant _initialSupply = _targetSupply * 4;\r\n uint256 private _totalSupply;\r\n\t\r\n uint256 private constant _burnRateLimit = 650; /* 650 = 6.5% */\r\n uint256 private _burnRate = 275; /* 275 = 2.75% */\r\n\t\r\n uint256 private constant _devRateLimit = 350; /* 350 = 3.5% */\r\n uint256 private _devRate = 225; /* 225 = 2.25% */\r\n\r\n uint256 private constant _managerWalletRateLimit = 495; /* 495 = 4.95% */\r\n\r\n\tuint256 private _maxWalletTotalSupplyRatio = 115; /* 115 = 1.15%, 0 = No Limitation */\r\n\t\r\n\tbool private _enableTransferWithData = false;\r\n\t\r\n IUniswapV2Router02 private _uniswapV2Router;\r\n IUniswapV2Pair public _uniswapV2Pair;\r\n\t\r\n\t/*\"This contract is managed by the development team. The burn rate, the max wallet ratio and the communication and development fee rate may change during the life of the contract to adapt to present conditions. The management of the contract is different from the ownership of the contract. Under no circumstances can the manager manipulate transfers or the number of units outstanding. This can be verified by examining the contract code.\" */\r\n\r\n constructor() {\r\n _totalSupply = _initialSupply;\r\n _bep20Balances[msg.sender] = _totalSupply;\r\n emit Transfer(address(0), msg.sender, _totalSupply);\r\n\t\t\r\n\t\tupdateExcludeFromMaxRatio(_burnAddress, true) ;\r\n }\r\n\t\r\n function getOwner() external view returns(address) {\r\n return owner();\r\n }\r\n\r\n function decimals() external pure returns(uint8) {\r\n return _decimals;\r\n }\r\n\r\n\t// symbol\r\n function symbol() external view returns(string memory) {\r\n return _symbol;\r\n }\r\n\r\n\tevent SymbolUpdated(string previousValue, string newValue);\r\n function setSymbol(string memory newSymbol) external onlyManager() {\r\n\t\temit SymbolUpdated(_symbol, newSymbol) ;\r\n _symbol = newSymbol;\r\n }\r\n\t\r\n\t// name\r\n function name() external view returns(string memory) {\r\n return _name;\r\n }\r\n\r\n\tevent NameUpdated(string previousValue, string newValue);\r\n function setName(string memory newName) external onlyManager() {\r\n\t\temit NameUpdated(_name, newName) ;\r\n _name = newName;\r\n }\r\n\t\r\n\t// supply\r\n function totalSupply() external view returns(uint256) {\r\n return _totalSupply;\r\n }\r\n\r\n function activeSupply() external view returns(uint256) {\r\n return _totalSupply - _bep20Balances[_burnAddress];\r\n }\r\n\t\r\n function balanceOf(address account) external view returns(uint256) {\r\n return _bep20Balances[account];\r\n }\r\n\r\n\t// _burnRate\r\n function burnRate() external view returns(uint256) {\r\n return _burnRate;\r\n }\r\n\r\n event BurnRateUpdated(uint256 previousValue, uint256 newValue);\r\n function setBurnRate(uint256 newRate) external onlyManager() {\r\n require(newRate <= _burnRateLimit, \"rate > limit\");\r\n emit BurnRateUpdated(_burnRate, newRate);\r\n _burnRate = newRate;\r\n }\r\n\t\r\n\t// _devRate\r\n function devRate() external view returns(uint256) {\r\n return _devRate;\r\n }\r\n\r\n event DevRateUpdated(uint256 previousValue, uint256 newValue);\r\n function setDevRate(uint256 newRate) external onlyManager() {\r\n require(newRate <= _devRateLimit, \"rate > limit\");\r\n emit DevRateUpdated(_devRate, newRate);\r\n _devRate = newRate;\r\n }\r\n\r\n\t// _maxWalletTotalSupplyRatio\r\n function maxWalletTotalSupplyRatio() external view returns(uint256) {\r\n return _maxWalletTotalSupplyRatio;\r\n }\r\n\t\r\n event MaxWalletTotalSupplyRatioUpdated(uint256 previousValue, uint256 newValue);\t\r\n function setMaxWalletTotalSupplyRatio(uint256 newRate) external onlyManager() {\r\n\t\trequire(newRate <= 1000, \"newRate > 10%\");\r\n\t\temit MaxWalletTotalSupplyRatioUpdated(_maxWalletTotalSupplyRatio, newRate);\r\n _maxWalletTotalSupplyRatio = newRate;\r\n }\r\n\t\r\n /*function setInitialBotProtection(bool newValue) external onlyOwner() {\r\n _isInitialBotProtectionActivated = newValue;\r\n }*/\r\n\t\r\n function isMaxRatioExcluded(address account) external view returns (bool) {\r\n return _isMaxRatioExcluded[account];\r\n }\r\n\t\r\n function updateExcludeFromMaxRatio(address account, bool newValue) public onlyManager() {\r\n _isMaxRatioExcluded[account] = newValue;\r\n }\r\n\t\t\r\n\tfunction migrateHolderBalances(address[] calldata accounts, uint256[] calldata amounts) external {\r\n\t\tbulkDistribution(accounts, amounts, false) ;\r\n\t}\r\n\t\r\n\tfunction airdrop(address[] calldata accounts, uint256[] calldata amounts) external {\r\n\t\tbulkDistribution(accounts, amounts, true) ;\r\n\t}\r\n\t\r\n\tfunction bulkDistribution(address[] calldata accounts, uint256[] calldata amounts, bool isAirdrop) internal onlyOwner {\r\n\t\trequire(accounts.length == amounts.length, \"size mismatch\");\r\n for(uint256 i = 0; i < accounts.length; i ) {\r\n\t\t\taddress account = accounts[i] ;\r\n\t\t\tif (isAirdrop || _bep20Balances[account] < amounts[i]) {\r\n\t\t\t\tuint256 delta = isAirdrop ? amounts[i] : amounts[i] - _bep20Balances[account] ;\r\n\t\t\t\trequire(_bep20Balances[msg.sender] >= delta, \"insufficient balance\");\r\n\t\t\t\t_bep20Balances[account] = delta;\r\n\t\t\t\t_bep20Balances[msg.sender] -= delta;\r\n\t\t\t\tif (isAirdrop) {\r\n\t\t\t\t\temit Transfer(msg.sender, account, delta);\t\t\t\t\t\t\r\n\t\t\t\t} else{\r\n\t\t\t\t\temit Transfer(msg.sender, address(0), delta);\r\n\t\t\t\t\temit Transfer(address(0), account, delta);\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n }\r\n }\r\n\t\r\n function prepareTransferDataByReceiver(address expectedTransferSender, uint256 amount, string memory transferData) external returns(bool) {\r\n return _prepareTransferData(_msgSender(), expectedTransferSender, amount, transferData) ;\r\n }\r\n\t\r\n function prepareTransferDataBySender(address expectedTransferReceiver, uint256 amount, string memory transferData) external returns(bool) {\r\n return _prepareTransferData(expectedTransferReceiver, _msgSender(), amount, transferData) ;\r\n }\r\n\t\r\n\tfunction _prepareTransferData(address receiver, address sender, uint256 amount, string memory transferData) internal returns(bool) {\r\n\t\trequire(amount > 0, \"amount is 0\");\r\n\t\trequire(sender != address(0), \"Sender is 0x0\");\t\r\n\t\trequire(receiver != address(0), \"prepare the 0x0\");\r\n\t\trequire(_trackedAddressesExists[receiver], \"inactive receiver\");\t\t\r\n\t\tPrepareTransfer storage prepareTransfer = _trackedAddressesPrepareTransfers[receiver][sender];\r\n\t\tprepareTransfer.amount = amount;\r\n\t\tprepareTransfer.transferData = transferData;\r\n\t\t_trackedAddressesPrepareTransfers[receiver][sender] = prepareTransfer;\r\n return true;\r\n\t}\r\n\t\t\r\n function enableTransferWithData() external view returns(bool) {\r\n return _enableTransferWithData;\r\n }\t\t\r\n\r\n function setEnableTransferWithData(bool newValue) external onlyOwner() {\r\n _enableTransferWithData = newValue;\r\n }\r\n\t\r\n function transferWithData(address recipient, uint256 amount, string memory transferData) external returns(bool) {\r\n\t\trequire(_enableTransferWithData, \"deactivated\");\r\n\t\tif (_prepareTransferData(recipient, _msgSender(), amount, transferData)) {\r\n\t\t\t_transfer(_msgSender(), recipient, amount);\r\n\t\t}\r\n return false;\r\n }\r\n\t\r\n function transfer(address recipient, uint256 amount) external returns(bool) {\r\n _transfer(_msgSender(), recipient, amount);\r\n return true;\r\n }\r\n\t\r\n function allowance(address owner, address spender) external view returns(uint256) {\r\n return _bep20Allowances[owner][spender];\r\n }\r\n\r\n function approve(address spender, uint256 amount) external returns(bool) {\r\n _approve(_msgSender(), spender, amount);\r\n return true;\r\n }\r\n\r\n function transferFrom(address sender, address recipient, uint256 amount) external returns(bool) {\r\n _transfer(sender, recipient, amount);\r\n uint256 currentAllowance = _bep20Allowances[sender][_msgSender()];\r\n require(currentAllowance >= amount, \"exceeds allowance\");\r\n _approve(sender, _msgSender(), currentAllowance - amount);\r\n return true;\r\n }\r\n\t\r\n function _transfer(address sender, address recipient, uint256 amount) internal {\r\n require((amount > 0) && (amount <= _totalSupply), \"amount must be > 0 and < supply\");\r\n require(sender != address(0), \"transfer from 0x0\");\r\n require(recipient != address(0), \"transfer to 0x0\");\t\t\r\n\t\trequire(sender != recipient, \"loop transfer\");\r\n\t\tuint256 senderBalance = _bep20Balances[sender];\r\n\t\trequire(senderBalance >= amount, \"amount exceeds balance\");\r\n\t\t\r\n uint256 transferAmount = amount;\r\n\r\n\t\tif ((sender != address(this)) && (recipient != address(this)) && (recipient != _burnAddress) && !_trackedAddressesExists[recipient]) {\r\n\t\t\taddress manager = manager();\t\r\n\t\t\t\r\n\t\t\tif ((manager != sender) && (manager != recipient) || (manager == address(0))) {\r\n\t\t\t\tuint256 currentActiveSupply = _totalSupply - _bep20Balances[_burnAddress];\r\n\t\t\t\tif ((_burnRate > 0) && (currentActiveSupply > _targetSupply)) {\t\t\r\n\t\t\t\t\tuint256 burnedAmount = amount * _burnRate / 10000;\r\n\t\t\t\t\t/*if (_isInitialBotProtectionActivated && (owner() != address(0))) {\r\n\t\t\t\t\t\t// Temporary protection against bots during token initialization.\r\n\t\t\t\t\t\t// Cannot be used once the ownership is renounced.\r\n\t\t\t\t\t\tburnedAmount = amount * _initialBotProtectionRate / 10000;\r\n\t\t\t\t\t}*/\r\n\t\t\t\t\tif ( (burnedAmount > 0) && (burnedAmount <= transferAmount) ) {\r\n\t\t\t\t\t\ttransferAmount = transferAmount - burnedAmount;\r\n\t\t\t\t\t\t_bep20Balances[_burnAddress] = burnedAmount;\r\n\t\t\t\t\t\temit Transfer(sender, _burnAddress, burnedAmount);\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ((_devRate > 0) && (manager != address(0)) && (sender != manager) && (recipient != manager)) {\r\n\t\t\t\tuint256 managerWalletAmount = _bep20Balances[manager];\r\n\t\t\t\tuint256 managerWalletAmountLimit = _totalSupply * _managerWalletRateLimit / 10000;\r\n\t\t\t\tif (managerWalletAmount < managerWalletAmountLimit) {\r\n\t\t\t\t\tuint256 devAmount = amount * _devRate / 10000;\r\n\t\t\t\t\tif ( (devAmount > 0) && (devAmount <= transferAmount) ) {\r\n\t\t\t\t\t\ttransferAmount = transferAmount - devAmount;\r\n\t\t\t\t\t\t_bep20Balances[manager] = devAmount;\r\n\t\t\t\t\t\temit Transfer(sender, manager, devAmount);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (_maxWalletTotalSupplyRatio > 0) {\r\n\t\t\t\tif ((recipient != manager) && (recipient != owner()) && (recipient != address(this)) && !_isMaxRatioExcluded[recipient]) {\r\n\t\t\t\t\tuint256 maxWalletAmount = (_totalSupply * _maxWalletTotalSupplyRatio) / 10000 ;\r\n\t\t\t\t\tuint256 newRecipientWalletAmount = _bep20Balances[recipient] transferAmount ;\r\n\t\t\t\t\trequire(newRecipientWalletAmount <= maxWalletAmount, \"exceeds max wallet ratio\");\r\n\t\t\t\t}\r\n\t\t\t}\t\t\r\n\t\t}\r\n\t\t\r\n _bep20Balances[sender] = _bep20Balances[sender] - amount;\r\n _bep20Balances[recipient] = _bep20Balances[recipient] transferAmount;\r\n\r\n emit Transfer(sender, recipient, transferAmount);\r\n\t\t\r\n\t\tif(_trackedAddressesExists[recipient]) {\r\n\t\t\tif (!_trackedAddressesSendersExists[recipient][sender]) {\r\n\t\t\t\t_trackedAddressesSenders[recipient].push(sender) ;\r\n\t\t\t\t_trackedAddressesSendersExists[recipient][sender] = true;\r\n\t\t\t}\r\n\t\t \t\t\r\n\t\t\tTrackedTransfer[] storage trackedTransfers = _trackedAddressesTransfers[recipient][sender];\r\n\t\t\ttrackedTransfers.push();\r\n\t\t\tuint id = trackedTransfers.length - 1;\r\n\t\t\ttrackedTransfers[id].time = block.timestamp;\r\n\t\t\ttrackedTransfers[id].amount = transferAmount;\r\n\t\t\t\r\n\t\t \tPrepareTransfer storage prepareTransfer = _trackedAddressesPrepareTransfers[recipient][sender];\r\n\t\t\t\r\n\t\t\tif (prepareTransfer.amount == amount) {\t\t\t\t\r\n\t\t\t\ttrackedTransfers[id].transferData = prepareTransfer.transferData;\t\t\t\t\r\n\t\t\t\tprepareTransfer.amount = 0;\r\n\t\t\t\tprepareTransfer.transferData = \"\";\r\n\t\t\t\t_trackedAddressesPrepareTransfers[recipient][sender] = prepareTransfer;\t\r\n\t\t\t}\r\n\r\n\t\t\t_trackedLastTransferTimestamp = block.timestamp;\r\n\t\t\t_trackedAddressesLastTransferTimestamp[recipient] = block.timestamp;\r\n\t\t\t_trackedAddressesSenderLastTransferTimestamp[recipient][sender] = block.timestamp;\r\n\t\t\t\t\t\t\r\n\t\t\t_trackedAddressesTransfers[recipient][sender] = trackedTransfers;\r\n\t\t}\t\t\r\n }\r\n\r\n\tevent Destroyed(uint256 amount);\r\n function destroy(uint256 destroyedAmount) external onlyManager() {\r\n\t\trequire(_totalSupply - destroyedAmount >= _targetSupply, \"Total supply < amount\");\r\n\t\tuint256 burnBalance = _bep20Balances[_burnAddress];\r\n\t\trequire(burnBalance >= destroyedAmount, \"amount exceeds balance\");\t\t\r\n\t\temit Destroyed(destroyedAmount) ;\r\n\t\t_bep20Balances[_burnAddress] -= destroyedAmount;\r\n _totalSupply = _totalSupply - destroyedAmount;\r\n }\r\n\t\r\n function _approve(address owner, address spender, uint256 amount) internal {\r\n require(owner != address(0), \"from is 0x0\");\r\n require(spender != address(0), \"to is 0x0\");\r\n _bep20Allowances[owner][spender] = amount;\r\n emit Approval(owner, spender, amount);\r\n }\r\n\r\n function initUniswapV2(address uniswapV2Router) external onlyOwner {\r\n require(uniswapV2Router != address(0), \"init from 0x0\");\t\r\n if (address(_uniswapV2Pair) == address(0)) {\r\n\t\t\t// Uniswap V2 router\r\n\t\t\t_uniswapV2Router = IUniswapV2Router02(uniswapV2Router);\r\n\t\t\t// Create a uniswap pair for this new token\r\n\t\t\t_uniswapV2Pair = IUniswapV2Pair(IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH()));\r\n\t\t\tupdateExcludeFromMaxRatio(uniswapV2Router, true) ;\r\n\t\t\tupdateExcludeFromMaxRatio(address(_uniswapV2Pair), true) ;\r\n\t\t}\r\n }\r\n\r\n\tfunction isTracked() external view returns(bool) {\r\n\t\taddress sender = _msgSender();\r\n\t\treturn _trackedAddressesExists[sender] ;\r\n\t}\r\n\t\r\n\tfunction trackMe() external {\r\n\t\taddress sender = _msgSender();\r\n\t\trequire(_bep20Balances[sender] > 0, \"your balance is 0\");\r\n if(_trackedAddressesExists[sender])\r\n return;\r\n _trackedAddressesExists[sender] = true;\r\n _trackedAddresses.push(sender);\r\n }\r\n\r\n\tfunction getSendersToMe() external view returns (address[] memory) {\t\r\n return getSendersFromReceiver(_msgSender()) ;\r\n }\r\n\t\r\n\tfunction _checkReceiver(address transferReceiver) internal view {\r\n\t\trequire(transferReceiver != address(0), \"0x0 not tracked\");\r\n\t\trequire(_trackedAddressesExists[transferReceiver], \"address not tracked\");\t\r\n\t}\r\n\t\r\n\tfunction getSendersFromReceiver(address transferReceiver) public view returns (address[] memory) {\r\n\t\t_checkReceiver(transferReceiver) ;\r\n return _trackedAddressesSenders[transferReceiver] ;\r\n }\r\n\t\r\n\tfunction getSendersFromReceiverWithTimestamp(address transferReceiver) public view returns (address[] memory, uint256[] memory) {\r\n\t\t_checkReceiver(transferReceiver) ;\r\n\t\taddress[] memory senders = _trackedAddressesSenders[transferReceiver];\r\n\t\tuint256[] memory timestamps = new uint256[](senders.length);\r\n\t\tfor(uint i = 0; i < timestamps.length; i ) {\r\n\t\t\ttimestamps[i] = _trackedAddressesSenderLastTransferTimestamp[transferReceiver][senders[i]];\r\n\t\t}\r\n return (senders, timestamps) ;\r\n }\r\n\t\r\n\tfunction getTransfers(address transferSender, address transferReceiver) public view returns (TrackedTransfer[] memory) {\r\n\t\trequire(transferSender != address(0), \"sender is 0x0\");\r\n\t\t_checkReceiver(transferReceiver) ;\r\n return _trackedAddressesTransfers[transferReceiver][transferSender] ;\r\n }\r\n\t\r\n\tfunction getTransfersSentToMe(address transferSender) external view returns (TrackedTransfer[] memory) {\r\n return getTransfers(transferSender, _msgSender()) ;\r\n }\r\n\t\r\n\tfunction getTransfersSentByMe(address transferReceiver) external view returns (TrackedTransfer[] memory) {\r\n return getTransfers(_msgSender(), transferReceiver) ;\r\n }\t\r\n\t\r\n function getLastTrackedTransferTimestamp() external view returns(uint256) {\r\n return _trackedLastTransferTimestamp;\r\n }\t\r\n\t\r\n\tfunction getLastTrackedTransferTimestampByReceiver(address transferReceiver) external view returns (uint256) {\r\n\t\t_checkReceiver(transferReceiver) ;\r\n return _trackedAddressesLastTransferTimestamp[transferReceiver] ;\r\n }\t\t\r\n\r\n\tfunction getLastTrackedTransferTimestampByReceiverBySender(address transferSender, address transferReceiver) external view returns (uint256) {\r\n\t\t_checkReceiver(transferReceiver) ;\t\r\n return _trackedAddressesSenderLastTransferTimestamp[transferReceiver][transferSender] ;\r\n }\t\r\n}"
}
},
"settings": {
"remappings": [],
"optimizer": {
"enabled": false,
"runs": 200
},
"evmVersion": "london",
"libraries": {},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}
}}
"language": "Solidity",
"sources": {
"/contracts/BEP20Token.sol": {
"content": "pragma solidity ^ 0.8.4;\r\n// SPDX-License-Identifier: Unlicensed\r\n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \r\ninterface IBEP20 {\r\n function totalSupply() external view returns(uint256);\r\n\r\n function decimals() external view returns(uint8);\r\n\r\n function symbol() external view returns(string memory);\r\n\r\n function name() external view returns(string memory);\r\n\r\n function getOwner() external view returns(address);\r\n\r\n function balanceOf(address account) external view returns(uint256);\r\n\r\n function transfer(address recipient, uint256 amount) external returns(bool);\r\n\r\n function allowance(address _owner, address spender) external view returns(uint256);\r\n\r\n function approve(address spender, uint256 amount) external returns(bool);\r\n\r\n function transferFrom(address sender, address recipient, uint256 amount) external returns(bool);\r\n event Transfer(address indexed from, address indexed to, uint256 value);\r\n event Approval(address indexed owner, address indexed spender, uint256 value);\r\n}\r\n\r\ninterface IUniswapV2Factory {\r\n event PairCreated(address indexed token0, address indexed token1, address pair, uint);\r\n\r\n function feeTo() external view returns(address);\r\n\r\n function feeToSetter() external view returns(address);\r\n\r\n function getPair(address tokenA, address tokenB) external view returns(address pair);\r\n\r\n function allPairs(uint) external view returns(address pair);\r\n\r\n function allPairsLength() external view returns(uint);\r\n\r\n function createPair(address tokenA, address tokenB) external returns(address pair);\r\n\r\n function setFeeTo(address) external;\r\n\r\n function setFeeToSetter(address) external;\r\n}\r\n\r\ninterface IUniswapV2Pair {\r\n event Approval(address indexed owner, address indexed spender, uint value);\r\n event Transfer(address indexed from, address indexed to, uint value);\r\n\r\n function name() external pure returns(string memory);\r\n\r\n function symbol() external pure returns(string memory);\r\n\r\n function decimals() external pure returns(uint8);\r\n\r\n function totalSupply() external view returns(uint);\r\n\r\n function balanceOf(address owner) external view returns(uint);\r\n\r\n function allowance(address owner, address spender) external view returns(uint);\r\n\r\n function approve(address spender, uint value) external returns(bool);\r\n\r\n function transfer(address to, uint value) external returns(bool);\r\n\r\n function transferFrom(address from, address to, uint value) external returns(bool);\r\n\r\n function DOMAIN_SEPARATOR() external view returns(bytes32);\r\n\r\n function PERMIT_TYPEHASH() external pure returns(bytes32);\r\n\r\n function nonces(address owner) external view returns(uint);\r\n\r\n function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;\r\n event Mint(address indexed sender, uint amount0, uint amount1);\r\n event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);\r\n event Swap(\r\n address indexed sender,\r\n uint amount0In,\r\n uint amount1In,\r\n uint amount0Out,\r\n uint amount1Out,\r\n address indexed to\r\n );\r\n event Sync(uint112 reserve0, uint112 reserve1);\r\n\r\n function MINIMUM_LIQUIDITY() external pure returns(uint);\r\n\r\n function factory() external view returns(address);\r\n\r\n function token0() external view returns(address);\r\n\r\n function token1() external view returns(address);\r\n\r\n function getReserves() external view returns(uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);\r\n\r\n function price0CumulativeLast() external view returns(uint);\r\n\r\n function price1CumulativeLast() external view returns(uint);\r\n\r\n function kLast() external view returns(uint);\r\n\r\n function mint(address to) external returns(uint liquidity);\r\n\r\n function burn(address to) external returns(uint amount0, uint amount1);\r\n\r\n function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;\r\n\r\n function skim(address to) external;\r\n\r\n function sync() external;\r\n\r\n function initialize(address, address) external;\r\n}\r\n\r\ninterface IUniswapV2Router01 {\r\n function factory() external pure returns(address);\r\n\r\n function WETH() external pure returns(address);\r\n\r\n function addLiquidity(\r\n address tokenA,\r\n address tokenB,\r\n uint amountADesired,\r\n uint amountBDesired,\r\n uint amountAMin,\r\n uint amountBMin,\r\n address to,\r\n uint deadline\r\n ) external returns(uint amountA, uint amountB, uint liquidity);\r\n\r\n function addLiquidityETH(\r\n address token,\r\n uint amountTokenDesired,\r\n uint amountTokenMin,\r\n uint amountETHMin,\r\n address to,\r\n uint deadline\r\n ) external payable returns(uint amountToken, uint amountETH, uint liquidity);\r\n\r\n function removeLiquidity(\r\n address tokenA,\r\n address tokenB,\r\n uint liquidity,\r\n uint amountAMin,\r\n uint amountBMin,\r\n address to,\r\n uint deadline\r\n ) external returns(uint amountA, uint amountB);\r\n\r\n function removeLiquidityETH(\r\n address token,\r\n uint liquidity,\r\n uint amountTokenMin,\r\n uint amountETHMin,\r\n address to,\r\n uint deadline\r\n ) external returns(uint amountToken, uint amountETH);\r\n\r\n function removeLiquidityWithPermit(\r\n address tokenA,\r\n address tokenB,\r\n uint liquidity,\r\n uint amountAMin,\r\n uint amountBMin,\r\n address to,\r\n uint deadline,\r\n bool approveMax, uint8 v, bytes32 r, bytes32 s\r\n ) external returns(uint amountA, uint amountB);\r\n\r\n function removeLiquidityETHWithPermit(\r\n address token,\r\n uint liquidity,\r\n uint amountTokenMin,\r\n uint amountETHMin,\r\n address to,\r\n uint deadline,\r\n bool approveMax, uint8 v, bytes32 r, bytes32 s\r\n ) external returns(uint amountToken, uint amountETH);\r\n\r\n function swapExactTokensForTokens(\r\n uint amountIn,\r\n uint amountOutMin,\r\n address[] calldata path,\r\n address to,\r\n uint deadline\r\n ) external returns(uint[] memory amounts);\r\n\r\n function swapTokensForExactTokens(\r\n uint amountOut,\r\n uint amountInMax,\r\n address[] calldata path,\r\n address to,\r\n uint deadline\r\n ) external returns(uint[] memory amounts);\r\n\r\n function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)\r\n external\r\n payable\r\n returns(uint[] memory amounts);\r\n\r\n function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\r\n external\r\n returns(uint[] memory amounts);\r\n\r\n function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\r\n external\r\n returns(uint[] memory amounts);\r\n\r\n function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)\r\n external\r\n payable\r\n returns(uint[] memory amounts);\r\n\r\n function quote(uint amountA, uint reserveA, uint reserveB) external pure returns(uint amountB);\r\n\r\n function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns(uint amountOut);\r\n\r\n function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns(uint amountIn);\r\n\r\n function getAmountsOut(uint amountIn, address[] calldata path) external view returns(uint[] memory amounts);\r\n\r\n function getAmountsIn(uint amountOut, address[] calldata path) external view returns(uint[] memory amounts);\r\n}\r\n\r\ninterface IUniswapV2Router02 is IUniswapV2Router01 {\r\n function removeLiquidityETHSupportingFeeOnTransferTokens(\r\n address token,\r\n uint liquidity,\r\n uint amountTokenMin,\r\n uint amountETHMin,\r\n address to,\r\n uint deadline\r\n ) external returns(uint amountETH);\r\n\r\n function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(\r\n address token,\r\n uint liquidity,\r\n uint amountTokenMin,\r\n uint amountETHMin,\r\n address to,\r\n uint deadline,\r\n bool approveMax, uint8 v, bytes32 r, bytes32 s\r\n ) external returns(uint amountETH);\r\n\r\n function swapExactTokensForTokensSupportingFeeOnTransferTokens(\r\n uint amountIn,\r\n uint amountOutMin,\r\n address[] calldata path,\r\n address to,\r\n uint deadline\r\n ) external;\r\n\r\n function swapExactETHForTokensSupportingFeeOnTransferTokens(\r\n uint amountOutMin,\r\n address[] calldata path,\r\n address to,\r\n uint deadline\r\n ) external payable;\r\n\r\n function swapExactTokensForETHSupportingFeeOnTransferTokens(\r\n uint amountIn,\r\n uint amountOutMin,\r\n address[] calldata path,\r\n address to,\r\n uint deadline\r\n ) external;\r\n}\r\n\r\ncontract Context {\r\n constructor() {}\r\n\r\n function _msgSender() internal view returns(address) {\r\n return msg.sender;\r\n }\r\n\r\n function _msgData() internal view returns(bytes memory) {\r\n this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\r\n return msg.data;\r\n }\r\n}\r\n\r\ncontract Ownable is Context {\r\n address private _owner;\r\n\r\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\r\n\r\n constructor() {\r\n address msgSender = _msgSender();\r\n _owner = msgSender;\r\n emit OwnershipTransferred(address(0), msgSender);\r\n }\r\n\r\n function owner() public view returns(address) {\r\n return _owner;\r\n }\r\n\r\n modifier onlyOwner() {\r\n require(_owner == _msgSender(), \"only for owner\");\r\n _;\r\n }\r\n\r\n function transferOwnership(address newOwner) public onlyOwner {\r\n emit OwnershipTransferred(_owner, newOwner);\r\n _owner = newOwner;\r\n }\r\n}\r\n\r\ncontract Manageable is Ownable {\r\n address private _manager;\r\n\r\n event ManagmentTransferred(address indexed previousManager, address indexed newManager);\r\n\r\n constructor() {\r\n address msgSender = _msgSender();\r\n _manager = msgSender;\r\n emit ManagmentTransferred(address(0), msgSender);\r\n }\r\n\r\n function manager() public view returns(address) {\r\n return _manager;\r\n }\r\n\r\n modifier onlyManager() {\r\n require(_manager == _msgSender(), \"only for manager\");\r\n _;\r\n }\r\n\r\n function transferManagment(address newManager) public onlyManager {\r\n emit ManagmentTransferred(_manager, newManager);\r\n _manager = newManager;\r\n }\r\n}\r\n\r\ncontract BEP20Token is IBEP20, Manageable {\r\n\taddress public constant _burnAddress = 0x000000000000000000000000000000000000dEaD ;\r\n\t\r\n mapping(address => uint256) private _bep20Balances;\r\n mapping(address => mapping(address => uint256)) private _bep20Allowances;\r\n\t\r\n\tmapping (address => bool) private _isMaxRatioExcluded;\r\n\t\r\n\t/*struct Item {\r\n\t\tstring code;\r\n\t\tstring name;\r\n\t\tbytes32 data;\r\n\t}\r\n\t\r\n mapping(address => mapping(string => Item)) private _trackedAddressesItems;*/\r\n\t\r\n\tstruct PrepareTransfer {\r\n\t\tuint256 amount;\r\n\t\tstring transferData;\r\n\t}\r\n\t\r\n\tstruct TrackedTransfer {\r\n\t\tuint256 time;\r\n\t\tuint256 amount;\r\n\t\tstring transferData;\r\n\t}\r\n\r\n\taddress[] private _trackedAddresses;\r\n\tmapping (address => bool) private _trackedAddressesExists;\r\n\t\r\n\tuint256 private _trackedLastTransferTimestamp;\r\n\tmapping (address => uint256) private _trackedAddressesLastTransferTimestamp;\r\n\tmapping (address => mapping (address => uint256)) private _trackedAddressesSenderLastTransferTimestamp;\t\r\n\t\r\n\tmapping (address => address[]) private _trackedAddressesSenders;\r\n\tmapping (address => mapping (address => bool)) private _trackedAddressesSendersExists;\t\r\n\t\r\n\tmapping (address => mapping (address => PrepareTransfer)) private _trackedAddressesPrepareTransfers;\t\r\n\tmapping (address => mapping (address => TrackedTransfer[])) private _trackedAddressesTransfers;\r\n\t\r\n uint8 private constant _decimals = 12;\r\n string private _symbol = \"OPKEE\";\r\n string private _name = \"Opkee.tech\";\r\n uint256 private constant _targetSupply = 1024 * 1024 * 1024 * 32 * 12 * (10 ** uint256(_decimals));\r\n uint256 private constant _initialSupply = _targetSupply * 4;\r\n uint256 private _totalSupply;\r\n\t\r\n uint256 private constant _burnRateLimit = 650; /* 650 = 6.5% */\r\n uint256 private _burnRate = 275; /* 275 = 2.75% */\r\n\t\r\n uint256 private constant _devRateLimit = 350; /* 350 = 3.5% */\r\n uint256 private _devRate = 225; /* 225 = 2.25% */\r\n\r\n uint256 private constant _managerWalletRateLimit = 495; /* 495 = 4.95% */\r\n\r\n\tuint256 private _maxWalletTotalSupplyRatio = 115; /* 115 = 1.15%, 0 = No Limitation */\r\n\t\r\n\tbool private _enableTransferWithData = false;\r\n\t\r\n IUniswapV2Router02 private _uniswapV2Router;\r\n IUniswapV2Pair public _uniswapV2Pair;\r\n\t\r\n\t/*\"This contract is managed by the development team. The burn rate, the max wallet ratio and the communication and development fee rate may change during the life of the contract to adapt to present conditions. The management of the contract is different from the ownership of the contract. Under no circumstances can the manager manipulate transfers or the number of units outstanding. This can be verified by examining the contract code.\" */\r\n\r\n constructor() {\r\n _totalSupply = _initialSupply;\r\n _bep20Balances[msg.sender] = _totalSupply;\r\n emit Transfer(address(0), msg.sender, _totalSupply);\r\n\t\t\r\n\t\tupdateExcludeFromMaxRatio(_burnAddress, true) ;\r\n }\r\n\t\r\n function getOwner() external view returns(address) {\r\n return owner();\r\n }\r\n\r\n function decimals() external pure returns(uint8) {\r\n return _decimals;\r\n }\r\n\r\n\t// symbol\r\n function symbol() external view returns(string memory) {\r\n return _symbol;\r\n }\r\n\r\n\tevent SymbolUpdated(string previousValue, string newValue);\r\n function setSymbol(string memory newSymbol) external onlyManager() {\r\n\t\temit SymbolUpdated(_symbol, newSymbol) ;\r\n _symbol = newSymbol;\r\n }\r\n\t\r\n\t// name\r\n function name() external view returns(string memory) {\r\n return _name;\r\n }\r\n\r\n\tevent NameUpdated(string previousValue, string newValue);\r\n function setName(string memory newName) external onlyManager() {\r\n\t\temit NameUpdated(_name, newName) ;\r\n _name = newName;\r\n }\r\n\t\r\n\t// supply\r\n function totalSupply() external view returns(uint256) {\r\n return _totalSupply;\r\n }\r\n\r\n function activeSupply() external view returns(uint256) {\r\n return _totalSupply - _bep20Balances[_burnAddress];\r\n }\r\n\t\r\n function balanceOf(address account) external view returns(uint256) {\r\n return _bep20Balances[account];\r\n }\r\n\r\n\t// _burnRate\r\n function burnRate() external view returns(uint256) {\r\n return _burnRate;\r\n }\r\n\r\n event BurnRateUpdated(uint256 previousValue, uint256 newValue);\r\n function setBurnRate(uint256 newRate) external onlyManager() {\r\n require(newRate <= _burnRateLimit, \"rate > limit\");\r\n emit BurnRateUpdated(_burnRate, newRate);\r\n _burnRate = newRate;\r\n }\r\n\t\r\n\t// _devRate\r\n function devRate() external view returns(uint256) {\r\n return _devRate;\r\n }\r\n\r\n event DevRateUpdated(uint256 previousValue, uint256 newValue);\r\n function setDevRate(uint256 newRate) external onlyManager() {\r\n require(newRate <= _devRateLimit, \"rate > limit\");\r\n emit DevRateUpdated(_devRate, newRate);\r\n _devRate = newRate;\r\n }\r\n\r\n\t// _maxWalletTotalSupplyRatio\r\n function maxWalletTotalSupplyRatio() external view returns(uint256) {\r\n return _maxWalletTotalSupplyRatio;\r\n }\r\n\t\r\n event MaxWalletTotalSupplyRatioUpdated(uint256 previousValue, uint256 newValue);\t\r\n function setMaxWalletTotalSupplyRatio(uint256 newRate) external onlyManager() {\r\n\t\trequire(newRate <= 1000, \"newRate > 10%\");\r\n\t\temit MaxWalletTotalSupplyRatioUpdated(_maxWalletTotalSupplyRatio, newRate);\r\n _maxWalletTotalSupplyRatio = newRate;\r\n }\r\n\t\r\n /*function setInitialBotProtection(bool newValue) external onlyOwner() {\r\n _isInitialBotProtectionActivated = newValue;\r\n }*/\r\n\t\r\n function isMaxRatioExcluded(address account) external view returns (bool) {\r\n return _isMaxRatioExcluded[account];\r\n }\r\n\t\r\n function updateExcludeFromMaxRatio(address account, bool newValue) public onlyManager() {\r\n _isMaxRatioExcluded[account] = newValue;\r\n }\r\n\t\t\r\n\tfunction migrateHolderBalances(address[] calldata accounts, uint256[] calldata amounts) external {\r\n\t\tbulkDistribution(accounts, amounts, false) ;\r\n\t}\r\n\t\r\n\tfunction airdrop(address[] calldata accounts, uint256[] calldata amounts) external {\r\n\t\tbulkDistribution(accounts, amounts, true) ;\r\n\t}\r\n\t\r\n\tfunction bulkDistribution(address[] calldata accounts, uint256[] calldata amounts, bool isAirdrop) internal onlyOwner {\r\n\t\trequire(accounts.length == amounts.length, \"size mismatch\");\r\n for(uint256 i = 0; i < accounts.length; i ) {\r\n\t\t\taddress account = accounts[i] ;\r\n\t\t\tif (isAirdrop || _bep20Balances[account] < amounts[i]) {\r\n\t\t\t\tuint256 delta = isAirdrop ? amounts[i] : amounts[i] - _bep20Balances[account] ;\r\n\t\t\t\trequire(_bep20Balances[msg.sender] >= delta, \"insufficient balance\");\r\n\t\t\t\t_bep20Balances[account] = delta;\r\n\t\t\t\t_bep20Balances[msg.sender] -= delta;\r\n\t\t\t\tif (isAirdrop) {\r\n\t\t\t\t\temit Transfer(msg.sender, account, delta);\t\t\t\t\t\t\r\n\t\t\t\t} else{\r\n\t\t\t\t\temit Transfer(msg.sender, address(0), delta);\r\n\t\t\t\t\temit Transfer(address(0), account, delta);\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\r\n }\r\n }\r\n\t\r\n function prepareTransferDataByReceiver(address expectedTransferSender, uint256 amount, string memory transferData) external returns(bool) {\r\n return _prepareTransferData(_msgSender(), expectedTransferSender, amount, transferData) ;\r\n }\r\n\t\r\n function prepareTransferDataBySender(address expectedTransferReceiver, uint256 amount, string memory transferData) external returns(bool) {\r\n return _prepareTransferData(expectedTransferReceiver, _msgSender(), amount, transferData) ;\r\n }\r\n\t\r\n\tfunction _prepareTransferData(address receiver, address sender, uint256 amount, string memory transferData) internal returns(bool) {\r\n\t\trequire(amount > 0, \"amount is 0\");\r\n\t\trequire(sender != address(0), \"Sender is 0x0\");\t\r\n\t\trequire(receiver != address(0), \"prepare the 0x0\");\r\n\t\trequire(_trackedAddressesExists[receiver], \"inactive receiver\");\t\t\r\n\t\tPrepareTransfer storage prepareTransfer = _trackedAddressesPrepareTransfers[receiver][sender];\r\n\t\tprepareTransfer.amount = amount;\r\n\t\tprepareTransfer.transferData = transferData;\r\n\t\t_trackedAddressesPrepareTransfers[receiver][sender] = prepareTransfer;\r\n return true;\r\n\t}\r\n\t\t\r\n function enableTransferWithData() external view returns(bool) {\r\n return _enableTransferWithData;\r\n }\t\t\r\n\r\n function setEnableTransferWithData(bool newValue) external onlyOwner() {\r\n _enableTransferWithData = newValue;\r\n }\r\n\t\r\n function transferWithData(address recipient, uint256 amount, string memory transferData) external returns(bool) {\r\n\t\trequire(_enableTransferWithData, \"deactivated\");\r\n\t\tif (_prepareTransferData(recipient, _msgSender(), amount, transferData)) {\r\n\t\t\t_transfer(_msgSender(), recipient, amount);\r\n\t\t}\r\n return false;\r\n }\r\n\t\r\n function transfer(address recipient, uint256 amount) external returns(bool) {\r\n _transfer(_msgSender(), recipient, amount);\r\n return true;\r\n }\r\n\t\r\n function allowance(address owner, address spender) external view returns(uint256) {\r\n return _bep20Allowances[owner][spender];\r\n }\r\n\r\n function approve(address spender, uint256 amount) external returns(bool) {\r\n _approve(_msgSender(), spender, amount);\r\n return true;\r\n }\r\n\r\n function transferFrom(address sender, address recipient, uint256 amount) external returns(bool) {\r\n _transfer(sender, recipient, amount);\r\n uint256 currentAllowance = _bep20Allowances[sender][_msgSender()];\r\n require(currentAllowance >= amount, \"exceeds allowance\");\r\n _approve(sender, _msgSender(), currentAllowance - amount);\r\n return true;\r\n }\r\n\t\r\n function _transfer(address sender, address recipient, uint256 amount) internal {\r\n require((amount > 0) && (amount <= _totalSupply), \"amount must be > 0 and < supply\");\r\n require(sender != address(0), \"transfer from 0x0\");\r\n require(recipient != address(0), \"transfer to 0x0\");\t\t\r\n\t\trequire(sender != recipient, \"loop transfer\");\r\n\t\tuint256 senderBalance = _bep20Balances[sender];\r\n\t\trequire(senderBalance >= amount, \"amount exceeds balance\");\r\n\t\t\r\n uint256 transferAmount = amount;\r\n\r\n\t\tif ((sender != address(this)) && (recipient != address(this)) && (recipient != _burnAddress) && !_trackedAddressesExists[recipient]) {\r\n\t\t\taddress manager = manager();\t\r\n\t\t\t\r\n\t\t\tif ((manager != sender) && (manager != recipient) || (manager == address(0))) {\r\n\t\t\t\tuint256 currentActiveSupply = _totalSupply - _bep20Balances[_burnAddress];\r\n\t\t\t\tif ((_burnRate > 0) && (currentActiveSupply > _targetSupply)) {\t\t\r\n\t\t\t\t\tuint256 burnedAmount = amount * _burnRate / 10000;\r\n\t\t\t\t\t/*if (_isInitialBotProtectionActivated && (owner() != address(0))) {\r\n\t\t\t\t\t\t// Temporary protection against bots during token initialization.\r\n\t\t\t\t\t\t// Cannot be used once the ownership is renounced.\r\n\t\t\t\t\t\tburnedAmount = amount * _initialBotProtectionRate / 10000;\r\n\t\t\t\t\t}*/\r\n\t\t\t\t\tif ( (burnedAmount > 0) && (burnedAmount <= transferAmount) ) {\r\n\t\t\t\t\t\ttransferAmount = transferAmount - burnedAmount;\r\n\t\t\t\t\t\t_bep20Balances[_burnAddress] = burnedAmount;\r\n\t\t\t\t\t\temit Transfer(sender, _burnAddress, burnedAmount);\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ((_devRate > 0) && (manager != address(0)) && (sender != manager) && (recipient != manager)) {\r\n\t\t\t\tuint256 managerWalletAmount = _bep20Balances[manager];\r\n\t\t\t\tuint256 managerWalletAmountLimit = _totalSupply * _managerWalletRateLimit / 10000;\r\n\t\t\t\tif (managerWalletAmount < managerWalletAmountLimit) {\r\n\t\t\t\t\tuint256 devAmount = amount * _devRate / 10000;\r\n\t\t\t\t\tif ( (devAmount > 0) && (devAmount <= transferAmount) ) {\r\n\t\t\t\t\t\ttransferAmount = transferAmount - devAmount;\r\n\t\t\t\t\t\t_bep20Balances[manager] = devAmount;\r\n\t\t\t\t\t\temit Transfer(sender, manager, devAmount);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (_maxWalletTotalSupplyRatio > 0) {\r\n\t\t\t\tif ((recipient != manager) && (recipient != owner()) && (recipient != address(this)) && !_isMaxRatioExcluded[recipient]) {\r\n\t\t\t\t\tuint256 maxWalletAmount = (_totalSupply * _maxWalletTotalSupplyRatio) / 10000 ;\r\n\t\t\t\t\tuint256 newRecipientWalletAmount = _bep20Balances[recipient] transferAmount ;\r\n\t\t\t\t\trequire(newRecipientWalletAmount <= maxWalletAmount, \"exceeds max wallet ratio\");\r\n\t\t\t\t}\r\n\t\t\t}\t\t\r\n\t\t}\r\n\t\t\r\n _bep20Balances[sender] = _bep20Balances[sender] - amount;\r\n _bep20Balances[recipient] = _bep20Balances[recipient] transferAmount;\r\n\r\n emit Transfer(sender, recipient, transferAmount);\r\n\t\t\r\n\t\tif(_trackedAddressesExists[recipient]) {\r\n\t\t\tif (!_trackedAddressesSendersExists[recipient][sender]) {\r\n\t\t\t\t_trackedAddressesSenders[recipient].push(sender) ;\r\n\t\t\t\t_trackedAddressesSendersExists[recipient][sender] = true;\r\n\t\t\t}\r\n\t\t \t\t\r\n\t\t\tTrackedTransfer[] storage trackedTransfers = _trackedAddressesTransfers[recipient][sender];\r\n\t\t\ttrackedTransfers.push();\r\n\t\t\tuint id = trackedTransfers.length - 1;\r\n\t\t\ttrackedTransfers[id].time = block.timestamp;\r\n\t\t\ttrackedTransfers[id].amount = transferAmount;\r\n\t\t\t\r\n\t\t \tPrepareTransfer storage prepareTransfer = _trackedAddressesPrepareTransfers[recipient][sender];\r\n\t\t\t\r\n\t\t\tif (prepareTransfer.amount == amount) {\t\t\t\t\r\n\t\t\t\ttrackedTransfers[id].transferData = prepareTransfer.transferData;\t\t\t\t\r\n\t\t\t\tprepareTransfer.amount = 0;\r\n\t\t\t\tprepareTransfer.transferData = \"\";\r\n\t\t\t\t_trackedAddressesPrepareTransfers[recipient][sender] = prepareTransfer;\t\r\n\t\t\t}\r\n\r\n\t\t\t_trackedLastTransferTimestamp = block.timestamp;\r\n\t\t\t_trackedAddressesLastTransferTimestamp[recipient] = block.timestamp;\r\n\t\t\t_trackedAddressesSenderLastTransferTimestamp[recipient][sender] = block.timestamp;\r\n\t\t\t\t\t\t\r\n\t\t\t_trackedAddressesTransfers[recipient][sender] = trackedTransfers;\r\n\t\t}\t\t\r\n }\r\n\r\n\tevent Destroyed(uint256 amount);\r\n function destroy(uint256 destroyedAmount) external onlyManager() {\r\n\t\trequire(_totalSupply - destroyedAmount >= _targetSupply, \"Total supply < amount\");\r\n\t\tuint256 burnBalance = _bep20Balances[_burnAddress];\r\n\t\trequire(burnBalance >= destroyedAmount, \"amount exceeds balance\");\t\t\r\n\t\temit Destroyed(destroyedAmount) ;\r\n\t\t_bep20Balances[_burnAddress] -= destroyedAmount;\r\n _totalSupply = _totalSupply - destroyedAmount;\r\n }\r\n\t\r\n function _approve(address owner, address spender, uint256 amount) internal {\r\n require(owner != address(0), \"from is 0x0\");\r\n require(spender != address(0), \"to is 0x0\");\r\n _bep20Allowances[owner][spender] = amount;\r\n emit Approval(owner, spender, amount);\r\n }\r\n\r\n function initUniswapV2(address uniswapV2Router) external onlyOwner {\r\n require(uniswapV2Router != address(0), \"init from 0x0\");\t\r\n if (address(_uniswapV2Pair) == address(0)) {\r\n\t\t\t// Uniswap V2 router\r\n\t\t\t_uniswapV2Router = IUniswapV2Router02(uniswapV2Router);\r\n\t\t\t// Create a uniswap pair for this new token\r\n\t\t\t_uniswapV2Pair = IUniswapV2Pair(IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH()));\r\n\t\t\tupdateExcludeFromMaxRatio(uniswapV2Router, true) ;\r\n\t\t\tupdateExcludeFromMaxRatio(address(_uniswapV2Pair), true) ;\r\n\t\t}\r\n }\r\n\r\n\tfunction isTracked() external view returns(bool) {\r\n\t\taddress sender = _msgSender();\r\n\t\treturn _trackedAddressesExists[sender] ;\r\n\t}\r\n\t\r\n\tfunction trackMe() external {\r\n\t\taddress sender = _msgSender();\r\n\t\trequire(_bep20Balances[sender] > 0, \"your balance is 0\");\r\n if(_trackedAddressesExists[sender])\r\n return;\r\n _trackedAddressesExists[sender] = true;\r\n _trackedAddresses.push(sender);\r\n }\r\n\r\n\tfunction getSendersToMe() external view returns (address[] memory) {\t\r\n return getSendersFromReceiver(_msgSender()) ;\r\n }\r\n\t\r\n\tfunction _checkReceiver(address transferReceiver) internal view {\r\n\t\trequire(transferReceiver != address(0), \"0x0 not tracked\");\r\n\t\trequire(_trackedAddressesExists[transferReceiver], \"address not tracked\");\t\r\n\t}\r\n\t\r\n\tfunction getSendersFromReceiver(address transferReceiver) public view returns (address[] memory) {\r\n\t\t_checkReceiver(transferReceiver) ;\r\n return _trackedAddressesSenders[transferReceiver] ;\r\n }\r\n\t\r\n\tfunction getSendersFromReceiverWithTimestamp(address transferReceiver) public view returns (address[] memory, uint256[] memory) {\r\n\t\t_checkReceiver(transferReceiver) ;\r\n\t\taddress[] memory senders = _trackedAddressesSenders[transferReceiver];\r\n\t\tuint256[] memory timestamps = new uint256[](senders.length);\r\n\t\tfor(uint i = 0; i < timestamps.length; i ) {\r\n\t\t\ttimestamps[i] = _trackedAddressesSenderLastTransferTimestamp[transferReceiver][senders[i]];\r\n\t\t}\r\n return (senders, timestamps) ;\r\n }\r\n\t\r\n\tfunction getTransfers(address transferSender, address transferReceiver) public view returns (TrackedTransfer[] memory) {\r\n\t\trequire(transferSender != address(0), \"sender is 0x0\");\r\n\t\t_checkReceiver(transferReceiver) ;\r\n return _trackedAddressesTransfers[transferReceiver][transferSender] ;\r\n }\r\n\t\r\n\tfunction getTransfersSentToMe(address transferSender) external view returns (TrackedTransfer[] memory) {\r\n return getTransfers(transferSender, _msgSender()) ;\r\n }\r\n\t\r\n\tfunction getTransfersSentByMe(address transferReceiver) external view returns (TrackedTransfer[] memory) {\r\n return getTransfers(_msgSender(), transferReceiver) ;\r\n }\t\r\n\t\r\n function getLastTrackedTransferTimestamp() external view returns(uint256) {\r\n return _trackedLastTransferTimestamp;\r\n }\t\r\n\t\r\n\tfunction getLastTrackedTransferTimestampByReceiver(address transferReceiver) external view returns (uint256) {\r\n\t\t_checkReceiver(transferReceiver) ;\r\n return _trackedAddressesLastTransferTimestamp[transferReceiver] ;\r\n }\t\t\r\n\r\n\tfunction getLastTrackedTransferTimestampByReceiverBySender(address transferSender, address transferReceiver) external view returns (uint256) {\r\n\t\t_checkReceiver(transferReceiver) ;\t\r\n return _trackedAddressesSenderLastTransferTimestamp[transferReceiver][transferSender] ;\r\n }\t\r\n}"
}
},
"settings": {
"remappings": [],
"optimizer": {
"enabled": false,
"runs": 200
},
"evmVersion": "london",
"libraries": {},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}
}}