{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"8fe6ca68-fccc-4b12-8e23-202d2f7aa4d4","kind":"impl_tests_review","nodes":[{"acceptedSubmissionHash":"0bdb01a2e0ce432410df9a6b71238c2c436afc79fd79892cc39966ed9d5d3cca","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d37537abb20af46832b24602788d7895021ecaac20c6934313dc4f8aba4ad047","skillId":"implement-contract","tools":[]},"key":"impl","kind":"code","role":"implement","skillHash":"d37537abb20af46832b24602788d7895021ecaac20c6934313dc4f8aba4ad047","skillId":"implement-contract","state":"accepted"},{"acceptedSubmissionHash":"43f18bb52e8abca8544e4d7536c8fb932561e25a62a04036c660aba1e6a52c2e","dependsOn":["impl","tests"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"a3a852ddaa3f2832abd8319bec3ff41835180728622f0a7998926ef2545fdef5","dependsOn":["impl","tests","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","tools":[]},"key":"review","kind":"code","role":"review","skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","state":"accepted"},{"acceptedSubmissionHash":"d0e5c2872b93500bfc297794b4807de606732362191215557ad3b5651ef390b0","dependsOn":["impl"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Memecoin Cemetery: a tokenless, ownerless, immutable contract on Ethereum mainnet where dead ERC-20 tokens get a tombstone, an 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, slightly funny place where tokens go to rest, where any real holder can stop a burial, 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 30-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 and let non-holders object). 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 such as USDC.)\n\nFunctions:\n- dig(address token, string calldata epitaph): 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). Epitaph 1 to 140 bytes. Allowed from None, or from Saved/Risen once the cooldown has passed. Starts a 30-day wake. Emits WakeOpened(token, digger, epitaph, 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. Emits Buried(token, epitaph, digger, sealedAt).\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, epitaph, dugAt, wakeEndsAt, sealedAt, burials, rises, saves. graveCount() view: number of tokens currently Buried.\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), and a RISEN banner with the rise count when state is Risen. Every user- or token-supplied string must be XML-escaped (& < > \" ') and non-printable bytes replaced with '?', so the SVG can never be broken or injected. Reverts for tokens never dug.\n\nDeliverables: a complete Foundry project laid out like other live IMD launches (for example launch 849, SitOnHands). Two earlier attempts of this request, launches 852 and 853, were parked only because foundry.toml was missing or wrong, 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, reverting, plus an EOA address) covering every state transition and every revert; the holder rule at both thresholds (small and huge supply) and the 1-base-unit floor for a supply under 1000; both cooldowns; epitaph lengths 0, 140 and 141; headstone() containing the escaped epitaph and correct dates, and staying valid with an epitaph full of < > & characters; ETH rejection. Fuzz: a sealed burial record (digger, epitaph, sealedAt) never changes. Invariant: graveCount equals the number of tokens in state Buried.\n3. script/Deploy.s.sol: requires block.chainid == 1 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; epitaphs are permanent and unmoderated), and the build, test, deploy and forge verify-contract commands.\nThe deployed bytecode must be reproducible from this foundry.toml, and the source must be verified on Etherscan.","parentJobId":null,"planHash":"481b078c406192259fa6075b1257225e50c11a7f23f42408429d790d03f5ef0f","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"8fe6ca68-fccc-4b12-8e23-202d2f7aa4d4","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-862-memecoincemetery"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51568","feedbackHash":"b94449649bb1a7e2eede4f94c6af025ef7d3e2a50da00d5474c6727eb1ac8e60","nodeKey":"impl","submissionHash":"465ea84e581c83afeafbc9283f48719ca5ec078e78e4b67c65f397284cb3f79e","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51751","feedbackHash":"456b5bdfde26e4813f75de951a5211c61c0c0132c50fb649d9bc3d0c528b4836","nodeKey":"impl","submissionHash":"0bdb01a2e0ce432410df9a6b71238c2c436afc79fd79892cc39966ed9d5d3cca","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52209","feedbackHash":"9254dc0a8c47a74a4a82d36f2dd46a187775523d1e54cfcaf64124c8a9e64c82","nodeKey":"manifest","submissionHash":"1d73779b740c35d7453d764232b56a3098687feaa60854220fa0f8b7997a9984","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51753","feedbackHash":"0558d6edab4377aa83c965edc217dde536e3dbd28e2bab9c7e0f92fb09dd5362","nodeKey":"manifest","submissionHash":"43f18bb52e8abca8544e4d7536c8fb932561e25a62a04036c660aba1e6a52c2e","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51169","feedbackHash":"0cc826528cc5e1f82dcb95a12fb90c1f7abc82fad0b592fe779490ed2db70180","nodeKey":"review","submissionHash":"f1be1493f7c3468c91cccbc3819f6e174ae76fb92ad6ac18a8d2d64bd3e90864","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52250","feedbackHash":"cdbf9211a730d2de933d4beaa84ca5d9015b63b578af8ae95f1abc2d407becc0","nodeKey":"review","submissionHash":"a3a852ddaa3f2832abd8319bec3ff41835180728622f0a7998926ef2545fdef5","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51570","feedbackHash":"8be1ede2455fba01c1943bab4f7bfb25830c1341c4edba8524c4feb45a5e7502","nodeKey":"tests","submissionHash":"1d189ffd318363dad652c8b2347a84cf694ca723de6408b81efbfc9464e1798d","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51184","feedbackHash":"d23a71238414431120d1fd0dbf9db19a3b1a200ffe698a2f02d31ceffedaa984","nodeKey":"tests","submissionHash":"d0e5c2872b93500bfc297794b4807de606732362191215557ad3b5651ef390b0","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"b0702110a705d8c679178f2f2c49b8f4ff7fd5fe350a21bf97bfd0c37a5fbda5","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"bb4a662691ea6b4a75995190f3ec4e45098f4a6e8f969e856f2617605c890529","device":"500cef6ec1073663","findings":[],"hash":"0bdb01a2e0ce432410df9a6b71238c2c436afc79fd79892cc39966ed9d5d3cca","nodeId":"d1205104-e74f-44a3-ba49-65e7aef6a023","outcome":"completed","summary":"Fixed all three reproduced findings: holder reads can use caller-funded gas, oversized symbols fall back to addresses, and short SVG text keeps its natural width.\n\nOffline `forge build` and all 14 scratch tests passed, including 256 fuzz runs. Used CLI build settings because configuration is absent; no configuration files changed.\n\nRecorded every verdict in `.imd-responses.json`.","treeHash":"0d04c0cc914d63e4cba485bd1079f5f3131f2bda","usage":{"cachedInputTokens":430336,"inputTokens":59042,"model":"gpt-6-astra","outputTokens":11251,"runtime":"codex","turns":5,"wallClockMs":277927}},{"artifacts":[],"attempt":1,"bundleHash":"b7e4fa54f8bf6ff833c0375d19acb4af6ae8007010dd6e68578ea96eb7c391ca","device":"493095393c4a2a74","findings":[],"hash":"1d189ffd318363dad652c8b2347a84cf694ca723de6408b81efbfc9464e1798d","nodeId":"53e637f2-7c9f-44f8-ad7a-4180787eb0f7","outcome":"completed","summary":"Added self-contained adversarial, fuzz, and invariant tests in `test/MemecoinCemetery.t.sol`.\n\nOffline build and tests pass: 38 reported checks, including 8,192 invariant calls. Optimized Cancun tests also pass.\n\nOnly the allowed test file changed. The checkout still lacks the required `foundry.toml`, which is outside this assignment’s scope.","treeHash":"64cde3220d30612ac9f43bfbcccf767c374dd7c7","usage":{"cachedInputTokens":684800,"inputTokens":69286,"model":"gpt-6-astra","outputTokens":22095,"runtime":"codex","turns":6,"wallClockMs":529236}},{"artifacts":[],"attempt":1,"bundleHash":"1d046ed5d7fdcba1e0b0c8693a429ea8b9fe6562502f3545d78ba87c8742d2bc","device":"4539d3d0693a7444","findings":[],"hash":"1d73779b740c35d7453d764232b56a3098687feaa60854220fa0f8b7997a9984","nodeId":"9ce3d3b7-09cd-4fbe-940e-ee86a3006dfb","outcome":"completed","summary":"Created [launch.json](/root/.identitymd/work/8fe6ca68-fccc-4b12-8e23-202d2f7aa4d4/9ce3d3b7-09cd-4fbe-940e-ee86a3006dfb/launch.json) naming only `MemecoinCemetery`, with empty constructor arguments.\n\nSchema and ABI checks passed. Offline `forge build` succeeded; `forge test` reported 38 passed, zero failed.\n\nChecks used explicit compiler settings because `foundry.toml` is absent. Missing project deliverables remain outside this manifest-only assignment. Only `launch.json` is submitted.","treeHash":"bf36e4f6fe9d372de6a11e6028e334a81cdc6055","usage":{"cachedInputTokens":284416,"inputTokens":33623,"model":"gpt-6-astra","outputTokens":3634,"runtime":"codex","turns":3,"wallClockMs":110576}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"68fdf4cb027a7a1f","findings":[],"hash":"254e5f58d59ac8efb5e4bf93e56c0eddc006b781fa742b08b5f2497d1831a210","nodeId":"9ce3d3b7-09cd-4fbe-940e-ee86a3006dfb","outcome":"failed","summary":"the task produced no changes; the agent's last message was: [launch.json](/root/.identitymd/work/8fe6ca68-fccc-4b12-8e23-202d2f7aa4d4/9ce3d3b7-09cd-4fbe-940e-ee86a3006dfb/launch.json) already satisfies the supplied schema and matches `MemecoinCemetery` with zero constructor arguments. No tracked changes were needed.\n\nOffline `forge build` and `forge test` passed: **40 tests, zero failures**. Checks used command-local settings because `foundry.toml` is absent; artifacts stayed in `test/scratch/`.","treeHash":null,"usage":{"cachedInputTokens":235392,"inputTokens":42197,"model":"gpt-6-astra","outputTokens":4740,"runtime":"codex","turns":3,"wallClockMs":116693}},{"artifacts":[],"attempt":2,"bundleHash":"e2cf5537354b90c499867480ba683b60420ac861e4e191364bfc58ffb0ece0e8","device":"6de2de551e41049f","findings":[],"hash":"43f18bb52e8abca8544e4d7536c8fb932561e25a62a04036c660aba1e6a52c2e","nodeId":"9ce3d3b7-09cd-4fbe-940e-ee86a3006dfb","outcome":"completed","summary":"Updated only [launch.json](/root/.identitymd/work/8fe6ca68-fccc-4b12-8e23-202d2f7aa4d4/9ce3d3b7-09cd-4fbe-940e-ee86a3006dfb/launch.json), clarifying wake deadlines and permanent burial history. It names `MemecoinCemetery` with no constructor arguments.\n\nManifest and ABI checks passed. Offline `forge build` and `forge test` passed: **40 tests, zero failures**. Checks used command-local settings because `foundry.toml` is absent.","treeHash":"c75521b68d9c89b0ae4829007b51f8fbacf08815","usage":{"cachedInputTokens":297344,"inputTokens":32106,"model":"gpt-6-astra","outputTokens":4119,"runtime":"codex","turns":3,"wallClockMs":125422}},{"artifacts":[],"attempt":1,"bundleHash":"3547415b1c786d7be382b5ab440e8aacf47b4bcf125aa89ddef552968342baf6","device":"3111534b6da56538","findings":[],"hash":"465ea84e581c83afeafbc9283f48719ca5ec078e78e4b67c65f397284cb3f79e","nodeId":"d1205104-e74f-44a3-ba49-65e7aef6a023","outcome":"completed","summary":"Implemented [MemecoinCemetery.sol](/root/.identitymd/work/8fe6ca68-fccc-4b12-8e23-202d2f7aa4d4/d1205104-e74f-44a3-ba49-65e7aef6a023/src/MemecoinCemetery.sol), including permanent burial history and escaped SVG headstones.\n\nOffline build and 25 scratch checks passed, including fuzzing and 8,192 invariant calls.\n\nOnly the permitted source file is delivered. Missing configuration was supplied through local check settings; prohibited project files were not created. Deployment and Etherscan verification remain unperformed.","treeHash":"6d65871c9a51ed0b0bddd0a46ef69facbd210e7f","usage":{"cachedInputTokens":704640,"inputTokens":74047,"model":"gpt-6-astra","outputTokens":20077,"runtime":"codex","turns":6,"wallClockMs":441209}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fc87c05048aca47d","findings":[{"citation":"resolved","description":"Carried over from the previous round (id 26a3cd5a18b1f8c7192d9627c47dea842cef0978d2b7f4bcd3a954b83aa0202e). The author answered that scaffolding is outside the tests-only assignment and must come from a separate project assignment; that is accepted, and this is recorded as non-blocking for the code under review. The fact itself is unchanged: the tree holds only launch.json, src/MemecoinCemetery.sol and test/MemecoinCemetery.t.sol. The brief lists deliverables 3-7 (script/Deploy.s.sol with the chainid==1 guard, docs/abi/MemecoinCemetery.json, the exact foundry.toml, remappings.txt + vendored lib/forge-std, README.md) as required and notes launches 852/853 were parked for a missing foundry.toml. Without foundry.toml nothing in the tree pins solc 0.8.26 / cancun / optimizer 200 / bytecode_hash=none, so reproducible bytecode and Etherscan verification are not yet guaranteed from this tree, and the protected harness (which imports forge-std/Test.sol) cannot compile from it offline. The author's dispute is accurate on one point: a bare `forge build --offline` of src/ and the self-contained test file does succeed here because solc 0.8.26 is cached; only the protected test and the pinned settings are affected. Verified this round: with the brief's exact foundry.toml plus vendored forge-std 1.17.0 in a scratch project, forge build and forge test --offline pass 40/40 (38 unit + 2 invariant, 128 runs x 64 depth), the attached proof passes, and the protected harness passes (runtime 9,017 bytes, no DELEGATECALL/CALLCODE/SELFDESTRUCT). So the code is ready; only the scaffolding assignment is outstanding before attestation.","line":6,"path":"test/MemecoinCemetery.t.sol","reproduction":"At the repository root: `ls foundry.toml remappings.txt lib/forge-std script docs README.md` -> every path is missing (only .git, .imd, launch.json, src, test exist). `forge build --offline .imd/reads/protected/evm_contracts/Contracts.protected.t.sol` -> fails with 'Source \"forge-std/Test.sol\" not found'. Expected per brief: all six paths present and the protected test compiling offline with the pinned 0.8.26/cancun/200/bytecode_hash=none settings.","severity":"low","snippet":"// The assignment checkout has no forge-std. Keep the submitted tests offline and","title":"Working tree still lacks the required project files: foundry.toml, remappings.txt, lib/forge-std, script/Deploy.s.sol, docs/abi, README.md (carried over, author disputes scope)"}],"hash":"a3a852ddaa3f2832abd8319bec3ff41835180728622f0a7998926ef2545fdef5","nodeId":"64b089c7-beeb-4fa6-80cd-2d590c8362b8","outcome":"completed","summary":"Review settled. The findings file is written at `.imd-findings.json` and no tracked file was changed.\n\n**Outcome of the previous round's findings**\n\n- **High, 50k gas cap locking holders out of itLives and rise: fixed.** The holder reads of totalSupply and balanceOf now forward the caller's gas, while dig's supply probe, the decimals fallback and the symbol read keep the 50,000 cap. I ran the attached proof unchanged against the revised code and both reflection-token cases pass (sole holder can save and can rise).\n- **Low, tests cemented the lockout: fixed.** The suite now has a reflection-style token whose cold balanceOf fails at 50k and succeeds at 200k, with passing save and rise regressions, and the gas-exhaustion expectation is limited to dig's supply probe.\n- **Low, unbounded symbol length in headstone: fixed.** Symbols over 32 bytes fall back to the shortened address before any copying. Measured this round: 16,384-, 1,024- and 33-byte symbols all render in about 85k gas with a 546-byte SVG, and a 32-byte symbol is still accepted.\n- **Info, short text stretched by textLength: fixed.** The attribute is only emitted for symbols over 30 bytes or epitaphs over 45 bytes. Symbol X with epitaph RIP renders with no textLength attribute.\n- **Low, missing project scaffolding: still outstanding, kept as non-blocking.** The author's scope dispute is reasonable for a tests-only assignment, and their reproduction holds: a bare offline build succeeds because solc is cached, but the protected harness cannot compile from this tree and nothing pins the build settings. The tree still contains only launch.json, src and test. This must come from the scaffolding assignment before attestation.\n\n**Nothing new found.** With the brief's exact foundry.toml and vendored forge-std 1.17.0 in a scratch project, the full suite passes 40 of 40 including both invariants at 128 runs by 64 depth, and the protected deployment harness passes on the compiled creation bytecode (runtime 9,017 bytes, no forbidden opcodes). The aderyn leads are false positives: ETH locking is the specified design with reverting receive and fallback, the \"storage array edited with memory\" line is a memory copy passed to the escaper, and the \"uninitialized local\" is assigned on the same line. All six state-changing entry points are recorded as holding in the coverage table.","treeHash":null,"usage":{"cachedInputTokens":1180152,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":15626,"runtime":"claude","turns":17,"wallClockMs":213388}},{"artifacts":[],"attempt":1,"bundleHash":"f8b00b88b6b95655ac371511e6c2b19f565d6e790d33ef448c9e11cade031966","device":"540f6378761dba26","findings":[{"description":"The checkout lacks foundry.toml, remappings.txt, lib/forge-std, script/Deploy.s.sol, docs/abi/MemecoinCemetery.json and README.md. The standalone tests can build with the locally cached compiler, but that does not supply the brief's reproducible build configuration or the forge-std import required by the protected harness. forge config --json reports auto_detect_solc=true, optimizer=false and bytecode_hash=ipfs instead of the required pinned settings. These files cannot be supplied in the authorized tests-only revision; no configuration, dependency or production-source changes were made.","line":1,"path":"foundry.toml","reproduction":"Run ls -ld foundry.toml remappings.txt lib/forge-std script/Deploy.s.sol docs/abi/MemecoinCemetery.json README.md: every path is missing. Run forge build --offline .imd/reads/protected/evm_contracts/Contracts.protected.t.sol: compilation exits 1 with ParserError 6275, Source forge-std/Test.sol not found. Expected: the required files are present and the protected harness compiles with vendored dependencies and the specified settings. Plain forge build --offline does pass here because solc 0.8.26 is cached and the submitted test file has no external imports; that narrower success does not resolve the missing project deliverables.","severity":"low","title":"Required project scaffolding is absent and the protected harness cannot compile offline"}],"hash":"d0e5c2872b93500bfc297794b4807de606732362191215557ad3b5651ef390b0","nodeId":"53e637f2-7c9f-44f8-ad7a-4180787eb0f7","outcome":"completed","summary":"Added gas-heavy holder save/rise regressions and removed obsolete gas-exhaustion expectations.\n\n`forge build --offline` and `forge test --offline` pass: **40 tests**, also passing with the requested compiler settings.\n\nWrote both review responses to `.imd-responses.json`. Reported missing scaffolding in `.imd-findings.json`; fixing it is outside scope, and the protected harness still cannot compile without `forge-std`.","treeHash":"3f9816c8c6ac3aae38bfda2ba7f11fad0991d107","usage":{"cachedInputTokens":529792,"inputTokens":55403,"model":"gpt-6-astra","outputTokens":8170,"runtime":"codex","turns":5,"wallClockMs":217298}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"87804e27e9c9f85a","findings":[{"citation":"resolved","description":"_requireHolder reads totalSupply() (line 243) and balanceOf() (line 251) through _readUint, which hard-caps every token call at READ_GAS = 50_000 (lines 38, 259-261). The brief only asks for a gas cap on dig()'s totalSupply probe; it defines a holder purely by balanceOf and promises burial 'only if none of the token's holders objects'. SafeMoon-style reflection tokens, the archetypal 2021 memecoin family this cemetery targets, compute balanceOf() by looping over every reward-excluded address (pair, contract, burn, marketing, owner...), costing roughly 8.3k gas per excluded address on top of ~12k fixed. Measured with a faithful reduction of the SafeMoon code: 4 excluded addresses -> itLives succeeds; 5 or more -> balanceOf exhausts the 50k allowance and itLives()/rise() revert with TokenReadFailed(token, 0x70a08231) for an account holding 100% of the supply. Any gas-heavy balanceOf (reflection tokens, rebasing tokens behind proxies, interest-bearing wrappers) therefore makes a token buryable with no possible objection and permanently un-raisable, which inverts the contract's core safety promise. The cap buys nothing here: the caller of itLives/rise chooses and pays the gas, and _readUint already bounds return data to 32 bytes, so a bomb is impossible. Fix that preserves the design: give the holder reads their own, far larger allowance (for example gas() or >= 1_000_000) while keeping the 50k cap for dig()'s totalSupply probe and for headstone()'s symbol read; raising READ_GAS globally would weaken the view-side cap and breaks test_MalformedAndNonprintableSymbolsFallBackSafely. The existing tests at test/MemecoinCemetery.t.sol:584-605 assert the opposite behaviour (ExhaustGas -> TokenReadFailed) and need updating alongside.","line":251,"path":"src/MemecoinCemetery.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {MemecoinCemetery} from \"src/MemecoinCemetery.sol\";\n\n/// @dev A faithful reduction of the SafeMoon-style \"reflection\" ERC-20 that most\n/// 2021-era memecoins copied. balanceOf() derives the balance from the reflected\n/// supply, which loops over every reward-excluded address (pair, contract, burn,\n/// marketing, owner...). Each excluded address costs three cold SLOADs, so with\n/// five or more excluded addresses balanceOf() needs more than 50,000 gas.\ncontract ReflectionToken {\n    string public name = \"SafeClone\";\n    string public symbol = \"SAFE\";\n    uint8 public decimals = 9;\n\n    uint256 private constant MAX = type(uint256).max;\n    uint256 private _tTotal = 1_000_000_000_000_000 * 1e9;\n    uint256 private _rTotal = (MAX - (MAX % _tTotal));\n\n    mapping(address => uint256) private _rOwned;\n    mapping(address => uint256) private _tOwned;\n    mapping(address => bool) private _isExcluded;\n    address[] private _excluded;\n\n    constructor(uint256 excludedCount, address holder) {\n        _rOwned[holder] = _rTotal;\n        for (uint256 i; i < excludedCount; ++i) {\n            address a = address(uint160(0xE0C1 + i));\n            _isExcluded[a] = true;\n            _excluded.push(a);\n        }\n    }\n\n    function totalSupply() external view returns (uint256) {\n        return _tTotal;\n    }\n\n    function balanceOf(address account) external view returns (uint256) {\n        if (_isExcluded[account]) return _tOwned[account];\n        return tokenFromReflection(_rOwned[account]);\n    }\n\n    function tokenFromReflection(uint256 rAmount) public view returns (uint256) {\n        require(rAmount <= _rTotal, \"Amount must be less than total reflections\");\n        uint256 currentRate = _getRate();\n        return rAmount / currentRate;\n    }\n\n    function _getRate() private view returns (uint256) {\n        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();\n        return rSupply / tSupply;\n    }\n\n    function _getCurrentSupply() private view returns (uint256, uint256) {\n        uint256 rSupply = _rTotal;\n        uint256 tSupply = _tTotal;\n        for (uint256 i = 0; i < _excluded.length; i++) {\n            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);\n            rSupply = rSupply - _rOwned[_excluded[i]];\n            tSupply = tSupply - _tOwned[_excluded[i]];\n        }\n        if (rSupply < _rTotal / _tTotal) return (_rTotal, _tTotal);\n        return (rSupply, tSupply);\n    }\n}\n\n/// Finding: MemecoinCemetery._requireHolder reads balanceOf()/totalSupply() with a\n/// hard 50,000 gas cap (READ_GAS). A holder of 100% of a token whose balanceOf()\n/// legitimately costs more than that is rejected with TokenReadFailed, so it can\n/// neither save the token during its wake nor raise it after burial. The brief\n/// promises burial \"only if none of the token's holders objects\".\ncontract HolderGasCapTest is Test {\n    MemecoinCemetery internal cemetery;\n    address internal constant HOLDER = address(0xBEEF);\n    address internal constant DIGGER = address(0xD166E2);\n    uint256 internal constant EXCLUDED = 8; // five already exceed the cap; eight leaves margin\n\n    function setUp() public {\n        vm.warp(1_706_572_800);\n        cemetery = new MemecoinCemetery();\n    }\n\n    function test_SoleHolderOfReflectionTokenCanObject() public {\n        ReflectionToken t = new ReflectionToken(EXCLUDED, HOLDER);\n        assertEq(t.balanceOf(HOLDER), t.totalSupply(), \"holder owns the entire supply\");\n\n        vm.prank(DIGGER);\n        cemetery.dig(address(t), \"Reflected into the void.\");\n\n        vm.prank(HOLDER);\n        cemetery.itLives(address(t)); // currently reverts TokenReadFailed(token, 0x70a08231)\n\n        (MemecoinCemetery.State state,,,,,,,,) = cemetery.graveOf(address(t));\n        assertEq(uint256(state), uint256(MemecoinCemetery.State.Saved), \"sole holder must be able to save\");\n    }\n\n    function test_SoleHolderOfReflectionTokenCanRise() public {\n        ReflectionToken t = new ReflectionToken(EXCLUDED, HOLDER);\n\n        vm.prank(DIGGER);\n        cemetery.dig(address(t), \"Reflected into the void.\");\n        vm.warp(block.timestamp + 30 days);\n        cemetery.seal(address(t));\n        assertEq(cemetery.graveCount(), 1, \"buried\");\n\n        vm.prank(HOLDER);\n        cemetery.rise(address(t)); // currently reverts TokenReadFailed(token, 0x70a08231)\n\n        (MemecoinCemetery.State state,,,,,,,,) = cemetery.graveOf(address(t));\n        assertEq(uint256(state), uint256(MemecoinCemetery.State.Risen), \"sole holder must be able to raise\");\n        assertEq(cemetery.graveCount(), 0, \"rise removes the grave\");\n    }\n}","reproduction":"Deploy ReflectionToken(8, HOLDER) from the proof (SafeMoon balanceOf with 8 reward-excluded addresses; HOLDER owns 100% of supply, t.balanceOf(HOLDER) == t.totalSupply()). cemetery.dig(token, 'Reflected into the void.'); then vm.prank(HOLDER); cemetery.itLives(token). Expected: state Saved. Actual: revert TokenReadFailed(token, 0x70a08231). Likewise after warp 30 days + seal(token): vm.prank(HOLDER); cemetery.rise(token) -> expected Risen, actual TokenReadFailed. Break point measured: 5 excluded addresses already fail; 4 pass.","severity":"high","snippet":"        (bool hasBalance, uint256 balance) = _readUint(token, abi.encodeWithSelector(BALANCE_OF, account));","title":"50k-gas cap on balanceOf/totalSupply in the holder check locks real holders out of itLives and rise"},{"citation":"resolved","description":"_requiredReadFailures iterates CemeteryProbeToken.Mode(1..4) for SUPPLY and BALANCE, and Mode.ExhaustGas is asserted to produce TokenReadFailed for itLives and rise. That encodes finding 1 as desired behaviour. No mock token in the suite has a legitimately expensive balanceOf (reflection loop, proxy + several cold SLOADs), so the suite cannot detect that a 100%-holder is rejected. The brief's holder rule is stated in terms of balanceOf only; the tests should include a realistic gas-heavy token whose holder can save and raise, and the ExhaustGas expectation should be limited to dig()'s totalSupply probe (where the brief asks for the cap) or re-expressed as an out-of-gas of the outer call rather than TokenReadFailed.","line":597,"path":"test/MemecoinCemetery.t.sol","reproduction":"Add a mock whose balanceOf costs ~60k gas (e.g. the ReflectionToken in finding 1 with 6 excluded addresses), give one account the whole supply, dig, then itLives from that account: the current suite has no such case, and the current code reverts TokenReadFailed. forge test --match-path test/MemecoinCemetery.t.sol passes 38/38 while this behaviour is present.","severity":"low","snippet":"                _callMustRevert(\n                    address(probe),\n                    action,\n                    abi.encodeWithSelector(MemecoinCemetery.TokenReadFailed.selector, address(probe), selectors[j])","title":"Tests assert that a slow balanceOf must fail the holder, cementing the lockout and leaving gas-heavy tokens untested"},{"citation":"resolved","description":"_symbol accepts any printable ASCII string whose length fits inside the return data the callee could produce within 50k gas. Building a well-formed 16 KiB response in memory costs the token only a few thousand gas, so it passes the cap. headstone() then copies it, scans it byte by byte, runs _escape (allocating 6x), and concatenates it into the SVG. Impact is confined to view calls for the attacker's own token (eth_call budget, indexers, frontends rendering galleries), not to state, so this is low. A symbol longer than a headstone can display (e.g. > 32 bytes) could simply fall back to the shortened address like the other malformed cases.","line":290,"path":"src/MemecoinCemetery.sol","reproduction":"Token whose symbol() returns abi offset 32, length 16384, followed by 16384 bytes of 0x41 ('A'), built in memory (fits in 50k gas: staticcall{gas:50_000} succeeds). dig(token, 'RIP'); then headstone(token): succeeds but consumes 13,138,116 gas and returns a 17,015-byte SVG. With a 1,024-byte symbol: 840,127 gas. For comparison a normal token renders in ~85k gas.","severity":"low","snippet":"        bytes memory symbol = new bytes(length);","title":"headstone() renders a symbol of unbounded length, so a crafted token makes its headstone cost >13M gas"},{"citation":"resolved","description":"textLength forces the rendered advance to exactly 520px (symbol) and 540px (epitaph, line 212) regardless of content, and spacingAndGlyphs permits glyph scaling. Browsers therefore stretch a 3-character symbol such as 'PEPE' or an epitaph such as 'RIP' horizontally to fill the whole width, which is visibly distorted. This is cosmetic and arguably within the 'slightly funny' brief, but it is not what the author likely intended: the attribute protects against long text overflowing, and could be applied only when the text exceeds a byte threshold, or lengthAdjust='spacing' with a text-anchor could be used instead.","line":209,"path":"src/MemecoinCemetery.sol","reproduction":"dig(token with symbol 'X', 'RIP'); headstone(token) emits <text ... textLength=\"520\" lengthAdjust=\"spacingAndGlyphs\">X</text> and <text ... textLength=\"540\" lengthAdjust=\"spacingAndGlyphs\">RIP</text>. Opened in Chrome or Firefox, the single glyph 'X' is scaled to 520px wide and 'RIP' to 540px wide.","severity":"info","snippet":"            '<text x=\"400\" y=\"205\" font-size=\"28\" textLength=\"520\" lengthAdjust=\"spacingAndGlyphs\">',","title":"textLength + lengthAdjust=spacingAndGlyphs stretches short symbols and epitaphs across the full width"},{"citation":"resolved","description":"The brief lists these as required deliverables and notes that launches 852 and 853 were parked for a missing or wrong foundry.toml. The tree currently holds only src/MemecoinCemetery.sol, test/MemecoinCemetery.t.sol and launch.json. Without foundry.toml the solc version, evm_version, optimizer settings and bytecode_hash='none' are not pinned, so the deployed bytecode is not reproducible as required, and the protected harness (which imports forge-std/Test.sol) cannot compile offline from this tree. The test file compensates by hand-declaring the cheatcode interface instead of importing forge-std. This may be the subject of a separate pending assignment; it is listed so it is not forgotten before attestation.","line":6,"path":"test/MemecoinCemetery.t.sol","reproduction":"In the repository root: ls foundry.toml remappings.txt lib/forge-std script docs README.md -> all missing. forge build --offline at the root fails (no pinned solc 0.8.26, no forge-std for the protected test). Copying src/ and test/ into a project with the brief's exact foundry.toml plus vendored forge-std builds and passes 38/38, which confirms the code itself is fine and only the project scaffolding is absent.","severity":"low","snippet":"// The assignment checkout has no forge-std. Keep the submitted tests offline and","title":"Working tree lacks the required project files: foundry.toml, remappings.txt, lib/forge-std, script/Deploy.s.sol, docs/abi, README.md"}],"hash":"f1be1493f7c3468c91cccbc3819f6e174ae76fb92ad6ac18a8d2d64bd3e90864","nodeId":"64b089c7-beeb-4fa6-80cd-2d590c8362b8","outcome":"completed","summary":"Review complete. The findings are in `.imd-findings.json` at the repository root, with no other files in the tree changed.\n\n**Headline finding (high).** The holder check applies the 50,000-gas read cap to `balanceOf` and `totalSupply`, not just to the dig-time probe the brief asked for. SafeMoon-style reflection tokens compute `balanceOf` by looping over their reward-excluded addresses, and a faithful reduction of that code shows the break point:\n\n| Reward-excluded addresses | `balanceOf` gas (cold) | `itLives` by 100% holder |\n|---|---|---|\n| 4 | 45,611 | succeeds |\n| 5 | ~54,000 | reverts `TokenReadFailed` |\n| 8 | 78,887 | reverts `TokenReadFailed` |\n\nSo a token from the most common memecoin family can be dug and sealed with no possible objection, and once buried can never rise, which inverts the contract's core promise. The embedded proof test fails on the current code and passes when the holder reads get a larger allowance. Raising the shared constant globally is the wrong fix: it breaks the hostile-symbol test because the view-side cap is doing real work there. The holder reads need their own budget.\n\n**Other findings.**\n- Low: the existing tests assert the opposite behaviour (gas exhaustion in `balanceOf` must produce `TokenReadFailed`), and no mock has a legitimately expensive `balanceOf`, so the suite cannot catch the lockout.\n- Low: `headstone()` has no bound on symbol length. A crafted 16 KiB printable symbol that fits the 50k cap makes rendering cost about 13 million gas. View-only impact.\n- Info: `textLength` with `spacingAndGlyphs` stretches short symbols and epitaphs such as \"RIP\" across the full width.\n- Low: the tree lacks foundry.toml, remappings, vendored forge-std, the deploy script, the ABI file and README, which the brief lists as required and which parked the two earlier launches. Noted as a scaffolding gap rather than a code defect, in case another assignment covers it.\n\n**What held.** State machine, cooldowns, seal and objection deadlines, the holder threshold at both bounds with the 1-unit floor, XML escaping for all bytes, the Gregorian date algorithm against golden vectors, burial-record immutability, the grave-count invariant, ETH rejection and the staticcall-only token interaction all traced correctly. The existing 38 tests pass under the brief's exact foundry.toml. The slither and aderyn leads were false positives: the \"locks ether\" and \"storage array edited with memory\" lines refer to a reverting payable receive and a memory copy of the epitaph respectively.\n\nCoverage rows are recorded for all six state-changing entry points: `dig`, `seal`, `receive` and `fallback` hold; `itLives` and `rise` carry the high finding.","treeHash":null,"usage":{"cachedInputTokens":1063249,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":32608,"runtime":"claude","turns":22,"wallClockMs":522531}}],"verification":[{"checks":[{"durationMs":92,"exitCode":0,"name":"build","output":"Compiling 1 files with Solc 0.8.26\nSolc 0.8.26 finished in 35.80ms\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/MemecoinCemetery.sol:77:36\n   │\n77 │         if (state != State.None && block.timestamp < cooldownEndsAt[token]) {\n   │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MemecoinCemetery.sol:93:9\n   │\n93 │         emit WakeOpened(token, msg.sender, epitaph, grave.wakeEndsAt);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MemecoinCemetery.sol:102:13\n    │\n102 │         if (block.timestamp >= grave.wakeEndsAt) revert WakeClosed(grave.wakeEndsAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MemecoinCemetery.sol:107:9\n    │\n107 │         emit Resurrected(token, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MemecoinCemetery.sol:116:13\n    │\n116 │         if (block.timestamp < grave.wakeEndsAt) revert WakeStillOpen(grave.wakeEndsAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MemecoinCemetery.sol:136:9\n    │\n136 │         emit Rose(token, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:296:22\n    │\n296 │         if (length > ((size - 64) / 32) * 32) return _shortAddress(token);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:292:49\n    │\n292 │         if (!ok || size < 64 || offset != 32 || length == 0 || length > 32) {\n    │                                                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:292:33\n    │\n292 │         if (!ok || size < 64 || offset != 32 || length == 0 || length > 32) {\n    │                                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:338:24\n    │\n338 │                 output[used++] = uint8(character) < 32 || uint8(character) > 126 ? bytes1(\"?\") : character;\n    │                        ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MemecoinCemetery.sol:338:84\n    │\n338 │                 output[used++] = uint8(character) < 32 || uint8(character) > 126 ? bytes1(\"?\") : character;\n    │                                                                                    ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'bytes1' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:356:36\n    │\n356 │         uint256 year = yearOfEra + era * 400;\n    │                                    ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:357:41\n    │\n357 │         uint256 dayOfYear = dayOfEra - (365 * yearOfEra + yearOfEra / 4 - yearOfEra / 100);\n    │                                         ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:359:36\n    │\n359 │         uint256 day = dayOfYear - (153 * marchMonth + 2) / 5 + 1;\n    │                                    ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MemecoinCemetery.sol:375:39\n    │\n375 │             output[--digits] = bytes1(uint8(48 + value % 10));\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":58,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\nWarning: No tests found in project! Forge looks for functions that start with `test`\n","passed":true},{"durationMs":24,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MemecoinCemetery.dig(address,string)\",\"MemecoinCemetery.fallback()\",\"MemecoinCemetery.itLives(address)\",\"MemecoinCemetery.receive()\",\"MemecoinCemetery.rise(address)\",\"MemecoinCemetery.seal(address)\"],\"files\":{\"src/MemecoinCemetery.sol\":380},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":179,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":209,"exitCode":0,"name":"aderyn","output":"[high] contract-locks-ether at src/MemecoinCemetery.sol:8: Contract locks Ether without a withdraw function\n[high] storage-array-memory-edit at src/MemecoinCemetery.sol:216: Storage Array Edited with Memory\n[low] large-numeric-literal at src/MemecoinCemetery.sol:38: Large Numeric Literal\n[low] literal-instead-of-constant at src/MemecoinCemetery.sol:251: Literal Instead of Constant (34 places)\n[low] uninitialized-local-variable at src/MemecoinCemetery.sol:299: Uninitialized Local Variable (3 places)","passed":true},{"durationMs":95,"exitCode":0,"name":"proof 7b0e31a5305a","output":"Owed nothing: on the tree this revision started from the proof did not compile or run, so it never reproduced the finding.\n\nError: Compiler run failed:\nError (6275): Source \"forge-std/Test.sol\" not found: File not found. Searched the following locations: \"/tmp/imd-verify-CcH0lm/repo\".\nParserError: Source \"forge-std/Test.sol\" not found: File not found. Searched the following locations: \"/tmp/imd-verify-CcH0lm/repo\".\n --> test/imd-proof-6404bd3c/Proof_7b0e31a5305a.t.sol:4:1:\n  |\n4 | import {Test} from \"forge-std/Test.sol\";\n  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"0bdb01a2e0ce432410df9a6b71238c2c436afc79fd79892cc39966ed9d5d3cca","verifiedTreeHash":"0d04c0cc914d63e4cba485bd1079f5f3131f2bda","verifierVersion":"0.1.0+7471272e"},{"checks":[{"durationMs":335,"exitCode":0,"name":"build","output":"Compiling 2 files with Solc 0.8.26\nSolc 0.8.26 finished in 245.66ms\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/MemecoinCemetery.sol:77:36\n   │\n77 │         if (state != State.None && block.timestamp < cooldownEndsAt[token]) {\n   │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MemecoinCemetery.sol:93:9\n   │\n93 │         emit WakeOpened(token, msg.sender, epitaph, grave.wakeEndsAt);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MemecoinCemetery.sol:102:13\n    │\n102 │         if (block.timestamp >= grave.wakeEndsAt) revert WakeClosed(grave.wakeEndsAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MemecoinCemetery.sol:107:9\n    │\n107 │         emit Resurrected(token, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MemecoinCemetery.sol:116:13\n    │\n116 │         if (block.timestamp < grave.wakeEndsAt) revert WakeStillOpen(grave.wakeEndsAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MemecoinCemetery.sol:136:9\n    │\n136 │         emit Rose(token, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:289:22\n    │\n289 │         if (length > ((size - 64) / 32) * 32) return _shortAddress(token);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:285:49\n    │\n285 │         if (!ok || size < 64 || offset != 32 || length == 0) {\n    │                                                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:285:33\n    │\n285 │         if (!ok || size < 64 || offset != 32 || length == 0) {\n    │                                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:331:24\n    │\n331 │                 output[used++] = uint8(character) < 32 || uint8(character) > 126 ? bytes1(\"?\") : character;\n    │                        ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MemecoinCemetery.sol:331:84\n    │\n331 │                 output[used++] = uint8(character) < 32 || uint8(character) > 126 ? bytes1(\"?\") : character;\n    │                                                                                    ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'bytes1' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:349:36\n    │\n349 │         uint256 year = yearOfEra + era * 400;\n    │                                    ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:350:41\n    │\n350 │         uint256 dayOfYear = dayOfEra - (365 * yearOfEra + yearOfEra / 4 - yearOfEra / 100);\n    │                                         ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:352:36\n    │\n352 │         uint256 day = dayOfYear - (153 * marchMonth + 2) / 5 + 1;\n    │                                    ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MemecoinCemetery.sol:368:39\n    │\n368 │             output[--digits] = bytes1(uint8(48 + value % 10));\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":4284,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 36 tests for test/MemecoinCemetery.t.sol:MemecoinCemeteryTest\n[PASS] testFuzz_EpitaphLengthAndSafeRendering(bytes) (runs: 256, μ: 2298726, ~: 2249024)\n[PASS] testFuzz_HolderThresholdAtBothEdges(uint256,uint8) (runs: 1000, μ: 1332320, ~: 1332267)\n[PASS] testFuzz_SealedRecordNeverChanges(address,bytes,uint32,uint8) (runs: 256, μ: 1820004, ~: 1661920)\n[PASS] test_AllForbiddenStateTransitionsRevertWithoutMutation() (gas: 4949742)\n[PASS] test_DigCapsSupplyGasAndRejectsStateWritesAndReturnBombs() (gas: 1760305)\n[PASS] test_DigIsPermissionlessAndEmitsCompleteWake() (gas: 173783)\n[PASS] test_DigRejectsEOAZeroAddressZeroSupplyAndRevertingToken() (gas: 971965)\n[PASS] test_DigRejectsMalformedSupplyResponses() (gas: 1836450)\n[PASS] test_ETHReceiveFallbackAndPayableFunctionCallsAreRejected() (gas: 170220)\n[PASS] test_EpitaphLengthsZeroOne140And141() (gas: 948946)\n[PASS] test_EpitaphLimitCountsBytesNotUnicodeCharacters() (gas: 434954)\n[PASS] test_EveryByteIsEscapedOrMadePrintable() (gas: 6619466)\n[PASS] test_HeadstoneEscapesAllFiveXMLCharactersInBothTextInputs() (gas: 3242132)\n[PASS] test_HeadstoneLeapDaySealDateAndUnsetDateDash() (gas: 2813049)\n[PASS] test_HeadstoneRemainsValidWith140Metacharacters() (gas: 4463335)\n[PASS] test_HeadstoneUTCDateGoldenVectors() (gas: 10330166)\n[PASS] test_HolderDecimalsZero36AndAbove36() (gas: 6647109)\n[PASS] test_HolderHugeSixDecimalSupplyNeedsOnlyOneWholeToken() (gas: 1331075)\n[PASS] test_HolderHugeSupplyNeedsOnlyOneWhole18DecimalToken() (gas: 1331326)\n[PASS] test_HolderReadsCurrentSupplyAndBalanceNotDigTimeSnapshot() (gas: 890238)\n[PASS] test_HolderSmallSixDecimalSupplyUsesOneTenthPercent() (gas: 1330993)\n[PASS] test_HolderSmallSupplyUsesOneTenthPercent18Decimals() (gas: 1331200)\n[PASS] test_HolderTinySupplyFloorAndIntegerRounding() (gas: 6693284)\n[PASS] test_LastSecondObjectionEmitsEventAndStartsFreshCooldown() (gas: 605801)\n[PASS] test_LateSealUsesActualTimestampAndNeedsNoWorkingTokenReads() (gas: 1524899)\n[PASS] test_MalformedAndNonprintableSymbolsFallBackSafely() (gas: 8308885)\n[PASS] test_MissingSymbolUsesShortAddressAndStillAllowsHolders() (gas: 785975)\n[PASS] test_NeverDugHasNoRecordAndNoHeadstone() (gas: 91086)\n[PASS] test_ObjectionAtDeadlineAndLaterIsTooLate() (gas: 253121)\n[PASS] test_PrintableSymbolSpaceAndTildeAreAccepted() (gas: 895417)\n[PASS] test_RepeatedCyclesKeepCountersArchivesAndRisenBanner() (gas: 20891435)\n[PASS] test_RequiredReadFailuresDuringBurialFailClosed() (gas: 3998387)\n[PASS] test_RequiredReadFailuresDuringWakeFailClosed() (gas: 3798332)\n[PASS] test_RisePreservesBurialEmitsEventAndStartsFreshCooldown() (gas: 873010)\n[PASS] test_SealRejectsOneSecondEarlyAndSucceedsAtDeadline() (gas: 589423)\n[PASS] test_UnreadableDecimalsDefaultsTo18ForBothHolderActions() (gas: 14842765)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 309.28ms (784.53ms CPU time)\n\nRan 2 tests for test/MemecoinCemetery.t.sol:MemecoinCemeteryInvariantTest\n[PASS]\nMemecoinCemeteryInvariantTest invariants:\n[PASS] invariant_GraveCountEqualsCurrentlyBuriedTokens\n[PASS] invariant_LifecycleCountersAndEveryBurialMatchModel\n MemecoinCemeteryInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------------------+----------+-------+---------+----------╮\n| Contract                 | Selector | Calls | Reverts | Discards |\n+==================================================================+\n| CemeteryLifecycleHandler | advance  | 1581  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | object   | 1651  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | open     | 1632  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | raise    | 1672  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | seal     | 1656  | 0       | 0        |\n╰--------------------------+----------+-------+---------+----------╯\n\n[PASS] test_HandlerExercisesRepeatBurialsAndAllTransitions() (gas: 1702555)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.22s (4.22s CPU time)\n\nRan 2 test suites in 4.22s (4.53s CPU time): 38 tests passed, 0 failed, 0 skipped (38 total tests)\n","passed":true},{"durationMs":29,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MemecoinCemetery.dig(address,string)\",\"MemecoinCemetery.fallback()\",\"MemecoinCemetery.itLives(address)\",\"MemecoinCemetery.receive()\",\"MemecoinCemetery.rise(address)\",\"MemecoinCemetery.seal(address)\"],\"files\":{\"src/MemecoinCemetery.sol\":373,\"test/MemecoinCemetery.t.sol\":1071},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"1d189ffd318363dad652c8b2347a84cf694ca723de6408b81efbfc9464e1798d","verifiedTreeHash":"64cde3220d30612ac9f43bfbcccf767c374dd7c7","verifierVersion":"0.1.0+7471272e"},{"checks":[{"durationMs":823,"exitCode":0,"name":"build","output":"Compiling 2 files with Solc 0.8.26\nSolc 0.8.26 finished in 561.05ms\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/MemecoinCemetery.sol:77:36\n   │\n77 │         if (state != State.None && block.timestamp < cooldownEndsAt[token]) {\n   │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MemecoinCemetery.sol:93:9\n   │\n93 │         emit WakeOpened(token, msg.sender, epitaph, grave.wakeEndsAt);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MemecoinCemetery.sol:102:13\n    │\n102 │         if (block.timestamp >= grave.wakeEndsAt) revert WakeClosed(grave.wakeEndsAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MemecoinCemetery.sol:107:9\n    │\n107 │         emit Resurrected(token, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MemecoinCemetery.sol:116:13\n    │\n116 │         if (block.timestamp < grave.wakeEndsAt) revert WakeStillOpen(grave.wakeEndsAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MemecoinCemetery.sol:136:9\n    │\n136 │         emit Rose(token, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:289:22\n    │\n289 │         if (length > ((size - 64) / 32) * 32) return _shortAddress(token);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:285:33\n    │\n285 │         if (!ok || size < 64 || offset != 32 || length == 0) {\n    │                                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:285:49\n    │\n285 │         if (!ok || size < 64 || offset != 32 || length == 0) {\n    │                                                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:331:24\n    │\n331 │                 output[used++] = uint8(character) < 32 || uint8(character) > 126 ? bytes1(\"?\") : character;\n    │                        ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MemecoinCemetery.sol:331:84\n    │\n331 │                 output[used++] = uint8(character) < 32 || uint8(character) > 126 ? bytes1(\"?\") : character;\n    │                                                                                    ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'bytes1' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:349:36\n    │\n349 │         uint256 year = yearOfEra + era * 400;\n    │                                    ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:350:41\n    │\n350 │         uint256 dayOfYear = dayOfEra - (365 * yearOfEra + yearOfEra / 4 - yearOfEra / 100);\n    │                                         ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:352:36\n    │\n352 │         uint256 day = dayOfYear - (153 * marchMonth + 2) / 5 + 1;\n    │                                    ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MemecoinCemetery.sol:368:39\n    │\n368 │             output[--digits] = bytes1(uint8(48 + value % 10));\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":5726,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 36 tests for test/MemecoinCemetery.t.sol:MemecoinCemeteryTest\n[PASS] testFuzz_EpitaphLengthAndSafeRendering(bytes) (runs: 256, μ: 2292277, ~: 2249219)\n[PASS] testFuzz_HolderThresholdAtBothEdges(uint256,uint8) (runs: 1000, μ: 1331838, ~: 1332195)\n[PASS] testFuzz_SealedRecordNeverChanges(address,bytes,uint32,uint8) (runs: 256, μ: 1798409, ~: 1661806)\n[PASS] test_AllForbiddenStateTransitionsRevertWithoutMutation() (gas: 4949742)\n[PASS] test_DigCapsSupplyGasAndRejectsStateWritesAndReturnBombs() (gas: 1760305)\n[PASS] test_DigIsPermissionlessAndEmitsCompleteWake() (gas: 173783)\n[PASS] test_DigRejectsEOAZeroAddressZeroSupplyAndRevertingToken() (gas: 971965)\n[PASS] test_DigRejectsMalformedSupplyResponses() (gas: 1836450)\n[PASS] test_ETHReceiveFallbackAndPayableFunctionCallsAreRejected() (gas: 170220)\n[PASS] test_EpitaphLengthsZeroOne140And141() (gas: 948946)\n[PASS] test_EpitaphLimitCountsBytesNotUnicodeCharacters() (gas: 434954)\n[PASS] test_EveryByteIsEscapedOrMadePrintable() (gas: 6619466)\n[PASS] test_HeadstoneEscapesAllFiveXMLCharactersInBothTextInputs() (gas: 3242132)\n[PASS] test_HeadstoneLeapDaySealDateAndUnsetDateDash() (gas: 2813049)\n[PASS] test_HeadstoneRemainsValidWith140Metacharacters() (gas: 4463335)\n[PASS] test_HeadstoneUTCDateGoldenVectors() (gas: 10330166)\n[PASS] test_HolderDecimalsZero36AndAbove36() (gas: 6647109)\n[PASS] test_HolderHugeSixDecimalSupplyNeedsOnlyOneWholeToken() (gas: 1331075)\n[PASS] test_HolderHugeSupplyNeedsOnlyOneWhole18DecimalToken() (gas: 1331326)\n[PASS] test_HolderReadsCurrentSupplyAndBalanceNotDigTimeSnapshot() (gas: 890238)\n[PASS] test_HolderSmallSixDecimalSupplyUsesOneTenthPercent() (gas: 1330993)\n[PASS] test_HolderSmallSupplyUsesOneTenthPercent18Decimals() (gas: 1331200)\n[PASS] test_HolderTinySupplyFloorAndIntegerRounding() (gas: 6693284)\n[PASS] test_LastSecondObjectionEmitsEventAndStartsFreshCooldown() (gas: 605801)\n[PASS] test_LateSealUsesActualTimestampAndNeedsNoWorkingTokenReads() (gas: 1524899)\n[PASS] test_MalformedAndNonprintableSymbolsFallBackSafely() (gas: 8308885)\n[PASS] test_MissingSymbolUsesShortAddressAndStillAllowsHolders() (gas: 785975)\n[PASS] test_NeverDugHasNoRecordAndNoHeadstone() (gas: 91086)\n[PASS] test_ObjectionAtDeadlineAndLaterIsTooLate() (gas: 253121)\n[PASS] test_PrintableSymbolSpaceAndTildeAreAccepted() (gas: 895417)\n[PASS] test_RepeatedCyclesKeepCountersArchivesAndRisenBanner() (gas: 20891435)\n[PASS] test_RequiredReadFailuresDuringBurialFailClosed() (gas: 3998387)\n[PASS] test_RequiredReadFailuresDuringWakeFailClosed() (gas: 3798332)\n[PASS] test_RisePreservesBurialEmitsEventAndStartsFreshCooldown() (gas: 873010)\n[PASS] test_SealRejectsOneSecondEarlyAndSucceedsAtDeadline() (gas: 589423)\n[PASS] test_UnreadableDecimalsDefaultsTo18ForBothHolderActions() (gas: 14842765)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 551.54ms (1.30s CPU time)\n\nRan 2 tests for test/MemecoinCemetery.t.sol:MemecoinCemeteryInvariantTest\n[PASS]\nMemecoinCemeteryInvariantTest invariants:\n[PASS] invariant_GraveCountEqualsCurrentlyBuriedTokens\n[PASS] invariant_LifecycleCountersAndEveryBurialMatchModel\n MemecoinCemeteryInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------------------+----------+-------+---------+----------╮\n| Contract                 | Selector | Calls | Reverts | Discards |\n+==================================================================+\n| CemeteryLifecycleHandler | advance  | 1649  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | object   | 1622  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | open     | 1673  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | raise    | 1639  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | seal     | 1609  | 0       | 0        |\n╰--------------------------+----------+-------+---------+----------╯\n\n[PASS] test_HandlerExercisesRepeatBurialsAndAllTransitions() (gas: 1702555)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.61s (5.60s CPU time)\n\nRan 2 test suites in 5.62s (6.16s CPU time): 38 tests passed, 0 failed, 0 skipped (38 total tests)\n","passed":true},{"durationMs":65,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MemecoinCemetery.dig(address,string)\",\"MemecoinCemetery.fallback()\",\"MemecoinCemetery.itLives(address)\",\"MemecoinCemetery.receive()\",\"MemecoinCemetery.rise(address)\",\"MemecoinCemetery.seal(address)\"],\"files\":{\"launch.json\":10,\"src/MemecoinCemetery.sol\":373,\"test/MemecoinCemetery.t.sol\":1071},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"1d73779b740c35d7453d764232b56a3098687feaa60854220fa0f8b7997a9984","verifiedTreeHash":"bf36e4f6fe9d372de6a11e6028e334a81cdc6055","verifierVersion":"0.1.0+7471272e"},{"checks":[{"durationMs":321,"exitCode":0,"name":"build","output":"Compiling 2 files with Solc 0.8.26\nSolc 0.8.26 finished in 234.22ms\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/MemecoinCemetery.sol:77:36\n   │\n77 │         if (state != State.None && block.timestamp < cooldownEndsAt[token]) {\n   │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MemecoinCemetery.sol:93:9\n   │\n93 │         emit WakeOpened(token, msg.sender, epitaph, grave.wakeEndsAt);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MemecoinCemetery.sol:102:13\n    │\n102 │         if (block.timestamp >= grave.wakeEndsAt) revert WakeClosed(grave.wakeEndsAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MemecoinCemetery.sol:107:9\n    │\n107 │         emit Resurrected(token, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MemecoinCemetery.sol:116:13\n    │\n116 │         if (block.timestamp < grave.wakeEndsAt) revert WakeStillOpen(grave.wakeEndsAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MemecoinCemetery.sol:136:9\n    │\n136 │         emit Rose(token, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:296:22\n    │\n296 │         if (length > ((size - 64) / 32) * 32) return _shortAddress(token);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:292:33\n    │\n292 │         if (!ok || size < 64 || offset != 32 || length == 0 || length > 32) {\n    │                                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:292:49\n    │\n292 │         if (!ok || size < 64 || offset != 32 || length == 0 || length > 32) {\n    │                                                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:338:24\n    │\n338 │                 output[used++] = uint8(character) < 32 || uint8(character) > 126 ? bytes1(\"?\") : character;\n    │                        ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MemecoinCemetery.sol:338:84\n    │\n338 │                 output[used++] = uint8(character) < 32 || uint8(character) > 126 ? bytes1(\"?\") : character;\n    │                                                                                    ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'bytes1' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:356:36\n    │\n356 │         uint256 year = yearOfEra + era * 400;\n    │                                    ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:357:41\n    │\n357 │         uint256 dayOfYear = dayOfEra - (365 * yearOfEra + yearOfEra / 4 - yearOfEra / 100);\n    │                                         ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:359:36\n    │\n359 │         uint256 day = dayOfYear - (153 * marchMonth + 2) / 5 + 1;\n    │                                    ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MemecoinCemetery.sol:375:39\n    │\n375 │             output[--digits] = bytes1(uint8(48 + value % 10));\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":4025,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 38 tests for test/MemecoinCemetery.t.sol:MemecoinCemeteryTest\n[PASS] testFuzz_EpitaphLengthAndSafeRendering(bytes) (runs: 256, μ: 2057025, ~: 1965936)\n[PASS] testFuzz_HolderThresholdAtBothEdges(uint256,uint8) (runs: 1000, μ: 1331642, ~: 1332123)\n[PASS] testFuzz_SealedRecordNeverChanges(address,bytes,uint32,uint8) (runs: 256, μ: 1888447, ~: 1725755)\n[PASS] test_AllForbiddenStateTransitionsRevertWithoutMutation() (gas: 4949668)\n[PASS] test_DigCapsSupplyGasAndRejectsStateWritesAndReturnBombs() (gas: 1760277)\n[PASS] test_DigIsPermissionlessAndEmitsCompleteWake() (gas: 173776)\n[PASS] test_DigRejectsEOAZeroAddressZeroSupplyAndRevertingToken() (gas: 971951)\n[PASS] test_DigRejectsMalformedSupplyResponses() (gas: 1836415)\n[PASS] test_ETHReceiveFallbackAndPayableFunctionCallsAreRejected() (gas: 170220)\n[PASS] test_EpitaphLengthsZeroOne140And141() (gas: 948932)\n[PASS] test_EpitaphLimitCountsBytesNotUnicodeCharacters() (gas: 434947)\n[PASS] test_EveryByteIsEscapedOrMadePrintable() (gas: 6311991)\n[PASS] test_GasHeavyReflectionHolderCanRise() (gas: 1384642)\n[PASS] test_GasHeavyReflectionHolderCanSave() (gas: 1115623)\n[PASS] test_HeadstoneEscapesAllFiveXMLCharactersInBothTextInputs() (gas: 2945692)\n[PASS] test_HeadstoneLeapDaySealDateAndUnsetDateDash() (gas: 2434118)\n[PASS] test_HeadstoneRemainsValidWith140Metacharacters() (gas: 4309598)\n[PASS] test_HeadstoneUTCDateGoldenVectors() (gas: 9574097)\n[PASS] test_HolderDecimalsZero36AndAbove36() (gas: 6646579)\n[PASS] test_HolderHugeSixDecimalSupplyNeedsOnlyOneWholeToken() (gas: 1330969)\n[PASS] test_HolderHugeSupplyNeedsOnlyOneWhole18DecimalToken() (gas: 1331220)\n[PASS] test_HolderReadsCurrentSupplyAndBalanceNotDigTimeSnapshot() (gas: 890155)\n[PASS] test_HolderSmallSixDecimalSupplyUsesOneTenthPercent() (gas: 1330887)\n[PASS] test_HolderSmallSupplyUsesOneTenthPercent18Decimals() (gas: 1331094)\n[PASS] test_HolderTinySupplyFloorAndIntegerRounding() (gas: 6692732)\n[PASS] test_LastSecondObjectionEmitsEventAndStartsFreshCooldown() (gas: 605764)\n[PASS] test_LateSealUsesActualTimestampAndNeedsNoWorkingTokenReads() (gas: 1524914)\n[PASS] test_MalformedAndNonprintableSymbolsFallBackSafely() (gas: 8098019)\n[PASS] test_MissingSymbolUsesShortAddressAndStillAllowsHolders() (gas: 773656)\n[PASS] test_NeverDugHasNoRecordAndNoHeadstone() (gas: 91086)\n[PASS] test_ObjectionAtDeadlineAndLaterIsTooLate() (gas: 253114)\n[PASS] test_PrintableSymbolSpaceAndTildeAreAccepted() (gas: 883131)\n[PASS] test_RepeatedCyclesKeepCountersArchivesAndRisenBanner() (gas: 18766740)\n[PASS] test_RequiredReadFailuresDuringBurialFailClosed() (gas: 3423065)\n[PASS] test_RequiredReadFailuresDuringWakeFailClosed() (gas: 3214282)\n[PASS] test_RisePreservesBurialEmitsEventAndStartsFreshCooldown() (gas: 872973)\n[PASS] test_SealRejectsOneSecondEarlyAndSucceedsAtDeadline() (gas: 589394)\n[PASS] test_UnreadableDecimalsDefaultsTo18ForBothHolderActions() (gas: 14842023)\nSuite result: ok. 38 passed; 0 failed; 0 skipped; finished in 246.95ms (597.79ms CPU time)\n\nRan 2 tests for test/MemecoinCemetery.t.sol:MemecoinCemeteryInvariantTest\n[PASS]\nMemecoinCemeteryInvariantTest invariants:\n[PASS] invariant_GraveCountEqualsCurrentlyBuriedTokens\n[PASS] invariant_LifecycleCountersAndEveryBurialMatchModel\n MemecoinCemeteryInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------------------+----------+-------+---------+----------╮\n| Contract                 | Selector | Calls | Reverts | Discards |\n+==================================================================+\n| CemeteryLifecycleHandler | advance  | 1667  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | object   | 1643  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | open     | 1660  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | raise    | 1558  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | seal     | 1664  | 0       | 0        |\n╰--------------------------+----------+-------+---------+----------╯\n\n[PASS] test_HandlerExercisesRepeatBurialsAndAllTransitions() (gas: 1702449)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.95s (3.95s CPU time)\n\nRan 2 test suites in 3.96s (4.20s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":31,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MemecoinCemetery.dig(address,string)\",\"MemecoinCemetery.fallback()\",\"MemecoinCemetery.itLives(address)\",\"MemecoinCemetery.receive()\",\"MemecoinCemetery.rise(address)\",\"MemecoinCemetery.seal(address)\"],\"files\":{\"launch.json\":10,\"src/MemecoinCemetery.sol\":380,\"test/MemecoinCemetery.t.sol\":1143},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"43f18bb52e8abca8544e4d7536c8fb932561e25a62a04036c660aba1e6a52c2e","verifiedTreeHash":"c75521b68d9c89b0ae4829007b51f8fbacf08815","verifierVersion":"0.1.0+7471272e"},{"checks":[{"durationMs":98,"exitCode":0,"name":"build","output":"Compiling 1 files with Solc 0.8.26\nSolc 0.8.26 finished in 49.65ms\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/MemecoinCemetery.sol:77:36\n   │\n77 │         if (state != State.None && block.timestamp < cooldownEndsAt[token]) {\n   │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MemecoinCemetery.sol:93:9\n   │\n93 │         emit WakeOpened(token, msg.sender, epitaph, grave.wakeEndsAt);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MemecoinCemetery.sol:102:13\n    │\n102 │         if (block.timestamp >= grave.wakeEndsAt) revert WakeClosed(grave.wakeEndsAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MemecoinCemetery.sol:107:9\n    │\n107 │         emit Resurrected(token, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MemecoinCemetery.sol:116:13\n    │\n116 │         if (block.timestamp < grave.wakeEndsAt) revert WakeStillOpen(grave.wakeEndsAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MemecoinCemetery.sol:136:9\n    │\n136 │         emit Rose(token, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:289:22\n    │\n289 │         if (length > ((size - 64) / 32) * 32) return _shortAddress(token);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:285:33\n    │\n285 │         if (!ok || size < 64 || offset != 32 || length == 0) {\n    │                                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:285:49\n    │\n285 │         if (!ok || size < 64 || offset != 32 || length == 0) {\n    │                                                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:331:24\n    │\n331 │                 output[used++] = uint8(character) < 32 || uint8(character) > 126 ? bytes1(\"?\") : character;\n    │                        ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MemecoinCemetery.sol:331:84\n    │\n331 │                 output[used++] = uint8(character) < 32 || uint8(character) > 126 ? bytes1(\"?\") : character;\n    │                                                                                    ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'bytes1' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:349:36\n    │\n349 │         uint256 year = yearOfEra + era * 400;\n    │                                    ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:350:41\n    │\n350 │         uint256 dayOfYear = dayOfEra - (365 * yearOfEra + yearOfEra / 4 - yearOfEra / 100);\n    │                                         ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:352:36\n    │\n352 │         uint256 day = dayOfYear - (153 * marchMonth + 2) / 5 + 1;\n    │                                    ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MemecoinCemetery.sol:368:39\n    │\n368 │             output[--digits] = bytes1(uint8(48 + value % 10));\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":43,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\nWarning: No tests found in project! Forge looks for functions that start with `test`\n","passed":true},{"durationMs":20,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MemecoinCemetery.dig(address,string)\",\"MemecoinCemetery.fallback()\",\"MemecoinCemetery.itLives(address)\",\"MemecoinCemetery.receive()\",\"MemecoinCemetery.rise(address)\",\"MemecoinCemetery.seal(address)\"],\"files\":{\"src/MemecoinCemetery.sol\":373},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":318,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":279,"exitCode":0,"name":"aderyn","output":"[high] contract-locks-ether at src/MemecoinCemetery.sol:8: Contract locks Ether without a withdraw function\n[high] storage-array-memory-edit at src/MemecoinCemetery.sol:213: Storage Array Edited with Memory\n[low] large-numeric-literal at src/MemecoinCemetery.sol:38: Large Numeric Literal\n[low] literal-instead-of-constant at src/MemecoinCemetery.sol:247: Literal Instead of Constant (33 places)\n[low] uninitialized-local-variable at src/MemecoinCemetery.sol:292: Uninitialized Local Variable (3 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"465ea84e581c83afeafbc9283f48719ca5ec078e78e4b67c65f397284cb3f79e","verifiedTreeHash":"6d65871c9a51ed0b0bddd0a46ef69facbd210e7f","verifierVersion":"0.1.0+7471272e"},{"checks":[{"durationMs":388,"exitCode":0,"name":"build","output":"Compiling 2 files with Solc 0.8.26\nSolc 0.8.26 finished in 291.80ms\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/MemecoinCemetery.sol:77:36\n   │\n77 │         if (state != State.None && block.timestamp < cooldownEndsAt[token]) {\n   │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MemecoinCemetery.sol:93:9\n   │\n93 │         emit WakeOpened(token, msg.sender, epitaph, grave.wakeEndsAt);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MemecoinCemetery.sol:102:13\n    │\n102 │         if (block.timestamp >= grave.wakeEndsAt) revert WakeClosed(grave.wakeEndsAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MemecoinCemetery.sol:107:9\n    │\n107 │         emit Resurrected(token, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MemecoinCemetery.sol:116:13\n    │\n116 │         if (block.timestamp < grave.wakeEndsAt) revert WakeStillOpen(grave.wakeEndsAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/MemecoinCemetery.sol:136:9\n    │\n136 │         emit Rose(token, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:296:22\n    │\n296 │         if (length > ((size - 64) / 32) * 32) return _shortAddress(token);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:292:49\n    │\n292 │         if (!ok || size < 64 || offset != 32 || length == 0 || length > 32) {\n    │                                                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:292:33\n    │\n292 │         if (!ok || size < 64 || offset != 32 || length == 0 || length > 32) {\n    │                                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/MemecoinCemetery.sol:338:24\n    │\n338 │                 output[used++] = uint8(character) < 32 || uint8(character) > 126 ? bytes1(\"?\") : character;\n    │                        ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MemecoinCemetery.sol:338:84\n    │\n338 │                 output[used++] = uint8(character) < 32 || uint8(character) > 126 ? bytes1(\"?\") : character;\n    │                                                                                    ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'bytes1' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:356:36\n    │\n356 │         uint256 year = yearOfEra + era * 400;\n    │                                    ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:357:41\n    │\n357 │         uint256 dayOfYear = dayOfEra - (365 * yearOfEra + yearOfEra / 4 - yearOfEra / 100);\n    │                                         ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MemecoinCemetery.sol:359:36\n    │\n359 │         uint256 day = dayOfYear - (153 * marchMonth + 2) / 5 + 1;\n    │                                    ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/MemecoinCemetery.sol:375:39\n    │\n375 │             output[--digits] = bytes1(uint8(48 + value % 10));\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":4502,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 38 tests for test/MemecoinCemetery.t.sol:MemecoinCemeteryTest\n[PASS] testFuzz_EpitaphLengthAndSafeRendering(bytes) (runs: 256, μ: 2061239, ~: 1965936)\n[PASS] testFuzz_HolderThresholdAtBothEdges(uint256,uint8) (runs: 1000, μ: 1331715, ~: 1332155)\n[PASS] testFuzz_SealedRecordNeverChanges(address,bytes,uint32,uint8) (runs: 256, μ: 1735787, ~: 1615393)\n[PASS] test_AllForbiddenStateTransitionsRevertWithoutMutation() (gas: 4949668)\n[PASS] test_DigCapsSupplyGasAndRejectsStateWritesAndReturnBombs() (gas: 1760277)\n[PASS] test_DigIsPermissionlessAndEmitsCompleteWake() (gas: 173776)\n[PASS] test_DigRejectsEOAZeroAddressZeroSupplyAndRevertingToken() (gas: 971951)\n[PASS] test_DigRejectsMalformedSupplyResponses() (gas: 1836415)\n[PASS] test_ETHReceiveFallbackAndPayableFunctionCallsAreRejected() (gas: 170220)\n[PASS] test_EpitaphLengthsZeroOne140And141() (gas: 948932)\n[PASS] test_EpitaphLimitCountsBytesNotUnicodeCharacters() (gas: 434947)\n[PASS] test_EveryByteIsEscapedOrMadePrintable() (gas: 6311991)\n[PASS] test_GasHeavyReflectionHolderCanRise() (gas: 1384642)\n[PASS] test_GasHeavyReflectionHolderCanSave() (gas: 1115623)\n[PASS] test_HeadstoneEscapesAllFiveXMLCharactersInBothTextInputs() (gas: 2945692)\n[PASS] test_HeadstoneLeapDaySealDateAndUnsetDateDash() (gas: 2434118)\n[PASS] test_HeadstoneRemainsValidWith140Metacharacters() (gas: 4309598)\n[PASS] test_HeadstoneUTCDateGoldenVectors() (gas: 9574097)\n[PASS] test_HolderDecimalsZero36AndAbove36() (gas: 6646579)\n[PASS] test_HolderHugeSixDecimalSupplyNeedsOnlyOneWholeToken() (gas: 1330969)\n[PASS] test_HolderHugeSupplyNeedsOnlyOneWhole18DecimalToken() (gas: 1331220)\n[PASS] test_HolderReadsCurrentSupplyAndBalanceNotDigTimeSnapshot() (gas: 890155)\n[PASS] test_HolderSmallSixDecimalSupplyUsesOneTenthPercent() (gas: 1330887)\n[PASS] test_HolderSmallSupplyUsesOneTenthPercent18Decimals() (gas: 1331094)\n[PASS] test_HolderTinySupplyFloorAndIntegerRounding() (gas: 6692732)\n[PASS] test_LastSecondObjectionEmitsEventAndStartsFreshCooldown() (gas: 605764)\n[PASS] test_LateSealUsesActualTimestampAndNeedsNoWorkingTokenReads() (gas: 1524914)\n[PASS] test_MalformedAndNonprintableSymbolsFallBackSafely() (gas: 8098019)\n[PASS] test_MissingSymbolUsesShortAddressAndStillAllowsHolders() (gas: 773656)\n[PASS] test_NeverDugHasNoRecordAndNoHeadstone() (gas: 91086)\n[PASS] test_ObjectionAtDeadlineAndLaterIsTooLate() (gas: 253114)\n[PASS] test_PrintableSymbolSpaceAndTildeAreAccepted() (gas: 883131)\n[PASS] test_RepeatedCyclesKeepCountersArchivesAndRisenBanner() (gas: 18766740)\n[PASS] test_RequiredReadFailuresDuringBurialFailClosed() (gas: 3423065)\n[PASS] test_RequiredReadFailuresDuringWakeFailClosed() (gas: 3214282)\n[PASS] test_RisePreservesBurialEmitsEventAndStartsFreshCooldown() (gas: 872973)\n[PASS] test_SealRejectsOneSecondEarlyAndSucceedsAtDeadline() (gas: 589394)\n[PASS] test_UnreadableDecimalsDefaultsTo18ForBothHolderActions() (gas: 14842023)\nSuite result: ok. 38 passed; 0 failed; 0 skipped; finished in 330.18ms (680.16ms CPU time)\n\nRan 2 tests for test/MemecoinCemetery.t.sol:MemecoinCemeteryInvariantTest\n[PASS]\nMemecoinCemeteryInvariantTest invariants:\n[PASS] invariant_GraveCountEqualsCurrentlyBuriedTokens\n[PASS] invariant_LifecycleCountersAndEveryBurialMatchModel\n MemecoinCemeteryInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------------------+----------+-------+---------+----------╮\n| Contract                 | Selector | Calls | Reverts | Discards |\n+==================================================================+\n| CemeteryLifecycleHandler | advance  | 1631  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | object   | 1642  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | open     | 1663  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | raise    | 1604  | 0       | 0        |\n|--------------------------+----------+-------+---------+----------|\n| CemeteryLifecycleHandler | seal     | 1652  | 0       | 0        |\n╰--------------------------+----------+-------+---------+----------╯\n\n[PASS] test_HandlerExercisesRepeatBurialsAndAllTransitions() (gas: 1702449)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.45s (4.44s CPU time)\n\nRan 2 test suites in 4.45s (4.78s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":36,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MemecoinCemetery.dig(address,string)\",\"MemecoinCemetery.fallback()\",\"MemecoinCemetery.itLives(address)\",\"MemecoinCemetery.receive()\",\"MemecoinCemetery.rise(address)\",\"MemecoinCemetery.seal(address)\"],\"files\":{\"src/MemecoinCemetery.sol\":380,\"test/MemecoinCemetery.t.sol\":1143},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d0e5c2872b93500bfc297794b4807de606732362191215557ad3b5651ef390b0","verifiedTreeHash":"3f9816c8c6ac3aae38bfda2ba7f11fad0991d107","verifierVersion":"0.1.0+7471272e"}]}