// 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();
}
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "supply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "pad_",
"type": "address",
"internalType": "address"
},
{
"name": "positionManager_",
"type": "address",
"internalType": "address"
},
{
"name": "locker_",
"type": "address",
"internalType": "address"
},
{
"name": "maxWallet_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "antiSnipeBlocks_",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "ERC20InsufficientAllowance",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "allowance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSpender",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "MaxWalletExceeded",
"type": "error",
"inputs": []
},
{
"name": "OnlyPad",
"type": "error",
"inputs": []
},
{
"name": "PoolAlreadySet",
"type": "error",
"inputs": []
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "antiSnipeDeadlineBlock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "antiSnipeExempt",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "maxWallet",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "pure"
},
{
"name": "pad",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pool",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "setPool",
"type": "function",
"inputs": [
{
"name": "pool_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
}
]0x608060408181526004918236101561001657600080fd5b600092833560e01c91826306fdde031461066757508163095ea7b3146105bd57816316f0115b1461059457816318160ddd1461057557816323b872dd1461047e578163313ce567146104625781634437152a146103b857816370a08231146103815781638da5cb5b146103665781639361266c1461032257816395d89b411461020157508063a9059cbb146101d1578063d21e00de14610197578063dd62ed3e1461014f578063ddf45597146101125763f8b45b05146100d557600080fd5b3461010e578160031936011261010e57602090517f000000000000000000000000000000000000000000108b2a2c280290940000008152f35b5080fd5b503461010e57602036600319011261010e5760209160ff9082906001600160a01b0361013c61078a565b1681526005855220541690519015158152f35b503461010e578060031936011261010e578060209261016c61078a565b6101746107a5565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b503461010e578160031936011261010e57602090517f0000000000000000000000000000000000000000000000000000000001868afb8152f35b503461010e578060031936011261010e576020906101fa6101f061078a565b60243590336107bb565b5160018152f35b83833461010e578160031936011261010e5780519082845460018160011c9060018316928315610318575b6020938484108114610305578388529081156102e95750600114610294575b505050829003601f01601f191682019267ffffffffffffffff841183851017610281575082918261027d925282610741565b0390f35b634e487b7160e01b815260418552602490fd5b8787529192508591837f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8385106102d5575050505083010185808061024b565b8054888601830152930192849082016102bf565b60ff1916878501525050151560051b840101905085808061024b565b634e487b7160e01b895260228a52602489fd5b91607f169161022c565b50503461010e578160031936011261010e57517f00000000000000000000000094085e08b91da3cb974c14fe6d51b20a014b60696001600160a01b03168152602090f35b50503461010e578160031936011261010e5751908152602090f35b50503461010e57602036600319011261010e5760209181906001600160a01b036103a961078a565b16815280845220549051908152f35b90503461045e57602036600319011261045e576103d361078a565b6001600160a01b03907f00000000000000000000000094085e08b91da3cb974c14fe6d51b20a014b60698216330361044e576006549282841661044057501680916bffffffffffffffffffffffff60a01b1617600655825260056020528120600160ff1982541617905580f35b8451632fc00d1f60e11b8152fd5b8351630411cf3760e01b81528390fd5b8280fd5b50503461010e578160031936011261010e576020905160128152f35b905082346105725760603660031901126105725761049a61078a565b6104a26107a5565b916044359360018060a01b0383168083526001602052868320338452602052868320549160001983106104de575b6020886101fa8989896107bb565b86831061054657811561052f573315610518575082526001602090815286832033845281529186902090859003905582906101fa876104d0565b8751634a1406b160e11b8152908101849052602490fd5b875163e602df0560e01b8152908101849052602490fd5b8751637dc7a0d960e11b8152339181019182526020820193909352604081018790528291506060010390fd5b80fd5b50503461010e578160031936011261010e576020906002549051908152f35b50503461010e578160031936011261010e5760065490516001600160a01b039091168152602090f35b90503461045e578160031936011261045e576105d761078a565b602435903315610650576001600160a01b031691821561063957508083602095338152600187528181208582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8351634a1406b160e11b8152908101859052602490fd5b835163e602df0560e01b8152808401869052602490fd5b8490843461045e578260031936011261045e578260035460018160011c9060018316928315610737575b6020938484108114610305578388529081156102e957506001146106e157505050829003601f01601f191682019267ffffffffffffffff841183851017610281575082918261027d925282610741565b600387529192508591837fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b838510610723575050505083010185808061024b565b80548886018301529301928490820161070d565b91607f1691610691565b6020808252825181830181905290939260005b82811061077657505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501610754565b600435906001600160a01b03821682036107a057565b600080fd5b602435906001600160a01b03821682036107a057565b916001600160a01b038084169283156109195716918215610900576000918183528260205260409485842054908282106108cf575060208284937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef938896885287845203888720558486528786208181540190558751908152a37f0000000000000000000000000000000000000000000000000000000001868afb431115806108c7575b806108b1575b61086e57505050565b829181528060205220547f000000000000000000000000000000000000000000108b2a2c28029094000000106108a15750565b51632ce93b5960e01b8152600490fd5b50818152600560205260ff838220541615610865565b50600161085f565b865163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101829052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fdfea26469706673582212203ce7a91ae1bde9cf3cb8b239971b8efede94055d590afe89756114b277c41ce064736f6c63430008180033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000123 | $0 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x9b2e75…25927f | 16 days agoThu, 30 Jul 2026 19:26:54 UTC | Transfer | [0] 0x000000000000…a47e6846 [1] 0x000000000000…0000dead data: 0x000000000000000000…b2feb849 |
| 0x9b2e75…25927f | 16 days agoThu, 30 Jul 2026 19:26:54 UTC | Transfer | [0] 0x000000000000…54d04898 [1] 0x000000000000…a47e6846 data: 0x000000000000000000…b2feb849 |
| 0x819485…0cc95d | 22 days agoFri, 24 Jul 2026 22:45:52 UTC | Transfer | [0] 0x000000000000…9408f070 [1] 0x000000000000…54d04898 data: 0x000000000000000000…935d0b91 |
| 0x687e4a…122f17 | 22 days agoFri, 24 Jul 2026 22:45:52 UTC | Approval | [0] 0x000000000000…9408f070 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0x0ef76c…af9548 | 22 days agoFri, 24 Jul 2026 22:45:52 UTC | Transfer | [0] 0x000000000000…ce6ca2a0 [1] 0x000000000000…54d04898 data: 0x000000000000000000…ae07a7d4 |
| 0x91c38f…b97414 | 22 days agoFri, 24 Jul 2026 22:45:52 UTC | Approval | [0] 0x000000000000…ce6ca2a0 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0x975614…506b92 | 22 days agoFri, 24 Jul 2026 22:45:52 UTC | Transfer | [0] 0x000000000000…8ef315e5 [1] 0x000000000000…54d04898 data: 0x000000000000000000…280b7d0b |
| 0xd7ea60…c04d01 | 22 days agoFri, 24 Jul 2026 22:45:52 UTC | Transfer | [0] 0x000000000000…91551638 [1] 0x000000000000…54d04898 data: 0x000000000000000000…47e9d707 |
| 0xad4b3a…6f78dd | 22 days agoFri, 24 Jul 2026 22:45:52 UTC | Approval | [0] 0x000000000000…8ef315e5 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0xfae755…69c3d4 | 22 days agoFri, 24 Jul 2026 22:45:52 UTC | Approval | [0] 0x000000000000…91551638 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0x23a84d…5c6bf8 | 22 days agoFri, 24 Jul 2026 22:20:08 UTC | Transfer | [0] 0x000000000000…54d04898 [1] 0x000000000000…91551638 data: 0x000000000000000000…47e9d707 |
| 0x862450…341bef | 22 days agoFri, 24 Jul 2026 22:20:08 UTC | Transfer | [0] 0x000000000000…54d04898 [1] 0x000000000000…8ef315e5 data: 0x000000000000000000…280b7d0b |
| 0xa5b208…a3c1a7 | 22 days agoFri, 24 Jul 2026 22:20:08 UTC | Transfer | [0] 0x000000000000…54d04898 [1] 0x000000000000…ce6ca2a0 data: 0x000000000000000000…ae07a7d4 |
| 0x19d042…e3fd22 | 22 days agoFri, 24 Jul 2026 22:20:08 UTC | Transfer | [0] 0x000000000000…54d04898 [1] 0x000000000000…9408f070 data: 0x000000000000000000…935d0b91 |
| 0x802ec7…12f074 | 23 days agoThu, 23 Jul 2026 05:45:46 UTC | Transfer | [0] 0x000000000000…998205d4 [1] 0x000000000000…54d04898 data: 0x000000000000000000…c1a28294 |
| 0xc928d4…7d92ff | 23 days agoThu, 23 Jul 2026 05:45:46 UTC | Approval | [0] 0x000000000000…998205d4 [1] 0x000000000000…1fcf6f60 data: 0xffffffffffffffffff…ffffffff |
| 0x03007a…f82fd8 | 23 days agoThu, 23 Jul 2026 05:45:34 UTC | Transfer | [0] 0x000000000000…15d582c8 [1] 0x000000000000…54d04898 data: 0x000000000000000000…788371bc |
| 0xa5453b…75e077 | 23 days agoThu, 23 Jul 2026 05:45:34 UTC | Approval | [0] 0x000000000000…15d582c8 [1] 0x000000000000…959e5cb2 data: 0xffffffffffffffffff…ffffffff |
| 0xff4fa1…596c4b | 23 days agoThu, 23 Jul 2026 05:44:16 UTC | Transfer | [0] 0x000000000000…54d04898 [1] 0x000000000000…15d582c8 data: 0x000000000000000000…788371bc |
| 0x1f9f51…aecaac | 23 days agoThu, 23 Jul 2026 05:44:15 UTC | Transfer | [0] 0x000000000000…014b6069 [1] 0x000000000000…998205d4 data: 0x000000000000000000…c1a28294 |
| 0x1f9f51…aecaac | 23 days agoThu, 23 Jul 2026 05:44:15 UTC | Transfer | [0] 0x000000000000…54d04898 [1] 0x000000000000…014b6069 data: 0x000000000000000000…c1a28294 |
| 0x1f9f51…aecaac | 23 days agoThu, 23 Jul 2026 05:44:15 UTC | Approval | [0] 0x000000000000…014b6069 [1] 0x000000000000…638de0d3 data: 0x000000000000000000…00000000 |
| 0x1f9f51…aecaac | 23 days agoThu, 23 Jul 2026 05:44:15 UTC | Transfer | [0] 0x000000000000…014b6069 [1] 0x000000000000…54d04898 data: 0x000000000000000000…e7ffd8ea |
| 0x1f9f51…aecaac | 23 days agoThu, 23 Jul 2026 05:44:15 UTC | Approval | [0] 0x000000000000…014b6069 [1] 0x000000000000…638de0d3 data: 0x000000000000000000…e8000000 |
| 0x1f9f51…aecaac | 23 days agoThu, 23 Jul 2026 05:44:15 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…014b6069 data: 0x000000000000000000…e8000000 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x2657ac38…2ff12e | Transfer | 17,332,878 | 23 days agoThu, 23 Jul 2026 13:44:21 UTC | 0xcaf7…5d11 | IN | 0x40fc…20d1 | $0.001 DIH |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x91c38f…b97414 | Approve | 18,518,505 | 22 days agoFri, 24 Jul 2026 22:45:52 UTC | 0xd260…a2a0 | IN | fries in bag | $0.000 ETH | 0.00000494 | |
| 0x687e4a…122f17 | Approve | 18,518,505 | 22 days agoFri, 24 Jul 2026 22:45:52 UTC | 0xd10d…f070 | IN | fries in bag | $0.000 ETH | 0.00000494 | |
| 0xad4b3a…6f78dd | Approve | 18,518,505 | 22 days agoFri, 24 Jul 2026 22:45:52 UTC | 0x53a7…15e5 | IN | fries in bag | $0.000 ETH | 0.00000494 | |
| 0xfae755…69c3d4 | Approve | 18,518,505 | 22 days agoFri, 24 Jul 2026 22:45:52 UTC | 0xc26c…1638 | IN | fries in bag | $0.000 ETH | 0.00000494 | |
| 0xc928d4…7d92ff | Approve | 17,046,460 | 23 days agoThu, 23 Jul 2026 05:45:46 UTC | 0xba13…05d4 | IN | fries in bag | $0.000 ETH | 0.00000450 | |
| 0xa5453b…75e077 | Approve | 17,046,336 | 23 days agoThu, 23 Jul 2026 05:45:34 UTC | 0xb36b…82c8 | IN | fries in bag | $0.000 ETH | 0.00000448 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 17,045,556 | 23 days agoThu, 23 Jul 2026 05:44:15 UTC | 0x1f9f51…aecaac | CREATE2 | createToken | 0x77d0…6480 | IN | 0x40fc…20d1 | 0 ETH |