{"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":"2326d0a9-6edd-433b-9c9b-459cea784cfb","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":null,"dependsOn":["scaffold_project","build_contract_project","build_website","refine_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","tools":[]},"key":"adversarial_review","kind":"code","role":"review","skillHash":"6b037a7b6601e883cf8a906c1520c0624817d42d8310b65c2f43679204608af3","skillId":"adversarial-review","state":"failed"},{"acceptedSubmissionHash":"4d17dd181529d7cb601b35c883029a7080d59d2183b0a65402c9b73b8bd35622","dependsOn":["scaffold_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"d8e6b37c2152132d8a56b737aadb00f0f18896726650c0f2b77cf2300fd3ee15","dependsOn":["build_contract_project"],"execution":{"mustProduce":["dist/index.html"],"network":true,"optionalTools":["browser"],"profile":"none","requires":["network"],"skillHash":"6715a761ae197330be56ba3ef74f7628c405aa1d94f0e62b3dcf3715e0135cbc","skillId":"build-website","tools":[]},"key":"build_website","kind":"code","role":"implement","skillHash":"6715a761ae197330be56ba3ef74f7628c405aa1d94f0e62b3dcf3715e0135cbc","skillId":"build-website","state":"accepted"},{"acceptedSubmissionHash":"089326677193b2d6f8018578fdebbf153e8bbe72f9b66aa4943fbfdafca1ad70","dependsOn":["build_website"],"execution":{"network":false,"profile":"none","requires":[],"skillHash":"99cccc7e3e2e1b515c66d54cc6d4bd9832d528aaf0ec0ba48c87a4182db4b7ca","skillId":"refine-project","tools":[]},"key":"refine_project","kind":"code","role":"implement","skillHash":"99cccc7e3e2e1b515c66d54cc6d4bd9832d528aaf0ec0ba48c87a4182db4b7ca","skillId":"refine-project","state":"accepted"},{"acceptedSubmissionHash":"fc8e2665526e686cc625bb874c66bcba4aa5e1b938bdac3e42252d4c613c1941","dependsOn":[],"execution":{"network":true,"profile":"none","requires":["network"],"skillHash":"7ae2f33d07dd65f04780071437d0c74200f8f58a323bc9324fa8524f587719c6","skillId":"scaffold-project","tools":[]},"key":"scaffold_project","kind":"code","role":"implement","skillHash":"7ae2f33d07dd65f04780071437d0c74200f8f58a323bc9324fa8524f587719c6","skillId":"scaffold-project","state":"accepted"},{"acceptedSubmissionHash":null,"dependsOn":["scaffold_project","build_contract_project","build_website","refine_project","adversarial_review"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"8189a3059fc9bb774ad7dcee66b87f32e25d781025f0e9f82a4c75182fe0ef19","skillId":"site-content-check","tools":[]},"key":"site_content_check","kind":"code","role":"review","skillHash":"8189a3059fc9bb774ad7dcee66b87f32e25d781025f0e9f82a4c75182fe0ef19","skillId":"site-content-check","state":"waiting"}],"objective":"# Dungeon Crawler Pepe (DCP)\n\nToken name: Dungeon Crawler Pepe. Token symbol: DCP.\n\nCURRENT ORDER: Build, test and independently review the complete Dungeon Crawler Pepe game, contracts, backend and operating software for the production specification below. Publish complete source on public GitHub, build the browser frontend's static export, and provide a locally runnable integrated demonstration. This is the user's authorised BUILD-AND-REVIEW fallback, not a launch: do not deploy contracts, mint a token, seed a pool, enable real-money gameplay, create paid subscriptions or submit paid swarm work. Do not publish a live production site in this order. Use local/fork simulations and labelled test fixtures. Deliver working implementation, not just research or a design document. Independently review it and clearly record unresolved defects, funding and provisioning gaps; prepare a supported subsequent IMD launch plan preserving hands-off operation. The production requirements below remain the target, but actual mainnet deployment and external runtime provisioning await a separate reviewed launch.\n\nECONOMY: Ethereum mainnet (1), ordinary play off-chain. DCP/IMD preferred; DCP/ETH allowed with automatic IMD conversion, protected gas reserves and expenses funded. Single-sided DCP seed; no requester-funded pair liquidity. Total supply: 1,000,000,000 DCP with 18 decimals, minted once; no further minting, owner, pause or upgrade on the token; plain transfers. 10% swarm, 10-20% pool, 70-80% contract game reserve; initial proposal 20/10/70. Verify quoted pairing/allocation. POOL4 optional.\n\nVerify current fees (docs 1.25%: 1% payer, 0.25% IMD). Verify treasury routing: initial factory.setRequester(uint64,address), permissionless claimFees/withdraw; prove both assets arrive. Fund reserve via supported remainderTo or one approved initial transfer of its exact allocation. No ongoing wallet forwarding, private keys or extra tax by default. Document LP ownership, collection, assets and depth; other pools need not pay. No wash trading.\n\nToken seed is not cash; no extra budget committed. Cost and specify inference/gas/hosting bootstrap before the later launch; disclose subsidy/gaps, no assumed wallet access. Separate player custody/liabilities from operation. Choose sinks/burn/recycling, capped emissions/anti-farming; finite supply/sell pressure, fun with small prizes, no yield promises. Replenish IMD at runway thresholds through approved liquid routes with minimum output, manipulation-resistant prices and slippage/gas/spend caps. Batch dust; handle DCP fees explicitly. Failed conversions preserve funds. Model zero volume, shallow liquidity, price falls, rising costs and depleted reserves; essential operation before prizes.\n\nTONE: Dungeon Crawler Pepe/DCP fixed; creative control of original world/cast/classes/combat/crafting/factions/equipment/seasons. Dungeon Crawler Carl intensity without copying plot, characters or dialogue. R-rated profanity, filthy jokes, grotesque monsters, outrageous violence, predatory sponsors and cosmic bureaucracy. Adults/non-graphic sexual comedy, unsanitised. Magical lightsaber strap-on is illustrative, NOT required starting gear. Make absurdity mechanical, with callbacks, consequences, recurring characters and emotional stakes; screenshot-worthy moments.\n\nVARIETY: A small bounded daily world, fixed loot list or shared upgrade ladder is unacceptable. 100 players must not get the same upgrades or exhaust possibilities. Swarm-authored systems plus deep procedural generation: individual routes, encounters, branching quests, powers/modifiers/curses/trade-offs and build synergies. Shared events, not identical progression or merely renamed/stat-rolled loot. Expand mechanics/content continually, many viable builds, randomness reacting to choices/history. Bound rewards/costs, not creative breadth. Validate combinations; resist seed/reroll farming, verifiable randomness for valuable prizes. Caching must not produce identical sessions. Simulate 100+ players/several days; measure repetition/duplicate upgrades/build diversity/dominant strategies; fix convergence.\n\nPLAY: Fast dark-mode desktop/mobile browser game, persistent characters/inventory/cross-device saves; long sessions, daily floors/quests/events, secrets, leaderboards, token/item rewards; consider parties/seasons. No ten-minute cap. Define death/resets/persistence, item ownership/trading and purchase consequences. Avoid pay-to-win; try before spending, no IMD NFT required. Browser/mobile wallets, replay-safe sign-in (connection is not authentication), account/network changes, approval/purchase/claim status. No seeds. Ordinary moves need neither transactions nor AI fees. Authoritative state, concurrency/retries/reorg safety, verified scores/claims; resist bots, multi-wallet farming and prompt injection. Preserve ownership/earned rewards.\n\nOPERATION: Durable swarm memory/versioned rules; separate creation, independent review, tests and publication. Generate ahead, fallback content, preserve active encounters. No arbitrary code/treasury commands from player/generated text. Provision revenue-to-IMD-to-paid-work/topups, validation/publication, gameplay/state/rewards. Verify APIs/payment authority/prices. Give automated content work its own constrained payment identity. Contracts cannot initiate transactions/HTTP. Fund/provision keepers, schedules, isolated payment signers, backend/database/indexer/RPC/hosting, backups/failover and recovery. No temporary worker workspace, my PC or manual account setup; IPFS is not a backend/perpetual hosting.\n\nBounded/revocable authority, replaceable operators; no unrestricted withdrawals or founder admin. Document roles/holders, content versus financial upgrades, external operators and IMD-staff-only controls. No secrets/personal history in prompts/source/browser/public outputs; no anonymity claims. Bounded retries, duplicate-payment prevention, rollback, old content playable in outages; low-runway spending reduction and safe dormancy protecting claims. Show version/history/runway/spend/reserves/liquidity/outages. No perpetual funding/service guarantees.\n\nDELIVERY FOR THIS BUILD: Prove fee/reserve routing and ownership in tests; deliver runtime code, provisioning/recovery automation and exact bootstrap costs/authority needed before the later launch. Identify unsupported sequencing and services explicitly; no founder chores. Test substantial play/saves/purchases/inventory/rankings/claims; 100-player variety; fee-to-treasury-to-paid-work; two unattended content cycles with durable state; operator loss/outages/bad content/empty budgets/treasury attacks. Independently test no overspending, duplicate claims, unauthorised minting/withdrawals or player-custody spending. Deliver source, runnable demo/static export, test/review evidence, deployment manifests, operating rules and a launch-readiness report. Future launch must deliver a live URL, verified contracts/pool and actually funded services. Success: entertaining, evolving adult game running without me.","parentJobId":null,"planHash":"4aaaf073307e4257c55ddf100f101fe2328d92e06c44a91bfd0b6328065f76c2","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"2326d0a9-6edd-433b-9c9b-459cea784cfb","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-847-dungeon-crawler-pepe-token-symbol-dcp"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52119","feedbackHash":"edc8c3559f545b7f4731495f3c08be81c0a85922b2efa2b6eab8a6e5fb7746d5","nodeKey":"build_contract_project","submissionHash":"4d17dd181529d7cb601b35c883029a7080d59d2183b0a65402c9b73b8bd35622","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52091","feedbackHash":"b8f4880bbc293b2f31ccdc36df8e4f0cc98a99eda42f63041df16de81fc86dfe","nodeKey":"build_website","submissionHash":"d8e6b37c2152132d8a56b737aadb00f0f18896726650c0f2b77cf2300fd3ee15","tag1":"verification:structural","tag2":"acceptance-v2","value":1},{"agentId":"52179","feedbackHash":"7c45c79b2a67ee49c8e15110289945736f4f8661841a523f4e87972853c9a81d","nodeKey":"refine_project","submissionHash":"089326677193b2d6f8018578fdebbf153e8bbe72f9b66aa4943fbfdafca1ad70","tag1":"verification:structural","tag2":"acceptance-v2","value":1},{"agentId":"52179","feedbackHash":"d17bf9db71331c1c21a780d378d4b70d399e99108eaa4f17c390c489475981da","nodeKey":"scaffold_project","submissionHash":"fc8e2665526e686cc625bb874c66bcba4aa5e1b938bdac3e42252d4c613c1941","tag1":"verification:structural","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"026cdce90cf2922f40151a88c33d6951eee2c6174e2185ef8d4ad622079eb5de","state":"blocked","submissions":[{"artifacts":[],"attempt":2,"bundleHash":"69b3f0e0515d5497900f8d149a58fbbace41582243ee79351b65ce782ee26031","device":"02f22d6f13810ca8","findings":[],"hash":"089326677193b2d6f8018578fdebbf153e8bbe72f9b66aa4943fbfdafca1ad70","nodeId":"0f206c14-d589-4a28-a113-2ab339c9bcc6","outcome":"completed","summary":"I fixed one problem the earlier review had already documented: three server database tables were never cleaned up and would grow forever. The full suite passes: 33 Node tests, including a new one. The previous attempt was rejected because its tool host was missing and it changed nothing. This time the environment worked.\n\n**Starting state.** Before changing anything I ran the existing checks. All 32 Node tests and 41 Solidity tests passed, formatting was clean, and rebuilding the browser export changed no files. There was no failing finding to repair, so I took an open item from `docs/review.md` that falls inside the paths I'm allowed to edit.\n\n**The problem.** The scheduled housekeeping job cleared the old action log but not three related tables:\n- **`action_requests`**: a fingerprint kept for each player action so a retry can be recognised.\n- **expired `sessions`**: login tokens past their expiry.\n- **stale `nonces`**: one-time codes used for wallet sign-in.\n\n**The fix (34 lines added, 3 removed, across 5 files):**\n- **`server/src/auth.js`**: a new `pruneAuth` deletes only sessions and nonces that sign-in already rejects, using the same clock and time limits. Deleting them can't change any sign-in result.\n- **`server/src/game/service.js`**: `pruneActionLog` also deletes fingerprints whose log entry is gone. A fingerprint and its log entry are always saved together, so the only way to lose the log entry is this cleanup. If an old action is retried after cleanup, it is still refused as out of date, never applied twice.\n- **`server/src/ops/keeper.js`**: the scheduled housekeeping step now also calls `pruneAuth`.\n- **`test/runtime.test.mjs`**: a new test runs housekeeping eight days ahead. It checks that old rows are removed, that a live session and a fresh nonce survive, and that retrying the old action is refused. It fails on the old code and passes with the fix.\n- **`docs/review.md`**: the open-issue entry now records the fix and the test.\n\n**Left unchanged:** contracts, scripts, `dist/` and the configuration files. The browser export doesn't include any of the files I edited, and rebuilding it produced no changes. I didn't commit anything.\n\n**Noticed but not fixed (outside my allowed paths or scope):**\n- `README.md` and `REVIEW.md` link to files under `artifacts/` (browser-check results, test logs, the source archive) that don't exist in this checkout. Those two files sit at the repository root, so I couldn't edit them.\n- The serious launch blockers in `docs/launch-readiness.md` are still open. They include factory and fee-routing proof against the real deployed contracts, a production swap and price source, the x402 payment flow, connecting the prize-randomness contract to the backend, safe transaction sending, funded hosting, independent review and public GitHub publication. The launch decision remains NO-GO, and nothing was deployed, published or paid for.","treeHash":"13ad3c130f7215fcbe16730d57a131b61ed48683","usage":{"cachedInputTokens":744547,"inputTokens":30,"model":"claude-opus-5-5","outputTokens":9923,"runtime":"claude","turns":21,"wallClockMs":168053}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"027faf38e95c50a5","findings":[],"hash":"267da7c03a6be759b36e16e9e2cb7c5ee6e27d5c1b907baf63f05d391925cf25","nodeId":"0f206c14-d589-4a28-a113-2ab339c9bcc6","outcome":"failed","summary":"the task produced no changes; the agent's last message was: I couldn’t inspect or modify the repository: both command attempts failed because the execution host is missing:\n\n`/home/ubuntu/.local/bin/codex-code-mode-host`\n\nNo files were changed, no tests ran, and nothing was published or deployed. I can’t assess the existing implementation or claim completion without repository access.\n\nRestore the execution host and rerun this task so I can read the accepted work, implement scoped fixes, and check the deliverable.","treeHash":null,"usage":{"cachedInputTokens":43008,"inputTokens":5090,"model":null,"outputTokens":277,"runtime":"codex","turns":2,"wallClockMs":11509}},{"artifacts":[],"attempt":1,"bundleHash":"abcd25f117d82597649733401d04463824e07754c4cc68f5578dd65e2410a5da","device":"1369de7c9398881a","findings":[],"hash":"4d17dd181529d7cb601b35c883029a7080d59d2183b0a65402c9b73b8bd35622","nodeId":"655d2743-30ef-4224-b71c-8f6a08cd5691","outcome":"completed","summary":"Delivered the local game, static export, hardened contracts/backend, recovery tooling, and [source bundle](artifacts/dcp-source.tar.gz).\n\nVerified: **41 Solidity tests**, **30 Node tests**, `forge build`, `forge fmt --check`, 120-player simulation, and backup/restore.\n\nRun with Node 24+: `node scripts/demo.mjs`, then open `http://127.0.0.1:8787`.\n\n**Not launch-ready:** GitHub publication, independent review, funding, and production integrations remain unresolved in [launch readiness](docs/launch-readiness.md). No contracts were deployed or paid services initiated.","treeHash":"c8fa80e82e357295760b06a458fd441cf5041a72","usage":{"cachedInputTokens":6446592,"inputTokens":200419,"model":"gpt-6-astra","outputTokens":53461,"runtime":"codex","turns":8,"wallClockMs":1540556}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"027faf38e95c50a5","findings":[],"hash":"789e571d380d0af5711dbb6fd7eb784a888df34299c03ccf173092bc2ad4417f","nodeId":"d20da98e-e566-4df1-9ca6-fbcfe988a544","outcome":"failed","summary":"the task produced no changes; the agent's last message was: Blocked by the execution environment. All three tool attempts failed with:\n\n```text\nfailed to spawn code-mode host\n/home/ubuntu/.local/bin/codex-code-mode-host:\nNo such file or directory (os error 2)\n```\n\nI could not read the pinned inputs, create files, run tests, or publish source. No repository changes or external actions were made.\n\nThe environment needs its code-mode host restored before I can complete the build and review. The requested deliverable remains unimplemented and unverified.","treeHash":null,"usage":{"cachedInputTokens":61056,"inputTokens":6143,"model":null,"outputTokens":434,"runtime":"codex","turns":3,"wallClockMs":20454}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"02c6a88ea85b2673","findings":[],"hash":"965af07beed7cd0fe0a16f2b3314d7a42aac65bacde5c5eaf96e759903517d4a","nodeId":"d20da98e-e566-4df1-9ca6-fbcfe988a544","outcome":"failed","summary":"Your organization has disabled Claude subscription access for Claude Code · Use an Anthropic API key instead, or ask your admin to enable access","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":"<synthetic>","outputTokens":0,"runtime":"claude","turns":1,"wallClockMs":1965}},{"artifacts":[],"attempt":1,"bundleHash":"4a803681549ecaeae32cc48cff7c903e167ed10fae1b372d69a10d23109dd3c6","device":"79606c6a6e3585fb","findings":[],"hash":"d8e6b37c2152132d8a56b737aadb00f0f18896726650c0f2b77cf2300fd3ee15","nodeId":"ab27849a-8eaf-4ad2-ba76-d0e98833dced","outcome":"completed","summary":"Implemented the responsive game interface, static browser practice, accessibility fixes, source lockfile and documentation.\n\nPassed: production build, typecheck, 32 Node tests, 41 Solidity tests, mobile/desktop browser checks and two durable content cycles.\n\nRun locally with Node 24+: `node scripts/demo.mjs`.\n\n**Not launched.** Public GitHub publication, independent sign-off, funding and production integrations remain outstanding, documented in `docs/launch-readiness.md`. Complete source handoff: `artifacts/dcp-source.tar.gz`.","treeHash":"ef78e97419ce4067da83c193abe4abc778cd9faf","usage":{"cachedInputTokens":5970688,"inputTokens":194975,"model":"gpt-6-astra","outputTokens":51600,"runtime":"codex","turns":10,"wallClockMs":1397262}},{"artifacts":[],"attempt":3,"bundleHash":"c73a280d9718ba4fa780b17fa2b9d7c63e0e4a33a90f60514011ddd8d00ac6a1","device":"02f22d6f13810ca8","findings":[],"hash":"fc8e2665526e686cc625bb874c66bcba4aa5e1b938bdac3e42252d4c613c1941","nodeId":"d20da98e-e566-4df1-9ca6-fbcfe988a544","outcome":"completed","summary":"","treeHash":"bfe55cd63b367057fcb50159df60b8d905afd585","usage":{"cachedInputTokens":8713569,"inputTokens":120,"model":"claude-opus-5-5","outputTokens":215807,"runtime":"claude","turns":61,"wallClockMs":2226878}}],"verification":[{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"089326677193b2d6f8018578fdebbf153e8bbe72f9b66aa4943fbfdafca1ad70","verifiedTreeHash":"13ad3c130f7215fcbe16730d57a131b61ed48683","verifierVersion":"0.1.0+7471272e"},{"checks":[{"durationMs":3097,"exitCode":0,"name":"build","output":"Compiling 36 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.95s\nCompiler run successful!\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ contracts/src/VRFPrizeSource.sol:30:45\n   │\n30 │     bytes4 private constant EXTRA_ARGS_V1 = bytes4(keccak256(\"VRF ExtraArgsV1\"));\n   │                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'bytes4' 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[uninitialized-local]: local variable is read before being initialized\n   ╭▸ contracts/src/DCPToken.sol:36:13\n   │\n36 │             sum += amounts[i];\n   │             ━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ contracts/src/DCPToken.sol:34:46\n   │\n34 │             if (recipients[i] == address(0)) revert ZeroAddress();\n   │                                              ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ contracts/src/GameShop.sol:50:9\n   │\n50 │         emit Purchase(msg.sender, orderId, sku, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ contracts/src/VRFPrizeSource.sol:68:9\n   │\n68 │         emit Requested(epoch, id);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ contracts/src/GameReserve.sol:86:9\n   │\n86 │         address poster_,\n   │         ━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ contracts/src/OpsTreasury.sol:174:9\n    │\n174 │         factory.claimFees(launchId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ contracts/src/OpsTreasury.sol:175:9\n    │\n175 │         factory.withdraw(launchId);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ contracts/src/OpsTreasury.sol:176:9\n    │\n176 │ ┏         emit Harvested(\n177 │ ┃             dcp.balanceOf(address(this)) - d0,\n178 │ ┃             imd.balanceOf(address(this)) - i0,\n179 │ ┃             weth.balanceOf(address(this)) + address(this).balance - w0\n180 │ ┃         );\n    │ ┗━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ contracts/src/GameReserve.sol:143:9\n    │\n143 │         emit DrawRequested(epoch, snapshotHash);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ contracts/src/OpsTreasury.sol:193:14\n    │\n193 │         if (!dcp.transfer(reserve, amt)) revert TransferFailed();\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ contracts/src/OpsTreasury.sol:194:9\n    │\n194 │         emit Recycled(amt);\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   ╭▸ contracts/src/TimelockedRoles.sol:57:13\n   │\n57 │         if (block.timestamp < eta) revert TooEarly();\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   ╭▸ contracts/src/TimelockedRoles.sol:61:9\n   │\n61 │         emit Executed(id, data);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ contracts/src/OpsTreasury.sol:215:14\n    │\n215 │         if (!IERC20Min(tokenIn).approve(address(swapAdapter), amountIn)) revert TransferFailed();\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ contracts/src/OpsTreasury.sol:216:9\n    │\n216 │         swapAdapter.swapExactIn(tokenIn, address(imd), amountIn, minOut, address(this));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ contracts/src/OpsTreasury.sol:217:14\n    │\n217 │         if (!IERC20Min(tokenIn).approve(address(swapAdapter), 0)) revert TransferFailed();\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ contracts/src/OpsTreasury.sol:222:23\n    │\n222 │         if (b > 0 && !imd.transfer(msg.sender, b)) revert TransferFailed();\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ contracts/src/GameReserve.sol:174:25\n    │\n174 │         r.anchorBlock = uint64(block.number);\n    │                         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ contracts/src/OpsTreasury.sol:223:9\n    │\n223 │         emit Converted(tokenIn, amountIn, out, msg.sender, b);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ contracts/src/OpsTreasury.sol:216:9\n    │\n216 │         swapAdapter.swapExactIn(tokenIn, address(imd), amountIn, minOut, address(this));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ contracts/src/OpsTreasury.sol:233:22\n    │\n233 │         (bool ok,) = op.call{value: gasTopUp}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `entered` is updated\n    ╭▸ contracts/src/OpsTreasury.sol:233:22\n    │\n233 │         (bool ok,) = op.call{value: gasTopUp}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ contracts/src/OpsTreasury.sol:226:23\n    │\n226 │     function topUpGas(address op) external nonReentrant {\n    │                       ━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ contracts/src/OpsTreasury.sol:235:9\n    │\n235 │         emit GasToppedUp(op, gasTopUp);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ contracts/src/GameReserve.sol:203:19\n    │\n203 │         r.total = uint128(total);\n    │                   ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' 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[unsafe-typecast]: typecast can truncate values\n    ╭▸ contracts/src/GameReserve.sol:204:22\n    │\n204 │         r.postedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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[reentrancy-no-eth]: external call can be reentered before `entered` is updated\n    ╭▸ contracts/src/OpsTreasury.sol:254:14\n    │\n254 │         if (!imd.transfer(payee, amount)) revert TransferFailed();\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ contracts/src/OpsTreasury.sol:255:9\n    │\n255 │         emit WorkPaid(invoiceId, payee, amount);\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    ╭▸ contracts/src/GameReserve.sol:216:13\n    │\n216 │         if (block.timestamp >= r.postedAt + CHALLENGE_WINDOW) revert InWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ contracts/src/OpsTreasury.sol:287:31\n    │\n287 │     function setPaymentSigner(address s) external onlySelf {\n    │                               ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ contracts/src/GameReserve.sol:252:14\n    │\n252 │         if (!token.transfer(account, amount)) revert TransferFailed();\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ contracts/src/GameReserve.sol:253:9\n    │\n253 │         emit Claimed(epoch, index, account, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ contracts/src/GameReserve.sol:242:35\n    │\n242 │         if (r.root == bytes32(0)) revert NotReady();\n    │                                   ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ contracts/src/GameReserve.sol:243:23\n    │\n243 │         if (r.vetoed) revert Vetoed();\n    │                       ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ contracts/src/GameReserve.sol:244:62\n    │\n244 │         if (block.timestamp < r.postedAt + CHALLENGE_WINDOW) revert InWindow();\n    │                                                              ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ contracts/src/GameReserve.sol:245:38\n    │\n245 │         if (isClaimed(epoch, index)) revert AlreadyClaimed();\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ contracts/src/GameReserve.sol:247:44\n    │\n247 │         if (!_verify(proof, r.root, leaf)) revert BadProof();\n    │                                            ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ contracts/src/GameReserve.sol:248:52\n    │\n248 │         if (uint256(r.claimed) + amount > r.total) revert OverCap();\n    │                                                    ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ contracts/src/GameReserve.sol:252:47\n    │\n252 │         if (!token.transfer(account, amount)) revert TransferFailed();\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ contracts/src/GameReserve.sol:244:13\n    │\n244 │         if (block.timestamp < r.postedAt + CHALLENGE_WINDOW) revert InWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ contracts/src/GameReserve.sol:250:22\n    │\n250 │         r.claimed += uint128(amount);\n    │                      ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' 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[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ contracts/src/GameReserve.sol:258:24\n    │\n258 │     function setPoster(address p) external onlySelf {\n    │                        ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ contracts/test/Base.t.sol:112:17\n    │\n112 │         vm.warp(block.timestamp + 2 days);\n    │         ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.number` may be reused across `vm.roll`\n    ╭▸ contracts/test/Reserve.t.sol:157:21\n    │\n157 │             vm.roll(block.number + 2);\n    │             ────────━━━━━━━━━━━━───── `vm.roll` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockNumber()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ contracts/test/Treasury.t.sol:182:17\n    │\n182 │         vm.warp(block.timestamp + 3 days);\n    │         ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ contracts/test/Treasury.t.sol:192:17\n    │\n192 │         vm.warp(block.timestamp + 3 days);\n    │         ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":121,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for contracts/test/TokenAndFees.t.sol:TokenAndFeesTest\n[PASS] testFuzz_PlainTransferNoTax(uint256) (runs: 256, μ: 74850, ~: 74656)\n[PASS] test_AllocationMustSumToSupply() (gas: 4743)\n[PASS] test_FeesRouteBothAssetsToTreasury() (gas: 738095)\n[PASS] test_NoMintOwnerPauseUpgradeSelectors() (gas: 140303)\n[PASS] test_SetRequesterOnlyOnceByLauncher() (gas: 67664)\n[PASS] test_ShopSplitBurnReserveTreasury() (gas: 266248)\n[PASS] test_SupplyAndAllocationExact() (gas: 79724)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 10.08ms (8.43ms CPU time)\n\nRan 10 tests for contracts/test/Hardening.t.sol:HardeningTest\n[PASS] test_BlockhashFixtureUnavailableOnMainnet() (gas: 55670)\n[PASS] test_CouncilCannotRaiseHardGasCapOrSpendEssentialFloor() (gas: 209922)\n[PASS] test_DeployFixtureUsesArgumentsNotCaller() (gas: 15749823)\nLogs:\n  DCP 0x45127f27819f45d1b72ef80e9a151a9DC8470207\n  GameReserve 0x89d319e6798816baCC38D6B4f7b2B490d5acaEb3\n  OpsTreasury 0x7027F1163f070Da410a772B3b26FEA8ADFAE4C8e\n  GameShop 0x222dc1efba2F6bAa9a15d9eB6BF97d9Ad2bDc177\n  MockIMDFactory 0xa40a556c824de3b0E08B454E5cc1c9E29B3540ED\n\n[PASS] test_GasRecipientCannotReenterAndDrainMultipleTopups() (gas: 446574)\n[PASS] test_OrderFrontRunnerCannotConsumeAnotherBuyerOrder() (gas: 354906)\n[PASS] test_RequestsAndBackloggedRootsCannotBurstDailyBudget() (gas: 856370)\n[PASS] test_UnfundedVRFDoesNotLockSnapshotOrSpendReserve() (gas: 360956)\n[PASS] test_VRFWaitAuthenticateNoRerollLateFulfillmentAndClaims() (gas: 851326)\n[PASS] test_WethUsesItsOwnDustAndSpendCaps() (gas: 353694)\n[PASS] test_ZeroOracleOutputPreservesFunds() (gas: 182036)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 21.15ms (6.98ms CPU time)\n\nRan 14 tests for contracts/test/Treasury.t.sol:TreasuryTest\n[PASS] testFuzz_NeverOverspendEpoch(uint256[8]) (runs: 256, μ: 710484, ~: 724809)\n[PASS] test_ConvertCapsDustAndRunwayGate() (gas: 362234)\n[PASS] test_ConvertDcpFeesWhenRunwayLow() (gas: 302962)\n[PASS] test_ConvertEpochCap() (gas: 584179)\n[PASS] test_ConvertRejectsLowMinOutAndPreservesFundsOnFailure() (gas: 680955)\n[PASS] test_EndToEndFeeToTreasuryToPaidWork() (gas: 2244829)\n[PASS] test_EssentialFloorProtected() (gas: 262892)\n[PASS] test_FreezeStopsSpendingAndNeedsTimelockToLift() (gas: 393340)\n[PASS] test_GasTopUpBounded() (gas: 201708)\n[PASS] test_PayWorkAuthority() (gas: 233827)\n[PASS] test_PayWorkCapsAndLowRunway() (gas: 892052)\n[PASS] test_PayWorkHappyPathAndDuplicateInvoice() (gas: 267545)\n[PASS] test_RecycleExcessDcpToReserve() (gas: 133045)\n[PASS] test_TreasuryAttacksFail() (gas: 390570)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 21.19ms (24.60ms CPU time)\n\nRan 10 tests for contracts/test/Reserve.t.sol:ReserveTest\n[PASS] test_ClaimManyBatchesAndBlocksDuplicates() (gas: 574093)\n[PASS] test_DormancyKeepsFinalClaims() (gas: 584104)\n[PASS] test_FullCycleClaimOnceToLeafAccount() (gas: 726014)\n[PASS] test_GuardianVetoReleasesLiability() (gas: 493423)\n[PASS] test_LeafEncodingVector() (gas: 650)\n[PASS] test_MaxEmissionNeverEmptiesReserve() (gas: 22725080)\n[PASS] test_NoWithdrawPathForCouncil() (gas: 136143)\n[PASS] test_PostOverCapReverts() (gas: 269516)\n[PASS] test_RevealExpiresAfter256Blocks() (gas: 165535)\n[PASS] test_SeedMustBeCommittedBeforeEpochAndMatch() (gas: 191944)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 23.36ms (24.01ms CPU time)\n\nRan 4 test suites in 24.07ms (75.78ms CPU time): 41 tests passed, 0 failed, 0 skipped (41 total tests)\n","passed":true},{"durationMs":73,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DCPToken.approve(address,uint256)\",\"DCPToken.burn(uint256)\",\"DCPToken.transfer(address,uint256)\",\"DCPToken.transferFrom(address,address,uint256)\",\"GameReserve.anchor(uint256)\",\"GameReserve.cancel(bytes32)\",\"GameReserve.claim(uint256,uint256,address,uint256,bytes32[])\",\"GameReserve.claimMany((uint256,uint256,address,uint256,bytes32[])[])\",\"GameReserve.commitSeed(uint256,bytes32)\",\"GameReserve.execute(bytes)\",\"GameReserve.finalizeDraw(uint256)\",\"GameReserve.postRoot(uint256,bytes32,uint256)\",\"GameReserve.queue(bytes)\",\"GameReserve.requestDraw(uint256,bytes32)\",\"GameReserve.revealSeed(uint256,bytes32)\",\"GameReserve.setCouncil(address)\",\"GameReserve.setGuardian(address)\",\"GameReserve.setPoster(address)\",\"GameReserve.setRandomnessSource(address)\",\"GameReserve.veto(uint256)\",\"GameShop.purchase(bytes32,uint256,uint256)\",\"OpsTreasury.cancel(bytes32)\",\"OpsTreasury.convert(address,uint256,uint256)\",\"OpsTreasury.execute(bytes)\",\"OpsTreasury.freeze()\",\"OpsTreasury.harvest()\",\"OpsTreasury.payWork(address,uint256,bytes32)\",\"OpsTreasury.queue(bytes)\",\"OpsTreasury.receive()\",\"OpsTreasury.recycleDcp()\",\"OpsTreasury.setCouncil(address)\",\"OpsTreasury.setGasOperator(address,bool)\",\"OpsTreasury.setGuardian(address)\",\"OpsTreasury.setParams((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))\",\"OpsTreasury.setPayee(address,bool)\",\"OpsTreasury.setPaymentSigner(address)\",\"OpsTreasury.setRoute(address,address)\",\"OpsTreasury.topUpGas(address)\",\"OpsTreasury.unfreeze()\",\"OpsTreasury.wrapEth()\",\"VRFPrizeSource.rawFulfillRandomWords(uint256,uint256[])\",\"VRFPrizeSource.request(uint256)\"],\"files\":{\"README.md\":48,\"contracts/script/DeployLocal.s.sol\":92,\"contracts/src/DCPToken.sol\":87,\"contracts/src/GameReserve.sol\":271,\"contracts/src/GameShop.sol\":52,\"contracts/src/OpsTreasury.sol\":326,\"contracts/src/TimelockedRoles.sol\":82,\"contracts/src/VRFPrizeSource.sol\":84,\"contracts/src/interfaces/IERC20Min.sol\":14,\"contracts/src/interfaces/IPrizeRandomness.sol\":9,\"contracts/src/interfaces/ISwapAdapter.sol\":26,\"contracts/test/Base.t.sol\":129,\"contracts/test/Hardening.t.sol\":220,\"contracts/test/Reserve.t.sol\":187,\"contracts/test/TokenAndFees.t.sol\":97,\"contracts/test/Treasury.t.sol\":225,\"contracts/test/mocks/Mocks.sol\":180,\"deploy/Dockerfile\":12,\"deploy/compose.yaml\":18,\"deploy/launch-gates.json\":33,\"dist/app.js\":328,\"dist/build.json\":30,\"dist/favicon.svg\":1,\"dist/index.html\":104,\"dist/manifest.webmanifest\":1,\"dist/style.css\":67,\"dist/wallet.js\":59,\"docs/abi/DCPToken.json\":291,\"docs/abi/GameReserve.json\":1100,\"docs/abi/GameShop.json\":191,\"docs/abi/OpsTreasury.json\":1560,\"docs/abi/VRFPrizeSource.json\":258,\"docs/architecture.md\":30,\"docs/evidence/checks.json\":98,\"docs/evidence/checks.txt\":546,\"docs/evidence/economy-stress.json\":120,\"docs/evidence/imd-capabilities.json\":265,\"docs/evidence/imd-version.json\":16,\"docs/evidence/unattended-cycles.json\":69,\"docs/evidence/variety-simulation.json\":184,\"docs/game.md\":23,\"docs/launch-plan.md\":36,\"docs/launch-readiness.md\":51,\"docs/operations.md\":48,\"docs/review.md\":47,\"foundry.toml\":15,\"scripts/build-web.mjs\":18,\"scripts/check-launch.mjs\":6,\"scripts/check.sh\":7,\"scripts/demo.mjs\":10,\"scripts/economy-stress.mjs\":42,\"scripts/evidence.mjs\":32,\"scripts/export-abi.mjs\":7,\"scripts/package-source.py\":34,\"scripts/recover.mjs\":35,\"server/src/app.js\":257,\"server/src/auth.js\":110,\"server/src/chain/indexer.js\":66,\"server/src/chain/rpc.js\":147,\"server/src/chain/sim.js\":210,\"server/src/content/base.js\":345,\"server/src/crypto/abi.js\":56,\"server/src/crypto/eth.js\":81,\"server/src/crypto/keccak.js\":75,\"server/src/crypto/secp256k1.js\":99,\"server/src/db.js\":107,\"server/src/economy.js\":218,\"server/src/game/content.js\":52,\"server/src/game/engine.js\":802,\"server/src/game/floor.js\":74,\"server/src/game/powers.js\":139,\"server/src/game/rng.js\":53,\"server/src/game/service.js\":175,\"server/src/main.js\":83,\"server/src/ops/author.js\":70,\"server/src/ops/keeper.js\":87,\"server/src/ops/pipeline.js\":231,\"server/src/ops/review.js\":98,\"server/src/ops/status.js\":34,\"server/src/shop.js\":58,\"server/src/sim/bots.js\":91,\"server/src/sim/simulate.js\":144,\"test/crypto.test.mjs\":40,\"test/engine.test.mjs\":127,\"test/helpers.mjs\":61,\"test/runtime.test.mjs\":273,\"test/stress.test.mjs\":15,\"test/variety.test.mjs\":21,\"test/wallet.test.mjs\":27,\"web/app.js\":328,\"web/favicon.svg\":1,\"web/index.html\":104,\"web/manifest.webmanifest\":1,\"web/style.css\":67,\"web/wallet.js\":59},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4d17dd181529d7cb601b35c883029a7080d59d2183b0a65402c9b73b8bd35622","verifiedTreeHash":"c8fa80e82e357295760b06a458fd441cf5041a72","verifierVersion":"0.1.0+7471272e"},{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"d8e6b37c2152132d8a56b737aadb00f0f18896726650c0f2b77cf2300fd3ee15","verifiedTreeHash":"ef78e97419ce4067da83c193abe4abc778cd9faf","verifierVersion":"0.1.0+7471272e"},{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"fc8e2665526e686cc625bb874c66bcba4aa5e1b938bdac3e42252d4c613c1941","verifiedTreeHash":"bfe55cd63b367057fcb50159df60b8d905afd585","verifierVersion":"0.1.0+94826a22"}]}