// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
interface IBalanceReceiver {
function setBalance(address account, uint256 newBalance) external;
}
/// @title LaunchToken
/// @notice Minimal fixed-supply ERC-20. The entire supply is minted to the factory at construction,
/// which then seeds the Uniswap v4 liquidity position. There is no mint function after
/// construction, so supply is permanently fixed.
///
/// STOCK-REWARDS MODE
/// ------------------
/// For launches that opt into Stock Rewards, the factory wires a `distributor` exactly once
/// (right after deploy). While set, every balance change is mirrored to the distributor so it
/// can pay stock dividends pro-rata to holders. When unset (the default / buyback-mode launches)
/// the token behaves as a plain fixed-supply ERC-20. Keeping a single token contract means the
/// CREATE2 init-code hash is identical for both modes.
contract LaunchToken is ERC20 {
/// @notice The launchpad factory that created this token.
address public immutable factory;
/// @notice IPFS/HTTPS URI for token metadata (logo, socials, description).
string public metadataURI;
/// @notice Stock-rewards distributor for this token, or address(0) for buyback-mode launches.
/// Set exactly once by the factory; immutable thereafter.
address public distributor;
event DistributorSet(address indexed distributor);
error OnlyFactory();
error DistributorAlreadySet();
error ZeroDistributor();
constructor(
string memory name_,
string memory symbol_,
uint256 totalSupply_,
string memory metadataURI_,
address mintTo
) ERC20(name_, symbol_) {
factory = msg.sender;
metadataURI = metadataURI_;
_mint(mintTo, totalSupply_);
}
/// @notice Wire the stock-rewards distributor. Factory-only and one-time; the mint in the constructor
/// happens before this is set, so the full supply lands with the (excluded) factory first.
function setDistributor(address _distributor) external {
if (msg.sender != factory) revert OnlyFactory();
if (distributor != address(0)) revert DistributorAlreadySet();
if (_distributor == address(0)) revert ZeroDistributor();
distributor = _distributor;
emit DistributorSet(_distributor);
}
/// @dev Mirror every balance change to the distributor so stock rewards accrue correctly. No-op for
/// buyback-mode tokens (distributor unset).
function _update(address from, address to, uint256 value) internal override {
super._update(from, to, value);
address d = distributor;
if (d != address(0)) {
if (from != address(0)) IBalanceReceiver(d).setBalance(from, balanceOf(from));
if (to != address(0)) IBalanceReceiver(d).setBalance(to, balanceOf(to));
}
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "totalSupply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "metadataURI_",
"type": "string",
"internalType": "string"
},
{
"name": "mintTo",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "DistributorAlreadySet",
"type": "error",
"inputs": []
},
{
"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": "OnlyFactory",
"type": "error",
"inputs": []
},
{
"name": "ZeroDistributor",
"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": "DistributorSet",
"type": "event",
"inputs": [
{
"name": "distributor",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"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": "distributor",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "metadataURI",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "setDistributor",
"type": "function",
"inputs": [
{
"name": "_distributor",
"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"
}
]0x60806040526004361015610011575f80fd5b5f3560e01c806303ee438c1461061457806306fdde0314610559578063095ea7b3146104d757806318160ddd146104ba57806323b872dd146103d5578063313ce567146103ba57806370a082311461038357806375619ab51461029e57806395d89b411461019a578063a9059cbb14610169578063bfe1092814610143578063c45a0155146101005763dd62ed3e146100a8575f80fd5b346100fc5760403660031901126100fc576100c161072f565b6001600160a01b036100d1610745565b91165f5260016020526001600160a01b0360405f2091165f52602052602060405f2054604051908152f35b5f80fd5b346100fc575f3660031901126100fc5760206040516001600160a01b037f00000000000000000000000023ab86d6f6c9f721c57deb3fc00ca225bfffc9eb168152f35b346100fc575f3660031901126100fc5760206001600160a01b0360065416604051908152f35b346100fc5760403660031901126100fc5761018f61018561072f565b602435903361075b565b602060405160018152f35b346100fc575f3660031901126100fc576040515f6004548060011c90600181168015610294575b6020831081146102805782855290811561025c57506001146101fe575b6101fa836101ee818503826106cf565b60405191829182610705565b0390f35b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b808210610242575090915081016020016101ee6101de565b91926001816020925483858801015201910190929161022a565b60ff191660208086019190915291151560051b840190910191506101ee90506101de565b634e487b7160e01b5f52602260045260245ffd5b91607f16916101c1565b346100fc5760203660031901126100fc576102b761072f565b6001600160a01b037f00000000000000000000000023ab86d6f6c9f721c57deb3fc00ca225bfffc9eb16330361037457600654906001600160a01b038216610365576001600160a01b0316908115610356577fffffffffffffffffffffffff00000000000000000000000000000000000000001681176006557f86719c518c7d99ac94b3d405d462ea876ba5cd0a978461dc9a7c9862a94858865f80a2005b632f83aa0f60e21b5f5260045ffd5b6396a8418f60e01b5f5260045ffd5b630636a15760e11b5f5260045ffd5b346100fc5760203660031901126100fc576001600160a01b036103a461072f565b165f525f602052602060405f2054604051908152f35b346100fc575f3660031901126100fc57602060405160128152f35b346100fc5760603660031901126100fc576103ee61072f565b6103f6610745565b604435906001600160a01b03831692835f52600160205260405f206001600160a01b0333165f5260205260405f20545f198110610439575b5061018f935061075b565b83811061049f57841561048c5733156104795761018f945f52600160205260405f206001600160a01b0333165f526020528360405f20910390558461042e565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b346100fc575f3660031901126100fc576020600254604051908152f35b346100fc5760403660031901126100fc576104f061072f565b60243590331561048c576001600160a01b031690811561047957335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346100fc575f3660031901126100fc576040515f6003548060011c9060018116801561060a575b6020831081146102805782855290811561025c57506001146105ac576101fa836101ee818503826106cf565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b8082106105f0575090915081016020016101ee6101de565b9192600181602092548385880101520191019092916105d8565b91607f1691610580565b346100fc575f3660031901126100fc576040515f6005548060011c906001811680156106c5575b6020831081146102805782855290811561025c5750600114610667576101fa836101ee818503826106cf565b60055f9081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0939250905b8082106106ab575090915081016020016101ee6101de565b919260018160209254838588010152019101909291610693565b91607f169161063b565b90601f8019910116810190811067ffffffffffffffff8211176106f157604052565b634e487b7160e01b5f52604160045260245ffd5b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100fc57565b602435906001600160a01b03821682036100fc57565b5f926001600160a01b038216918215610913576001600160a01b03841691821561090057835f525f60205260405f20548181106108e7577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60208386948894855f525f84520360405f2055845f525f825260405f20818154019055604051908152a36001600160a01b036006541692836107f8575b505050505050565b5f525f60205260405f205490833b156100fc576040516338c110ef60e21b81526001600160a01b0391909116600482015260248101919091525f8160448183875af180156108dc576108c7575b50835282602052604083205491813b156108c3576040516338c110ef60e21b81526001600160a01b03919091166004820152602481019290925282908290604490829084905af180156108b8576108a0575b808080806107f0565b6108ab8280926106cf565b6108b55780610897565b80fd5b6040513d84823e3d90fd5b8380fd5b6108d49194505f906106cf565b5f925f610845565b6040513d5f823e3d90fd5b8463391434e360e21b5f5260045260245260445260645ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffdfea2646970667358221220eaa78680167289a1bbe538a63d7325cb5c834b7cc604043957d462a2210dc95764736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xabc9ac…1c49f3 | 33 days agoWed, 15 Jul 2026 08:17:15 UTC | Transfer | [0] 0x000000000000…d528c420 [1] 0x000000000000…43e40951 data: 0x000000000000000000…dd550714 |
| 0x4aaa01…1e3484 | 33 days agoWed, 15 Jul 2026 08:17:15 UTC | Approval | [0] 0x000000000000…d528c420 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0x0af6b6…01b1b9 | 34 days agoTue, 14 Jul 2026 16:30:08 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…d528c420 data: 0x000000000000000000…dd550714 |
| 0xac3a85…ca1c6a | 35 days agoMon, 13 Jul 2026 17:14:09 UTC | Transfer | [0] 0x000000000000…db8c0904 [1] 0x000000000000…43e40951 data: 0x000000000000000000…e907c6e2 |
| 0xac3a85…ca1c6a | 35 days agoMon, 13 Jul 2026 17:14:09 UTC | Transfer | [0] 0x000000000000…5558aa51 [1] 0x000000000000…db8c0904 data: 0x000000000000000000…e907c6e2 |
| 0x2da82c…5ddc98 | 35 days agoMon, 13 Jul 2026 14:50:54 UTC | Approval | [0] 0x000000000000…5558aa51 [1] 0x000000000000…018d237c data: 0xffffffffffffffffff…ffffffff |
| 0x9e8481…0764de | 35 days agoMon, 13 Jul 2026 14:50:53 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…5558aa51 data: 0x000000000000000000…e907c6e2 |
| 0x7b8dcd…3d8746 | 35 days agoMon, 13 Jul 2026 14:49:30 UTC | Transfer | [0] 0x000000000000…a40bf752 [1] 0x000000000000…43e40951 data: 0x000000000000000000…dd550714 |
| 0x248050…746eb4 | 35 days agoMon, 13 Jul 2026 14:48:12 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…a40bf752 data: 0x000000000000000000…dd550714 |
| 0x959a11…51f4af | 35 days agoMon, 13 Jul 2026 14:47:04 UTC | Transfer | [0] 0x000000000000…a40bf752 [1] 0x000000000000…43e40951 data: 0x000000000000000000…136628b3 |
| 0x0fedf1…d49413 | 35 days agoMon, 13 Jul 2026 14:47:02 UTC | Approval | [0] 0x000000000000…a40bf752 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0xae65aa…46229e | 35 days agoMon, 13 Jul 2026 14:45:21 UTC | Transfer | [0] 0x000000000000…6a1ee6a0 [1] 0x000000000000…43e40951 data: 0x000000000000000000…83f627cd |
| 0x23145e…3e7cc7 | 35 days agoMon, 13 Jul 2026 14:45:21 UTC | Transfer | [0] 0x000000000000…b227281f [1] 0x000000000000…43e40951 data: 0x000000000000000000…7980d2a1 |
| 0x16fb04…784cae | 35 days agoMon, 13 Jul 2026 14:45:21 UTC | Approval | [0] 0x000000000000…b227281f [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0x0ad318…6bf20e | 35 days agoMon, 13 Jul 2026 14:45:20 UTC | Approval | [0] 0x000000000000…6a1ee6a0 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0xacbf65…ad7172 | 35 days agoMon, 13 Jul 2026 14:43:27 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…a40bf752 data: 0x000000000000000000…8622e20f |
| 0x11a6df…6e14c1 | 35 days agoMon, 13 Jul 2026 14:42:43 UTC | Transfer | [0] 0x000000000000…c8fbb38f [1] 0x000000000000…43e40951 data: 0x000000000000000000…e10c804a |
| 0x676452…a51db0 | 35 days agoMon, 13 Jul 2026 14:42:42 UTC | Approval | [0] 0x000000000000…c8fbb38f [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0xcb8aa6…dd7273 | 35 days agoMon, 13 Jul 2026 14:41:16 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…a40bf752 data: 0x000000000000000000…8d4346a4 |
| 0xc97f38…71443a | 35 days agoMon, 13 Jul 2026 14:39:41 UTC | Transfer | [0] 0x000000000000…36ff2c3f [1] 0x000000000000…43e40951 data: 0x000000000000000000…a9d3c1e4 |
| 0x851583…08e0a9 | 35 days agoMon, 13 Jul 2026 14:39:41 UTC | Approval | [0] 0x000000000000…36ff2c3f [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0x7ec791…5acf02 | 35 days agoMon, 13 Jul 2026 14:39:11 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…36ff2c3f data: 0x000000000000000000…a9d3c1e4 |
| 0xc26084…99eb99 | 35 days agoMon, 13 Jul 2026 14:39:06 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…b227281f data: 0x000000000000000000…7980d2a1 |
| 0x7b4d3c…c5de8b | 35 days agoMon, 13 Jul 2026 14:39:06 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…6a1ee6a0 data: 0x000000000000000000…83f627cd |
| 0x972ff0…c3b11c | 35 days agoMon, 13 Jul 2026 14:31:08 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…c8fbb38f data: 0x000000000000000000…e10c804a |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x4aaa01…1e3484 | Approve | 10,241,841 | 33 days agoWed, 15 Jul 2026 08:17:15 UTC | 0x3645…c420 | IN | Ribbit Agent | $0.000 ETH | 0.00000242 | |
| 0x2da82c…5ddc98 | Approve | 8,752,700 | 35 days agoMon, 13 Jul 2026 14:50:54 UTC | 0xd6ec…aa51 | IN | Ribbit Agent | $0.000 ETH | 0.00000226 | |
| 0x0fedf1…d49413 | Approve | 8,750,386 | 35 days agoMon, 13 Jul 2026 14:47:02 UTC | 0x8337…f752 | IN | Ribbit Agent | $0.000 ETH | 0.00000227 | |
| 0x16fb04…784cae | Approve | 8,749,375 | 35 days agoMon, 13 Jul 2026 14:45:21 UTC | 0x5c92…281f | IN | Ribbit Agent | $0.000 ETH | 0.00000227 | |
| 0x0ad318…6bf20e | Approve | 8,749,372 | 35 days agoMon, 13 Jul 2026 14:45:20 UTC | 0x9358…e6a0 | IN | Ribbit Agent | $0.000 ETH | 0.00000227 | |
| 0x676452…a51db0 | Approve | 8,747,798 | 35 days agoMon, 13 Jul 2026 14:42:42 UTC | 0xb143…b38f | IN | Ribbit Agent | $0.000 ETH | 0.00000226 | |
| 0x851583…08e0a9 | Approve | 8,745,980 | 35 days agoMon, 13 Jul 2026 14:39:41 UTC | 0x4f2e…2c3f | IN | Ribbit Agent | $0.000 ETH | 0.00000231 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 8,077,849 | 36 days agoSun, 12 Jul 2026 20:03:54 UTC | 0x5a0e42…035770 | CREATE2 | launch | 0x23ab…c9eb | IN | 0xcd26…3dad | 0 ETH |