BaseBase
0xf3...f263
ThuggyPenguins

ThuggyPenguins

THUGGY

代币
市值
$1.00
 
价格
2%
此合同的源代码已经过验证!
合同元数据
编译器
0.8.20+commit.a1b79de6
语言
Solidity
合同源代码
文件 1 的 6:Context.sol
合同源代码
文件 2 的 6:ERC20.sol
合同源代码
文件 3 的 6:IERC20.sol
合同源代码
文件 4 的 6:IERC20Metadata.sol
合同源代码
文件 5 的 6:Ownable.sol
合同源代码
文件 6 的 6:Thuggy.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.9/contracts/token/ERC20/ERC20.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.9/contracts/access/Ownable.sol";

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);
}

interface IUniswapAccessControl {
    function isTradable() external view returns (bool);

    function allowTrade() external;
}

contract Thuggy is ERC20, Ownable {
    uint256 private lpAdditionLockUntil = type(uint256).max;
    uint256 public buyLimit = 1_500_000 * 10**decimals();
    address public uniswapV2Pair;

    IUniswapV2Router02 private uniswapV2Router;
    IUniswapAccessControl private uniswapAccessControl;

    constructor(address uniswapAccessControlAddress)
        ERC20("ThuggyPenguins", "THUGGY")
    {
        _mint(msg.sender, 100_000_000 * 10**decimals());

        uniswapV2Router = IUniswapV2Router02(
            0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24
        );
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
            address(this),
            uniswapV2Router.WETH()
        );

        uniswapAccessControl = IUniswapAccessControl(
            uniswapAccessControlAddress
        );
    }

    function updateBuyLimit(uint256 newLimit) external onlyOwner {
        buyLimit = newLimit;
    }

    function allowTrade() external onlyOwner {
        lpAdditionLockUntil = block.timestamp + 15;
        uniswapAccessControl.allowTrade();
    }

    function tradeIsAllowed() public view returns (bool) {
        bool alreadySwaped = (lpAdditionLockUntil < block.timestamp);
        return (alreadySwaped || uniswapAccessControl.isTradable());
    }

    function updateUniswapAccessControl(address newManager) external onlyOwner {
        require(newManager != address(0), "Invalid address");
        uniswapAccessControl = IUniswapAccessControl(newManager);
    }

    function isContract(address addr) internal view returns (bool) {
        return addr.code.length > 0;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        address buyer = tx.origin;

        if (from == owner() || buyer == owner()) {
            super._transfer(from, to, amount);
            return;
        }

        if (to == uniswapV2Pair || isContract(to)) {// Prevents distributed marketing tokens from entering the liquidity pool before the official launch
            if (
                block.timestamp < lpAdditionLockUntil ||
                block.timestamp == type(uint256).max
            ) {
                revert("Only owner can add initial liquidity.");
            }
        }

        if (from == uniswapV2Pair) {
            require(tradeIsAllowed(), "Trading is not allowed.");

            require(
                balanceOf(buyer) + amount <= buyLimit ||
                    lpAdditionLockUntil + 300 < block.timestamp,
                "Buy limit exceeded."
            );
            if (lpAdditionLockUntil == type(uint256).max)
                lpAdditionLockUntil = block.timestamp + 15;
        }

        super._transfer(from, to, amount);
    }
}
设置
{
  "compilationTarget": {
    "contracts/Thuggy.sol": "Thuggy"
  },
  "evmVersion": "shanghai",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "remappings": []
}
ABI
[{"inputs":[{"internalType":"address","name":"uniswapAccessControlAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":[],"name":"allowTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":[],"name":"tradeIsAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"updateBuyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newManager","type":"address"}],"name":"updateUniswapAccessControl","outputs":[],"stateMutability":"nonpayable","type":"function"}]