// 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"
}
]0x6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde031461062257508063095ea7b3146105a057806318160ddd14610583578063225a10211461050857806323b872dd146104295780632f982c67146103ef578063313ce567146103d457806370a082311461039d57806374c6fdec146103615780638c0b5e221461032757806394a8cbd4146102ea57806395d89b41146101cf578063a9059cbb1461019e578063aa4bde2814610164578063c45a0155146101205763dd62ed3e146100cc575f80fd5b3461011c57604036600319011261011c576100e561071b565b6100ed610731565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b5f80fd5b3461011c575f36600319011261011c576040517f00000000000000000000000052453b4289a6c3a70bb8b4682bcd3d8731267e286001600160a01b03168152602090f35b3461011c575f36600319011261011c5760206040517f000000000000000000000000000000000000000000108b2a2c280290940000008152f35b3461011c57604036600319011261011c576101c46101ba61071b565b6024359033610747565b602060405160018152f35b3461011c575f36600319011261011c576040515f6004548060011c906001811680156102e0575b6020831081146102cc578285529081156102b0575060011461025b575b50819003601f01601f191681019067ffffffffffffffff82118183101761024757610243829182604052826106f1565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b82821061029a57506020915082010182610213565b6001816020925483858801015201910190610285565b90506020925060ff191682840152151560051b82010182610213565b634e487b7160e01b5f52602260045260245ffd5b91607f16916101f6565b3461011c57602036600319011261011c576001600160a01b0361030b61071b565b165f526005602052602060ff60405f2054166040519015158152f35b3461011c575f36600319011261011c5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461011c575f36600319011261011c5760206040517f000000000000000000000000000000000000000000000000000000000185694643108152f35b3461011c57602036600319011261011c576001600160a01b036103be61071b565b165f525f602052602060405f2054604051908152f35b3461011c575f36600319011261011c57602060405160128152f35b3461011c575f36600319011261011c5760206040517f00000000000000000000000000000000000000000000000000000000018569468152f35b3461011c57606036600319011261011c5761044261071b565b61044a610731565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f198110610488575b506101c49350610747565b8381106104ed5784156104da5733156104c7576101c4945f52600160205260405f2060018060a01b0333165f526020528360405f20910390558461047d565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b3461011c57602036600319011261011c5761052161071b565b7f00000000000000000000000052453b4289a6c3a70bb8b4682bcd3d8731267e286001600160a01b03163303610574576001600160a01b03165f908152600560205260409020805460ff19166001179055005b631966391b60e11b5f5260045ffd5b3461011c575f36600319011261011c576020600254604051908152f35b3461011c57604036600319011261011c576105b961071b565b6024359033156104da576001600160a01b03169081156104c757335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b3461011c575f36600319011261011c575f6003548060011c906001811680156106e7575b6020831081146102cc578285529081156102b057506001146106925750819003601f01601f191681019067ffffffffffffffff82118183101761024757610243829182604052826106f1565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b8282106106d157506020915082010182610213565b60018160209254838588010152019101906106bc565b91607f1691610646565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361011c57565b602435906001600160a01b038216820361011c57565b6001600160a01b031690811561092e576001600160a01b031691821561091b577f00000000000000000000000000000000000000000000000000000000018569464310610806575b815f525f60205260405f20548181106107ed57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b7f00000000000000000000000000000000000000000000000000000000000000008015159081610911575b50806108fa575b806108e3575b6108d4577f000000000000000000000000000000000000000000108b2a2c2802909400000080151590816108bb575b81610888575b501561078f57632ce93b5960e01b5f5260045ffd5b9050835f525f60205260405f20548281018091116108a757115f610873565b634e487b7160e01b5f52601160045260245ffd5b9050835f52600560205260ff60405f205416159061086d565b63136c002360e21b5f5260045ffd5b50825f52600560205260ff60405f2054161561083e565b50815f52600560205260ff60405f20541615610838565b905081115f610831565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffdfea2646970667358221220d2bb0b6502f25a1e3d745a3451c46d30d0f7f1c6494d2d5afad6bcd69e4c520264736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000123 | $0 |
| 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 |
|---|---|---|---|
| 0x97e009…df12b3 | 21 days agoSat, 25 Jul 2026 18:39:09 UTC | Transfer | [0] 0x000000000000…8f26d0f3 [1] 0x000000000000…b59e816e data: 0x000000000000000000…0e14906d |
| 0x01eb86…5f95c2 | 28 days agoSat, 18 Jul 2026 06:54:48 UTC | Transfer | [0] 0x000000000000…7128f8b6 [1] 0x000000000000…0000dead data: 0x000000000000000000…9756817a |
| 0x89cf36…03a873 | 33 days agoMon, 13 Jul 2026 23:43:31 UTC | Transfer | [0] 0x000000000000…1b703a7e [1] 0x000000000000…9d4cc3a1 data: 0x000000000000000000…1e0248f0 |
| 0x89cf36…03a873 | 33 days agoMon, 13 Jul 2026 23:43:31 UTC | Transfer | [0] 0x000000000000…1b703a7e [1] 0x000000000000…8f26d0f3 data: 0x000000000000000000…0e14906d |
| 0x89cf36…03a873 | 33 days agoMon, 13 Jul 2026 23:43:31 UTC | Transfer | [0] 0x000000000000…dc19c235 [1] 0x000000000000…1b703a7e data: 0x000000000000000000…2c16d95d |
| 0xe04872…e290c3 | 33 days agoMon, 13 Jul 2026 17:27:59 UTC | Transfer | [0] 0x000000000000…a449308f [1] 0x000000000000…dc19c235 data: 0x000000000000000000…38ece8af |
| 0xa00a67…239360 | 33 days agoMon, 13 Jul 2026 17:27:59 UTC | Approval | [0] 0x000000000000…a449308f [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0x1e78c6…66d546 | 33 days agoMon, 13 Jul 2026 01:49:22 UTC | Transfer | [0] 0x000000000000…1b703a7e [1] 0x000000000000…9d4cc3a1 data: 0x000000000000000000…2d42802a |
| 0x1e78c6…66d546 | 33 days agoMon, 13 Jul 2026 01:49:22 UTC | Transfer | [0] 0x000000000000…1b703a7e [1] 0x000000000000…7128f8b6 data: 0x000000000000000000…9756817a |
| 0x1e78c6…66d546 | 33 days agoMon, 13 Jul 2026 01:49:22 UTC | Transfer | [0] 0x000000000000…dc19c235 [1] 0x000000000000…1b703a7e data: 0x000000000000000000…c49901a4 |
| 0x1ed8af…ad6914 | 33 days agoMon, 13 Jul 2026 00:21:22 UTC | Transfer | [0] 0x000000000000…9d4cc3a1 [1] 0x000000000000…dc19c235 data: 0x000000000000000000…5c703b8f |
| 0x89c0b6…92379e | 33 days agoMon, 13 Jul 2026 00:20:38 UTC | Transfer | [0] 0x000000000000…4a3fd470 [1] 0x000000000000…dc19c235 data: 0x000000000000000000…94000000 |
| 0x41b926…f59a93 | 33 days agoMon, 13 Jul 2026 00:20:38 UTC | Transfer | [0] 0x000000000000…b9a2e7c4 [1] 0x000000000000…dc19c235 data: 0x000000000000000000…db5468a0 |
| 0x82671b…fbb47b | 33 days agoMon, 13 Jul 2026 00:20:38 UTC | Approval | [0] 0x000000000000…4a3fd470 [1] 0x000000000000…acf85448 data: 0xffffffffffffffffff…ffffffff |
| 0xac83f0…c1ee31 | 33 days agoMon, 13 Jul 2026 00:20:37 UTC | Approval | [0] 0x000000000000…9d4cc3a1 [1] 0x000000000000…959e5cb2 data: 0xffffffffffffffffff…ffffffff |
| 0x9495d7…ada759 | 33 days agoMon, 13 Jul 2026 00:20:37 UTC | Transfer | [0] 0x000000000000…dc19c235 [1] 0x000000000000…4a3fd470 data: 0x000000000000000000…94000000 |
| 0xb5e8be…5cc6ab | 33 days agoMon, 13 Jul 2026 00:20:37 UTC | Approval | [0] 0x000000000000…b9a2e7c4 [1] 0x000000000000…959e5cb2 data: 0xffffffffffffffffff…ffffffff |
| 0xb5e8be…5cc6ab | 33 days agoMon, 13 Jul 2026 00:20:37 UTC | Transfer | [0] 0x000000000000…dc19c235 [1] 0x000000000000…b9a2e7c4 data: 0x000000000000000000…db5468a0 |
| 0xad8089…796589 | 33 days agoMon, 13 Jul 2026 00:20:37 UTC | Transfer | [0] 0x000000000000…dc19c235 [1] 0x000000000000…a449308f data: 0x000000000000000000…38ece8af |
| 0xd42ecb…70649d | 33 days agoMon, 13 Jul 2026 00:20:36 UTC | Transfer | [0] 0x000000000000…dc19c235 [1] 0x000000000000…9d4cc3a1 data: 0x000000000000000000…5c703b8f |
| 0xd42ecb…70649d | 33 days agoMon, 13 Jul 2026 00:20:36 UTC | Transfer | [0] 0x000000000000…31267e28 [1] 0x000000000000…0000dead data: 0x000000000000000000…00002fe8 |
| 0xd42ecb…70649d | 33 days agoMon, 13 Jul 2026 00:20:36 UTC | Transfer | [0] 0x000000000000…31267e28 [1] 0x000000000000…dc19c235 data: 0x000000000000000000…e7ffd018 |
| 0xd42ecb…70649d | 33 days agoMon, 13 Jul 2026 00:20:36 UTC | Approval | [0] 0x000000000000…31267e28 [1] 0x000000000000…638de0d3 data: 0x000000000000000000…e8000000 |
| 0xd42ecb…70649d | 33 days agoMon, 13 Jul 2026 00:20:36 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…31267e28 data: 0x000000000000000000…e8000000 |
| 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 | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xf6e0b451…2b7245 | Transfer | 19,057,830 | 21 days agoSat, 25 Jul 2026 13:48:51 UTC | 0xcaf7…5d11 | IN | 0xc2de…4f86 | $0.001 DIH |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x01eb86…5f95c2 | Transfer | 12,781,150 | 28 days agoSat, 18 Jul 2026 06:54:48 UTC | 0x34b2…f8b6 | IN | robin h00d | $0.000 ETH | 0.00000217 | |
| 0xa00a67…239360 | Approve | 8,846,778 | 33 days agoMon, 13 Jul 2026 17:27:59 UTC | 0x9dd1…308f | IN | robin h00d | $0.000 ETH | 0.00000239 | |
| 0x82671b…fbb47b | Approve | 8,231,609 | 33 days agoMon, 13 Jul 2026 00:20:38 UTC | 0x36b9…d470 | IN | robin h00d | $0.000 ETH | 0.00000257 | |
| 0xac83f0…c1ee31 | Approve | 8,231,608 | 33 days agoMon, 13 Jul 2026 00:20:37 UTC | 0x8359…c3a1 | IN | robin h00d | $0.000 ETH | 0.00000257 |