LunchTokenPlain
0x20b70d5ed3515f219bb7a6a2d8c7a27b05f5d3f4
Verification
Verified
v0.8.30+commit.73712a01
Type
Contract
2,285 bytes
ABI entries
22
9 read · 3 write
License
mit
Contract information
- Address
- 0x20b70d5ed3515f219bb7a6a2d8c7a27b05f5d3f4
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.30+commit.73712a01
- Optimization
- Enabled
- Creator
- 0xC783221AB1…631E80B988
- Creation tx
- 0x2dde9afa4f…7ef294686e
Token
- Name
- PawStrike
- Symbol
- PAW
- Decimals
- 18
- Holders
- 159
- Market
- View token page →
Read contract (9)
allowance(address, address) → uint256
balanceOf(address) → uint256
creator() → address
decimals() → uint8
launcher() → address
name() → string
symbol() → string
tokenURI() → string
totalSupply() → uint256
Events (2)
ApprovalTransfer
ABI
[
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "symbol_",
"type": "string"
},
{
"internalType": "uint256",
"name": "totalSupply_",
"type": "uint256"
},
{
"internalType": "address",
"name": "launcher_",
"type": "address"
},
{
"internalType": "address",
"name": "creator_",
"type": "address"
}
],
"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"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "length",
"type": "uint256"
}
],
"name": "StringsInsufficientHexLength",
"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": "creator",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "launcher",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "tokenURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"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"
}
]Source code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
// TEST: identical to LunchV3Token EXCEPT there is NO _update override — no first-hour 2% max-wallet,
// no pool/initLimits gate. A dead-plain, immutable, fixed-supply ERC20. Same constructor signature +
// a no-op initLimits so the existing launcher works unchanged. Purpose: see whether removing the
// anti-snipe transfer hook makes GMGN stop flagging "honeypot / TradeRestriction".
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
interface ILunchLauncherBase {
function baseTokenURI() external view returns (string memory);
}
contract LunchTokenPlain is ERC20 {
address public immutable launcher;
address public immutable creator;
constructor(
string memory name_,
string memory symbol_,
uint256 totalSupply_,
address launcher_,
address creator_
) ERC20(name_, symbol_) {
require(totalSupply_ > 0, "supply=0");
require(launcher_ != address(0), "launcher=0");
launcher = launcher_;
creator = creator_;
_mint(launcher_, totalSupply_);
}
// NO initLimits, NO _update override, NO privileged functions of any kind — a pure, immutable,
// fixed-supply ERC20 with unrestricted transfers from block 0. (launcher/creator are just public
// getters, kept for constructor-signature parity + so the auto-verify cron can read them.)
/// @notice Metadata for this coin: `<base><address>.json` (e.g. https://www.lunch.fun/t/0x8ec1….json),
/// resolving to JSON with description, image, banner and socials. Indexers (GMGN) read it.
/// @dev A `view` getter — it touches nothing in the transfer path, so the plain-ERC20 property
/// this contract exists to preserve is unchanged and honeypot simulators see the same
/// unrestricted buys/sells as before.
///
/// Stores no state. The address half derives from `address(this)` and the base is read from
/// the launcher rather than hardcoded, so a domain move is one owner call on the launcher
/// and repairs every coin at once — a baked-in constant would strand them all forever.
/// Profile edits stay off-chain and cost the creator no gas.
///
/// The launcher owner can only move where the JSON is fetched from; supply and transfers
/// stay untouchable. Never reverts: "" if no base is set or the launcher call fails.
function tokenURI() external view returns (string memory) {
try ILunchLauncherBase(launcher).baseTokenURI() returns (string memory base) {
if (bytes(base).length == 0) return "";
return string.concat(base, Strings.toHexString(address(this)), ".json");
} catch {
return "";
}
}
}
Chain explorer7427msChain node77ms