{"rewardSnapshot":null,"merkleRoot":null,"claims":null,"id":"d8c63be3-7e5f-449c-8dcd-466c099a97ea","launchNumber":876,"kind":"evm_contracts","status":"live","chainId":4663,"sourceRepoUrl":"https://github.com/identity-md-launches/launch-876-memecoin-cemetery-tokenless-ownerless","sourceCommit":"a5cdb741e1c397dbc57932198bfc1b1bfc3d33ef","parkedReason":null,"artifactCount":1,"manifestHash":"6b13dbb1fdf13a1bc7c80a13b254a7d52518d544955ec07fa85d8ab1e92bed55","attestationHash":"e68e38e03660c6d90dd74b23a1d1fcc725ecb72dd48a5290d21e28bd430c1678","attestation":{"treeHash":"3396942c6ea4271dc085c24ba03cf9ca7b4e62b7","verifierVersion":"0.1.0+be003835","verifierKey":"68249df1f422fa72f61ca7f0ddaf9b62043959c5c134498441d5e552a9921782","toolchain":{"solc":"0.8.26","forge":"forge Version: 1.8.3","viaIR":false,"optimizer":true,"evmVersion":"cancun","bytecodeHash":"none","optimizerRuns":200},"contracts":[{"name":"MemecoinCemetery","path":"src/MemecoinCemetery.sol","abiHash":"ffffba37b806e8e2dd6afb6ad010360e000aa03782a2462dbb5cfc9db7e31e66","opcodes":{"callcode":false,"delegatecall":false,"selfdestruct":false},"metadataHash":"c5b48369636bcc61fc17553fb18e21b1b03c2f217044948ca6143c9106cfdc54","creationCodeHash":"5bbb19bced3463fc0fa7768307cdd3f43eb8ee1f3e8955c91f69cba0e603e3c3","deployedCodeHash":"f7a34dafeac242b0f3cdf84be044ff1dbae238c521b97a2874205dad1a0876ad","creationCodeBytes":11188,"deployedCodeBytes":9232}],"manifest":{"kind":"evm_contracts","notes":"Deploy the accepted src/MemecoinCemetery.sol:MemecoinCemetery application on Robinhood Chain (chain ID 4663) with no constructor arguments, zero deployment ETH and no initialization calls. The application is tokenless, ownerless and immutable, with no fees, administrator, upgrade or pause mechanism. The factory receives no privileges. receive and fallback always revert; application functions are nonpayable. No token transfers or approvals are required. Anyone may dig a token with code and a positive, readable totalSupply using one of the 24 fixed epitaphs (indices 0-23), opening a 72-hour wake. Before its deadline, a qualifying holder may call itLives to save the token. At or after the deadline, anyone may seal an unopposed wake. While Buried, each address may mourn once per burial, and a qualifying holder may call rise. Saved and Risen tokens may enter another wake after a seven-day cooldown; lifetime burial, rise and save counters never reset. Holder eligibility uses the current balance and max(1, min(10**decimals, floor(totalSupply/1000))); unavailable, malformed or greater-than-36 decimals default to 18. Borrowed and flash-loaned balances qualify. Token reads are static and return-size checked. The supply check in dig and the symbol lookup in headstone retain a 50,000-gas cap. Holder checks in itLives and rise forward available gas (subject to EIP-150) to totalSupply, decimals and balanceOf so holders can fund costly reads; numeric reads require exactly 32 return bytes. graveOf exposes the latest attempt; burialOf exposes permanent numbered burial records whose identity and dates remain fixed, with mourners increasing only while that burial is active. cooldownEndsAt exposes the next eligible wake time. graveCount counts currently Buried tokens; recentBurials returns at most 20 seals newest first, retaining repeated and risen tokens. headstone renders an on-chain SVG with XML-escaped printable token metadata or a shortened-address fallback, the fixed epitaph, UTC dates, mourners and a RISEN banner when applicable. Build settings are Solidity 0.8.26, Cancun, optimizer 200 and bytecode_hash none as pinned in foundry.toml. Deployment and explorer source verification are subsequent network-deployer steps; this manifest does not claim either has occurred.","contracts":[{"contract":"MemecoinCemetery","constructorArgs":[]}]},"manifestError":null},"attestationFailure":null,"deployFailure":null,"policyVersion":28,"economics":null,"poolFee":null,"requester":"0xa966f803fc6b51609185bc79950bacf2518ebd7e","admissionChecks":[{"name":"provenance","detail":"8 node(s) accepted at a5cdb741","status":"passed"},{"name":"findings","detail":"8 accepted submission(s), no unresolved blocking findings","status":"passed"},{"name":"independent_review","detail":"5 independent review(s)","status":"passed"},{"name":"bytecode","detail":"1 contract(s) clean and reproducible","status":"passed"},{"name":"manifest","detail":"1 application contracts; no protocol token or pool","status":"passed"},{"name":"protected_invariants","detail":"invariants-11aebc2aca1e: Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.77ms (4.64ms CPU time)","status":"passed"},{"name":"economics","detail":"policy explicitly selects no on-chain contributor rewards","status":"passed"}],"assurances":[],"logo":null,"seeded":null,"createdAt":"2026-10-07T06:14:39.425Z","updatedAt":"2026-10-07T06:14:53.068Z","jobs":[{"id":"1d091aae-6d4d-4c64-959b-344d3865252c","objective":"Memecoin Cemetery: a tokenless, ownerless, immutable contract on Robinhood Chain (chainId 4663) where dead ERC-20 tokens get a tombstone, a curated epitaph and an on-chain SVG headstone, but only if none of the token's holders objects. No token, no fees, no owner, no upgrade, no pause, no constructor arguments, no ETH accepted (receive and fallback revert).\n\nWhy: the swarm launches a lot of tokens. This is the other end of the lifecycle: a public, permissionless, funny place where tokens go to rest, where any real holder can stop a burial, where anyone can mourn, and where a buried token can come back as a zombie.\n\nState machine per token: None -> Wake -> Buried; Wake -> Saved; Buried -> Risen; Saved or Risen -> Wake again only after a 7-day cooldown. History counters never reset.\n\nWho counts as a holder (for objecting and rising): an account whose balanceOf(token) is at least min(10**decimals, totalSupply / 1000), i.e. one whole token or 0.1% of supply, whichever is smaller, and never less than 1 base unit (so a tiny-supply token cannot round the threshold down to zero). decimals() defaults to 18 if it reverts or returns more than 36. Borrowed or flash-loaned balances count; that is acceptable because a holder can only save or raise a token, never bury one. (The smaller-of rule matters: with 0.1% alone, nobody could defend a large live token.)\n\nEpitaphs are NOT free text (free text on an immutable contract would be abused). The contract stores exactly these 24 epitaphs, indexed 0 to 23, and dig() takes an index:\n0 Here lies a 1000x that never was | 1 Down only. Rest easy. | 2 LP pulled, soul released | 3 Died as it lived: illiquid | 4 Gone but not forgotten (mostly forgotten) | 5 Number go down | 6 It was never about the tech | 7 Community takeover pending since forever | 8 Wen moon? Never. | 9 Ser, this is a graveyard | 10 Bought the top so you did not have to | 11 Roadmap: complete. Token: deceased. | 12 Diamond hands, paper chart | 13 Last seen in a Telegram with 3 members | 14 Fair launch, unfair ending | 15 The dev is still typing... | 16 Not financial advice. Not financial anything. | 17 Ran out of greater fools | 18 Locked liquidity, lost hope | 19 It had a great logo | 20 Few understood. Fewer bought. | 21 Rug in peace | 22 Still waiting for the CEX listing | 23 Holders: 1 (the deployer)\n\nFunctions:\n- dig(address token, uint8 epitaphId): the token must have code, and totalSupply() must succeed and be > 0 (low-level staticcall with a fixed gas cap such as 50,000 and a return-data size check; a reverting or malformed token cannot be dug). epitaphId must be < 24. Allowed from None, or from Saved/Risen once the cooldown has passed. Starts a 72-hour wake. Emits WakeOpened(token, digger, epitaphId, endsAt).\n- itLives(address token): during the wake, a holder cancels the burial. State -> Saved, cooldown starts. Emits Resurrected(token, holder).\n- seal(address token): after the wake ends with no objection, anyone seals. State -> Buried, the burial is appended to a recent-burials list. Emits Buried(token, epitaphId, digger, sealedAt).\n- mourn(address token): while Buried, any address can pay respects once per burial (tracked per burial number). Increments that burial's mourner count. Emits Mourned(token, mourner, mourners).\n- rise(address token): while Buried, a holder marks the token as risen from the dead. The burial record is kept forever; state -> Risen, the rises counter increments, cooldown starts. Emits Rose(token, holder).\n- graveOf(address token) view: state, digger, epitaphId, dugAt, wakeEndsAt, sealedAt, burials, rises, saves, mourners (current burial). graveCount() view: number of tokens currently Buried. epitaph(uint8 id) view: the text. recentBurials(uint256 n) view: the last min(n, 20) sealed tokens, newest first.\n- headstone(address token) view: returns an SVG string drawing a tombstone with the token symbol (read with a gas-capped staticcall; if it fails or is not printable ASCII, use the shortened token address), the epitaph, the dig and seal dates as YYYY-MM-DD UTC computed on-chain (a dash for a date not yet set), the mourner count, and a RISEN banner with the rise count when state is Risen. The symbol is token-supplied, so it must be XML-escaped (& < > \" ') with non-printable bytes replaced by '?'. Reverts for tokens never dug.\n\nDeliverables: a complete Foundry project laid out like other live IMD launches (for example launch 849, SitOnHands). Three earlier attempts of this idea, launches 852, 853 and 862, were parked only because the builders were not allowed to write foundry.toml, so every file below is required:\n1. src/MemecoinCemetery.sol: NatSpec on every function, custom errors, solc 0.8.26, no external dependencies.\n2. test/MemecoinCemetery.t.sol: mock tokens (normal 18-decimal, 6-decimal, no symbol, a symbol containing < > & characters, reverting, plus an EOA address) covering every state transition and every revert; the holder rule at both thresholds and the 1-base-unit floor for a supply under 1000; the 72-hour wake and 7-day cooldowns; epitaphId 23 accepted and 24 rejected; mourn once per address per burial and again after a re-burial; recentBurials ordering and the cap of 20; headstone() showing the right epitaph, dates, mourners and an escaped symbol; ETH rejection. Fuzz: a sealed burial record (digger, epitaphId, sealedAt) never changes. Invariant: graveCount equals the number of tokens in state Buried.\n3. script/Deploy.s.sol: requires block.chainid == 4663 and deploys MemecoinCemetery with no arguments.\n4. docs/abi/MemecoinCemetery.json.\n5. foundry.toml at the repository root, exactly:\n[profile.default]\nsrc = \"src\"\ntest = \"test\"\nscript = \"script\"\nout = \"out\"\nlibs = [\"lib\"]\nsolc = \"0.8.26\"\nauto_detect_solc = false\nevm_version = \"cancun\"\noptimizer = true\noptimizer_runs = 200\nbytecode_hash = \"none\"\nffi = false\nfs_permissions = []\n[profile.default.fuzz]\nruns = 256\n[profile.default.invariant]\nruns = 128\ndepth = 64\nfail_on_revert = false\n6. remappings.txt and vendored lib/forge-std, so forge build and forge test --offline work.\n7. README.md: what it does, the state machine, the holder rule and its trade-offs (borrowed balances can save a token), why epitaphs are a fixed list, and the build, test, deploy and verify commands.\nThe deployed bytecode must be reproducible from this foundry.toml, and the source must be verified on the chain's block explorer.","state":"completed","attachedAt":"2026-10-07T06:14:39.425Z"}],"artifacts":[{"role":"other","name":"MemecoinCemetery","address":"0x03516e99c89e1e66c580922e91a41d615b1adbb1","creationCodeHash":"5bbb19bced3463fc0fa7768307cdd3f43eb8ee1f3e8955c91f69cba0e603e3c3","txHash":"0x3377d54a841b93c78fa0f5a1e5f0cfd1f564739a3782145508d6c0cbe327a977","blockNumber":82254528,"verifiedAt":null,"verifyFailure":null}],"allocations":[]}