// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
/// @notice Minimal fixed-supply ERC-20 deployed per launch via CREATE2.
/// Full supply is minted in the constructor, split between the
/// bonding curve and the Mindshare escrow. No owner, no mint,
/// no hooks, no taxes — fully composable.
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;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
error InsufficientBalance();
error InsufficientAllowance();
/// @param curveAmount tokens sellable on the bonding curve
/// @param graduationAmount tokens held back to seed the DEX pool at
/// graduation. Sent to the curve contract but never sellable
/// through it. 800M sellable / 200M reserved of a 1B supply.
constructor(
string memory _name,
string memory _symbol,
address curve,
uint256 curveAmount,
uint256 graduationAmount,
address mindshare,
uint256 mindshareAmount
) {
name = _name;
symbol = _symbol;
totalSupply = curveAmount + graduationAmount + mindshareAmount;
uint256 toCurve = curveAmount + graduationAmount;
balanceOf[curve] = toCurve;
emit Transfer(address(0), curve, toCurve);
if (mindshareAmount > 0) {
balanceOf[mindshare] = mindshareAmount;
emit Transfer(address(0), mindshare, mindshareAmount);
}
}
function transfer(address to, uint256 amount) external returns (bool) {
return _transfer(msg.sender, to, amount);
}
/// @dev The allowance is always checked and always decremented, including
/// when it is set to max. Skipping the decrement at max is the common
/// gas optimisation and it is safe, but automated scanners read it out
/// of decompiled bytecode as "the allowance check is skipped at max"
/// and label the token a critical backdoor. Every holder of every
/// token we launch would see that warning. A few thousand gas is not
/// worth arguing with every scanner on the internet.
function transferFrom(address from, address to, uint256 amount) external returns (bool) {
uint256 allowed = allowance[from][msg.sender];
if (allowed < amount) revert InsufficientAllowance();
unchecked {
allowance[from][msg.sender] = allowed - amount;
}
return _transfer(from, to, amount);
}
function approve(address spender, uint256 amount) external returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
function _transfer(address from, address to, uint256 amount) internal returns (bool) {
uint256 bal = balanceOf[from];
if (bal < amount) revert InsufficientBalance();
unchecked {
balanceOf[from] = bal - amount;
balanceOf[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_name",
"type": "string",
"internalType": "string"
},
{
"name": "_symbol",
"type": "string",
"internalType": "string"
},
{
"name": "curve",
"type": "address",
"internalType": "address"
},
{
"name": "curveAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "graduationAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "mindshare",
"type": "address",
"internalType": "address"
},
{
"name": "mindshareAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "InsufficientAllowance",
"type": "error",
"inputs": []
},
{
"name": "InsufficientBalance",
"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": "",
"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": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"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": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"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": "amount",
"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": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
}
]0x60806040526004361015610011575f80fd5b5f3560e01c806306fdde031461048f578063095ea7b31461040a57806318160ddd146103d057806323b872dd146102fd578063313ce567146102e257806370a082311461029d57806395d89b4114610120578063a9059cbb146100ee5763dd62ed3e1461007c575f80fd5b346100ea5760406003193601126100ea57610095610592565b73ffffffffffffffffffffffffffffffffffffffff6100b26105b5565b91165f52600360205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060405f2054604051908152f35b5f80fd5b346100ea5760406003193601126100ea57602061011661010c610592565b60243590336105d8565b6040519015158152f35b346100ea575f6003193601126100ea576040515f600154908160011c60018316928315610293575b60208210841461026657818552849390811561022457506001146101c8575b5003601f01601f191681019067ffffffffffffffff82118183101761019b57604082905281906101979082610568565b0390f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60015f90815291507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8183106102085750508101602001601f19610167565b60209193508060019154838588010152019101909183926101f2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208581019190915291151560051b84019091019150601f199050610167565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b90607f1690610148565b346100ea5760206003193601126100ea5773ffffffffffffffffffffffffffffffffffffffff6102cb610592565b165f526002602052602060405f2054604051908152f35b346100ea575f6003193601126100ea57602060405160128152f35b346100ea5760606003193601126100ea57610316610592565b61031e6105b5565b60443573ffffffffffffffffffffffffffffffffffffffff831691825f52600360205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260405f2054938285106103a857602094610116945f526003865260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5286528360405f20910390556105d8565b7f13be252b000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100ea575f6003193601126100ea5760206040517f0000000000000000000000000000000000000000033b2e3c9fd0803ce80000008152f35b346100ea5760406003193601126100ea57610423610592565b73ffffffffffffffffffffffffffffffffffffffff60243591335f52600360205260405f208282165f526020528260405f205560405192835216907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346100ea575f6003193601126100ea576040515f8054908160011c6001831692831561055e575b6020821084146102665781855284939081156102245750600114610504575003601f01601f191681019067ffffffffffffffff82118183101761019b57604082905281906101979082610568565b5f80805291507f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b8183106105425750508101602001601f19610167565b602091935080600191548385880101520191019091839261052c565b90607f16906104b6565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100ea57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036100ea57565b73ffffffffffffffffffffffffffffffffffffffff1690815f52600260205260405f20549083821061066b5773ffffffffffffffffffffffffffffffffffffffff602091857fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef94865f52600285520360405f20551693845f526002825260405f20818154019055604051908152a3600190565b7ff4d678b8000000000000000000000000000000000000000000000000000000005f5260045ffdfea264697066735822122075f7542687844ba4dda86fdab54c9ac4ee7ee835f37d2636d99fca5616c2cacc64736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x8e708d…852b04 | 20 days agoTue, 28 Jul 2026 16:50:26 UTC | Transfer | [0] 0x000000000000…8be78458 [1] 0x000000000000…6741e794 data: 0x000000000000000000…e7ffe48d |
| 0x8e708d…852b04 | 20 days agoTue, 28 Jul 2026 16:50:26 UTC | Approval | [0] 0x000000000000…8be78458 [1] 0x000000000000…638de0d3 data: 0x000000000000000000…e8000000 |
| 0x8e708d…852b04 | 20 days agoTue, 28 Jul 2026 16:50:26 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…8be78458 data: 0x000000000000000000…e8000000 |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| 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 ? | ||
|---|---|---|---|---|---|---|---|---|---|
| No direct transactions — this address is only ever reached via internal calls (common for a contract only invoked through a router or proxy). View Internal Transactions → | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 21,748,774 | 20 days agoTue, 28 Jul 2026 16:50:26 UTC | 0x8e708d…852b04 | CREATE2 | 0x6da86a6f | 0x02b4…c9cf | IN | 0xb72a…d4d6 | 0 ETH |