// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
/// @notice ERC20 launched by the LaunchFactory. Enforces anti-snipe max-wallet /
/// max-tx limits until `restrictionsEndBlock`, after which it behaves as a plain ERC20.
contract LaunchToken is ERC20 {
error NotFactory();
error MaxWalletExceeded();
error MaxTxExceeded();
address public immutable factory;
uint256 public immutable restrictionsEndBlock;
uint256 public immutable maxWalletAmount; // 0 = no limit
uint256 public immutable maxTxAmount; // 0 = no limit
/// @notice Addresses exempt from restrictions (pool, locker, position manager, router, factory).
mapping(address => bool) public restrictionExempt;
constructor(
string memory name_,
string memory symbol_,
uint256 supply_,
uint16 maxWalletBps_,
uint16 maxTxBps_,
uint256 restrictionsEndBlock_
) ERC20(name_, symbol_) {
factory = msg.sender;
restrictionsEndBlock = restrictionsEndBlock_;
maxWalletAmount = maxWalletBps_ >= 10_000 ? 0 : (supply_ * maxWalletBps_) / 10_000;
maxTxAmount = maxTxBps_ >= 10_000 ? 0 : (supply_ * maxTxBps_) / 10_000;
restrictionExempt[msg.sender] = true;
_mint(msg.sender, supply_);
}
/// @notice Factory marks protocol addresses as exempt during launch (one-way).
function setRestrictionExempt(address account) external {
if (msg.sender != factory) revert NotFactory();
restrictionExempt[account] = true;
}
function restrictionsActive() public view returns (bool) {
return block.number < restrictionsEndBlock;
}
function _update(address from, address to, uint256 value) internal override {
if (from != address(0) && to != address(0) && restrictionsActive()) {
if (maxTxAmount != 0 && value > maxTxAmount && !restrictionExempt[from] && !restrictionExempt[to]) {
revert MaxTxExceeded();
}
if (maxWalletAmount != 0 && !restrictionExempt[to] && balanceOf(to) + value > maxWalletAmount) {
revert MaxWalletExceeded();
}
}
super._update(from, to, value);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "supply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxWalletBps_",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "maxTxBps_",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "restrictionsEndBlock_",
"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": "MaxTxExceeded",
"type": "error",
"inputs": []
},
{
"name": "MaxWalletExceeded",
"type": "error",
"inputs": []
},
{
"name": "NotFactory",
"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": "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": "factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "maxTxAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "maxWalletAmount",
"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": "restrictionExempt",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "restrictionsActive",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "restrictionsEndBlock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "setRestrictionExempt",
"type": "function",
"inputs": [
{
"name": "account",
"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"
}
]0x6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde031461062257508063095ea7b3146105a057806318160ddd14610583578063225a10211461050857806323b872dd146104295780632f982c67146103ef578063313ce567146103d457806370a082311461039d57806374c6fdec146103615780638c0b5e221461032757806394a8cbd4146102ea57806395d89b41146101cf578063a9059cbb1461019e578063aa4bde2814610164578063c45a0155146101205763dd62ed3e146100cc575f80fd5b3461011c57604036600319011261011c576100e561071b565b6100ed610731565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b5f80fd5b3461011c575f36600319011261011c576040517f00000000000000000000000052453b4289a6c3a70bb8b4682bcd3d8731267e286001600160a01b03168152602090f35b3461011c575f36600319011261011c5760206040517f000000000000000000000000000000000000000000108b2a2c280290940000008152f35b3461011c57604036600319011261011c576101c46101ba61071b565b6024359033610747565b602060405160018152f35b3461011c575f36600319011261011c576040515f6004548060011c906001811680156102e0575b6020831081146102cc578285529081156102b0575060011461025b575b50819003601f01601f191681019067ffffffffffffffff82118183101761024757610243829182604052826106f1565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b82821061029a57506020915082010182610213565b6001816020925483858801015201910190610285565b90506020925060ff191682840152151560051b82010182610213565b634e487b7160e01b5f52602260045260245ffd5b91607f16916101f6565b3461011c57602036600319011261011c576001600160a01b0361030b61071b565b165f526005602052602060ff60405f2054166040519015158152f35b3461011c575f36600319011261011c5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461011c575f36600319011261011c5760206040517f00000000000000000000000000000000000000000000000000000000018567dc43108152f35b3461011c57602036600319011261011c576001600160a01b036103be61071b565b165f525f602052602060405f2054604051908152f35b3461011c575f36600319011261011c57602060405160128152f35b3461011c575f36600319011261011c5760206040517f00000000000000000000000000000000000000000000000000000000018567dc8152f35b3461011c57606036600319011261011c5761044261071b565b61044a610731565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f198110610488575b506101c49350610747565b8381106104ed5784156104da5733156104c7576101c4945f52600160205260405f2060018060a01b0333165f526020528360405f20910390558461047d565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b3461011c57602036600319011261011c5761052161071b565b7f00000000000000000000000052453b4289a6c3a70bb8b4682bcd3d8731267e286001600160a01b03163303610574576001600160a01b03165f908152600560205260409020805460ff19166001179055005b631966391b60e11b5f5260045ffd5b3461011c575f36600319011261011c576020600254604051908152f35b3461011c57604036600319011261011c576105b961071b565b6024359033156104da576001600160a01b03169081156104c757335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b3461011c575f36600319011261011c575f6003548060011c906001811680156106e7575b6020831081146102cc578285529081156102b057506001146106925750819003601f01601f191681019067ffffffffffffffff82118183101761024757610243829182604052826106f1565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b8282106106d157506020915082010182610213565b60018160209254838588010152019101906106bc565b91607f1691610646565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361011c57565b602435906001600160a01b038216820361011c57565b6001600160a01b031690811561092e576001600160a01b031691821561091b577f00000000000000000000000000000000000000000000000000000000018567dc4310610806575b815f525f60205260405f20548181106107ed57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b7f00000000000000000000000000000000000000000000000000000000000000008015159081610911575b50806108fa575b806108e3575b6108d4577f000000000000000000000000000000000000000000108b2a2c2802909400000080151590816108bb575b81610888575b501561078f57632ce93b5960e01b5f5260045ffd5b9050835f525f60205260405f20548281018091116108a757115f610873565b634e487b7160e01b5f52601160045260245ffd5b9050835f52600560205260ff60405f205416159061086d565b63136c002360e21b5f5260045ffd5b50825f52600560205260ff60405f2054161561083e565b50815f52600560205260ff60405f20541615610838565b905081115f610831565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffdfea2646970667358221220d2bb0b6502f25a1e3d745a3451c46d30d0f7f1c6494d2d5afad6bcd69e4c520264736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| 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 |
|---|---|---|---|
| 0x682c48…be0e14 | 22 days agoSun, 26 Jul 2026 14:39:54 UTC | Transfer | [0] 0x000000000000…792d83da [1] 0x000000000000…f738f079 data: 0x000000000000000000…a8bcf95d |
| 0x682c48…be0e14 | 22 days agoSun, 26 Jul 2026 14:39:54 UTC | Approval | [0] 0x000000000000…792d83da [1] 0x000000000000…959e5cb2 data: 0x000000000000000000…a8bcf95d |
| 0x682c48…be0e14 | 22 days agoSun, 26 Jul 2026 14:39:54 UTC | Transfer | [0] 0x000000000000…7e08b72c [1] 0x000000000000…792d83da data: 0x000000000000000000…a8bcf95d |
| 0xeb204b…d44e14 | 22 days agoSun, 26 Jul 2026 14:39:52 UTC | Approval | [0] 0x000000000000…7e08b72c [1] 0x000000000000…792d83da data: 0xffffffffffffffffff…ffffffff |
| 0x42892e…c1f6c1 | 22 days agoSun, 26 Jul 2026 12:45:04 UTC | Transfer | [0] 0x000000000000…b59e816e [1] 0x000000000000…7e08b72c data: 0x000000000000000000…a8bcf95d |
| 0xf0c01a…8c1b1a | 23 days agoSun, 26 Jul 2026 06:22:52 UTC | Transfer | [0] 0x000000000000…cce42a1c [1] 0x000000000000…b59e816e data: 0x000000000000000000…a8bcf95d |
| 0xf832e8…d35063 | 23 days agoSun, 26 Jul 2026 06:22:50 UTC | Transfer | [0] 0x000000000000…b59e816e [1] 0x000000000000…cce42a1c data: 0x000000000000000000…a8bcf95d |
| 0x95908f…99dab2 | 23 days agoSat, 25 Jul 2026 18:34:06 UTC | Transfer | [0] 0x000000000000…8f26d0f3 [1] 0x000000000000…b59e816e data: 0x000000000000000000…a8bcf95d |
| 0x042237…5deb88 | 34 days agoWed, 15 Jul 2026 00:47:07 UTC | Transfer | [0] 0x000000000000…1b703a7e [1] 0x000000000000…ae86850d data: 0x000000000000000000…767c32f3 |
| 0x042237…5deb88 | 34 days agoWed, 15 Jul 2026 00:47:07 UTC | Transfer | [0] 0x000000000000…1b703a7e [1] 0x000000000000…8f26d0f3 data: 0x000000000000000000…2a5dca8a |
| 0x042237…5deb88 | 34 days agoWed, 15 Jul 2026 00:47:07 UTC | Transfer | [0] 0x000000000000…f738f079 [1] 0x000000000000…1b703a7e data: 0x000000000000000000…a0d9fd7d |
| 0xabf134…38db52 | 34 days agoTue, 14 Jul 2026 08:27:21 UTC | Transfer | [0] 0x000000000000…ae86850d [1] 0x000000000000…f738f079 data: 0x000000000000000000…d5270534 |
| 0xa7b802…90b7ab | 34 days agoTue, 14 Jul 2026 08:27:21 UTC | Approval | [0] 0x000000000000…ae86850d [1] 0x000000000000…55ddfc38 data: 0xffffffffffffffffff…ffffffff |
| 0xfe02e5…724bf3 | 35 days agoMon, 13 Jul 2026 23:43:47 UTC | Transfer | [0] 0x000000000000…1b703a7e [1] 0x000000000000…ae86850d data: 0x000000000000000000…d5270534 |
| 0xfe02e5…724bf3 | 35 days agoMon, 13 Jul 2026 23:43:47 UTC | Transfer | [0] 0x000000000000…1b703a7e [1] 0x000000000000…8f26d0f3 data: 0x000000000000000000…7e5f2ed3 |
| 0xfe02e5…724bf3 | 35 days agoMon, 13 Jul 2026 23:43:47 UTC | Transfer | [0] 0x000000000000…f738f079 [1] 0x000000000000…1b703a7e data: 0x000000000000000000…53863407 |
| 0x474b71…76ce39 | 35 days agoMon, 13 Jul 2026 17:31:33 UTC | Transfer | [0] 0x000000000000…a449308f [1] 0x000000000000…f738f079 data: 0x000000000000000000…23a14b6e |
| 0xd7fbc4…e533a9 | 35 days agoMon, 13 Jul 2026 17:31:32 UTC | Approval | [0] 0x000000000000…a449308f [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0xf16d61…2229a5 | 36 days agoSun, 12 Jul 2026 23:08:40 UTC | Transfer | [0] 0x000000000000…018d237c [1] 0x000000000000…f738f079 data: 0x000000000000000000…1655fe87 |
| 0xf16d61…2229a5 | 36 days agoSun, 12 Jul 2026 23:08:40 UTC | Approval | [0] 0x000000000000…018d237c [1] 0x000000000000…959e5cb2 data: 0x000000000000000000…1655fe87 |
| 0xf16d61…2229a5 | 36 days agoSun, 12 Jul 2026 23:08:40 UTC | Transfer | [0] 0x000000000000…2595dc52 [1] 0x000000000000…018d237c data: 0x000000000000000000…1655fe87 |
| 0xc46521…fa8b51 | 36 days agoSun, 12 Jul 2026 23:08:33 UTC | Transfer | [0] 0x000000000000…018d237c [1] 0x000000000000…f738f079 data: 0x000000000000000000…0ff1bab9 |
| 0xc46521…fa8b51 | 36 days agoSun, 12 Jul 2026 23:08:33 UTC | Approval | [0] 0x000000000000…018d237c [1] 0x000000000000…959e5cb2 data: 0x000000000000000000…0ff1bab9 |
| 0xc46521…fa8b51 | 36 days agoSun, 12 Jul 2026 23:08:33 UTC | Transfer | [0] 0x000000000000…e4df5c81 [1] 0x000000000000…018d237c data: 0x000000000000000000…0ff1bab9 |
| 0xb88660…4fe402 | 36 days agoSun, 12 Jul 2026 23:08:19 UTC | Transfer | [0] 0x000000000000…018d237c [1] 0x000000000000…f738f079 data: 0x000000000000000000…da4d3fe7 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xeb204b…d44e14 | Approve | 19,949,275 | 22 days agoSun, 26 Jul 2026 14:39:52 UTC | 0xcedf…b72c | IN | silly | $0.000 ETH | 0.00000240 | |
| 0xf0c01a…8c1b1a | Transfer | 19,652,139 | 23 days agoSun, 26 Jul 2026 06:22:52 UTC | 0xe9c1…2a1c | IN | silly | $0.000 ETH | 0.00000282 | |
| 0xa7b802…90b7ab | Approve | 9,384,891 | 34 days agoTue, 14 Jul 2026 08:27:21 UTC | 0x7bad…850d | IN | silly | $0.000 ETH | 0.00000213 | |
| 0xd7fbc4…e533a9 | Approve | 8,848,905 | 35 days agoMon, 13 Jul 2026 17:31:32 UTC | 0x9dd1…308f | IN | silly | $0.000 ETH | 0.00000235 | |
| 0xb9edc9…39ae78 | Approve | 8,188,134 | 36 days agoSun, 12 Jul 2026 23:08:03 UTC | 0x50ef…5c81 | IN | silly | $0.000 ETH | 0.00000251 | |
| 0x89fb6b…a4cbe5 | Approve | 8,188,132 | 36 days agoSun, 12 Jul 2026 23:08:03 UTC | 0xfd73…dc52 | IN | silly | $0.000 ETH | 0.00000250 | |
| 0xe6e7fa…586777 | Approve | 8,188,130 | 36 days agoSun, 12 Jul 2026 23:08:03 UTC | 0x7bad…850d | IN | silly | $0.000 ETH | 0.00000249 | |
| 0x71ac74…fe35bf | Approve | 8,188,103 | 36 days agoSun, 12 Jul 2026 23:08:00 UTC | 0x9b85…f495 | IN | silly | $0.000 ETH | 0.00000249 | |
| 0x22891a…682e4c | Approve | 8,188,070 | 36 days agoSun, 12 Jul 2026 23:07:57 UTC | 0x1d3e…59f8 | IN | silly | $0.000 ETH | 0.00000250 | |
| 0xbe0874…641ef6 | Approve | 8,188,070 | 36 days agoSun, 12 Jul 2026 23:07:57 UTC | 0xe402…563f | IN | silly | $0.000 ETH | 0.00000250 | |
| 0x5e8cfc…3e5f0f | Approve | 8,188,059 | 36 days agoSun, 12 Jul 2026 23:07:56 UTC | 0xd584…2d45 | IN | silly | $0.000 ETH | 0.00000248 | |
| 0x5c69a4…d21590 | Approve | 8,188,059 | 36 days agoSun, 12 Jul 2026 23:07:56 UTC | 0x40d0…edd5 | IN | silly | $0.000 ETH | 0.00000248 | |
| 0xaa2f2b…5dcf2c | Approve | 8,188,059 | 36 days agoSun, 12 Jul 2026 23:07:56 UTC | 0x6bac…f86a | IN | silly | $0.000 ETH | 0.00000248 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 8,188,048 | 36 days agoSun, 12 Jul 2026 23:07:55 UTC | 0x2a5926…0ce05b | CREATE2 | launchToken | 0x5245…7e28 | IN | 0xe451…3d5d | 0 ETH |