PewToken

0x0932c4d0c10a075ca7aab9801120b098cf48dff1

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

Contract information

Address
0x0932c4d0c10a075ca7aab9801120b098cf48dff1
Chain
Robinhood Chain (4663)
Compiler
v0.8.26+commit.8a97fa7a
Optimization
Enabled
Creation tx
0xdff1625231…4ff5b85a00

Token

Name
milAIdy
Symbol
MILAIDY
Decimals
18
Holders
8

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 explorer1162msChain node87ms