// SPDX-License-Identifier: MIT
//
// =========================================================
// ____ __ _ __ __
// / __ \____ / /_ (_)___ / / ____ ____ / /_
// / /_/ / __ \/ __ \/ / __ \ / / / __ \/ __ \/ __/
// / _, _/ /_/ / /_/ / / / / / / /___/ /_/ / /_/ / /_
// /_/ |_|\____/_.___/_/_/ /_/ /_____/\____/\____/\__/
// =========================================================
//
pragma solidity ^0.8.25;
/**
* @title LaunchToken
* @notice A fixed-supply, born-renounced ERC-20 minted in one shot at deploy —
* the token type every launchpad meme launch spawns (distinct from the
* mineable $LOOT protocol token). There is no owner, no mint, no pause,
* no admin — the entire supply is created once to `recipient` (the
* launchpad) and the contract is immutable forever. Un-ruggable by
* construction.
*
* Anti-whale window: for the first hour after launch, no non-exempt
* wallet may hold more than 2% of supply; after that the limit lifts
* permanently and the token trades with no restriction. Exempt from the
* cap are the zero address, the launchpad (holds the full supply until
* it seeds the pool), and the pool itself (holds the LP reserves). The
* launchpad wires the pool in once, atomically, via `arm()` during the
* launch tx — the only privileged call, and it self-locks. No owner,
* mint, or pause is ever introduced.
*
* Minimal, gas-lean, no external deps. Supports infinite allowance
* (type(uint256).max) so routers don't decrement it every swap.
*/
contract LaunchToken {
string public name;
string public symbol;
uint8 public constant decimals = 18;
uint256 public immutable totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
// ---- anti-whale (first hour only) ----
uint256 public constant LIMIT_WINDOW = 1 hours;
uint256 public constant MAX_WALLET_BPS = 200; // 2%
address public immutable launchpad; // deployer/initial holder — exempt
uint256 public immutable launchedAt; // limit active while now < launchedAt + 1h
uint256 public immutable maxWallet; // 2% of supply
address public pool; // set once by the launchpad — exempt
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
constructor(string memory _name, string memory _symbol, uint256 _supply, address _recipient) {
require(_recipient != address(0), "recipient");
name = _name;
symbol = _symbol;
totalSupply = _supply;
launchpad = _recipient;
launchedAt = block.timestamp;
maxWallet = (_supply * MAX_WALLET_BPS) / 10_000;
balanceOf[_recipient] = _supply;
emit Transfer(address(0), _recipient, _supply);
}
/// One-time infra wiring by the launchpad: mark the launch pool exempt from the
/// first-hour cap (it holds the LP reserves). Callable only by the launchpad and
/// only once — grants no ongoing power and cannot be re-pointed.
function arm(address pool_) external {
require(msg.sender == launchpad, "auth");
require(pool == address(0), "armed");
require(pool_ != address(0), "pool");
pool = pool_;
}
function transfer(address to, uint256 value) external returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function approve(address spender, uint256 value) external returns (bool) {
allowance[msg.sender][spender] = value;
emit Approval(msg.sender, spender, value);
return true;
}
function transferFrom(address from, address to, uint256 value) external returns (bool) {
uint256 allowed = allowance[from][msg.sender];
if (allowed != type(uint256).max) {
require(allowed >= value, "allowance");
unchecked { allowance[from][msg.sender] = allowed - value; }
}
_transfer(from, to, value);
return true;
}
function _transfer(address from, address to, uint256 value) internal {
require(to != address(0) && to != address(this), "to");
uint256 bal = balanceOf[from];
require(bal >= value, "balance");
unchecked {
balanceOf[from] = bal - value;
balanceOf[to] += value;
}
// First-hour 2% cap: applies to every recipient except the launchpad and the
// pool. Sells (to == pool) and the initial seed (to == pool) are never capped,
// so liquidity always flows; only wallet accumulation is throttled.
if (block.timestamp < launchedAt + LIMIT_WINDOW && to != launchpad && to != pool) {
require(balanceOf[to] <= maxWallet, "maxWallet");
}
emit Transfer(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": "_recipient",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"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": "LIMIT_WINDOW",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_WALLET_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"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": "arm",
"type": "function",
"inputs": [
{
"name": "pool_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "",
"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": "launchedAt",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "launchpad",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"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": "pool",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"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"
}
]0x608060408181526004918236101561001657600080fd5b600092833560e01c91826302669b52146106d35750816303371ccf146106b657816306fdde03146105dc578163095ea7b31461056b57816316f0115b1461054357816318160ddd1461050857816323b872dd14610448578163313ce5671461042c5781633abe37f11461033a57816370a082311461030257816395d89b41146101df57508063a9059cbb146101af578063b6efaa7514610194578063bf56b3711461015a578063dd62ed3e146101125763f8b45b05146100d557600080fd5b3461010e578160031936011261010e57602090517f00000000000000000000000000000000000000000000043c33c19375648000008152f35b5080fd5b503461010e578060031936011261010e578060209261012f61075f565b61013761077a565b6001600160a01b0391821683526003865283832091168252845220549051908152f35b503461010e578160031936011261010e57602090517f000000000000000000000000000000000000000000000000000000006a5d43eb8152f35b503461010e578160031936011261010e576020905160c88152f35b503461010e578060031936011261010e576020906101d86101ce61075f565b6024359033610790565b5160018152f35b83833461010e578160031936011261010e578051908260018054908160011c90600183169283156102f8575b60209384841081146102e5578388529081156102c95750600114610273575b505050829003601f01601f191682019267ffffffffffffffff841183851017610260575082918261025c925282610716565b0390f35b634e487b7160e01b815260418552602490fd5b600187529192508591837fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8385106102b5575050505083010185808061022a565b80548886018301529301928490820161029f565b60ff1916878501525050151560051b840101905085808061022a565b634e487b7160e01b895260228a52602489fd5b91607f169161020b565b50503461010e57602036600319011261010e5760209181906001600160a01b0361032a61075f565b1681526002845220549051908152f35b919050346104285760203660031901126104285761035661075f565b6001600160a01b037f000000000000000000000000f8436c12130e1f823c8316ec3295c0a474fe1f96811633036103fe578354918183166103d357169182156103aa57506001600160a01b03191617905580f35b5162461bcd60e51b815260208185015260248101849052631c1bdbdb60e21b6044820152606490fd5b835162461bcd60e51b81526020818701526005602482015264185c9b595960da1b6044820152606490fd5b825162461bcd60e51b815260208186015260248101859052630c2eae8d60e31b6044820152606490fd5b8280fd5b50503461010e578160031936011261010e576020905160128152f35b83833461010e57606036600319011261010e5761046361075f565b61046b61077a565b6001600160a01b0382168085526003602090815284862033875281528486205496909560443594929091600189016104ac575b505050906101d89291610790565b8589106104d9575094848197986101d897845260038a528284203385528a5203912055859493878061049e565b865162461bcd60e51b81529081018890526009602482015268616c6c6f77616e636560b81b6044820152606490fd5b50503461010e578160031936011261010e57602090517f00000000000000000000000000000000000000000000d3c21bcecceda10000008152f35b9050346104285782600319360112610428575490516001600160a01b03909116815260209150f35b50503461010e578060031936011261010e576020918161058961075f565b91602435918291338152600387528181209460018060a01b0316948582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b83833461010e578160031936011261010e5780519082835460018160011c90600183169283156106ac575b60209384841081146102e5578388529081156102c9575060011461065757505050829003601f01601f191682019267ffffffffffffffff841183851017610260575082918261025c925282610716565b8680529192508591837f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b838510610698575050505083010185808061022a565b805488860183015293019284908201610682565b91607f1691610607565b50503461010e578160031936011261010e5760209051610e108152f35b84903461010e578160031936011261010e577f000000000000000000000000f8436c12130e1f823c8316ec3295c0a474fe1f966001600160a01b03168152602090f35b6020808252825181830181905290939260005b82811061074b57505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501610729565b600435906001600160a01b038216820361077557565b600080fd5b602435906001600160a01b038216820361077557565b6001600160a01b039182169291908315158061095f575b156109355781169160009183835260209260028452604091828220548481106109075784908784526002875203838320558682528282208481540190557f000000000000000000000000000000000000000000000000000000006a5d43eb610e1081018091116108f357421090816108c6575b816108b7575b50610851575b50519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a3565b80868392526002855220547f00000000000000000000000000000000000000000000043c33c1937564800000106108885738610826565b5162461bcd60e51b81526004810183905260096024820152681b585e15d85b1b195d60ba1b6044820152606490fd5b90506004541686141538610820565b7f000000000000000000000000f8436c12130e1f823c8316ec3295c0a474fe1f968116881415915061081a565b634e487b7160e01b83526011600452602483fd5b835162461bcd60e51b815260048101879052600760248201526662616c616e636560c81b6044820152606490fd5b60405162461bcd60e51b8152602060048201526002602482015261746f60f01b6044820152606490fd5b50308414156107a756fea2646970667358221220900220c855bc269b58e19ddf77bdd49b5348711a97c3e144f2010271774ddeab64736f6c63430008190033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000102 | $0 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x82a505f5…d42494 | Transfer | 19,077,096 | 23 days agoSat, 25 Jul 2026 14:21:02 UTC | 0xcaf7…5d11 | IN | 0x84f3…c4b8 | $0.001 DIH |
| 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 |
|---|---|---|---|
| 0x6941b8…50c326 | 28 days agoMon, 20 Jul 2026 10:12:04 UTC | Transfer | [0] 0x000000000000…d935f764 [1] 0x000000000000…17eb9df2 data: 0x000000000000000000…6cf2489a |
| 0xab3ac9…06ec93 | 28 days agoMon, 20 Jul 2026 10:11:57 UTC | Approval | [0] 0x000000000000…d935f764 [1] 0x000000000000…959e5cb2 data: 0xffffffffffffffffff…ffffffff |
| 0x2ba20a…64a8db | 29 days agoSun, 19 Jul 2026 21:39:38 UTC | Transfer | [0] 0x000000000000…17eb9df2 [1] 0x000000000000…d935f764 data: 0x000000000000000000…6cf2489a |
| 0x0d1ec5…59f166 | 29 days agoSun, 19 Jul 2026 21:38:51 UTC | Transfer | [0] 0x000000000000…74fe1f96 [1] 0x000000000000…17eb9df2 data: 0x000000000000000000…a0ffffda |
| 0x0d1ec5…59f166 | 29 days agoSun, 19 Jul 2026 21:38:51 UTC | Approval | [0] 0x000000000000…74fe1f96 [1] 0x000000000000…638de0d3 data: 0x000000000000000000…a1000000 |
| 0x0d1ec5…59f166 | 29 days agoSun, 19 Jul 2026 21:38:51 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…74fe1f96 data: 0x000000000000000000…a1000000 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xab3ac9…06ec93 | Approve | 14,619,549 | 28 days agoMon, 20 Jul 2026 10:11:57 UTC | 0x46b1…f764 | IN | Silver Messi | $0.000 ETH | 0.00000236 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 14,169,619 | 29 days agoSun, 19 Jul 2026 21:38:51 UTC | 0x0d1ec5…59f166 | CREATE2 | createForPair | 0xf843…1f96 | IN | 0x84f3…c4b8 | 0 ETH |