{"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":"f95cc590-c5c3-4fb5-b81d-7803a1eb4be1","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"060baa0e068909bc905a9e303737d4a138f92c89f848da1d93b7539d002e48c5","dependsOn":["manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":"6deb9395117fe71ba9e8a3a3174a96bc5a9544fad0efed56a501cb67b9c3df12","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"}],"objective":"Ouroboros Press: an ownerless contract on Robinhood Chain (4663) that is itself a paying customer of IMD Intake v2. Anyone calls commission(); the contract pays Intake v2 exactly 0.5 IMD from its own balance for one research-report job (job.open@job-1) asking the swarm to write chapter N of a book about the contract itself, and the writer's callback onResult (0x4374622e) records the result hash; onFailure (0x5a0df71e) clears a refused or failed request; reset() frees a request with no answer after 6 hours. Deploy the OuroborosPress contract from this repository as it arrived: evm_contracts, no token, no pool, zero constructor arguments (Intake v2 0xa43e6f75ee006411f79ac1c84120606c2330de82 and IMD 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127 are constants in the source), nothing called after deployment. Do not edit src/ unless an audit finding reproduces. There is no owner, admin, upgrade, pause, withdraw or selfdestruct: setIntake is gated by STEWARD = address(0) and can never be called, and IMD leaves the contract only as the 0.5 IMD Intake price and a 0.02 IMD bounty to the commissioner of a delivered chapter. Tests: forge test (offline; mocks deployed at the real addresses) and an optional Robinhood fork suite; see README.md and THREAT-MODEL.md.","parentJobId":null,"planHash":"44888c93dae0e3e3cda520a40d63ea5700bf05bd3e73790746541f83d9452416","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"f95cc590-c5c3-4fb5-b81d-7803a1eb4be1","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2408-ouroborospress"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51538","feedbackHash":"ba90f87240f3114ad472fee70c3d6751d5f40379de0d982f91bb522d7821dc3d","nodeKey":"audit_imported_code","submissionHash":"060baa0e068909bc905a9e303737d4a138f92c89f848da1d93b7539d002e48c5","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51237","feedbackHash":"2ed234cd4986285544435258af9eae8864f5c9ed6347d5d48d354d4b19e68862","nodeKey":"manifest","submissionHash":"6deb9395117fe71ba9e8a3a3174a96bc5a9544fad0efed56a501cb67b9c3df12","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"b30b4b4ab3c25bdf578190c31c19e213c426771bd183a3eb7b05a4e782e94cbb","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b57ae3a96321a0e1","findings":[{"citation":"resolved","description":"Intake v2's price per action is owner-settable and read on chain with priceOf(action, asset); the intake-client reference states a moved price must not need a redeploy and the hub example pays priceOf on each ask. OuroborosPress instead bakes PRICE = 0.5e18 (line 49) into the balance check (line 162), the approval (line 167) and the request amount (line 175). The Intake pulls exactly `amount` and refunds nothing, and reverts when amount is below the price. So: (a) if the price is ever raised above 0.5 IMD, every commission() reverts at the Intake and, because the contract has no owner, withdraw, sweep or setter, every IMD it holds (and every future donation) is frozen permanently; (b) if the price is ever lowered, the press keeps sending 0.5 IMD and the difference is lost to the treasury on every chapter. THREAT-MODEL.md lists (a) as an accepted cost, but it is avoidable without adding any privileged role: read priceOf(ACTION_JOB_OPEN, imd) in commission() (revert if zero), check balance >= price + BOUNTY, approve and pass `price`. If the author wants a ceiling on what one chapter may cost, add a MAX_PRICE constant and revert above it. Live check today: priceOf(job.open@job-1, IMD) on Robinhood Chain returns 500000000000000000, so the defect is latent, not current.","line":167,"path":"src/OuroborosPress.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {OuroborosPress} from \"src/OuroborosPress.sol\";\nimport {IIntakeV2} from \"src/interfaces/IIntakeV2.sol\";\n\n/// @dev 18-decimal stand-in for IMD at the real Robinhood address.\ncontract ScratchIMD is ERC20 {\n    constructor() ERC20(\"Identity MD\", \"IMD\") {}\n\n    function mint(address to, uint256 amount) external {\n        _mint(to, amount);\n    }\n}\n\n/// @dev Intake v2 as the docs describe it, with the owner-settable price the real one has:\n///      `priceOf(action, asset)` is the live price; `requestWithFailure` reverts below it and\n///      pulls exactly `amount` (never refunds the excess) to the treasury in the same call.\ncontract ScratchIntake is IIntakeV2 {\n    error PriceNotMet();\n\n    address public constant TREASURY = address(0x7EA5);\n    mapping(bytes32 => mapping(address => uint256)) public priceOf;\n    uint256 public nonce;\n\n    function setPrice(bytes32 action, address asset, uint256 price) external {\n        priceOf[action][asset] = price;\n    }\n\n    function request(bytes32, bytes calldata, Callback calldata, address, uint256) external pure returns (bytes32) {\n        revert(\"unused\");\n    }\n\n    function requestWithFailure(bytes32 action, bytes calldata, Callback calldata, bytes4, address asset, uint256 amount)\n        external\n        returns (bytes32 id)\n    {\n        uint256 price = priceOf[action][asset];\n        if (price == 0 || amount < price) revert PriceNotMet();\n        require(IERC20(asset).transferFrom(msg.sender, TREASURY, amount), \"pull failed\");\n        id = keccak256(abi.encode(block.chainid, address(this), ++nonce, msg.sender));\n    }\n}\n\n/// @notice The press hardcodes PRICE = 0.5 IMD instead of reading `priceOf` on each ask. If the\n///         Intake's price moves (it is owner-settable, and the docs say \"a moved price must not\n///         need a redeploy\"), the press either reverts forever (price up: every IMD it holds is\n///         frozen, there is no admin or withdraw) or overpays (price down: the difference is lost\n///         on every chapter). Fails on the code as it is; passes once `commission()` pays the\n///         live `priceOf(ACTION_JOB_OPEN, imd)` instead of the constant.\ncontract PriceFollowsIntakeScratch is Test {\n    address constant INTAKE = 0xa43e6F75ee006411F79Ac1C84120606C2330DE82;\n    address constant IMD = 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127;\n    bytes32 constant JOB_OPEN = \"job.open@job-1\";\n\n    ScratchIMD imd;\n    ScratchIntake intake;\n    OuroborosPress press;\n\n    function setUp() public {\n        vm.warp(1_792_000_000);\n        vm.etch(IMD, address(new ScratchIMD()).code);\n        vm.etch(INTAKE, address(new ScratchIntake()).code);\n        imd = ScratchIMD(IMD);\n        intake = ScratchIntake(INTAKE);\n        press = new OuroborosPress();\n    }\n\n    /// Price raised from 0.5 to 0.6 IMD: the press holds 5 IMD and nothing can ever spend it.\n    function test_priceRaisedAboveConstantFreezesEveryIMDInThePress() public {\n        intake.setPrice(JOB_OPEN, IMD, 0.6e18);\n        imd.mint(address(press), 5e18);\n\n        // Expected: the press pays the live price (0.6 IMD) and the chapter is ordered.\n        // Actual on the current code: ScratchIntake.PriceNotMet() on every attempt, forever.\n        bytes32 id = press.commission();\n        assertTrue(id != bytes32(0));\n        assertEq(imd.balanceOf(intake.TREASURY()), 0.6e18, \"pays the live price\");\n        assertEq(imd.balanceOf(address(press)), 5e18 - 0.6e18);\n    }\n\n    /// Price lowered from 0.5 to 0.25 IMD: the press still sends 0.5 and the Intake keeps it all.\n    function test_priceLoweredBelowConstantOverpaysEveryChapter() public {\n        intake.setPrice(JOB_OPEN, IMD, 0.25e18);\n        imd.mint(address(press), 1e18);\n\n        press.commission();\n        // Expected: exactly the live price (0.25 IMD) leaves the press.\n        // Actual on the current code: 0.5 IMD leaves; 0.25 IMD per chapter is lost to the treasury.\n        assertEq(imd.balanceOf(intake.TREASURY()), 0.25e18, \"pays only the live price\");\n        assertEq(imd.balanceOf(address(press)), 1e18 - 0.25e18);\n    }\n}","reproduction":"State: Intake price for job.open@job-1 in IMD set to 0.6e18 (owner-settable on the real Intake); press holds 5 IMD. Call press.commission() from any address. Expected: the press pays the live 0.6 IMD and a request id is returned. Actual: the Intake reverts (price not met) because the press approves and sends exactly 0.5e18; every later commission() reverts the same way and the 5 IMD can never leave the contract. Second case: price set to 0.25e18, press holds 1 IMD; commission() succeeds but the treasury receives 0.5e18 instead of 0.25e18 (0.25 IMD lost per chapter). Both cases are in test/scratch/PriceFollowsIntake.t.sol, which fails on the current code (PriceNotMet() and 500000000000000000 != 250000000000000000) and passes when commission() pays priceOf().","severity":"medium","snippet":"        imd.forceApprove(intake_, PRICE);","title":"commission() pays a hardcoded 0.5 IMD instead of the Intake's live priceOf(): a price rise freezes every IMD in the press forever, a price cut overpays on every chapter"},{"citation":"resolved","description":"reset() (lines 227-235) may be called by anyone one second after requestedAt + 6 hours. It clears `busy` and records a miss, and _settle() (line 316) then refuses the writer's onResult/onFailure for that request id with NotBusy, even though the slot _chapters[n] still holds that request id and no new commission has been made. The 0.5 IMD already paid is lost, the chapter is lost, and the failure streak doubles the next cool-down. The intake-client reference says a job takes minutes to hours and that a callback can be lost, so a deadline is right, but discarding a late answer is not required by it: the pending request id is still unique and known. Anyone (a bot watching for the 6-hour mark, or a competitor wanting the next bounty) can trigger this at gas cost. Suggested fix: after reset(), keep accepting onResult/onFailure for the still-stored request id while _chapters[n].requestId matches and no new commission has overwritten it (e.g. settle on `requestId == _chapters[n].requestId` rather than on `busy`, and let a late result publish the chapter and undo the miss), or make the late result at least clear the cool-down. Alternatively lengthen TIMEOUT. This is a design choice the author may keep; it is reported so the trade-off is explicit.","line":316,"path":"src/OuroborosPress.sol","reproduction":"State: press funded with 1 IMD, commission() at t0 returns id. At t0 + 6h + 1s any address calls reset(): busy becomes false, failures = 1, failureStreak = 1, cooldownUntil = t0 + 7h + 1s. At t0 + 6h + 61s the Intake delivers onResult(id, hash, uri) with 200k gas: the call reverts NotBusy, chapterCount() stays 0, the press balance stays 0.5 IMD (0.5 IMD spent for nothing), and commission() reverts CoolingDown until t0 + 7h + 1s. See test/scratch/LateResult.t.sol (passes on current code, demonstrating the loss).","severity":"low","snippet":"        if (!busy) revert NotBusy();","title":"reset() is permissionless at exactly TIMEOUT and a result that arrives after it is refused although nothing has replaced the request: a slow but successful job costs 0.5 IMD and starts a cool-down"},{"citation":"resolved","description":"The evm_contracts launch rules forbid anything configured after deployment rather than in a constructor, and the reviewer checklist asks for such surfaces to be reported so the adapter removes them. setIntake(address) (lines 261-265) is exactly that surface: a public setter guarded by `msg.sender != STEWARD` with STEWARD = address(0). No transaction can have msg.sender == address(0) on Robinhood Chain (an L1 caller would arrive aliased), so the function is unreachable and the gate is tautological dead code. Keeping it costs an SLOAD of `intake` on every commission/onResult/onFailure and leaves a function named like an admin action in the ABI, which the later audit panel and the opcode/owner floor will flag again. Minimal fix that preserves the stated design (the Intake address is fixed): delete setIntake, STEWARD, NotSteward and the IntakeChanged event, and read INTAKE_V2 directly (or make `intake` immutable). The adapter must not replace it with a reachable owner-gated setter, since the brief requires an ownerless contract.","line":262,"path":"src/OuroborosPress.sol","reproduction":"Call press.setIntake(0x000000000000000000000000000000000000bEEF) from any EOA, from the Intake address (0xa43e6f75ee006411f79ac1c84120606c2330de82) and from the press itself: every call reverts NotSteward() and intake() still returns 0xa43e6f75ee006411f79ac1c84120606c2330de82. Only vm.prank(address(0)) in a test can make it succeed, which has no on-chain counterpart. Expected under the launch rules: no such function in the ABI.","severity":"low","snippet":"        if (msg.sender != STEWARD) revert NotSteward();","title":"setIntake() is a post-deployment setter that can never succeed; `intake` is a mutable storage slot read on every call although the launch forbids post-deployment configuration"},{"citation":"resolved","description":"_previous(n) decides between \"none (it was delivered without a uri)\" and a quoted uri by checking the stored uri string, which inscribe() fills later. Between onResult (which stores only uriHash) and inscribe(), previewBody() therefore describes chapter n-1 as delivered without a uri, while commission() in the same state reverts PreviousNotInscribed. The scripts send previewBody() to POST /requests/check before commissioning, so a site or operator that previews before inscribing checks a different body than the one eventually sent. No funds move, so info. Fix: in _previous, return a distinct text (or revert PreviousNotInscribed) when bytes(uri).length == 0 && p.uriHash != keccak256(\"\"), or have previewBody() revert in that state.","line":377,"path":"src/OuroborosPress.sol","reproduction":"Fund 2 IMD; commission(); Intake delivers onResult(id, h, \"ipfs://bafy.../result.json\"). Now chapterCount() == 1, isInscribed(1) == false. previewBody() returns a chapter-2 body containing \"The previous chapter is at none (it was delivered without a uri).\" while commission() reverts PreviousNotInscribed(1). After inscribe(1, uri) previewBody() instead quotes the uri. Expected: the preview before inscription either matches what will be sent or signals that nothing can be sent.","severity":"info","snippet":"        if (bytes(uri).length == 0) return \"none (it was delivered without a uri)\";","title":"previewBody() returns a body commission() would never send while the previous chapter awaits inscription (it says the previous chapter had no uri)"},{"citation":"resolved","description":"For a chapter whose delivered uri was empty, uriHash == keccak256(\"\"). inscribe(n, \"\") then passes the AlreadyInscribed check (the stored uri stays zero-length), passes the hash check, writes an empty string and emits Inscribed(n, \"\"). Nothing else changes and no value moves, so this is only event noise for indexers; the explicit isInscribed() already treats this chapter as inscribed. Fix: revert when uriHash == keccak256(\"\") (or when uri.length == 0) in inscribe.","line":244,"path":"src/OuroborosPress.sol","reproduction":"Fund 1 IMD; commission(); Intake delivers onResult(id, h, \"\"). isInscribed(1) == true. Call inscribe(1, \"\") twice from any address: both succeed and each emits Inscribed(1, \"\"). Expected: the second (and arguably the first) call reverts AlreadyInscribed(1).","severity":"info","snippet":"        if (keccak256(bytes(uri)) != c.uriHash) revert UriMismatch(n);","title":"inscribe(n, \"\") can be repeated without limit for a chapter delivered with an empty uri, emitting spurious Inscribed events"}],"hash":"060baa0e068909bc905a9e303737d4a138f92c89f848da1d93b7539d002e48c5","nodeId":"9f9b38be-b20e-45a2-9a1e-2f2c5a4bd992","outcome":"completed","summary":"The review is complete. Nothing in `src/`, tests, or configuration was changed. The findings and coverage record are in `.imd-findings.json`, and the scratch proofs are under `test/scratch/`.\n\n**What I read.** The press contract and its interface, the three test mocks, the offline suite, the fork suite, the launch manifest, the README and threat model, and the pinned Pashov and intake-client references. The live Intake v2 and IMD token on Robinhood Chain have no source in the tree, so I could not read them. I verified them by calls instead: the live price for `job.open@job-1` is 0.5 IMD, both have the same owner key, and the fork suite ran green against the real Intake.\n\n**What held.** The offline suite passes, the fork suite passes, and the compiled runtime has no DELEGATECALL, CALLCODE or SELFDESTRUCT. The chapter-1 body and three chapter-2 variants returned no blockers from the plane's free check door today. Callback gates, reentrancy, exact-price pull with zero residual allowance, and the 200k-gas callback budget all traced as intended.\n\n**Findings, most severe first:**\n\n- **Medium, hardcoded price.** `commission()` approves and sends a constant 0.5 IMD instead of reading the Intake's live price. A price rise makes every commission revert forever, freezing all IMD in an ownerless contract. A price cut overpays on every chapter. The attached proof fails on current code and passes once the function pays `priceOf`.\n- **Low, late result discarded.** Anyone can call `reset()` one second after six hours. A result arriving a minute later is refused even though nothing replaced the request, so a slow job costs 0.5 IMD and starts a cool-down.\n- **Low, dead setter.** `setIntake` can never succeed, yet it is a post-deployment configuration surface the launch forbids. The adapter should delete it rather than gate it on an owner.\n- **Info.** `previewBody()` describes a delivered-but-uninscribed chapter as having no uri, differing from what `commission()` would send. `inscribe(n, \"\")` is repeatable for empty-uri chapters, emitting spurious events.\n\n**Coverage.** All eight state-changing entry points have a verdict, plus five invariant rows. No critical or high defects were found.","treeHash":null,"usage":{"cachedInputTokens":1590069,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":33307,"runtime":"claude","turns":34,"wallClockMs":515685}},{"artifacts":[],"attempt":1,"bundleHash":"9fff4220478f3af926189b8a35dcb70956f8571b3977683d7ed723537598d24d","device":"308998a1407291a8","findings":[],"hash":"6deb9395117fe71ba9e8a3a3174a96bc5a9544fad0efed56a501cb67b9c3df12","nodeId":"444c1fe0-ffc1-4d7e-8739-1e4a228b8745","outcome":"completed","summary":"Created [launch.json](/home/identitymd/.identitymd/work/f95cc590-c5c3-4fb5-b81d-7803a1eb4be1/444c1fe0-ffc1-4d7e-8739-1e4a228b8745/launch.json) with only `OuroborosPress` and empty constructor arguments.\n\nManifest structure and compiled constructor ABI checks passed. Offline `forge build` succeeded; all 32 tests passed with the supplied fuzz seed.\n\nOnly `launch.json` is changed for submission.","treeHash":"adcbe59186bb1a9764ae9ea3b82a3d442843b1ed","usage":{"cachedInputTokens":239104,"inputTokens":34743,"model":"gpt-6-astra","outputTokens":2871,"runtime":"codex","turns":3,"wallClockMs":81862}}],"verification":[{"checks":[{"durationMs":1617,"exitCode":0,"name":"build","output":"Compiling 44 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.53s\nCompiler run successful!\n","passed":true},{"durationMs":418,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 32 tests for test/OuroborosPress.t.sol:OuroborosPressTest\n[PASS] testFuzz_bodyStaysValidJsonForAnyUri(bytes) (runs: 256, μ: 1111563, ~: 1109797)\n[PASS] testFuzz_chapterCountAndUriLength(uint256,uint256) (runs: 256, μ: 4894575, ~: 4558966)\n[PASS] test_blockedTokenSkipsBountyButKeepsChapter() (gas: 647304)\n[PASS] test_commissionPullsExactlyPriceAndSetsBusy() (gas: 564225)\n[PASS] test_commissionWithoutBalanceReverts() (gas: 158599)\n[PASS] test_constructorWiresRobinhoodConstants() (gas: 60275)\n[PASS] test_deliveryStoresChapterPaysBountyClearsBusy_under150kGas() (gas: 847942)\nLogs:\n  onResult gas, 200-byte uri, first chapter (cold, bounty paid): 109491\n\n[PASS] test_deliveryWithEmptyBalanceSkipsBountyWithoutReverting() (gas: 668691)\n[PASS] test_donateWorks() (gas: 669812)\n[PASS] test_emptyUriCountsAsInscribed() (gas: 1461835)\n[PASS] test_expensiveTokenSkipsBountyButKeepsChapterUnderStipend() (gas: 821275)\nLogs:\n  onResult gas when the bounty transfer runs out of gas: 155146\n\n[PASS] test_failureCooldownDoublesAndCaps() (gas: 3602322)\n[PASS] test_inscribeChecksHashAndChainsChapters() (gas: 2171652)\n[PASS] test_intakeCannotCommission() (gas: 115003)\n[PASS] test_onFailureClearsStateAndCounts() (gas: 1261759)\nLogs:\n  onFailure gas (first failure, cold): 63862\n\n[PASS] test_onFailureFromStrangerReverts() (gas: 477289)\n[PASS] test_onResultAt512ByteUriFitsStipend() (gas: 878332)\nLogs:\n  onResult gas, 512-byte uri: 111984\n\n[PASS] test_onResultFromStrangerReverts() (gas: 477192)\n[PASS] test_onResultWhenIdleReverts() (gas: 38150)\n[PASS] test_onResultWithWrongRequestIdReverts() (gas: 557552)\n[PASS] test_overlongUriIsNotQuoted() (gas: 1684129)\n[PASS] test_previewBodyIsValidCompactJson() (gas: 1092586)\nLogs:\n  previewBody bytes: 610\n  {\"objective\":\"Write chapter 1 of The Ouroboros Press, a book that a smart contract on Robinhood Chain (chain id 4663) is writing about itself. The contract is at 0xf62849f9a0b5bf2913b396098f7c7019b51a820a. It holds 1020000000000000000 IMD in wei (18 decimals). Chapters published before this one: 0. The previous chapter is at none. Describe what this contract is, what it has done so far, what a reader should know about a machine that pays agents to document itself, and end with one question the next chapter should answer. 300 to 600 words, plain prose, no headings.\",\"skill\":\"research-report\",\"ipfs\":true}\n\n[PASS] test_previewBodyWorstCaseLength() (gas: 1616256)\n[PASS] test_receiveRevertsAndNoFallback() (gas: 86352)\n[PASS] test_reentrancyFromMaliciousIntakeFails() (gas: 329055)\n[PASS] test_relativeIntakeResultUriIsQuotedWithApiHost() (gas: 1356101)\n[PASS] test_resetBeforeTimeoutReverts_afterTimeoutSucceeds() (gas: 689699)\n[PASS] test_secondCommissionWhileBusyReverts() (gas: 475336)\n[PASS] test_selectorsEqualDocumentedConstants() (gas: 504017)\n[PASS] test_setIntakeIsLockedForEveryone() (gas: 58837)\n[PASS] test_spoofedCallbacksThroughIntakeAreRefused() (gas: 712779)\n[PASS] test_unquotableUriKeepsBodyValidJson() (gas: 1646164)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 299.69ms (384.52ms CPU time)\n\nRan 1 test suite in 300.51ms (299.69ms CPU time): 32 tests passed, 0 failed, 0 skipped (32 total tests)\n","passed":true},{"durationMs":42,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"OuroborosPress.commission()\",\"OuroborosPress.donate(uint256)\",\"OuroborosPress.inscribe(uint256,string)\",\"OuroborosPress.onFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"OuroborosPress.onResult(bytes32,bytes32,string)\",\"OuroborosPress.receive()\",\"OuroborosPress.reset()\",\"OuroborosPress.setIntake(address)\"],\"files\":{\".gitignore\":8,\"LICENSE\":21,\"README.md\":322,\"THREAT-MODEL.md\":87,\"foundry.toml\":32,\"launch.json\":10,\"remappings.txt\":2,\"script/PreviewBody.s.sol\":45,\"scripts/00-wallet.sh\":230,\"scripts/01-import.sh\":26,\"scripts/02-check-launch-body.sh\":28,\"scripts/02b-check-job-body.sh\":32,\"scripts/03-approve-intake.sh\":24,\"scripts/04-launch.sh\":35,\"scripts/05-watch-launch.sh\":74,\"scripts/06-fund-contract.sh\":42,\"scripts/07-commission.sh\":40,\"scripts/08-status.sh\":31,\"scripts/09-inscribe.sh\":33,\"scripts/10-verify.sh\":17,\"scripts/11-reset.sh\":25,\"scripts/12-demo.sh\":349,\"scripts/lib.sh\":325,\"src/OuroborosPress.sol\":395,\"src/interfaces/IIntakeV2.sol\":54,\"test/OuroborosPress.t.sol\":655,\"test/fork/OuroborosPress.fork.t.sol\":63,\"test/mocks/MaliciousIntake.sol\":49,\"test/mocks/MockIMD.sol\":40,\"test/mocks/MockIntake.sol\":126},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6deb9395117fe71ba9e8a3a3174a96bc5a9544fad0efed56a501cb67b9c3df12","verifiedTreeHash":"adcbe59186bb1a9764ae9ea3b82a3d442843b1ed","verifierVersion":"0.1.0+560ab6a2"}]}