// 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"
}
]0x6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde031461062257508063095ea7b3146105a057806318160ddd14610583578063225a10211461050857806323b872dd146104295780632f982c67146103ef578063313ce567146103d457806370a082311461039d57806374c6fdec146103615780638c0b5e221461032757806394a8cbd4146102ea57806395d89b41146101cf578063a9059cbb1461019e578063aa4bde2814610164578063c45a0155146101205763dd62ed3e146100cc575f80fd5b3461011c57604036600319011261011c576100e561071b565b6100ed610731565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b5f80fd5b3461011c575f36600319011261011c576040517f00000000000000000000000052453b4289a6c3a70bb8b4682bcd3d8731267e286001600160a01b03168152602090f35b3461011c575f36600319011261011c5760206040517f000000000000000000000000000000000000000000108b2a2c280290940000008152f35b3461011c57604036600319011261011c576101c46101ba61071b565b6024359033610747565b602060405160018152f35b3461011c575f36600319011261011c576040515f6004548060011c906001811680156102e0575b6020831081146102cc578285529081156102b0575060011461025b575b50819003601f01601f191681019067ffffffffffffffff82118183101761024757610243829182604052826106f1565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b82821061029a57506020915082010182610213565b6001816020925483858801015201910190610285565b90506020925060ff191682840152151560051b82010182610213565b634e487b7160e01b5f52602260045260245ffd5b91607f16916101f6565b3461011c57602036600319011261011c576001600160a01b0361030b61071b565b165f526005602052602060ff60405f2054166040519015158152f35b3461011c575f36600319011261011c5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461011c575f36600319011261011c5760206040517f0000000000000000000000000000000000000000000000000000000001856dde43108152f35b3461011c57602036600319011261011c576001600160a01b036103be61071b565b165f525f602052602060405f2054604051908152f35b3461011c575f36600319011261011c57602060405160128152f35b3461011c575f36600319011261011c5760206040517f0000000000000000000000000000000000000000000000000000000001856dde8152f35b3461011c57606036600319011261011c5761044261071b565b61044a610731565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f198110610488575b506101c49350610747565b8381106104ed5784156104da5733156104c7576101c4945f52600160205260405f2060018060a01b0333165f526020528360405f20910390558461047d565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b3461011c57602036600319011261011c5761052161071b565b7f00000000000000000000000052453b4289a6c3a70bb8b4682bcd3d8731267e286001600160a01b03163303610574576001600160a01b03165f908152600560205260409020805460ff19166001179055005b631966391b60e11b5f5260045ffd5b3461011c575f36600319011261011c576020600254604051908152f35b3461011c57604036600319011261011c576105b961071b565b6024359033156104da576001600160a01b03169081156104c757335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b3461011c575f36600319011261011c575f6003548060011c906001811680156106e7575b6020831081146102cc578285529081156102b057506001146106925750819003601f01601f191681019067ffffffffffffffff82118183101761024757610243829182604052826106f1565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b8282106106d157506020915082010182610213565b60018160209254838588010152019101906106bc565b91607f1691610646565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361011c57565b602435906001600160a01b038216820361011c57565b6001600160a01b031690811561092e576001600160a01b031691821561091b577f0000000000000000000000000000000000000000000000000000000001856dde4310610806575b815f525f60205260405f20548181106107ed57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b7f00000000000000000000000000000000000000000000000000000000000000008015159081610911575b50806108fa575b806108e3575b6108d4577f000000000000000000000000000000000000000000108b2a2c2802909400000080151590816108bb575b81610888575b501561078f57632ce93b5960e01b5f5260045ffd5b9050835f525f60205260405f20548281018091116108a757115f610873565b634e487b7160e01b5f52601160045260245ffd5b9050835f52600560205260ff60405f205416159061086d565b63136c002360e21b5f5260045ffd5b50825f52600560205260ff60405f2054161561083e565b50815f52600560205260ff60405f20541615610838565b905081115f610831565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffdfea2646970667358221220d2bb0b6502f25a1e3d745a3451c46d30d0f7f1c6494d2d5afad6bcd69e4c520264736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xb68034…4b1c69 | 21 days agoSat, 25 Jul 2026 18:48:53 UTC | Transfer | [0] 0x000000000000…8f26d0f3 [1] 0x000000000000…b59e816e data: 0x000000000000000000…96ec9088 |
| 0x89cf36…03a873 | 32 days agoMon, 13 Jul 2026 23:43:31 UTC | Transfer | [0] 0x000000000000…1b703a7e [1] 0x000000000000…c55c4669 data: 0x000000000000000000…f4532c81 |
| 0x89cf36…03a873 | 32 days agoMon, 13 Jul 2026 23:43:31 UTC | Transfer | [0] 0x000000000000…1b703a7e [1] 0x000000000000…8f26d0f3 data: 0x000000000000000000…96ec9088 |
| 0x89cf36…03a873 | 32 days agoMon, 13 Jul 2026 23:43:31 UTC | Transfer | [0] 0x000000000000…5dd642f8 [1] 0x000000000000…1b703a7e data: 0x000000000000000000…8b3fbd09 |
| 0xe26830…e88814 | 33 days agoMon, 13 Jul 2026 04:46:40 UTC | Transfer | [0] 0x000000000000…43a702d2 [1] 0x000000000000…5dd642f8 data: 0x000000000000000000…3a1a4c65 |
| 0xd94dba…66d65e | 33 days agoMon, 13 Jul 2026 04:46:39 UTC | Approval | [0] 0x000000000000…43a702d2 [1] 0x000000000000…959e5cb2 data: 0xffffffffffffffffff…ffffffff |
| 0x781cb1…cb524f | 33 days agoMon, 13 Jul 2026 04:37:53 UTC | Transfer | [0] 0x000000000000…d846c7c4 [1] 0x000000000000…5dd642f8 data: 0x000000000000000000…8953682b |
| 0xe6149d…f20ee3 | 33 days agoMon, 13 Jul 2026 04:37:52 UTC | Approval | [0] 0x000000000000…d846c7c4 [1] 0x000000000000…959e5cb2 data: 0xffffffffffffffffff…ffffffff |
| 0x571128…40c5ab | 33 days agoMon, 13 Jul 2026 04:17:08 UTC | Transfer | [0] 0x000000000000…07d15606 [1] 0x000000000000…5dd642f8 data: 0x000000000000000000…61be07b9 |
| 0xc475eb…136750 | 33 days agoMon, 13 Jul 2026 04:17:08 UTC | Approval | [0] 0x000000000000…07d15606 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0xce8836…bfeb10 | 33 days agoMon, 13 Jul 2026 04:17:06 UTC | Approval | [0] 0x000000000000…07d15606 [1] 0x000000000000…959e5cb2 data: 0x000000000000000000…61be07b9 |
| 0x5c977a…e1c4ca | 33 days agoMon, 13 Jul 2026 04:16:51 UTC | Transfer | [0] 0x000000000000…5dd642f8 [1] 0x000000000000…d846c7c4 data: 0x000000000000000000…8953682b |
| 0x85ea3e…cdd9f7 | 33 days agoMon, 13 Jul 2026 04:16:37 UTC | Transfer | [0] 0x000000000000…5dd642f8 [1] 0x000000000000…43a702d2 data: 0x000000000000000000…3a1a4c65 |
| 0x659bd8…fccf9b | 33 days agoMon, 13 Jul 2026 04:16:36 UTC | Transfer | [0] 0x000000000000…c55c4669 [1] 0x000000000000…5dd642f8 data: 0x000000000000000000…eec4ad83 |
| 0x8cc08d…5d0a5b | 33 days agoMon, 13 Jul 2026 04:16:36 UTC | Approval | [0] 0x000000000000…c55c4669 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0x98c502…a2d405 | 33 days agoMon, 13 Jul 2026 04:16:28 UTC | Transfer | [0] 0x000000000000…b6e466c8 [1] 0x000000000000…5dd642f8 data: 0x000000000000000000…93ffffff |
| 0x192471…86d843 | 33 days agoMon, 13 Jul 2026 04:16:25 UTC | Transfer | [0] 0x000000000000…3d6d6e7f [1] 0x000000000000…07d15606 data: 0x000000000000000000…61be07b9 |
| 0x192471…86d843 | 33 days agoMon, 13 Jul 2026 04:16:25 UTC | Transfer | [0] 0x000000000000…3d6d6e7f [1] 0x000000000000…5dd642f8 data: 0x000000000000000000…bcf56d6d |
| 0x192471…86d843 | 33 days agoMon, 13 Jul 2026 04:16:25 UTC | Approval | [0] 0x000000000000…3d6d6e7f [1] 0x000000000000…959e5cb2 data: 0x000000000000000000…bcf56d6d |
| 0x192471…86d843 | 33 days agoMon, 13 Jul 2026 04:16:25 UTC | Transfer | [0] 0x000000000000…5dd642f8 [1] 0x000000000000…3d6d6e7f data: 0x000000000000000000…1eb37526 |
| 0xed4d22…7e4895 | 33 days agoMon, 13 Jul 2026 04:16:25 UTC | Approval | [0] 0x000000000000…b6e466c8 [1] 0x000000000000…959e5cb2 data: 0xffffffffffffffffff…ffffffff |
| 0xed4d22…7e4895 | 33 days agoMon, 13 Jul 2026 04:16:25 UTC | Transfer | [0] 0x000000000000…5dd642f8 [1] 0x000000000000…b6e466c8 data: 0x000000000000000000…93ffffff |
| 0x737026…234d0b | 33 days agoMon, 13 Jul 2026 04:16:25 UTC | Transfer | [0] 0x000000000000…5dd642f8 [1] 0x000000000000…c55c4669 data: 0x000000000000000000…eec4ad83 |
| 0x737026…234d0b | 33 days agoMon, 13 Jul 2026 04:16:25 UTC | Transfer | [0] 0x000000000000…31267e28 [1] 0x000000000000…0000dead data: 0x000000000000000000…00002fe8 |
| 0x737026…234d0b | 33 days agoMon, 13 Jul 2026 04:16:25 UTC | Transfer | [0] 0x000000000000…31267e28 [1] 0x000000000000…5dd642f8 data: 0x000000000000000000…e7ffd018 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xd94dba…66d65e | Approve | 8,390,820 | 33 days agoMon, 13 Jul 2026 04:46:39 UTC | 0xa5dd…02d2 | IN | Believe In Something | $0.000 ETH | 0.00000243 | |
| 0xe6149d…f20ee3 | Approve | 8,385,562 | 33 days agoMon, 13 Jul 2026 04:37:52 UTC | 0x80f1…c7c4 | IN | Believe In Something | $0.000 ETH | 0.00000243 | |
| 0xc475eb…136750 | Approve | 8,373,157 | 33 days agoMon, 13 Jul 2026 04:17:08 UTC | 0xecaf…5606 | IN | Believe In Something | $0.000 ETH | 0.00000244 | |
| 0xce8836…bfeb10 | Approve | 8,373,137 | 33 days agoMon, 13 Jul 2026 04:17:06 UTC | 0xecaf…5606 | IN | Believe In Something | $0.000 ETH | 0.00000243 | |
| 0x8cc08d…5d0a5b | Approve | 8,372,834 | 33 days agoMon, 13 Jul 2026 04:16:36 UTC | 0xdf22…4669 | IN | Believe In Something | $0.000 ETH | 0.00000249 |