{"workflow":null,"planning":null,"id":"1d091aae-6d4d-4c64-959b-344d3865252c","state":"completed","template":"shape:chain","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.","blockedReason":null,"createdAt":"2026-10-07T05:11:33.635Z","updatedAt":"2026-10-07T06:14:04.652Z","paidBy":"0xa966f803fc6b51609185bc79950bacf2518ebd7e","parentJobId":null,"project":{"id":"1d091aae-6d4d-4c64-959b-344d3865252c","head":"1d091aae-6d4d-4c64-959b-344d3865252c","running":null,"versions":[{"jobId":"1d091aae-6d4d-4c64-959b-344d3865252c","workflowId":null,"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.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","state":"completed","createdAt":"2026-10-07T05:11:33.635Z"}]},"deliver":true,"host":false,"site":null,"launch":{"requested":true,"kind":"evm_contracts","id":"d8c63be3-7e5f-449c-8dcd-466c099a97ea","status":"live","chainId":4663},"oracleRequestId":null,"delivery":{"repoUrl":"https://github.com/identity-md-launches/launch-876-memecoin-cemetery-tokenless-ownerless","pullRequestUrl":"https://github.com/identity-md-launches/launch-876-memecoin-cemetery-tokenless-ownerless/pull/1","commit":"a5cdb741e1c397dbc57932198bfc1b1bfc3d33ef","deliveredAt":"2026-10-07T06:14:39.425Z","media":null},"media":null,"nodes":[{"key":"audit_economics","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project","write_foundry_tests","manifest"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T05:49:49.563Z","verdict":null,"seat":{"tokenId":"372","agentId":"52160"},"live":null},{"key":"audit_flow","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project","write_foundry_tests","manifest"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T05:48:07.564Z","verdict":null,"seat":{"tokenId":"11","agentId":"52173"},"live":null},{"key":"audit_judge","role":"review","state":"accepted","attempt":1,"revisions":1,"judgeRevisions":1,"dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T06:14:04.652Z","verdict":null,"seat":{"tokenId":"1401","agentId":"51146"},"live":null},{"key":"audit_math","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project","write_foundry_tests","manifest"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T05:48:34.570Z","verdict":null,"seat":{"tokenId":"560","agentId":"52161"},"live":null},{"key":"audit_permissions","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project","write_foundry_tests","manifest"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T05:46:42.990Z","verdict":null,"seat":{"tokenId":"38","agentId":"52232"},"live":null},{"key":"build_contract_project","role":"implement","state":"accepted","attempt":1,"revisions":1,"judgeRevisions":1,"dependsOn":[],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T06:01:45.704Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+be003835","verifiedTreeHash":"fe7986c7a047ad29a9b8a2a965ac752f9fdb1d30","at":"2026-10-07T06:01:45.705Z","failedChecks":[]},"seat":{"tokenId":"480","agentId":"51151"},"live":null},{"key":"manifest","role":"integrate","state":"accepted","attempt":1,"revisions":1,"judgeRevisions":1,"dependsOn":["build_contract_project","write_foundry_tests"],"allowedPaths":["launch.json"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T06:10:03.972Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+be003835","verifiedTreeHash":"3396942c6ea4271dc085c24ba03cf9ca7b4e62b7","at":"2026-10-07T06:10:04.108Z","failedChecks":[]},"seat":{"tokenId":"294","agentId":"51044"},"live":null},{"key":"write_foundry_tests","role":"tests","state":"accepted","attempt":1,"revisions":1,"judgeRevisions":1,"dependsOn":["build_contract_project"],"allowedPaths":["test","test/**"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T06:06:07.956Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+be003835","verifiedTreeHash":"035316c0b12b5352882d0c604824989d543b450c","at":"2026-10-07T06:06:07.957Z","failedChecks":[]},"seat":{"tokenId":"760","agentId":"51304"},"live":null}],"reviews":[{"status":"sent","chainId":1,"txHash":"0x67382ca728cb6d94b82414df646cc8f2052eda3c7bbd970a5dc1b52287fb54fa","blockNumber":26138649,"sentAt":"2026-10-07T06:14:51.291Z","entries":[{"nodeKey":"audit_economics","agentId":"52160","value":1,"role":"review:submission"},{"nodeKey":"audit_flow","agentId":"52173","value":1,"role":"review:submission"},{"nodeKey":"audit_judge","agentId":"50907","value":1,"role":"review:submission"},{"nodeKey":"audit_judge","agentId":"51146","value":1,"role":"review:submission"},{"nodeKey":"audit_math","agentId":"52161","value":1,"role":"review:submission"},{"nodeKey":"audit_permissions","agentId":"52232","value":1,"role":"review:submission"},{"nodeKey":"build_contract_project","agentId":"52140","value":1,"role":"verification:checks"},{"nodeKey":"build_contract_project","agentId":"51151","value":1,"role":"verification:checks"},{"nodeKey":"manifest","agentId":"51044","value":1,"role":"verification:checks"},{"nodeKey":"manifest","agentId":"51306","value":1,"role":"verification:checks"},{"nodeKey":"write_foundry_tests","agentId":"52154","value":1,"role":"verification:checks"},{"nodeKey":"write_foundry_tests","agentId":"51304","value":1,"role":"verification:checks"}]}]}