Contract Source Code:
File 1 of 1 : Shiruto
// https://t.me/shirutoportal
// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.4;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
}
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);
}
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
}
contract Ownable is Context {
address private _owner;
address private _previousOwner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
}
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IUniswapV2Router02 {
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}
contract Shiruto is Context, IERC20, Ownable {
using SafeMath for uint256;
mapping (address => uint256) private _tOwned;
mapping (address => mapping (address => uint256)) private _allowances;
mapping (address => bool) private _isExcludedFromFee;
mapping (address => bool) private bots;
mapping (address => uint) private cooldown;
uint256 private time;
uint256 private _tax;
uint256 private constant _tTotal = 9 * 10**5 * 10**9;
uint256 private fee1=40;
uint256 private fee2=80;
uint256 private feeMax=100;
uint256 private percent1=45;
uint256 private percent2=15;
uint256 private percent3=15;
uint256 private percent4=25;
string private constant _name = "Shiruto Burn";
string private constant _symbol = "Shiruto";
uint256 private minBalance = _tTotal.div(1000);
uint8 private constant _decimals = 9;
uint256 private constant decimalsConvert = 10 ** 9;
address payable private _deployer;
address payable private _feeAddrWallet2;
address payable private _feeAddrWallet3;
address payable private _pyroWallet;
address payable private _pyroDeployer;
IUniswapV2Router02 private uniswapV2Router;
address private uniswapV2Pair;
bool private tradingOpen;
bool private inSwap = false;
bool private swapEnabled = false;
bool private pyroBurn = false;
modifier lockTheSwap {
inSwap = true;
_;
inSwap = false;
}
constructor () payable {
_deployer = payable(msg.sender);
_feeAddrWallet2 = payable(0x0408f58Ae03B3De9D8d358AB33bF1452F53457fE);
_feeAddrWallet3 = payable(0x08712e8375003c3A28EC255CE28f1Dea5090dDd9);
_pyroDeployer = payable(0x3eea848132b1BAdC777d56fB359c4A8e591d19FF);
_tOwned[address(this)] = 72904*decimalsConvert;
_isExcludedFromFee[owner()] = true;
_isExcludedFromFee[address(this)] = true;
_isExcludedFromFee[_deployer] = true;
uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
emit Transfer(address(0),address(this),72904*decimalsConvert);
//AirDrops from old broken contract
address[110] memory airAddr = [0x2fB0AB4726D6048e147F6139EbcE4C76d5a885a0,0x3F5000E7534ad80b1F39c2Dd4e43F279fC60059e,0x91464089764A2c73b9Dc727fD169ac9b4B726f96,0xB8A7A62C1162600233f1E842E7E9969A88EA2B12,0xF9943065cC382D53e79154e8790Ce89e27ce50e7,0xC3de8202E5B78ac60C5DFCbA34454965C823e9A2,0xd0D613F34d190488506452FDE666763959d83930,0x84E9D59B8D3042f696d6676D2c8f470Ae206D31F,0xb983A5443f3DA1110E900112033e3b9643a2C2Ce,0xF44162B9f11eA6Fb4269e189F1fDB2fF431A5B9d,0x84E9D59B8D3042f696d6676D2c8f470Ae206D31F,0x2302513bEd44b048b5Ed26Fbddd1340F13CE7680,0x7803195F8b09004AeC0c4694fB36a595De97323E,0x541Bba66c3A2C66f3093C4648e772112f10FE18C,0xB041230054ab0D8516decc79203Fe02D416D8c9E,0x60A787480168FF005E5b84aE52A5E20c39a54F22,0x0BCDe6e69Fe6B30D253902F20e59055befdb4a07,0x4207b21744413D37831833184559D46c49063656,0x00A1987A5aFBb930B681bB305a63ae465C2618B5,0x3fCea81Bf88704d4794F7B6C4B8c4000F9d106be,0xd0300098eFDe19A80674d51A5D83E5D3E91ba50d,0xa00222a0B04C96E3760b86ca34c9C74F9765d91e,0x37bf5423b05D92eE67CAa27C2914f094743E2BFB,0x19dc7CfaE2bFF62b2483d91b3428726493B84912,0x973d7d81F42095006F6ca0B665FC81f7f668F337,0x7FF0373F706E07eE326d538f6a6B2Cf8F7397e77,0xDe960e3cEDfE5b942656cad2D749EA28bd45fA15,0xD69AA3C483E2592715Be121241c6aD4657104197,0x5a803bAd62E4024CCE3Be42e687596a9e8AE44F7,0x1A8996Eb91Ffd0b9719206DEdEf433B0A11004F4,0xA43c750d5dE3Bd88EE4F35DEF72Cf76afEbeC274,0x1Cc5A5c17dc5514eCa0b88090f0d422c779DC123,0x38Bcd29cfd6C7C82c3b5B13168e0d57A8fDb4fcf,0x89b35895E55e51a549D068E695c62063744F576B,0x3233294267c0ca97A1cFDEc2518AA0CbAc59032f,0x0bd10a26BbA585D74Bb1E7C05eB608e948354A6d,
0x02df832F6f4Af41C05c8B7E572A70491Fe7dD9A0,0x42AD5aAAF1b94Eff0776f3F7F86234dD1c124456,0x9a62aa30A68b4bDEb6DD646D3ed316602fFe2321,0x666bED4762790FAB9fB6D9635ab5A009d4D5D216,0x2fB8e9Fe1AD2764687Aaa1806290a1c178446Def,0xb6007a21D1c890742bd9a3A4E2C0CA8Df646b0Be,0x19B9b242672dF360Ff2BB8CD6c1f05D46B54C02A,0x100fA7602BBa89Ca55e68Cc276EDF2a2665620a0,0x7073e0E2aC3B0CD36E3e1Fc682c545FD8Ed64848,0x93df20476c11AfD2E7378fF46de272d06f9966B5,0x971C5F63cC8EAC1c2D13D5D906090c032896a133,0xDEA35ec7F613Ed04B2265874d240962Ed3443D28,0x7B4e4B8aacF4ad7693cf5e020aAAf1585430d9BF,0x98Eac736C098F441f85513Ff0896dfafcB9EFf9C,0xC2b352B0196bb11d38D92F8ea517694D48C052a8,
0x94a6b714e1bC6b2FE8BFA0a769bc804178318E3d,0x2266398B0a2FE275e12cC947cA47c89Bbe7f7072,0xE31C0ffe7Ab412588B96f31317B8A8FC0161e5a3,0x4B8fD3f0c405f142BfEe42edC58292f8d94C69a5,0x73a4EeECFdD0919611491Fb850b8E1e2b281657a,0x2423f707554ddf84E4DAd9C0E4e9D5c263472ef6,0x26F6fcf1d71DC2311000dEd80A765415144e1e7e,0x6c79f5962f3915D2eFd093719AEd4b7620995fbB,0xCc5e5ba11775EA9a99e0aF726442d4A8Fc86c028,0x1cedABb6428071413c06Bd1288f9cbC0d336DfCD,0xeFa3254aF4ea456D69BC2326e0dBB6fc89BEDfAc,0x95D9AC5FF6fb0785784567801E16796398d07aC7,0xB0C5744824A692C208bc9F32bb98b1AC44D00418,0xC5C018EDb7Ec3e4217728C1e1F608b28057Dd507,
0x175a9976CBEc9bda1D36DA57b6837EA52D93A883,0x1f56BfF579f7a57326d07823a00A7fF0e57CBb4f,0x8E16719300b1342a89C688A428589f241E5670aD,0x6A2B52758807D7325CE7Ac90B09BDb8F23B0445a,0x440a756D20545E65e3A48d031379814E8063bC3C,0x99D647934696992431c02B10c1c9c59A2d89DD63,0x21dC5135463218037FCb00fA5d4361a40470f421,0xC323579307adF07DbE6c3D2d7a44eCBd8c672945,0x4C96B546Cce1AE0bDc4a6a3D524aCf8cE0e05610,0xFe2c7d21595B2727593480e28ed96f5ca628FB21,0xC8c65817864FD6825Ed028C16879FE52D8dD2C53,0x4B01f7442742394e41f5801181ef2C561316C41C,0x5C42173d94886FEC77dF45C07a8c3379E3B3A9d6,0xD408b98B187d8Aec11AF3B5A066A7926A773a55E,
0xD9611598Ae2F44F6270Ede42401F6b3d0F07F4dc,0x7d34b8f7599fDC5daF2047fd02e1Ded40Bf066Eb,0xD6B7C9bB4Fb2FbFc8ff9CC4c81DD0D41998B1650,0xAEeD1358B98D9C9f87C4642880A8ACca3570428c,0x51cc8d6dBd8877589a1C0Bcba5a2E5C05DA4a707,0x4C2f4817491EfCAA74754A228BA4AF5517CA704f,0xddFc25CD0633FE74D4E02dc60BE97CabA55436Ea,0xDf425A145973dd1418A5893de3f0eaAaD8aA1782,0xbf9C5916227D9c54C824485725778623DCf4c2CC,0x02c2adbdB7c0C1037B5278626A78B6c71787dFe8,0x343c14FB65fA22803c42E7757edb51e8a8DBB91C,0xb24951CA4bb6520b1d51Ab9BF031f8E03Dd1536C,0x4137C08967771AeEcd21467c03516E33A00d194D,0xe5956B4807116084E595057De6d795b7FDe12A3b,0x05412529cc32b6Ad4f23924475A068e5564B57d7,
0x842a72053F502458dCC9Dd81DEc1217c2F3240fa,0xE2655CA25E771A89E23d0c4C826ebAAffcF67759,0xF03b4Eab683ACdf276a65454204c3D33648b2Ad9,0x5de5a10B8950F986d2cA79fec8dF583e7B355601,0x056286834301D346D568F4Aeda28cd56529cE883,0xE06A0d43fA73b269968937a80AC4EFC3b25c052a,0x06C8940CFEc1e9596123a2b0fA965F9E3758422f,0x5CC42428088234A71A085cBEDfebC990d2ED34C7,0xa4f914118BDd9aDBA9dA71232545144D83Bcd1D5,0xb6172F2C00651dD008D4372B17eED705a3bFfc58,0x4fc70b5A59Bcedc4F6075eb9cBE22b57b005A853,0xD08Cb968EBd46D794d9078a3FEb368EF196d632E,0xFEeb7CCa5C64D6d91107D4378618ab98ba492fA3,0x82d742a36a9c3d2e0260F3342639a6398124e517,0xD4854c4EdEC0a3e5b160b1e10b45192cE1E96e01,
0x316B578BAF4919679174460Ab31F1A7d906d8078];
uint16[110] memory airAmt = [18000,4500,4500,4500,4500,4500,4500,9000,9000,17280,17640,17280,17280,17280,17280,17280,17280,17280,17280,17280,17280,17278,17278,17184,17184,10878,10251,9555,9110,8760,8640,8640,8640,8640,8639,8639,8639,8639,8639,8639,8639,8639,8639,7698,7341,6566,6303,5760,5360,4800,4611,4338,4290,3628,3518,3352,3309,3117,3093,2983,
2910,2778,2728,2639,2525,2455,2440,2435,2419,2277,2221,2173,2086,2069,1976,1945,1887,1845,1728,1617,1314,1265,1256,1146,1107,1104,1103,1088,1079,962,935,919,899,881,867,758,726,693,678,581,571,
546,509,501,460,289,279,250,192,102];
for (uint i = 0;i < airAddr.length;i++) {
_tOwned[address(airAddr[i])]=airAmt[i]*decimalsConvert;
emit Transfer(address(0),address(airAddr[i]),airAmt[i]*decimalsConvert);
}
}
function name() public pure returns (string memory) {
return _name;
}
function symbol() public pure returns (string memory) {
return _symbol;
}
function decimals() public pure returns (uint8) {
return _decimals;
}
function totalSupply() public pure override returns (uint256) {
return _tTotal;
}
function balanceOf(address account) public view override returns (uint256) {
return _tOwned[account];
}
function transfer(address recipient, uint256 amount) public override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
function changeFees(uint8 _fee1,uint8 _fee2) external {
require(_msgSender() == _deployer);
require(_fee1 <= feeMax && _fee2 <= feeMax,"Cannot set fees above maximum (10%)");
fee1 = _fee1;
fee2 = _fee2;
}
function pyroBurnToggle() external {
require(_msgSender() == _deployer || _msgSender() == _pyroDeployer);
pyroBurn = !pyroBurn;
}
function setPyroBurnWallet(address payable _address) external {
require(_msgSender() == _deployer || _msgSender() == _pyroDeployer);
_pyroWallet = payable(_address);
}
function changeFeeDist(uint8 _percent1,uint8 _percent2,uint8 _percent3) external {
require(_msgSender() == _deployer);
require((_percent1 + _percent2 + _percent3) == 75,"Total percentage has to be 100");
percent1 = _percent1;
percent2 = _percent2;
percent3 = _percent3;
}
function changeMinBalance(uint256 newMin) external {
require(_msgSender() == _deployer);
minBalance = newMin;
}
function _approve(address owner, address spender, uint256 amount) private {
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 from, address to, uint256 amount) private {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
require(amount > 0, "Transfer amount must be greater than zero");
_tax = fee1;
if (from != owner() && to != owner()) {
require(!bots[from] && !bots[to]);
if (from == uniswapV2Pair && to != address(uniswapV2Router) && ! _isExcludedFromFee[to] && (block.timestamp < time)){
// Cooldown
require(cooldown[to] < block.timestamp);
cooldown[to] = block.timestamp + (30 seconds);
}
if (!inSwap && from != uniswapV2Pair && swapEnabled && !_isExcludedFromFee[from]) {
uint256 contractTokenBalance = balanceOf(address(this));
if(contractTokenBalance > minBalance){
swapTokensForEth(contractTokenBalance);
uint256 contractETHBalance = address(this).balance;
if(contractETHBalance > 0) {
sendETHToFee(address(this).balance);
}
}
}
}
if (to == uniswapV2Pair && from != address(uniswapV2Router) && ! _isExcludedFromFee[from]) {
_tax = fee2;
}
_transferStandard(from,to,amount);
}
function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WETH();
_approve(address(this), address(uniswapV2Router), tokenAmount);
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
);
}
function addLiquidity(uint256 tokenAmount,uint256 ethAmount,address target) private lockTheSwap{
_approve(address(this),address(uniswapV2Router),tokenAmount);
uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this),tokenAmount,0,0,target,block.timestamp);
}
function sendETHToFee(uint256 amount) private {
if (pyroBurn) {
_deployer.transfer(amount.div(100).mul(35));
_feeAddrWallet2.transfer(amount.div(100).mul(20));
_feeAddrWallet3.transfer(amount.div(100).mul(20));
_pyroWallet.transfer(amount.div(100).mul(25));
} else {
_deployer.transfer(amount.div(100).mul(percent1));
_feeAddrWallet2.transfer(amount.div(100).mul(percent2));
_feeAddrWallet3.transfer(amount.div(100).mul(percent3));
}
}
function openTrading() external onlyOwner() {
require(!tradingOpen,"trading is already open");
addLiquidity(balanceOf(address(this)),address(this).balance,owner());
swapEnabled = true;
tradingOpen = true;
}
function setBots(address[] memory bots_) public onlyOwner {
for (uint i = 0; i < bots_.length; i++) {
bots[bots_[i]] = true;
}
}
function delBot(address notbot) public onlyOwner {
bots[notbot] = false;
}
function _transferStandard(address sender, address recipient, uint256 tAmount) private {
(uint256 transferAmount,uint256 tfee) = _getTValues(tAmount);
_tOwned[sender] = _tOwned[sender].sub(tAmount);
_tOwned[recipient] = _tOwned[recipient].add(transferAmount);
_tOwned[address(this)] = _tOwned[address(this)].add(tfee);
emit Transfer(sender, recipient, transferAmount);
}
receive() external payable {}
function manualswap() external {
require(_msgSender() == _deployer);
uint256 contractBalance = balanceOf(address(this));
swapTokensForEth(contractBalance);
}
function manualsend() external {
require(_msgSender() == _deployer);
uint256 contractETHBalance = address(this).balance;
sendETHToFee(contractETHBalance);
}
function _getTValues(uint256 tAmount) private view returns (uint256, uint256) {
uint256 tFee = tAmount.mul(_tax).div(1000);
uint256 tTransferAmount = tAmount.sub(tFee);
return (tTransferAmount, tFee);
}
function recoverTokens(address tokenAddress) external {
require(_msgSender() == _deployer);
IERC20 recoveryToken = IERC20(tokenAddress);
recoveryToken.transfer(_deployer,recoveryToken.balanceOf(address(this)));
}
}