Token 10X: Africa's First Cryptocurrency Hub
Spin Inu Token
Spin Inu is a meme that takes inspiration from Dogecoin and also follows the popular "Spin to Earn" trend. By keeping tokens, users can partake in a lucky circle with incredibly alluring prizes, stake for enormous profits, take part in NFT collection, and notably the incredibly intriguing "Hot Walle...
About Spin Inu
Spin Inu is a meme that takes inspiration from Dogecoin and also follows the popular "Spin to Earn" trend. By keeping tokens, users can partake in a lucky circle with incredibly alluring prizes, stake for enormous profits, take part in NFT collection, and notably the incredibly intriguing "Hot Wallet" feature that will be unveiled soon. %u2705 AUDIT & KYC. %u2705 Collection NFTs. %u2705 SPIN2EARN. %u2705 Staking High Apr. %u2705 NO Dev Token
28 total visits
Token information and links
Circulating Supply
1000000000000000000000000000000
Token Contract (BSC Chain)
0XB04ECBB2165D2D746EDE4A14A743B37452AD48DE
Contract license:
Launch Date
14/07/2022
KYC Information
No
Audit Information
None
Team Information
Team leader: None
Team leader contact: None
Contract source code
{{
"language": "Solidity",
"sources": {
"contracts/SpinInu.sol": {
"content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/utils/Context.sol\";\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport \"@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol\";\nimport \"@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol\";\n\n\ncontract SpinInu is Context, IERC20Metadata, Ownable {\n using SafeMath for uint256;\n\n uint8 constant FEE_EXEMPT = 0;\n uint8 constant TRANSFER = 1;\n uint8 constant BUY = 2;\n uint8 constant SELL = 3;\n\n string private constant NAME = \"Spin Inu\";\n string private constant SYMBOL = \"SPINU\";\n uint8 private constant DECIMALS = 18;\n\n uint256 private constant _totalSupply = 1000 * 1e9 * 10 ** DECIMALS;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n mapping(address => uint256) private _balances;\n\n\n bool private _isFeeEnabled;\n\n function isFeeEnabled() public view returns (bool) {\n return _isFeeEnabled;\n }\n\n function setFeeEnabled(bool isEnabled) public onlyOwner {\n _isFeeEnabled = isEnabled;\n }\n\n uint256 public _marketingFeePercentage;\n uint256 public _developmentFeePercentage;\n uint256 public _treasuryFeePercentage;\n uint256 public constant _maxFeePercentage = 30;\n\n function totalFee() internal view returns (uint256) {\n return _marketingFeePercentage.add(_developmentFeePercentage).add(_treasuryFeePercentage);\n }\n\n function setFees(uint256 marketingFeePercentage, uint256 developmentFeePercentage, uint256 treasuryFeePercentage) public onlyOwner {\n require(_maxFeePercentage >= marketingFeePercentage developmentFeePercentage treasuryFeePercentage);\n _marketingFeePercentage = marketingFeePercentage;\n _developmentFeePercentage = developmentFeePercentage;\n _treasuryFeePercentage = treasuryFeePercentage;\n }\n\n\n mapping(address => bool) private _feeExclusions;\n\n function isExcludedFromFees(address addr) public view returns (bool) {\n return _feeExclusions[addr];\n }\n\n function setExcludedFromFees(address addr, bool value) public onlyOwner {\n _feeExclusions[addr] = value;\n }\n\n\n uint256 private _transactionUpperLimit = _totalSupply;\n\n function setTransactionUpperLimit(uint256 limit) public onlyOwner {\n require(limit > 100 * 10 ** DECIMALS);\n _transactionUpperLimit = limit;\n }\n\n function transactionUpperLimit() public view returns (uint256) {\n return _transactionUpperLimit;\n }\n\n\n mapping(address => bool) private _limitExclusions;\n\n function isExcludedFromLimit(address addr) public view returns (bool) {\n return _limitExclusions[addr];\n }\n\n function setLimitExclusions(address addr, bool value) public onlyOwner {\n _limitExclusions[addr] = value;\n }\n\n\n address public _marketingWallet;\n address public _developmentWallet;\n address public _treasuryWallet;\n\n function setFeeWallets(address marketingWallet, address developmentWallet, address treasuryWallet) public onlyOwner {\n _marketingWallet = marketingWallet;\n _developmentWallet = developmentWallet;\n _treasuryWallet = treasuryWallet;\n }\n\n\n IUniswapV2Router02 internal _swapRouter;\n address private _swapPair;\n\n function setSwapRouter(address routerAddress) public onlyOwner {\n require(routerAddress != address(0), \"Invalid router address\");\n\n _swapRouter = IUniswapV2Router02(routerAddress);\n _approve(address(this), routerAddress, type(uint256).max);\n\n _swapPair = IUniswapV2Factory(_swapRouter.factory()).getPair(address(this), _swapRouter.WETH());\n if (_swapPair == address(0)) {// pair doesn't exist beforehand\n _swapPair = IUniswapV2Factory(_swapRouter.factory()).createPair(address(this), _swapRouter.WETH());\n }\n }\n\n bool private _inSwap;\n uint256 public _minTokenAmountToSwapFees = 0;\n modifier swapping() {_inSwap = true;\n _;\n _inSwap = false;}\n\n function setMinTokenAmountToSwapFees(uint256 amount) external onlyOwner {\n _minTokenAmountToSwapFees = amount;\n }\n\n function isSwapPair(address addr) internal view returns (bool) {\n return _swapPair == addr;\n }\n\n function swapPairAddress() public view returns (address) {\n return _swapPair;\n }\n\n event Swapped(uint256 tokensSwapped, uint256 bnbReceived, uint256 tokensIntoLiqudity, uint256 bnbIntoLiquidity, bool successSentMarketing);\n\n bool private _tradingOpen;\n\n function openTrading() external onlyOwner {\n _tradingOpen = true;\n }\n\n constructor() {\n _balances[_msgSender()] = totalSupply();\n\n _feeExclusions[address(this)] = true;\n _feeExclusions[_msgSender()] = true;\n\n _marketingWallet = _msgSender();\n _developmentWallet = _msgSender();\n _treasuryWallet = _msgSender();\n\n setFees(2, 2, 2);\n setFeeEnabled(true);\n\n emit Transfer(address(0), _msgSender(), totalSupply());\n }\n\n\n //region Internal\n function _approve(address owner, address spender, uint256 amount) private {\n require(owner != address(0), \"Invalid owner address\");\n require(spender != address(0), \"Invalid spender address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n function _transfer(address sender, address recipient, uint256 amount) internal virtual {\n require(sender != address(0), \"Invalid sender address\");\n require(recipient != address(0), \"Invalid recipient address\");\n require(amount > 0, \"Invalid transferring amount\");\n\n if (!isExcludedFromLimit(sender) && !isExcludedFromLimit(recipient)) {\n require(amount <= _transactionUpperLimit, \"Transferring amount exceeds the maximum allowed\");\n }\n\n if (_inSwap) {return _basicTransfer(sender, recipient, amount);}\n\n _balances[sender] = _balances[sender].sub(amount, \"Insufficient balance\");\n uint256 afterFeeAmount = amount;\n uint8 transferType = _transferType(sender, recipient);\n\n if (transferType == BUY || transferType == SELL) {\n require(_tradingOpen, \"Trading is not open!\");\n afterFeeAmount = _takeFees(afterFeeAmount);\n }\n\n if (_shouldSwapFees(transferType)) {//\n _swapFees();\n }\n\n _balances[recipient] = _balances[recipient].add(afterFeeAmount);\n emit Transfer(sender, recipient, afterFeeAmount);\n }\n\n function _basicTransfer(address sender, address recipient, uint256 amount) internal {\n _balances[sender] = _balances[sender].sub(amount, \"Insufficient Balance\");\n _balances[recipient] = _balances[recipient].add(amount);\n emit Transfer(sender, recipient, amount);\n }\n\n function _takeFees(uint256 amount) private returns (uint256) {\n uint256 marketingFee = amount.mul(_marketingFeePercentage).div(100);\n amount = amount.sub(marketingFee, \"Insufficient amount\");\n uint256 developmentFee = amount.mul(_developmentFeePercentage).div(100);\n amount = amount.sub(developmentFee, \"Insufficient amount\");\n uint256 treasuryFee = amount.mul(_treasuryFeePercentage).div(100);\n amount = amount.sub(treasuryFee, \"Insufficient amount\");\n\n uint256 totalFee = marketingFee.add(developmentFee).add(treasuryFee);\n _balances[address(this)] = _balances[address(this)].add(totalFee);\n return amount;\n }\n\n function _shouldSwapFees(uint8 transferType) private returns (bool) {\n return transferType == SELL && balanceOf(address(this)) > _minTokenAmountToSwapFees;\n }\n\n function _swapFees() private swapping {\n uint256 receivedBNB = swapTokensForBNB();\n\n uint256 totalFee = _marketingFeePercentage.add(_developmentFeePercentage).add(_treasuryFeePercentage);\n uint256 bnbToMarketing = receivedBNB.mul(_marketingFeePercentage).div(totalFee);\n uint256 bnbToDevelopment = receivedBNB.mul(_developmentFeePercentage).div(totalFee);\n uint256 bnbToTreasury = receivedBNB.sub(bnbToMarketing, \"Insufficient amount\").sub(bnbToDevelopment, \"Insufficient amount\");\n (bool successSentMarketing,) = _marketingWallet.call{value : bnbToMarketing}(\"\");\n (bool successSentDevelopment,) = _developmentWallet.call{value : bnbToDevelopment}(\"\");\n (bool successSentTreasury,) = _treasuryWallet.call{value : bnbToTreasury}(\"\");\n }\n\n\n function swapTokensForBNB() internal returns (uint256) {\n uint256 tokenAmount = balanceOf(address(this));\n\n address[] memory path = new address[](2);\n path[0] = address(this);\n path[1] = _swapRouter.WETH();\n\n // Swap\n _swapRouter.swapExactTokensForETH(tokenAmount, 0, path, address(this), block.timestamp 360);\n\n // Return the amount received\n return address(this).balance;\n }\n\n function _transferType(address from, address to) internal view returns (uint8) {\n if (isExcludedFromFees(from) || isExcludedFromFees(to)) return FEE_EXEMPT;\n if (from == _swapPair) return BUY;\n if (to == _swapPair) return SELL;\n return TRANSFER;\n }\n\n\n //endregion\n\n //region IERC20\n function totalSupply() public override pure returns (uint256) {\n return _totalSupply;\n }\n\n function allowance(address owner, address spender) public view override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n function balanceOf(address account) public view override returns (uint256) {\n return _balances[account];\n }\n\n function transfer(address recipient, uint256 amount) public override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n function approve(address spender, uint256 amount) public override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {\n if (_allowances[sender][msg.sender] != type(uint256).max) {\n _allowances[sender][_msgSender()] = _allowances[sender][_msgSender()].sub(amount, \"Insufficient allowance\");\n }\n _transfer(sender, recipient, amount);\n // TODO review\n return true;\n }\n //endregion\n\n //region IERC20Metadata\n\n function name() public override pure returns (string memory) {\n return NAME;\n }\n\n function symbol() public override pure returns (string memory) {\n return SYMBOL;\n }\n\n function decimals() public override pure returns (uint8) {\n return DECIMALS;\n }\n //endregion\n\n // allow receiving eth\n receive() external payable {}\n}\n"
},
"@openzeppelin/contracts/utils/Context.sol": {
"content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n"
},
"@openzeppelin/contracts/utils/math/SafeMath.sol": {
"content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)\n\npragma solidity ^0.8.0;\n\n// CAUTION\n// This version of SafeMath should only be used with Solidity 0.8 or later,\n// because it relies on the compiler's built in overflow checks.\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler\n * now has built in overflow checking.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's ` ` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n return a b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n return a * b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator.\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b <= a, errorMessage);\n return a - b;\n }\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a / b;\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a % b;\n }\n }\n}\n"
},
"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": {
"content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
},
"@openzeppelin/contracts/access/Ownable.sol": {
"content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
},
"@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol": {
"content": "pragma solidity >=0.6.2;\n\nimport './IUniswapV2Router01.sol';\n\ninterface IUniswapV2Router02 is IUniswapV2Router01 {\n function removeLiquidityETHSupportingFeeOnTransferTokens(\n address token,\n uint liquidity,\n uint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline\n ) external returns (uint amountETH);\n function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(\n address token,\n uint liquidity,\n uint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline,\n bool approveMax, uint8 v, bytes32 r, bytes32 s\n ) external returns (uint amountETH);\n\n function swapExactTokensForTokensSupportingFeeOnTransferTokens(\n uint amountIn,\n uint amountOutMin,\n address[] calldata path,\n address to,\n uint deadline\n ) external;\n function swapExactETHForTokensSupportingFeeOnTransferTokens(\n uint amountOutMin,\n address[] calldata path,\n address to,\n uint deadline\n ) external payable;\n function swapExactTokensForETHSupportingFeeOnTransferTokens(\n uint amountIn,\n uint amountOutMin,\n address[] calldata path,\n address to,\n uint deadline\n ) external;\n}\n"
},
"@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol": {
"content": "pragma solidity >=0.5.0;\n\ninterface IUniswapV2Factory {\n event PairCreated(address indexed token0, address indexed token1, address pair, uint);\n\n function feeTo() external view returns (address);\n function feeToSetter() external view returns (address);\n\n function getPair(address tokenA, address tokenB) external view returns (address pair);\n function allPairs(uint) external view returns (address pair);\n function allPairsLength() external view returns (uint);\n\n function createPair(address tokenA, address tokenB) external returns (address pair);\n\n function setFeeTo(address) external;\n function setFeeToSetter(address) external;\n}\n"
},
"@openzeppelin/contracts/token/ERC20/IERC20.sol": {
"content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n"
},
"@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol": {
"content": "pragma solidity >=0.6.2;\n\ninterface IUniswapV2Router01 {\n function factory() external pure returns (address);\n function WETH() external pure returns (address);\n\n function addLiquidity(\n address tokenA,\n address tokenB,\n uint amountADesired,\n uint amountBDesired,\n uint amountAMin,\n uint amountBMin,\n address to,\n uint deadline\n ) external returns (uint amountA, uint amountB, uint liquidity);\n function addLiquidityETH(\n address token,\n uint amountTokenDesired,\n uint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline\n ) external payable returns (uint amountToken, uint amountETH, uint liquidity);\n function removeLiquidity(\n address tokenA,\n address tokenB,\n uint liquidity,\n uint amountAMin,\n uint amountBMin,\n address to,\n uint deadline\n ) external returns (uint amountA, uint amountB);\n function removeLiquidityETH(\n address token,\n uint liquidity,\n uint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline\n ) external returns (uint amountToken, uint amountETH);\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\n uint liquidity,\n uint amountAMin,\n uint amountBMin,\n address to,\n uint deadline,\n bool approveMax, uint8 v, bytes32 r, bytes32 s\n ) external returns (uint amountA, uint amountB);\n function removeLiquidityETHWithPermit(\n address token,\n uint liquidity,\n uint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline,\n bool approveMax, uint8 v, bytes32 r, bytes32 s\n ) external returns (uint amountToken, uint amountETH);\n function swapExactTokensForTokens(\n uint amountIn,\n uint amountOutMin,\n address[] calldata path,\n address to,\n uint deadline\n ) external returns (uint[] memory amounts);\n function swapTokensForExactTokens(\n uint amountOut,\n uint amountInMax,\n address[] calldata path,\n address to,\n uint deadline\n ) external returns (uint[] memory amounts);\n function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)\n external\n payable\n returns (uint[] memory amounts);\n function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\n external\n returns (uint[] memory amounts);\n function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\n external\n returns (uint[] memory amounts);\n function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)\n external\n payable\n returns (uint[] memory amounts);\n\n function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);\n function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);\n function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);\n function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);\n function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);\n}\n"
}
},
"settings": {
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}
}}
"language": "Solidity",
"sources": {
"contracts/SpinInu.sol": {
"content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/utils/Context.sol\";\nimport \"@openzeppelin/contracts/utils/math/SafeMath.sol\";\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport \"@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol\";\nimport \"@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol\";\n\n\ncontract SpinInu is Context, IERC20Metadata, Ownable {\n using SafeMath for uint256;\n\n uint8 constant FEE_EXEMPT = 0;\n uint8 constant TRANSFER = 1;\n uint8 constant BUY = 2;\n uint8 constant SELL = 3;\n\n string private constant NAME = \"Spin Inu\";\n string private constant SYMBOL = \"SPINU\";\n uint8 private constant DECIMALS = 18;\n\n uint256 private constant _totalSupply = 1000 * 1e9 * 10 ** DECIMALS;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n mapping(address => uint256) private _balances;\n\n\n bool private _isFeeEnabled;\n\n function isFeeEnabled() public view returns (bool) {\n return _isFeeEnabled;\n }\n\n function setFeeEnabled(bool isEnabled) public onlyOwner {\n _isFeeEnabled = isEnabled;\n }\n\n uint256 public _marketingFeePercentage;\n uint256 public _developmentFeePercentage;\n uint256 public _treasuryFeePercentage;\n uint256 public constant _maxFeePercentage = 30;\n\n function totalFee() internal view returns (uint256) {\n return _marketingFeePercentage.add(_developmentFeePercentage).add(_treasuryFeePercentage);\n }\n\n function setFees(uint256 marketingFeePercentage, uint256 developmentFeePercentage, uint256 treasuryFeePercentage) public onlyOwner {\n require(_maxFeePercentage >= marketingFeePercentage developmentFeePercentage treasuryFeePercentage);\n _marketingFeePercentage = marketingFeePercentage;\n _developmentFeePercentage = developmentFeePercentage;\n _treasuryFeePercentage = treasuryFeePercentage;\n }\n\n\n mapping(address => bool) private _feeExclusions;\n\n function isExcludedFromFees(address addr) public view returns (bool) {\n return _feeExclusions[addr];\n }\n\n function setExcludedFromFees(address addr, bool value) public onlyOwner {\n _feeExclusions[addr] = value;\n }\n\n\n uint256 private _transactionUpperLimit = _totalSupply;\n\n function setTransactionUpperLimit(uint256 limit) public onlyOwner {\n require(limit > 100 * 10 ** DECIMALS);\n _transactionUpperLimit = limit;\n }\n\n function transactionUpperLimit() public view returns (uint256) {\n return _transactionUpperLimit;\n }\n\n\n mapping(address => bool) private _limitExclusions;\n\n function isExcludedFromLimit(address addr) public view returns (bool) {\n return _limitExclusions[addr];\n }\n\n function setLimitExclusions(address addr, bool value) public onlyOwner {\n _limitExclusions[addr] = value;\n }\n\n\n address public _marketingWallet;\n address public _developmentWallet;\n address public _treasuryWallet;\n\n function setFeeWallets(address marketingWallet, address developmentWallet, address treasuryWallet) public onlyOwner {\n _marketingWallet = marketingWallet;\n _developmentWallet = developmentWallet;\n _treasuryWallet = treasuryWallet;\n }\n\n\n IUniswapV2Router02 internal _swapRouter;\n address private _swapPair;\n\n function setSwapRouter(address routerAddress) public onlyOwner {\n require(routerAddress != address(0), \"Invalid router address\");\n\n _swapRouter = IUniswapV2Router02(routerAddress);\n _approve(address(this), routerAddress, type(uint256).max);\n\n _swapPair = IUniswapV2Factory(_swapRouter.factory()).getPair(address(this), _swapRouter.WETH());\n if (_swapPair == address(0)) {// pair doesn't exist beforehand\n _swapPair = IUniswapV2Factory(_swapRouter.factory()).createPair(address(this), _swapRouter.WETH());\n }\n }\n\n bool private _inSwap;\n uint256 public _minTokenAmountToSwapFees = 0;\n modifier swapping() {_inSwap = true;\n _;\n _inSwap = false;}\n\n function setMinTokenAmountToSwapFees(uint256 amount) external onlyOwner {\n _minTokenAmountToSwapFees = amount;\n }\n\n function isSwapPair(address addr) internal view returns (bool) {\n return _swapPair == addr;\n }\n\n function swapPairAddress() public view returns (address) {\n return _swapPair;\n }\n\n event Swapped(uint256 tokensSwapped, uint256 bnbReceived, uint256 tokensIntoLiqudity, uint256 bnbIntoLiquidity, bool successSentMarketing);\n\n bool private _tradingOpen;\n\n function openTrading() external onlyOwner {\n _tradingOpen = true;\n }\n\n constructor() {\n _balances[_msgSender()] = totalSupply();\n\n _feeExclusions[address(this)] = true;\n _feeExclusions[_msgSender()] = true;\n\n _marketingWallet = _msgSender();\n _developmentWallet = _msgSender();\n _treasuryWallet = _msgSender();\n\n setFees(2, 2, 2);\n setFeeEnabled(true);\n\n emit Transfer(address(0), _msgSender(), totalSupply());\n }\n\n\n //region Internal\n function _approve(address owner, address spender, uint256 amount) private {\n require(owner != address(0), \"Invalid owner address\");\n require(spender != address(0), \"Invalid spender address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n function _transfer(address sender, address recipient, uint256 amount) internal virtual {\n require(sender != address(0), \"Invalid sender address\");\n require(recipient != address(0), \"Invalid recipient address\");\n require(amount > 0, \"Invalid transferring amount\");\n\n if (!isExcludedFromLimit(sender) && !isExcludedFromLimit(recipient)) {\n require(amount <= _transactionUpperLimit, \"Transferring amount exceeds the maximum allowed\");\n }\n\n if (_inSwap) {return _basicTransfer(sender, recipient, amount);}\n\n _balances[sender] = _balances[sender].sub(amount, \"Insufficient balance\");\n uint256 afterFeeAmount = amount;\n uint8 transferType = _transferType(sender, recipient);\n\n if (transferType == BUY || transferType == SELL) {\n require(_tradingOpen, \"Trading is not open!\");\n afterFeeAmount = _takeFees(afterFeeAmount);\n }\n\n if (_shouldSwapFees(transferType)) {//\n _swapFees();\n }\n\n _balances[recipient] = _balances[recipient].add(afterFeeAmount);\n emit Transfer(sender, recipient, afterFeeAmount);\n }\n\n function _basicTransfer(address sender, address recipient, uint256 amount) internal {\n _balances[sender] = _balances[sender].sub(amount, \"Insufficient Balance\");\n _balances[recipient] = _balances[recipient].add(amount);\n emit Transfer(sender, recipient, amount);\n }\n\n function _takeFees(uint256 amount) private returns (uint256) {\n uint256 marketingFee = amount.mul(_marketingFeePercentage).div(100);\n amount = amount.sub(marketingFee, \"Insufficient amount\");\n uint256 developmentFee = amount.mul(_developmentFeePercentage).div(100);\n amount = amount.sub(developmentFee, \"Insufficient amount\");\n uint256 treasuryFee = amount.mul(_treasuryFeePercentage).div(100);\n amount = amount.sub(treasuryFee, \"Insufficient amount\");\n\n uint256 totalFee = marketingFee.add(developmentFee).add(treasuryFee);\n _balances[address(this)] = _balances[address(this)].add(totalFee);\n return amount;\n }\n\n function _shouldSwapFees(uint8 transferType) private returns (bool) {\n return transferType == SELL && balanceOf(address(this)) > _minTokenAmountToSwapFees;\n }\n\n function _swapFees() private swapping {\n uint256 receivedBNB = swapTokensForBNB();\n\n uint256 totalFee = _marketingFeePercentage.add(_developmentFeePercentage).add(_treasuryFeePercentage);\n uint256 bnbToMarketing = receivedBNB.mul(_marketingFeePercentage).div(totalFee);\n uint256 bnbToDevelopment = receivedBNB.mul(_developmentFeePercentage).div(totalFee);\n uint256 bnbToTreasury = receivedBNB.sub(bnbToMarketing, \"Insufficient amount\").sub(bnbToDevelopment, \"Insufficient amount\");\n (bool successSentMarketing,) = _marketingWallet.call{value : bnbToMarketing}(\"\");\n (bool successSentDevelopment,) = _developmentWallet.call{value : bnbToDevelopment}(\"\");\n (bool successSentTreasury,) = _treasuryWallet.call{value : bnbToTreasury}(\"\");\n }\n\n\n function swapTokensForBNB() internal returns (uint256) {\n uint256 tokenAmount = balanceOf(address(this));\n\n address[] memory path = new address[](2);\n path[0] = address(this);\n path[1] = _swapRouter.WETH();\n\n // Swap\n _swapRouter.swapExactTokensForETH(tokenAmount, 0, path, address(this), block.timestamp 360);\n\n // Return the amount received\n return address(this).balance;\n }\n\n function _transferType(address from, address to) internal view returns (uint8) {\n if (isExcludedFromFees(from) || isExcludedFromFees(to)) return FEE_EXEMPT;\n if (from == _swapPair) return BUY;\n if (to == _swapPair) return SELL;\n return TRANSFER;\n }\n\n\n //endregion\n\n //region IERC20\n function totalSupply() public override pure returns (uint256) {\n return _totalSupply;\n }\n\n function allowance(address owner, address spender) public view override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n function balanceOf(address account) public view override returns (uint256) {\n return _balances[account];\n }\n\n function transfer(address recipient, uint256 amount) public override returns (bool) {\n _transfer(_msgSender(), recipient, amount);\n return true;\n }\n\n function approve(address spender, uint256 amount) public override returns (bool) {\n _approve(_msgSender(), spender, amount);\n return true;\n }\n\n function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {\n if (_allowances[sender][msg.sender] != type(uint256).max) {\n _allowances[sender][_msgSender()] = _allowances[sender][_msgSender()].sub(amount, \"Insufficient allowance\");\n }\n _transfer(sender, recipient, amount);\n // TODO review\n return true;\n }\n //endregion\n\n //region IERC20Metadata\n\n function name() public override pure returns (string memory) {\n return NAME;\n }\n\n function symbol() public override pure returns (string memory) {\n return SYMBOL;\n }\n\n function decimals() public override pure returns (uint8) {\n return DECIMALS;\n }\n //endregion\n\n // allow receiving eth\n receive() external payable {}\n}\n"
},
"@openzeppelin/contracts/utils/Context.sol": {
"content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n"
},
"@openzeppelin/contracts/utils/math/SafeMath.sol": {
"content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)\n\npragma solidity ^0.8.0;\n\n// CAUTION\n// This version of SafeMath should only be used with Solidity 0.8 or later,\n// because it relies on the compiler's built in overflow checks.\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations.\n *\n * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler\n * now has built in overflow checking.\n */\nlibrary SafeMath {\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n *\n * _Available since v3.4._\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n *\n * _Available since v3.4._\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's ` ` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(uint256 a, uint256 b) internal pure returns (uint256) {\n return a b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting on\n * overflow (when the result is negative).\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n return a * b;\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator.\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(uint256 a, uint256 b) internal pure returns (uint256) {\n return a / b;\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting when dividing by zero.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n return a % b;\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n * overflow (when the result is negative).\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {trySub}.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b <= a, errorMessage);\n return a - b;\n }\n }\n\n /**\n * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a / b;\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n * reverting with custom message when dividing by zero.\n *\n * CAUTION: This function is deprecated because it requires allocating memory for the error\n * message unnecessarily. For custom revert reasons use {tryMod}.\n *\n * Counterpart to Solidity's `%` operator. This function uses a `revert`\n * opcode (which leaves remaining gas untouched) while Solidity uses an\n * invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function mod(\n uint256 a,\n uint256 b,\n string memory errorMessage\n ) internal pure returns (uint256) {\n unchecked {\n require(b > 0, errorMessage);\n return a % b;\n }\n }\n}\n"
},
"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": {
"content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n"
},
"@openzeppelin/contracts/access/Ownable.sol": {
"content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n"
},
"@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol": {
"content": "pragma solidity >=0.6.2;\n\nimport './IUniswapV2Router01.sol';\n\ninterface IUniswapV2Router02 is IUniswapV2Router01 {\n function removeLiquidityETHSupportingFeeOnTransferTokens(\n address token,\n uint liquidity,\n uint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline\n ) external returns (uint amountETH);\n function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(\n address token,\n uint liquidity,\n uint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline,\n bool approveMax, uint8 v, bytes32 r, bytes32 s\n ) external returns (uint amountETH);\n\n function swapExactTokensForTokensSupportingFeeOnTransferTokens(\n uint amountIn,\n uint amountOutMin,\n address[] calldata path,\n address to,\n uint deadline\n ) external;\n function swapExactETHForTokensSupportingFeeOnTransferTokens(\n uint amountOutMin,\n address[] calldata path,\n address to,\n uint deadline\n ) external payable;\n function swapExactTokensForETHSupportingFeeOnTransferTokens(\n uint amountIn,\n uint amountOutMin,\n address[] calldata path,\n address to,\n uint deadline\n ) external;\n}\n"
},
"@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol": {
"content": "pragma solidity >=0.5.0;\n\ninterface IUniswapV2Factory {\n event PairCreated(address indexed token0, address indexed token1, address pair, uint);\n\n function feeTo() external view returns (address);\n function feeToSetter() external view returns (address);\n\n function getPair(address tokenA, address tokenB) external view returns (address pair);\n function allPairs(uint) external view returns (address pair);\n function allPairsLength() external view returns (uint);\n\n function createPair(address tokenA, address tokenB) external returns (address pair);\n\n function setFeeTo(address) external;\n function setFeeToSetter(address) external;\n}\n"
},
"@openzeppelin/contracts/token/ERC20/IERC20.sol": {
"content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n"
},
"@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol": {
"content": "pragma solidity >=0.6.2;\n\ninterface IUniswapV2Router01 {\n function factory() external pure returns (address);\n function WETH() external pure returns (address);\n\n function addLiquidity(\n address tokenA,\n address tokenB,\n uint amountADesired,\n uint amountBDesired,\n uint amountAMin,\n uint amountBMin,\n address to,\n uint deadline\n ) external returns (uint amountA, uint amountB, uint liquidity);\n function addLiquidityETH(\n address token,\n uint amountTokenDesired,\n uint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline\n ) external payable returns (uint amountToken, uint amountETH, uint liquidity);\n function removeLiquidity(\n address tokenA,\n address tokenB,\n uint liquidity,\n uint amountAMin,\n uint amountBMin,\n address to,\n uint deadline\n ) external returns (uint amountA, uint amountB);\n function removeLiquidityETH(\n address token,\n uint liquidity,\n uint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline\n ) external returns (uint amountToken, uint amountETH);\n function removeLiquidityWithPermit(\n address tokenA,\n address tokenB,\n uint liquidity,\n uint amountAMin,\n uint amountBMin,\n address to,\n uint deadline,\n bool approveMax, uint8 v, bytes32 r, bytes32 s\n ) external returns (uint amountA, uint amountB);\n function removeLiquidityETHWithPermit(\n address token,\n uint liquidity,\n uint amountTokenMin,\n uint amountETHMin,\n address to,\n uint deadline,\n bool approveMax, uint8 v, bytes32 r, bytes32 s\n ) external returns (uint amountToken, uint amountETH);\n function swapExactTokensForTokens(\n uint amountIn,\n uint amountOutMin,\n address[] calldata path,\n address to,\n uint deadline\n ) external returns (uint[] memory amounts);\n function swapTokensForExactTokens(\n uint amountOut,\n uint amountInMax,\n address[] calldata path,\n address to,\n uint deadline\n ) external returns (uint[] memory amounts);\n function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)\n external\n payable\n returns (uint[] memory amounts);\n function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\n external\n returns (uint[] memory amounts);\n function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\n external\n returns (uint[] memory amounts);\n function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)\n external\n payable\n returns (uint[] memory amounts);\n\n function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);\n function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);\n function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);\n function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);\n function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);\n}\n"
}
},
"settings": {
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}
}}