| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
// SPDX-License-Identifier: MIT
pragma solidity 0.8.30;
// An immutable, fixed-supply ERC20 IDENTICAL to LunchTokenPlain in every trading-relevant way — no mint,
// no burn, no transfer restriction, no privileged control over balances — EXCEPT it notifies its
// DividendTracker of balance changes so holders can earn dividends. The notify is wrapped in try/catch
// with a bounded gas stipend so a tracker fault can NEVER revert a transfer (the token stays freely
// tradeable / non-honeypot; dividends merely degrade in the pathological case). Used only by the rewards
// launch flavor; Fair/Tax launches keep LunchTokenPlain.
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
interface ILunchLauncherBase {
function baseTokenURI() external view returns (string memory);
}
interface IDividendTracker {
function setBalance(address account, uint256 newBalance) external;
function process(uint256 gasBudget) external returns (uint256);
}
contract LunchTokenDividend is ERC20 {
address public immutable launcher;
address public immutable creator;
address public tracker; // set ONCE by the launcher at launch, then permanent
uint256 private constant SET_BALANCE_GAS = 160_000; // stipend for the notify. A brand-NEW holder writes
// eligibleSupply + corrections + trackedBalance + the
// iterable-holder array push (~125k), so the stipend
// must comfortably exceed that or setBalance OOGs.
uint256 private constant MIN_NOTIFY_GAS = 175_000; // require this before each notify so the 63/64 rule
// always delivers the full stipend — otherwise a
// starved+swallowed OOG desyncs tracked>real (phantom
// shares) / silently drops a holder. Honest transfers
// carry far more; this is a heavier reflection token.
uint256 private constant PROCESS_GAS = 300_000; // stipend handed to the auto-push per transfer
uint256 private constant PROCESS_BUDGET = 200_000; // gas the push loop is allowed to spend inside it
uint256 private constant PROCESS_FLOOR = 400_000; // only auto-push when the transfer has ample gas to
// spare; otherwise skip it (best-effort, never blocks)
error OnlyLauncher();
error TrackerAlreadySet();
error InsufficientGas();
constructor(
string memory name_,
string memory symbol_,
uint256 totalSupply_,
address launcher_,
address creator_
) ERC20(name_, symbol_) {
require(totalSupply_ > 0, "supply=0");
require(launcher_ != address(0), "launcher=0");
launcher = launcher_;
creator = creator_;
_mint(launcher_, totalSupply_); // minted before tracker is set; launcher is excluded anyway
}
/// @notice One-shot link to the dividend tracker. Called by the launcher inside the launch tx, before
/// any public trading. Immutable thereafter.
function initTracker(address tracker_) external {
if (msg.sender != launcher) revert OnlyLauncher();
if (tracker != address(0)) revert TrackerAlreadySet();
tracker = tracker_;
}
/// @dev Mirror balance changes into the tracker. try/catch + gas cap so a tracker revert or gas bomb
/// can never brick a transfer — the token's freely-tradeable property is preserved unconditionally.
function _update(address from, address to, uint256 value) internal override {
super._update(from, to, value);
address t = tracker;
if (t == address(0)) return;
if (from != address(0)) {
if (gasleft() < MIN_NOTIFY_GAS) revert InsufficientGas();
try IDividendTracker(t).setBalance{gas: SET_BALANCE_GAS}(from, balanceOf(from)) {} catch {}
}
if (to != address(0)) {
if (gasleft() < MIN_NOTIFY_GAS) revert InsufficientGas();
try IDividendTracker(t).setBalance{gas: SET_BALANCE_GAS}(to, balanceOf(to)) {} catch {}
}
// auto-push: pay a batch of holders their reward, but only when the transfer has ample gas to spare.
// Gas-capped + try/catch so it is strictly best-effort and can NEVER block a trade (non-honeypot).
if (gasleft() > PROCESS_FLOOR) {
try IDividendTracker(t).process{gas: PROCESS_GAS}(PROCESS_BUDGET) returns (uint256) {} catch {}
}
}
/// @notice Same off-chain metadata scheme as LunchTokenPlain: `<base><address>.json`. View-only, never
/// touches the transfer path, never reverts.
function tokenURI() external view returns (string memory) {
try ILunchLauncherBase(launcher).baseTokenURI() returns (string memory base) {
if (bytes(base).length == 0) return "";
return string.concat(base, Strings.toHexString(address(this)), ".json");
} catch {
return "";
}
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "totalSupply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "launcher_",
"type": "address",
"internalType": "address"
},
{
"name": "creator_",
"type": "address",
"internalType": "address"
}
],
"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": "InsufficientGas",
"type": "error",
"inputs": []
},
{
"name": "OnlyLauncher",
"type": "error",
"inputs": []
},
{
"name": "StringsInsufficientHexLength",
"type": "error",
"inputs": [
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "length",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "TrackerAlreadySet",
"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": "creator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "initTracker",
"type": "function",
"inputs": [
{
"name": "tracker_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "launcher",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"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": "tokenURI",
"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": "tracker",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"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"
}
]0x6080806040526004361015610012575f80fd5b5f3560e01c90816302d05d3f146105e65750806306fdde031461052b578063095ea7b3146104a957806316eebd1e1461046557806318160ddd1461044857806323b872dd14610369578063313ce5671461034e5780633a6de101146102b95780633c130d901461029e57806370a082311461026757806395d89b4114610163578063a9059cbb14610132578063dd62ed3e146100e25763f52bccad146100b6575f80fd5b346100de575f3660031901126100de576005546040516001600160a01b039091168152602090f35b5f80fd5b346100de5760403660031901126100de576100fb610651565b610103610667565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b346100de5760403660031901126100de5761015861014e610651565b60243590336108cd565b602060405160018152f35b346100de575f3660031901126100de576040515f6004548060011c9060018116801561025d575b6020831081146102495782855290811561022557506001146101c7575b6101c3836101b78185038261067d565b60405191829182610627565b0390f35b91905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b915f905b80821061020b575090915081016020016101b76101a7565b9192600181602092548385880101520191019092916101f3565b60ff191660208086019190915291151560051b840190910191506101b790506101a7565b634e487b7160e01b5f52602260045260245ffd5b91607f169161018a565b346100de5760203660031901126100de576001600160a01b03610288610651565b165f525f602052602060405f2054604051908152f35b346100de575f3660031901126100de576101c36101b76106b3565b346100de5760203660031901126100de576102d2610651565b7f000000000000000000000000c783221ab1db0244203458417981b4631e80b9886001600160a01b0316330361033f57600554906001600160a01b038216610330576001600160a01b03166001600160a01b03199190911617600555005b63904eae7560e01b5f5260045ffd5b6304e255a160e01b5f5260045ffd5b346100de575f3660031901126100de57602060405160128152f35b346100de5760603660031901126100de57610382610651565b61038a610667565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f1981106103c8575b5061015893506108cd565b83811061042d57841561041a57331561040757610158945f52600160205260405f2060018060a01b0333165f526020528360405f2091039055846103bd565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b346100de575f3660031901126100de576020600254604051908152f35b346100de575f3660031901126100de576040517f000000000000000000000000c783221ab1db0244203458417981b4631e80b9886001600160a01b03168152602090f35b346100de5760403660031901126100de576104c2610651565b60243590331561041a576001600160a01b031690811561040757335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346100de575f3660031901126100de576040515f6003548060011c906001811680156105dc575b60208310811461024957828552908115610225575060011461057e576101c3836101b78185038261067d565b91905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915f905b8082106105c2575090915081016020016101b76101a7565b9192600181602092548385880101520191019092916105aa565b91607f1691610552565b346100de575f3660031901126100de577f000000000000000000000000d2f6c165e8d1401b96b77513873ef3c17a0c37d06001600160a01b03168152602090f35b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100de57565b602435906001600160a01b03821682036100de57565b90601f8019910116810190811067ffffffffffffffff82111761069f57604052565b634e487b7160e01b5f52604160045260245ffd5b60405163d547cfb760e01b81525f816004817f000000000000000000000000c783221ab1db0244203458417981b4631e80b9886001600160a01b03165afa5f9181610841575b50610713575060405161070d60208261067d565b5f815290565b805115610832576040513061072960608361067d565b602a82526020820190604036833782511561081e576030825382516001101561081e576078602184015360295b600181116107c457506107ac57602092836005926107a9946040519684889551918291018587015e840190838201905f8252519283915e010164173539b7b760d91b815203601a1981018452018261067d565b90565b63e22e27eb60e01b5f5230600452601460245260445ffd5b90600f8116601081101561081e57845183101561081e576f181899199a1a9b1b9c1cb0b131b232b360811b901a8483016020015360041c90801561080a575f1901610756565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5060405161070d60208261067d565b9091503d805f833e610853818361067d565b8101906020818303126100de5780519067ffffffffffffffff82116100de570181601f820112156100de5780519067ffffffffffffffff821161069f57604051926108a8601f8401601f19166020018561067d565b828452602083830101116100de57815f9260208093018386015e83010152905f6106f9565b91906001600160a01b0383161561090b576001600160a01b038116156108f8576108f69261091e565b565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b5f926001600160a01b038216801593929091908415610b425760025482810180911161080a576002555b6001600160a01b03841692831592849082907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020908715610b2d5780600254036002555b604051908152a36005546001600160a01b0316958615610b235715610aa5575b505015610a23575b505062061a805a116109c6575050565b6020829160246040518095819363ffb2c47960e01b835262030d406004840152620493e0f16109f3575050565b6020823d602011610a1b575b81610a0c6020938361067d565b81010312610a18575050565b80fd5b3d91506109ff565b6202ab985a10610a9657835282602052604083205490823b15610a92576040516338c110ef60e21b81526001600160a01b03919091166004820152602481019190915282908181604481838762027100f1156109b65781610a839161067d565b610a8e57815f6109b6565b5080fd5b8380fd5b6307099c5360e21b8452600484fd5b6202ab985a10610b14575f525f60205260405f205490853b156100de576040516338c110ef60e21b81526001600160a01b0391909116600482015260248101919091525f81604481838962027100f1610aff575b806109ae565b610b0c9195505f9061067d565b5f935f610af9565b6307099c5360e21b5f5260045ffd5b5050505050505050565b845f525f825260405f2081815401905561098e565b825f525f60205260405f2054828110610b69578290845f525f6020520360405f2055610948565b90508263391434e360e21b5f5260045260245260445260645ffdfea2646970667358221220d3e4f74ab312d7aa522aa284877914c4adfcc4e539f72a6f2d59df435dd9524764736f6c634300081e0033
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x640ac2…4e74a3 | 26 days agoTue, 21 Jul 2026 21:00:19 UTC | Transfer | [0] 0x000000000000…e9b05d31 [1] 0x000000000000…43e40951 data: 0x000000000000000000…8e11d51a |
| 0x640ac2…4e74a3 | 26 days agoTue, 21 Jul 2026 21:00:19 UTC | Transfer | [0] 0x000000000000…7a0c37d0 [1] 0x000000000000…e9b05d31 data: 0x000000000000000000…8e11d51a |
| 0x0d9dfe…e81013 | 26 days agoTue, 21 Jul 2026 21:00:15 UTC | Approval | [0] 0x000000000000…7a0c37d0 [1] 0x000000000000…e1a4f53d data: 0x000000000000000000…8e11d51a |
| 0x2fa7fb…0c5758 | 26 days agoTue, 21 Jul 2026 20:59:50 UTC | Approval | [0] 0x000000000000…7a0c37d0 [1] 0x000000000000…3ac78ba3 data: 0x000000000000000000…8e11d51a |
| 0x0b4acb…d2f1e2 | 26 days agoTue, 21 Jul 2026 20:57:36 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…7a0c37d0 data: 0x000000000000000000…8e11d51a |
| 0x0b4acb…d2f1e2 | 26 days agoTue, 21 Jul 2026 20:57:36 UTC | Transfer | [0] 0x000000000000…b0839872 [1] 0x000000000000…43e40951 data: 0x000000000000000000…e7ffd018 |
| 0x0b4acb…d2f1e2 | 26 days agoTue, 21 Jul 2026 20:57:36 UTC | Transfer | [0] 0x000000000000…1e80b988 [1] 0x000000000000…b0839872 data: 0x000000000000000000…e8000000 |
| 0x0b4acb…d2f1e2 | 26 days agoTue, 21 Jul 2026 20:57:36 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…1e80b988 data: 0x000000000000000000…e8000000 |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| 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 ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x0d9dfe…e81013 | Approve | 15,869,671 | 26 days agoTue, 21 Jul 2026 21:00:15 UTC | 0xd2f6…37d0 | IN | Tung tung tung Sahur | $0.000 ETH | 0.00000326 | |
| 0x2fa7fb…0c5758 | Approve | 15,869,423 | 26 days agoTue, 21 Jul 2026 20:59:50 UTC | 0xd2f6…37d0 | IN | Tung tung tung Sahur | $0.000 ETH | 0.00000325 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 15,868,072 | 26 days agoTue, 21 Jul 2026 20:57:36 UTC | 0x0b4acb…d2f1e2 | CREATE | launchRewardsWithMeta | 0xc783…b988 | IN | 0x7c47…a78a | 0 ETH |