{"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":"51c02cc0-b08e-4f3c-ab69-03ad39344ffb","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"3ac6d6377afcf40c83fbc0c4728752787979ebc714f8f2c07c9026d4b01ad99a","dependsOn":["build_contract_project","write_foundry_tests"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","tools":[]},"key":"adversarial_review","kind":"code","role":"review","skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","state":"accepted"},{"acceptedSubmissionHash":"d9f9a9d511dafc90efd1910be849486667442817c52feafdefcca03c4a65e085","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"bd88bb982fed6eb478056ea4602640d48a3b1e1c8af82b93d2958bdb9dcd2678","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"ff1fad07fad3b8e08a71e9c5201fd632e161ed8163eb407676ea8b0bedbe179e","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"ff1fad07fad3b8e08a71e9c5201fd632e161ed8163eb407676ea8b0bedbe179e","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Build OrderBook (src/OrderBook.sol), an on-chain limit-order book for one ERC-20 base token against one ERC-20 quote token with price-time priority, partial fills and cancels, then independent invariant tests and a review. Local only: do not deploy; tests use two 18-decimal mock ERC-20s.\n\nUnits: constructor(address base, address quote, uint256 tickSize, uint256 minBaseAmount), immutable, non-zero, base != quote, and minBaseAmount x tickSize >= 1e18 so every fill is worth at least 1 quote unit. A price is quote units per 1e18 base units, a positive multiple of tickSize. Orders are at least minBaseAmount of base. A fill's quote is floor(fillBase x makerPrice / 1e18), paid by the buyer and credited to the seller.\n\nplace(bool isBuy, uint256 price, uint256 baseAmount, bool immediateOrCancel) returns orderId (from 1). It escrows first (a sell: baseAmount of base; a buy: ceil(baseAmount x price / 1e18) of quote, always enough since each fill is floored at a price no worse than the limit), then matches the opposite side best price first and oldest first within a level, at the maker's price, touching at most MAX_FILLS = 32 resting orders. The remainder then rests at the tail of its level only if it no longer crosses the book, is at least minBaseAmount and immediateOrCancel is false; otherwise it is released at once (so the fill cap can never leave a crossed book, and a market order is IOC with a far limit). A maker remainder below minBaseAmount is also released, so no dust rests. Self-trades settle like any other fill.\n\nSettlement is pull-based: nothing leaves the contract during matching. Fills credit claimable balances (base to the buyer, quote to the seller); a buy order's unused quote escrow is credited when it completes, is cancelled or is released. withdraw(token) pays the caller's whole claimable balance. cancel(orderId): maker only (NotMaker), open only (NotOpen), credits the remaining escrow. Deposits check the received balance and revert on fee-on-transfer tokens.\n\nStructure: per side, a sorted doubly-linked list of non-empty price levels, each a FIFO queue; empty levels are unlinked. A new level is inserted by walking from the best price, at most MAX_LEVEL_WALK = 64 levels, reverting TooDeep beyond that (bounded gas, no hints). Views: bestBid(), bestAsk() (0 when empty), order(id) (maker, isBuy, price, remaining base, remaining quote escrow, status Open|Filled|Cancelled), nextLevel(isBuy, price), claimable(account, token). Events OrderPlaced, Filled(makerOrderId, takerOrderId, price, baseAmount, quoteAmount), OrderCancelled, Withdrawn. No owner, fee, pause or ETH.\n\nEdge cases to test: an order filled completely on entry never rests; one order crossing several levels; 33 resting orders at one level (the cap stops at 32 and the crossing remainder is released, not rested); IOC against an empty book; cancel by a non-maker or of a closed order; off-tick price or below minBaseAmount; a buy finishing with unused escrow; insertion 65 levels deep reverts.","parentJobId":null,"planHash":"e758d90fab836876c343118f192afc554ad8721670b73ef7935e9b98aba51445","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"51c02cc0-b08e-4f3c-ab69-03ad39344ffb","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-280-build-orderbook-src-orderbook-sol-on-cha"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51023","feedbackHash":"cb91d030a9d1f1bad9ed60b7a31fd23d03f72a06e895f0dd5fb83eeb090d189a","nodeKey":"adversarial_review","submissionHash":"3ac6d6377afcf40c83fbc0c4728752787979ebc714f8f2c07c9026d4b01ad99a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50971","feedbackHash":"308f088b26dfe5aa8b67a013f85a199fb6dd5798dd5ec18ee31495696457bd4f","nodeKey":"build_contract_project","submissionHash":"d9f9a9d511dafc90efd1910be849486667442817c52feafdefcca03c4a65e085","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50971","feedbackHash":"c3df028cdc7a93453a1669c5ac7386ebcec9996e5bf9efcdcac1c563855f7460","nodeKey":"write_foundry_tests","submissionHash":"bd88bb982fed6eb478056ea4602640d48a3b1e1c8af82b93d2958bdb9dcd2678","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"6581a035ae84c61d0da9bf298a614d95c4061255f45f82bba84036f6e0aec2bb","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ca080fd306399669","findings":[{"description":"PROVENANCE.md records the vendored Math.sol SHA-256 as a6ee779fc42e6bf01b5e6a963065706e882b016affbedfd8be19a71ea48e6e15 and states 'The dependency is unchanged'. docs/REVIEW.md line 38 states 'Vendored source/license checksums matched the provenance record.' The committed file hashes to 370229dde74ae1e02df304c97851ac561c632c6c9985c3c2d816a98d711751e0. Diffing against upstream v5.0.2 shows the only change is a forge-fmt line wrap of the four-argument mulDiv signature (line 207), so the code is semantically identical and no arithmetic behaviour is affected. The defect is that the provenance record and the review's verification statement cannot both be true of the committed tree, so anyone re-running the documented integrity check gets a mismatch and cannot distinguish a formatting change from a tampered dependency. Fix: either restore the byte-exact upstream file (and exclude lib/ from forge fmt) or update the recorded hash and the 'unchanged' wording.","line":8,"path":"lib/openzeppelin-contracts/PROVENANCE.md","reproduction":"Run `sha256sum lib/openzeppelin-contracts/contracts/utils/math/Math.sol` in the repository root. Expected (per PROVENANCE.md): a6ee779fc42e6bf01b5e6a963065706e882b016affbedfd8be19a71ea48e6e15. Actual: 370229dde74ae1e02df304c97851ac561c632c6c9985c3c2d816a98d711751e0. `curl -sL https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/v5.0.2/contracts/utils/math/Math.sol | sha256sum` yields the recorded hash, and `diff` against the vendored copy shows only the wrapped signature at line 207.","severity":"low","title":"Vendored Math.sol checksum does not match PROVENANCE.md; REVIEW.md's 'checksums matched' claim is false"},{"description":"The only tests that reach the 32-fill cap (testFuzzFillCapReleasesCrossingRemainder, testFuzzFillCapMayRestUncrossedRemainder) put all resting makers on a single price level, so the branch where the cap is hit while levels are being emptied and unlinked mid-loop (bestBid/bestAsk advancing through _unlink, then the crossing remainder released against a still-crossing 33rd level) is never exercised. The case where the remainder after exactly 32 fills is below minBaseAmount (dust released rather than cap release) is also untested. Instrumenting BookHandler._compareTrades with `require(seen < N)` shows the OrderBookInvariant campaign (256 runs x 100 actions) fails at N=4 but passes at N=6 and N=8, i.e. no random placement ever touched more than 5 makers; the 32-cap and 64-walk paths are therefore covered only by deterministic single-level tests, as ORDERBOOK_REVIEW.md acknowledges. I reproduced the untested scenarios in a scratch harness and the implementation behaves correctly (32 fills across 32 one-tick levels cost 2,375,852 gas; remainder released; bestAsk equals the 33rd level; conservation exact), so this is a coverage gap, not a defect.","line":173,"path":"test/OrderBook.t.sol","reproduction":"Untested scenario (verified correct in scratch harness, tick=1e16, min=100): BOB places 33 asks at prices (i+1)*1e16 for i in 0..32, each 100 base; ALICE places buy(price=40e16, base=3400, ioc=false). Expected and actual: 32 Filled events, order 34 status Cancelled with remaining 0, bestAsk()==33e16, bestBid()==0, book base balance == 100 (order 33) + 0 claimable, quote balance == sum of 32 floored fills + ALICE's refund. Dust variant: 33 asks at 101e16 x 100 base; ALICE buy(101e16, 3201): after 32 fills remainder 1 < min, order Cancelled, ALICE quote claimable == 2 (3234 escrow - 3232 paid), order 33 still Open. Neither appears in test/ or is reachable by the invariant handlers (max observed fills per placement: 5).","severity":"info","title":"Fill cap (MAX_FILLS) across multiple price levels and post-cap dust release are untested; invariant campaigns never exceed 5 fills per placement"},{"description":"The TooDeep bound is the requested design ('bounded gas, no hints') and README documents that the walk cap can prevent deep insertion, so this is recorded as an operational observation rather than a defect. The concrete cost is worth stating: with the test parameters (tick 1e16, minBaseAmount 100) an attacker who rests 64 minimum-size bids at consecutive ticks just below the best bid locks only 4,320 quote wei in total, all recoverable by cancel, and thereafter any bid more than 64 ticks below the best reverts TooDeep for every user until the attacker cancels or is filled. The same holds for asks placed just above the best ask. Inserting at a better price than the spam is unaffected (walk length 0), and appending to an existing deep level needs no walk. A 64-level walk costs 405,077 gas for the inserter, which is bounded as specified. Any mitigation (price hints, larger minBaseAmount, coarser tick) is a design or parameter decision outside this review's scope.","line":243,"path":"src/OrderBook.sol","reproduction":"tick=1e16, min=100. BOB: place(false, 200e16, 100, false). CAROL: place(true, 100e16, 100, false). ALICE: for i in 0..63 place(true, (99-i)*1e16, 100, false) (total quote locked: 4,320 wei). CAROL: place(true, 30e16, 1e24, false). Expected by spec: revert TooDeep. Actual: revert TooDeep; CAROL cannot rest any bid at or below 35e16 while ALICE's 64 levels stand. Verified in scratch harness.","severity":"info","title":"Design-inherent level-walk griefing: 64 dust-sized bids block every deeper bid for negligible, fully recoverable capital"}],"hash":"3ac6d6377afcf40c83fbc0c4728752787979ebc714f8f2c07c9026d4b01ad99a","nodeId":"221a9fe5-c384-4532-b3f1-ee791a2981b9","outcome":"completed","summary":"The findings file is written and is excluded from git by the repository's own info/exclude, so the tracked working tree is unchanged. Review complete.\n\n**Outcome: no high or medium defect found.** The implementation held under every attack in the assignment. I ran the existing 29 tests (all pass) plus a scratch harness in /tmp that I have since deleted.\n\nWhat I checked and how it held:\n\n- **Rounding across many partial fills.** Buyer escrow is ceil at the limit and each fill floors at a price no worse than the limit, so remaining escrow never underflows and always covers the remainder. 200 IOC buys of 101 base against one sell at 1.01 left the seller 2 wei short of the unrounded ideal, which is the specified floor behaviour. A buy maker hit by 90 partial fills then cancelled refunded exactly ceil minus the sum of floors.\n- **Fill cap and rest-or-release.** 32 fills across 32 one-tick levels with a 33rd still crossing released the remainder, advanced the best pointer correctly, and cost about 2.4M gas. A remainder that is dust after exactly 32 fills is released, not rested. A partially filled taker always rests as the new best, so the walk bound can never revert a transaction after fills.\n- **Level walk.** Verified the 64-pass / 65th-revert boundary and measured a full walk at about 405k gas.\n- **Dust release, cancel ordering, credit conservation.** Maker and taker dust are released with rounding surplus refunded. Cancel after a partial fill returns only the remainder. Claimable plus open escrow equalled contract balance after every scenario.\n\nFindings written to .imd-findings.json, ranked:\n\n1. **Low.** The vendored Math.sol hash does not match PROVENANCE.md, and docs/REVIEW.md claims the checksums matched. The only diff against upstream v5.0.2 is a forge-fmt line wrap, so the arithmetic is unaffected, but the integrity claim is false as committed.\n2. **Info.** The fill cap is only tested on a single price level. The cap-across-levels and post-cap-dust paths have no test, and the invariant campaign never touches more than 5 makers per placement. I verified both paths behave correctly, so this is a coverage gap.\n3. **Info.** Level-walk griefing is design-inherent and documented, but the cost is worth knowing: 64 minimum-size bids locking 4,320 quote wei block every bid more than 64 ticks below the best.","treeHash":null,"usage":{"cachedInputTokens":1153985,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":35427,"runtime":"claude","turns":28,"wallClockMs":1024152}},{"artifacts":[],"attempt":1,"bundleHash":"5a7b2ff9bbc5557af4ccf4673a690e1ec752feb6b3ceeabfb4abc4e3ec32786a","device":"35c52a5b502e847c","findings":[],"hash":"bd88bb982fed6eb478056ea4602640d48a3b1e1c8af82b93d2958bdb9dcd2678","nodeId":"b3627bfa-1ef9-45f5-953b-55f4d80c36e8","outcome":"completed","summary":"Added independent handler invariants for exact solvency, FIFO integrity, withdrawal limits, and failure paths. Both suites use inline settings of 256 runs and depth 100.\n\n`forge build` and `forge test` passed: **29 tests**, including **51,200 invariant actions**, with zero unexpected reverts.\n\nReview recorded in `test/ORDERBOOK_REVIEW.md`; no reproducible unresolved defects found. All changes are under `test/`.","treeHash":"c638b0b210fc2bc6ddc53c4ff59cf97d2dcb67ba","usage":{"cachedInputTokens":683520,"inputTokens":50134,"model":"gpt-6-astra","outputTokens":13480,"runtime":"codex","turns":6,"wallClockMs":517640}},{"artifacts":[],"attempt":1,"bundleHash":"edb4df52aaa74eb9bfd25e81d071429096807a36131978815181c94fb4df8b0a","device":"35c52a5b502e847c","findings":[],"hash":"d9f9a9d511dafc90efd1910be849486667442817c52feafdefcca03c4a65e085","nodeId":"ba6422fe-e27d-4f4e-a67c-8a23a0b2be08","outcome":"completed","summary":"Implemented the order book, behavioral tests, independent reference-model invariants, operational documentation, and a local security review.\n\nVerified with Solidity 0.8.26:\n\n- `forge build` passed.\n- `forge test` passed: 27 tests, including 12,288 invariant actions.\n- `forge fmt --check` passed.\n\nNothing was deployed. The review documents assumptions and limitations; it is not an independent external audit.","treeHash":"dab194dcb396b2e2f8626f748b1e077593993b94","usage":{"cachedInputTokens":648704,"inputTokens":50059,"model":"gpt-6-astra","outputTokens":29539,"runtime":"codex","turns":7,"wallClockMs":946185}}],"verification":[{"checks":[{"durationMs":971,"exitCode":0,"name":"build","output":"Compiling 7 files with Solc 0.8.26\nSolc 0.8.26 finished in 916.59ms\nCompiler run successful!\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/helpers/MockERC20.sol:81:50\n   │\n81 │             callbackError = result.length >= 4 ? bytes4(result) : bytes4(0);\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\n","passed":true},{"durationMs":48837,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 26 tests for test/OrderBook.t.sol:OrderBookTest\n[PASS] testCancelAuthorizationAndClosedOrders() (gas: 591016)\n[PASS] testConstructorAndEmptyViews() (gas: 36334)\n[PASS] testCrossesSeveralLevelsInPriceTimeOrder() (gas: 724927)\n[PASS] testFilledOnEntryNeverRestsAndUsesMakerPrice() (gas: 426905)\n[PASS] testFullPrecisionEscrowAndFill() (gas: 407936)\n[PASS] testFullPrecisionRoundingRefund() (gas: 423436)\n[PASS] testFuzzFalseAndRevertingDepositsRollback(bool,bool) (runs: 256, μ: 104176, ~: 104164)\n[PASS] testFuzzFillCapMayRestUncrossedRemainder(bool) (runs: 256, μ: 4806840, ~: 5058669)\n[PASS] testFuzzFillCapReleasesCrossingRemainder(bool) (runs: 256, μ: 4833741, ~: 5085584)\n[PASS] testFuzzIOCEmptyAndPartial(bool) (runs: 256, μ: 508587, ~: 500714)\n[PASS] testFuzzInexactDepositsRejected(bool,bool) (runs: 256, μ: 113722, ~: 113873)\n[PASS] testFuzzLevelWalk64Succeeds65RevertsAtomically(bool) (runs: 256, μ: 12353472, ~: 11699814)\n[PASS] testFuzzMakerDustReleased(bool) (runs: 256, μ: 412666, ~: 412651)\n[PASS] testFuzzNoReturnTokensSupported(bool) (runs: 256, μ: 275561, ~: 267684)\n[PASS] testFuzzQueueMiddleHeadTailAndLevelReinsertion(bool) (runs: 256, μ: 1005373, ~: 958407)\n[PASS] testFuzzReentrancyBlockedOnDepositAndWithdrawal(uint8) (runs: 256, μ: 364131, ~: 347961)\n[PASS] testFuzzTakerDustCannotMakeZeroQuoteFill(bool) (runs: 256, μ: 556165, ~: 565899)\n[PASS] testInvalidConstructors() (gas: 1711794)\n[PASS] testInvalidOrdersAndMissingAllowance() (gas: 75754)\n[PASS] testPartiallyFilledHeadRetainsPriority() (gas: 657525)\n[PASS] testPlacedCancelledWithdrawnEvents() (gas: 273059)\n[PASS] testRoundingRefundForBuyMakerOnCompletion() (gas: 530357)\n[PASS] testSelfTradeConservesBothTokens() (gas: 445518)\n[PASS] testSellTakerBestBidFirstAndPartialBuyRefund() (gas: 779980)\n[PASS] testUnrepresentableEscrowRevertsBeforeDeposit() (gas: 25883)\n[PASS] testWithdrawAllOnlyCallerAndRetryFailure() (gas: 310017)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 235.76ms (1.20s CPU time)\n\nRan 2 tests for test/invariant/OrderBookSolvencyInvariant.t.sol:OrderBookSolvencyInvariantTest\n[PASS] invariant_exactSolvencyAndReachableFIFO() (runs: 256, calls: 25600, reverts: 0)\n\n╭-----------------+----------+-------+---------+----------╮\n| Contract        | Selector | Calls | Reverts | Discards |\n+=========================================================+\n| SolvencyHandler | cancel   | 6410  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| SolvencyHandler | place    | 6368  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| SolvencyHandler | reject   | 6341  | 0       | 0        |\n|-----------------+----------+-------+---------+----------|\n| SolvencyHandler | withdraw | 6481  | 0       | 0        |\n╰-----------------+----------+-------+---------+----------╯\n\n[PASS] testRejectedActionsPreserveLiveBookAndCredits() (gas: 7055055)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 27.39s (27.41s CPU time)\n\nRan 1 test for test/invariant/OrderBookInvariant.t.sol:OrderBookInvariantTest\n[PASS] invariant_matchesModelStructuresAndConservation() (runs: 256, calls: 25600, reverts: 0)\n\n╭-------------+----------+-------+---------+----------╮\n| Contract    | Selector | Calls | Reverts | Discards |\n+=====================================================+\n| BookHandler | cancel   | 6410  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| BookHandler | donate   | 6341  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| BookHandler | place    | 6368  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| BookHandler | withdraw | 6481  | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 48.77s (48.77s CPU time)\n\nRan 3 test suites in 48.77s (76.40s CPU time): 29 tests passed, 0 failed, 0 skipped (29 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"bd88bb982fed6eb478056ea4602640d48a3b1e1c8af82b93d2958bdb9dcd2678","verifiedTreeHash":"c638b0b210fc2bc6ddc53c4ff59cf97d2dcb67ba","verifierVersion":"0.1.0+ff982c0f"},{"checks":[{"durationMs":619,"exitCode":0,"name":"build","output":"Compiling 6 files with Solc 0.8.26\nSolc 0.8.26 finished in 577.02ms\nCompiler run successful!\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/helpers/MockERC20.sol:81:50\n   │\n81 │             callbackError = result.length >= 4 ? bytes4(result) : bytes4(0);\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://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\n","passed":true},{"durationMs":26111,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 26 tests for test/OrderBook.t.sol:OrderBookTest\n[PASS] testCancelAuthorizationAndClosedOrders() (gas: 591016)\n[PASS] testConstructorAndEmptyViews() (gas: 36334)\n[PASS] testCrossesSeveralLevelsInPriceTimeOrder() (gas: 724927)\n[PASS] testFilledOnEntryNeverRestsAndUsesMakerPrice() (gas: 426905)\n[PASS] testFullPrecisionEscrowAndFill() (gas: 407936)\n[PASS] testFullPrecisionRoundingRefund() (gas: 423436)\n[PASS] testFuzzFalseAndRevertingDepositsRollback(bool,bool) (runs: 256, μ: 104199, ~: 104164)\n[PASS] testFuzzFillCapMayRestUncrossedRemainder(bool) (runs: 256, μ: 4776129, ~: 4534538)\n[PASS] testFuzzFillCapReleasesCrossingRemainder(bool) (runs: 256, μ: 4803028, ~: 4561423)\n[PASS] testFuzzIOCEmptyAndPartial(bool) (runs: 256, μ: 509547, ~: 517101)\n[PASS] testFuzzInexactDepositsRejected(bool,bool) (runs: 256, μ: 113730, ~: 113873)\n[PASS] testFuzzLevelWalk64Succeeds65RevertsAtomically(bool) (runs: 256, μ: 12433186, ~: 13060273)\n[PASS] testFuzzMakerDustReleased(bool) (runs: 256, μ: 412668, ~: 412684)\n[PASS] testFuzzNoReturnTokensSupported(bool) (runs: 256, μ: 276522, ~: 284080)\n[PASS] testFuzzQueueMiddleHeadTailAndLevelReinsertion(bool) (runs: 256, μ: 1011100, ~: 1056158)\n[PASS] testFuzzReentrancyBlockedOnDepositAndWithdrawal(uint8) (runs: 256, μ: 366529, ~: 347961)\n[PASS] testFuzzTakerDustCannotMakeZeroQuoteFill(bool) (runs: 256, μ: 554978, ~: 545641)\n[PASS] testInvalidConstructors() (gas: 1711794)\n[PASS] testInvalidOrdersAndMissingAllowance() (gas: 75754)\n[PASS] testPartiallyFilledHeadRetainsPriority() (gas: 657525)\n[PASS] testPlacedCancelledWithdrawnEvents() (gas: 273059)\n[PASS] testRoundingRefundForBuyMakerOnCompletion() (gas: 530357)\n[PASS] testSelfTradeConservesBothTokens() (gas: 445518)\n[PASS] testSellTakerBestBidFirstAndPartialBuyRefund() (gas: 779980)\n[PASS] testUnrepresentableEscrowRevertsBeforeDeposit() (gas: 25883)\n[PASS] testWithdrawAllOnlyCallerAndRetryFailure() (gas: 310017)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 196.50ms (924.75ms CPU time)\n\nRan 1 test for test/invariant/OrderBookInvariant.t.sol:OrderBookInvariantTest\n[PASS] invariant_matchesModelStructuresAndConservation() (runs: 128, calls: 12288, reverts: 0)\n\n╭-------------+----------+-------+---------+----------╮\n| Contract    | Selector | Calls | Reverts | Discards |\n+=====================================================+\n| BookHandler | cancel   | 3066  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| BookHandler | donate   | 3164  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| BookHandler | place    | 3073  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| BookHandler | withdraw | 2985  | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 26.07s (26.07s CPU time)\n\nRan 2 test suites in 26.07s (26.26s CPU time): 27 tests passed, 0 failed, 0 skipped (27 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d9f9a9d511dafc90efd1910be849486667442817c52feafdefcca03c4a65e085","verifiedTreeHash":"dab194dcb396b2e2f8626f748b1e077593993b94","verifierVersion":"0.1.0+ff982c0f"}]}