PotatoToken

0x37466293bba712ea646634c9da7d21fbf2ea60b4

Verification
Verified
v0.8.24+commit.e11b9ed9
Type
Contract
2,408 bytes
ABI entries
28
12 read · 4 write
License
mit

Contract information

Address
0x37466293bba712ea646634c9da7d21fbf2ea60b4
Chain
Robinhood Chain (4663)
Compiler
v0.8.24+commit.e11b9ed9
Optimization
Enabled
Creation tx
0xc7b6f39028…36530269ed

Token

Name
DeepFryer
Symbol
DEEPFRYER
Decimals
18
Holders
24

Read contract (12)

allowance(address, address)uint256
antiSnipeDeadlineBlock()uint256
antiSnipeExempt(address)bool
balanceOf(address)uint256
decimals()uint8
maxWallet()uint256
name()string
owner()address
pad()address
pool()address
symbol()string
totalSupply()uint256

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": "pad_",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "positionManager_",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "locker_",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "maxWallet_",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "antiSnipeBlocks_",
        "type": "uint256"
      }
    ],
    "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": [],
    "name": "MaxWalletExceeded",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "OnlyPad",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "PoolAlreadySet",
    "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": [],
    "name": "antiSnipeDeadlineBlock",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "name": "antiSnipeExempt",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "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": "decimals",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "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": "owner",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "pure",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "pad",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "pool",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "pool_",
        "type": "address"
      }
    ],
    "name": "setPool",
    "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": [
      {
        "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.24;

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

/// @title PotatoToken
/// @notice Fixed-supply ERC-20. The entire supply is minted to the launchpad
///         (the deployer) in the constructor. There is no owner, no mint, no
///         pause, no blacklist — nothing a rug could hide in.
///
///         The ONE piece of logic beyond a vanilla ERC-20 is a time-boxed
///         anti-snipe max-wallet cap: for a short window after launch, no
///         non-exempt address may end a transfer holding more than
///         `maxWallet` tokens. This throttles bots from hoovering up the
///         single-sided launch supply in the first few blocks. It is enforced
///         purely on the receiving balance, exempts the launch infrastructure
///         (pad / pool / position manager / locker), and — critically — becomes
///         a complete no-op once `antiSnipeDeadlineBlock` passes, so it can
///         never interfere with normal trading afterwards.
contract PotatoToken is ERC20 {
    /// @notice The launchpad that deployed this token (holds the full supply at genesis).
    address public immutable pad;
    /// @notice Max tokens a non-exempt wallet may hold during the anti-snipe window.
    uint256 public immutable maxWallet;
    /// @notice Last block (inclusive) at which the max-wallet cap is enforced.
    uint256 public immutable antiSnipeDeadlineBlock;

    /// @notice Addresses exempt from the anti-snipe cap (launch infrastructure).
    mapping(address => bool) public antiSnipeExempt;

    /// @notice The token's Uniswap V3 pool. Set once by the pad, right after the
    ///         pool is created (its address isn't known at construction time).
    address public pool;

    error OnlyPad();
    error PoolAlreadySet();
    error MaxWalletExceeded();

    /// @param pad_ the deployer/launchpad; receives the full supply and is exempt.
    /// @param positionManager_ Uniswap NonfungiblePositionManager (exempt).
    /// @param locker_ the fee locker that holds the LP NFT (exempt).
    /// @param maxWallet_ max non-exempt balance during the anti-snipe window.
    /// @param antiSnipeBlocks_ length of the window in blocks (0 disables it).
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 supply_,
        address pad_,
        address positionManager_,
        address locker_,
        uint256 maxWallet_,
        uint256 antiSnipeBlocks_
    ) ERC20(name_, symbol_) {
        pad = pad_;
        maxWallet = maxWallet_;
        antiSnipeDeadlineBlock = block.number + antiSnipeBlocks_;

        antiSnipeExempt[pad_] = true;
        antiSnipeExempt[positionManager_] = true;
        antiSnipeExempt[locker_] = true;
        // Fee-burn sink: the locker sends the launched-token side of swap fees here,
        // which must never trip the max-wallet cap and revert a permissionless
        // collect() during the anti-snipe window.
        antiSnipeExempt[0x000000000000000000000000000000000000dEaD] = true;

        _mint(pad_, supply_);
    }

    /// @notice One-time hook for the pad to register the pool as exempt once it
    ///         exists. The pool must be exempt because it custodies ~the entire
    ///         supply as single-sided LP.
    function setPool(address pool_) external {
        if (msg.sender != pad) revert OnlyPad();
        if (pool != address(0)) revert PoolAlreadySet();
        pool = pool_;
        antiSnipeExempt[pool_] = true;
    }

    /// @notice Always address(0). PotatoToken has no owner, mint, pause, or
    ///         blacklist — it is renounced by construction (there was never an owner
    ///         to renounce). Exposed purely so scanners and DEX tools that detect
    ///         "renounced" via `owner() == address(0)` recognize it as such.
    function owner() external pure returns (address) {
        return address(0);
    }

    /// @dev Enforces the max-wallet cap on the recipient during the anti-snipe
    ///      window only. After `antiSnipeDeadlineBlock` this is a pure no-op, so
    ///      transfers behave exactly like a vanilla ERC-20 forever after.
    function _update(address from, address to, uint256 value) internal override {
        super._update(from, to, value);

        if (block.number <= antiSnipeDeadlineBlock && to != address(0) && !antiSnipeExempt[to]) {
            if (balanceOf(to) > maxWallet) revert MaxWalletExceeded();
        }
    }
}
Chain explorer1218msChain node67ms