PewToken

0x98d94d8e9711abc3975878efcb1c1b2ff8e244bc

Verification
Verified
v0.8.26+commit.8a97fa7a
Type
Contract
3,692 bytes
ABI entries
30
17 read · 4 write
License
none

Contract information

Address
0x98d94d8e9711abc3975878efcb1c1b2ff8e244bc
Chain
Robinhood Chain (4663)
Compiler
v0.8.26+commit.8a97fa7a
Optimization
Enabled
Creation tx
0x4e6a7833ac…4243919bd5

Token

Name
Sushi SZN
Symbol
SushiSZN
Decimals
18
Holders
52

Read contract (17)

allowance(address, address)uint256
balanceOf(address)uint256
capUntil()uint256
decimals()uint8
description()string
launcher()address
logoURI()string
maxWallet()uint256
name()string
pool()address
symbol()string
telegram()string
totalSupply()uint256
tradingOpen()bool
tradingOpensAt()uint256
twitter()string
website()string

Events (2)

ApprovalTransfer

ABI

[
  {
    "inputs": [
      {
        "internalType": "string",
        "name": "name_",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "symbol_",
        "type": "string"
      },
      {
        "internalType": "uint256",
        "name": "supply_",
        "type": "uint256"
      },
      {
        "internalType": "address",
        "name": "launcher_",
        "type": "address"
      },
      {
        "internalType": "string",
        "name": "logoURI_",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "description_",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "twitter_",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "telegram_",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "website_",
        "type": "string"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "constructor"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "allowance",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "needed",
        "type": "uint256"
      }
    ],
    "name": "ERC20InsufficientAllowance",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "sender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "balance",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "needed",
        "type": "uint256"
      }
    ],
    "name": "ERC20InsufficientBalance",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "approver",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidApprover",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "receiver",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidReceiver",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "sender",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidSender",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidSpender",
    "type": "error"
  },
  {
    "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": "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": "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": "value",
        "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": "capUntil",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "pool_",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "maxWallet_",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "launchDelaySecs",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "capWindowSecs",
        "type": "uint256"
      }
    ],
    "name": "configure",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "decimals",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "description",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "launcher",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "logoURI",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "maxWallet",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "name",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "pool",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "symbol",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "telegram",
    "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": "tradingOpen",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "tradingOpensAt",
    "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": "",
        "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": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "twitter",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "website",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  }
]

Source code

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";

/*//////////////////////////////////////////////////////////////////////////////
//                                                                            //
//                                 pew.fun                                    //
//                     the sniper-resistant launchpad                         //
//                            https://pew.fun                                 //
//                                                                            //
//////////////////////////////////////////////////////////////////////////////*/

/// @title  PewToken
/// @author pew.fun (https://pew.fun)
/// @notice The immutable ERC-20 minted by every pew.fun launch — instant launch and crew/party alike.
///         Ownerless by design: no owner, no mint after construction, no tax, no pause, no blacklist.
///         There is nothing to rug, so it passes honeypot/rug scanners cleanly. On-chain metadata (logo +
///         socials) lets explorers and aggregators render the coin without an off-chain index.
///
///         The ONLY privileged action is a one-time `configure` by the launcher at launch — it wires the
///         pool and a short, timestamp-bounded anti-snipe window. Once that window closes the token is a
///         plain, unrestricted ERC-20 forever.
///
/// @dev    Anti-snipe is TIMESTAMP-based, not block-based: on Arbitrum/Orbit `block.number` is the
///         parent-chain block number, which the frontend can't read reliably — `block.timestamp` is
///         unambiguous on both sides and matches the app's launch countdown.
/// @custom:security-contact security@pew.fun
contract PewToken is ERC20 {
    /// @notice The factory / crew contract that launched this token (holds the initial supply at mint).
    address public immutable launcher;

    // ─────────────────────────────────── on-chain metadata ───────────────────────────────────
    string public logoURI;
    string public description;
    string public twitter;
    string public telegram;
    string public website;

    // ──────────────────────────── launch protections (set once at launch) ────────────────────────────
    address public pool; // the token's Uniswap V3 pool
    uint256 public maxWallet; // per-wallet cap during the anti-snipe window (0 = cap disabled)
    uint256 public tradingOpensAt; // public trading is blocked before this timestamp (launch-delay gate)
    uint256 public capUntil; // the max-wallet cap is enforced until this timestamp
    bool private _configured;

    constructor(
        string memory name_,
        string memory symbol_,
        uint256 supply_,
        address launcher_,
        string memory logoURI_,
        string memory description_,
        string memory twitter_,
        string memory telegram_,
        string memory website_
    ) ERC20(name_, symbol_) {
        launcher = launcher_;
        logoURI = logoURI_;
        description = description_;
        twitter = twitter_;
        telegram = telegram_;
        website = website_;
        _mint(launcher_, supply_); // full supply to the launcher; there is no other mint path
    }

    /// @notice One-time launch wiring by the launcher: set the pool + the anti-snipe window. Windows are
    ///         in SECONDS. Reverts if called by anyone but the launcher, or a second time.
    function configure(address pool_, uint256 maxWallet_, uint256 launchDelaySecs, uint256 capWindowSecs)
        external
    {
        require(msg.sender == launcher && !_configured, "not launcher / configured");
        _configured = true;
        pool = pool_;
        maxWallet = maxWallet_;
        tradingOpensAt = block.timestamp + launchDelaySecs;
        capUntil = tradingOpensAt + capWindowSecs;
    }

    /// @notice True once the token is configured and public trading has opened.
    function tradingOpen() external view returns (bool) {
        return _configured && block.timestamp >= tradingOpensAt;
    }

    /// @dev Launch protections apply ONLY to public trades — transfers touching the pool where neither side
    ///      is the launcher. The launcher (its exempt first buy + any distributions) is never restricted.
    ///        1. launch-delay: public trading is blocked until `tradingOpensAt`.
    ///        2. anti-snipe: for `capUntil` after trading opens, a public buy can't push a wallet past
    ///           `maxWallet` (skipped when `maxWallet == 0`, so it can never brick trading).
    function _update(address from, address to, uint256 value) internal override {
        if (_configured && (from == pool || to == pool) && from != launcher && to != launcher) {
            require(block.timestamp >= tradingOpensAt, "launch: trading not open");
            if (maxWallet != 0 && block.timestamp < capUntil && to != pool && to != address(0)) {
                require(balanceOf(to) + value <= maxWallet, "anti-snipe: max wallet");
            }
        }
        super._update(from, to, value);
    }
}
Chain explorer7357msChain node78ms