{"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":"c140dddb-9db7-44ae-8adb-62d5b2163712","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"70c605ac6b01ccb05f66e1533095e7fecb453eb9ce22d2c25265f2b7548ac06b","dependsOn":["audit_imported_code"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","tools":[]},"key":"adapt_contract_project","kind":"code","role":"implement","skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","state":"accepted"},{"acceptedSubmissionHash":"8b74403416f43d612a9df2c042d59f4c764b35d126a73be91c9613e3e19c8be6","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"ee4bed81b09967127ce5ffe7fcdc94321112ebd4f737a701bdd24300821b2131","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"f0f1cda5282d9ce38ae273e5083cf00e2ebeec236985d8c7988e0a7b670d9c30","dependsOn":[],"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":"e34c190dc780bcaf943ccde9dafd9fac209c91200e20747c50aa055a08ae39d3","dependsOn":["adapt_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"f18240f70fbcb7923c25e6112ac9945dc5e3a778e45861c53c8582e01f75b604","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"85a5ad868a8d4a8a4f43e1ace817fa5993ee6b320bba46a6cad7b86c90c5d656","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"521e7b6d9711b05f71f90164bd6c948adc665d251c638f876c33cffdb02a2ded","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"8eb3a4b566643ab14f30e644c51e606c5584e4b9cb5bdefc770b485904e3615c","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Start from this repository's audited Verdict contracts with settler rewards (src/VerdictBurnVault.sol, src/VerdictOracle.sol, src/VerdictMarkets.sol and their tests, deployed on Sepolia as launch 1296). Let each market take bets in one of two collateral tokens, IMD or WETH, while bounties, oracle fees and settler rewards stay in IMD. Change nothing else in behaviour. Re-run every existing test, add the new ones below, run an independent review, then deploy all three on Sepolia (chain 11155111) in the order VerdictBurnVault, VerdictOracle, VerdictMarkets. Leave web/ and dist/ untouched.\n\nWhy: IMD's oracle is paid only in IMD, so today a market can only take bets in IMD. Bettors should be able to use ETH (as WETH) without holding IMD, while every market still buys its answer with IMD.\n\nCollateral in VerdictMarkets:\n- Exactly two collateral slots, fixed at construction and never changeable: slot 0 and slot 1, each with token, creatorFeeBps, burnFeeBps, treasuryFeeBps (sum at most 500) and maxPoolPerMarket (above 0). The two tokens differ and are nonzero. The constructor becomes VerdictMarkets(address oracle, address treasury, address burnSink, address guardian, address token0, uint16 creatorBps0, uint16 burnBps0, uint16 treasuryBps0, uint256 maxPool0, address token1, uint16 creatorBps1, uint16 burnBps1, uint16 treasuryBps1, uint256 maxPool1, uint256 maxSettlerReward). Getters collateralConfig(uint8) and the existing fee getters become per slot.\n- Params gains uint8 collateralId (0 or 1, appended last); createMarket reverts on any other value. The market stores its collateral token. MarketCreated appends address collateral.\n- bet, claim, refunds, the pool cap and the fee split use the market's collateral token and that slot's fees and cap. A zero burn share sends nothing to burnSink.\n- The bounty is pulled in the oracle's asset (IMD) at creation and the market records that bounty token. resolve, escalate and settler rewards pay from it as today, and an ask reverts with OracleAssetMismatch if the oracle's asset no longer equals the market's bounty token. Unspent bounty returns to the creator in the bounty token.\n- Accounting per market: in the collateral token, payouts + refunds + fees == deposits with no dust; in the bounty token, oracle spend + settler rewards + returned bounty == bounty. When both are IMD the two ledgers stay separate and the contract's IMD balance equals their sum across markets.\n- WETH is a plain ERC-20 here: no native ETH, no receive or fallback.\n- agentId stays a caller-supplied label, not a verified identity; say so in NatSpec.\n\nDocs: add docs/AGENTS.md, a plain guide for AI agents and their operators: finding markets from events, reading a market and its bodies, betting in IMD or WETH with an agentId, earning settler rewards (resolve; propose with the attestation decoded from the delivery transaction's Intake.complete calldata; finalize; voidMarket), claiming, and the exact ABIs and addresses file to use.\n\nNew tests: markets in each slot with their own fees and caps; a WETH market's fees, payouts and refunds in WETH while its bounty, oracle spend and rewards are in IMD; an IMD market keeps both ledgers separate; collateralId out of range reverts; constructor rejects equal or zero tokens, zero caps and fees over 500; burn share zero sends nothing; OracleAssetMismatch when the oracle's asset changes; the full lifecycle invariant for both slots with settler rewards.\n\nSepolia only. GitHub publication is approved. Contracts only: no token, no pool, no proxy. Constructor arguments: VerdictBurnVault(); VerdictOracle(0xa43e6f75ee006411f79ac1c84120606c2330de82, 0x44a1cd38474fb1748400e7deb5f8d786cce3f89a, 0x5598aa9146215bc13eb26f2c692ad1461fd32982, 0x6f7261636c652e72657175657374406f7261636c652d31000000000000000000, 500000000000000000, $owner, 0); VerdictMarkets($contract:VerdictOracle, $owner, $contract:VerdictBurnVault, $owner, 0x44a1cd38474fb1748400e7deb5f8d786cce3f89a, 150, 50, 50, 500000000000000000000, 0xfff9976782d46cc05630d1f6ebab18b2324d6b14, 150, 0, 100, 1000000000000000000, 250000000000000000). Slot 0 is test IMD (1.5% creator, 0.5% burn, 0.5% treasury, 500 IMD cap); slot 1 is Sepolia WETH (1.5% creator, no burn, 1% treasury, 1 WETH cap). The owner is 0x397dacb1ee8e9a8ce5196988958f56bde0a0a312. Solidity 0.8.26, OpenZeppelin v5 as vendored.","parentJobId":null,"planHash":"eeff83292c2c2eebf1b8f4cc98cae9b4d87eea7187c14fdd4199ff3745c10633","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"c140dddb-9db7-44ae-8adb-62d5b2163712","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1301-start-repository-s-audited-verdict"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51401","feedbackHash":"240b68d9e85353bfe388be289d755a59848c66dfb73b9e1e539af4e6efb95277","nodeKey":"adapt_contract_project","submissionHash":"70c605ac6b01ccb05f66e1533095e7fecb453eb9ce22d2c25265f2b7548ac06b","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51146","feedbackHash":"0951c202c33ff1cde430e9067269a1c1002627ee134d5aa4a99b6b27947529e5","nodeKey":"audit_economics","submissionHash":"8b74403416f43d612a9df2c042d59f4c764b35d126a73be91c9613e3e19c8be6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52017","feedbackHash":"52dd9607e136100e7c937327ddd35c9f2a4bd0960041e88729db3f0d127efd2a","nodeKey":"audit_flow","submissionHash":"ee4bed81b09967127ce5ffe7fcdc94321112ebd4f737a701bdd24300821b2131","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51401","feedbackHash":"2b9a19fd7c9b76645496a23d63977e3df35f520db84c842888cb4137fc4c2ca1","nodeKey":"audit_imported_code","submissionHash":"f0f1cda5282d9ce38ae273e5083cf00e2ebeec236985d8c7988e0a7b670d9c30","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51154","feedbackHash":"a5bbf35f3c685c2476cc9f37d15fc858230855cd19f4f49dd43654adb709c5f4","nodeKey":"audit_judge","submissionHash":"e34c190dc780bcaf943ccde9dafd9fac209c91200e20747c50aa055a08ae39d3","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51043","feedbackHash":"4ada3b79c10c5a79e59dcd934a035d77986e99c93f184084dec89802d917d02e","nodeKey":"audit_math","submissionHash":"f18240f70fbcb7923c25e6112ac9945dc5e3a778e45861c53c8582e01f75b604","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52179","feedbackHash":"e2284f824b0cce3a6b31226a2a90bcca76de481c040ee424b8ba7354eb5cd5c3","nodeKey":"audit_permissions","submissionHash":"85a5ad868a8d4a8a4f43e1ace817fa5993ee6b320bba46a6cad7b86c90c5d656","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51734","feedbackHash":"c3a8401c9454e6e95ec8adbdf8d08dfcb880f138fa13f40ae3af21404fe0f89a","nodeKey":"manifest","submissionHash":"521e7b6d9711b05f71f90164bd6c948adc665d251c638f876c33cffdb02a2ded","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52478","feedbackHash":"b676deb5f02f546518705b8e63b8c60f556f5b8b101b078c0ea2204271d4d740","nodeKey":"write_foundry_tests","submissionHash":"8eb3a4b566643ab14f30e644c51e606c5584e4b9cb5bdefc770b485904e3615c","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"cbae7e8a6bcf0b1e962b1469d52b037750ed7979dcfcc0fc4808fb7222ecbb22","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"095a89383a0fb0a58b98ba3be588c2ccfb2e653dba4537c86ac567e4ff763bcf","device":"a68191e8efe5b6e4","findings":[],"hash":"521e7b6d9711b05f71f90164bd6c948adc665d251c638f876c33cffdb02a2ded","nodeId":"7898115d-6e8b-4d5c-be28-d2bf10e7394e","outcome":"completed","summary":"Created [launch.json](/home/imd/.identitymd-6/work/c140dddb-9db7-44ae-8adb-62d5b2163712/7898115d-6e8b-4d5c-be28-d2bf10e7394e/launch.json) with the approved deployment order, constructor arguments, and `$owner` references.\n\nValidated against compiled ABIs. `forge build` passed; all 178 tests passed. Only the manifest changed outside permitted scratch files.","treeHash":"4e6a5b0d4449c0f3b7798d6728ec001a59bdbf1b","usage":{"cachedInputTokens":799360,"inputTokens":45127,"model":"gpt-6-astra","outputTokens":6670,"runtime":"codex","turns":5,"wallClockMs":288430}},{"artifacts":[],"attempt":1,"bundleHash":"60cbadf3c93cd10fa2330918c9bfb5f3489f9aacbbd0926b8950d83a731758ee","device":"2ab0b432477fde6c","findings":[],"hash":"70c605ac6b01ccb05f66e1533095e7fecb453eb9ce22d2c25265f2b7548ac06b","nodeId":"1f58e205-d8ce-4a78-a6c6-b6b5a92e22b6","outcome":"completed","summary":"Everything is green and in scope. Build passes, the complete suite passes with 178 tests in 25 suites, and no protected file (foundry config, lib, web, dist, .github) changed.\n\n**What I did**\n\n- **`src/VerdictMarkets.sol`**: two immutable collateral slots set by the 15-argument constructor the brief specifies, with `collateralConfig(uint8)` and per-slot fee and cap getters. `Params` gains `collateralId`, `Market` stores `collateral` and `bountyToken`, and `MarketCreated` appends the collateral address. Bets, payouts, refunds, the cap and the fee split use the market's collateral token; the bounty is pulled in the oracle's asset at creation and every oracle fee, settler reward and bounty return pays from that recorded token. Asks revert `OracleAssetMismatch` if the oracle's asset drifts from it. The two ledgers never mix, and a zero burn share makes no transfer.\n- **Audit findings**: the own-ask outcome shopping finding reproduced, so `propose` now accepts only the market's most recent paid primary ask. The stale 10-argument `launch.json` and parameter library reproduced and are removed and rewritten. The missing `agentId` NatSpec reproduced and is added. The info findings are reproduced as tests or documented, unchanged, as the brief requires. Dispositions are in `ADAPTATION.md`.\n- **Tests**: every existing test is kept; two regression tests that encoded the old \"either ask\" rule are rewritten and say why. New suites cover each brief item: per-slot fees and caps, WETH market ledgers, IMD market ledger separation, out-of-range slot, constructor rejections, zero burn, asset mismatch, plus a stateful lifecycle invariant over both slots with settler rewards.\n- **Review**: a separate pass with six reviewer probes (reentrancy through the collateral token, fee-on-transfer collateral, cross-ledger reach, price rise, payment shapes, bounty token after rotation) and `docs/COLLATERAL_INDEPENDENT_REVIEW.md`. It found no value-moving defect. It is a second pass by this same automated worker, which the report states plainly.\n- **Docs**: `docs/AGENTS.md` for agents and operators, with this build's ABIs exported to `docs/agents/abi/` and `docs/agents/addresses.json`. `README.md` and `docs/DEPLOYMENT.md` carry the new constructor table and accounting.\n\n**What I left out and why**\n\n- **Deployment**: the brief says to deploy on Sepolia, but the launch reference forbids a worker from reading keys or broadcasting. I prepared the exact handoff and left deployment to the launch stage. The three contract addresses in `docs/agents/addresses.json` are `null` until that stage fills them; I invented none.\n- **The web ABIs and addresses** still target the previous launch, untouched as instructed. A later site job must regenerate them.","treeHash":"5f1e920d7f207667fb79aa7f99bb197408619fb1","usage":{"cachedInputTokens":3140602,"inputTokens":674,"model":"claude-fable-5-1","outputTokens":83324,"runtime":"claude","turns":56,"wallClockMs":1636029}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"02f22d6f13810ca8","findings":[],"hash":"85a5ad868a8d4a8a4f43e1ace817fa5993ee6b320bba46a6cad7b86c90c5d656","nodeId":"ebefddf7-80bb-4041-981e-d72bf6441580","outcome":"completed","summary":"Review complete. The findings file is valid JSON and no tracked files were changed.\n\n**Outcome:** no reproducible defect in the assigned area. The review file holds an empty findings list and a coverage row for all 23 listed entry points plus three invariant and deployment rows, each marked `holds`.\n\n**What I covered, in depth**\n\n- **Access control.** Every guardian path (pause, unpause, allowlist, two-step transfer, renounce) has a single writer with the same guard, and renounce is refused while paused or while the allowlist is on, so entry can never be left locked. The oracle's config and ownership paths are owner-only with two-step ownership. The settlement functions are permissionless by design, and pause touches only creation and betting.\n- **Trust gap.** The oracle owner's zero-delay rotation of intake, signer, asset and price cannot reach in-flight value: pending requests keep their recorded intake and signer, markets keep their recorded bounty token, and rewards and bounty returns pay only in that token. Third-party purchases through the oracle are keyed to their own intake id and cannot establish an outcome. I found no unprivileged amplifier for any owner action.\n- **Asymmetry.** The paired windows are complementary at every boundary: propose versus voidMarket at voidAfter, replacement propose and escalate versus finalize at disputeEnds, finalize versus voidMarket on winning stake. The IMD and WETH branches of finalize move the same amounts, the collateral and bounty ledgers never share a writer, and claim's remainder logic cannot underflow.\n\n**Verification done**\n\n- Full suite: 178 tests passed, 0 failed, including the two-slot lifecycle invariants.\n- Exported ABIs in docs/agents/abi match `forge inspect` for all three contracts.\n- Deployment parameters in the script and docs match the brief exactly.\n\n**Known limitations I did not report as defects** because they are pre-existing, documented design choices outside this adaptation's scope: escalation is unavailable once answerUntil passes even if a dispute window is open, voidAfter has no upper bound, and the retry rule can strand a late first answer.","treeHash":null,"usage":{"cachedInputTokens":1330441,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":37591,"runtime":"claude","turns":28,"wallClockMs":1097610}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"824e6de6196c686f","findings":[{"citation":"resolved","description":"The agent guide's market-discovery step says to start the MarketCreated log scan at 'the deployment block in addresses.json'. docs/agents/addresses.json has keys chainId, network, note, contracts, external, collateralSlots and abi only; there is no deployment-block field, and the deployment handoff described in docs/DEPLOYMENT.md says it fills the three null contract addresses, not a block number. An operator following the guide literally has no start block and must either scan from genesis or guess. This is a documentation gap in a brief-required deliverable (docs/AGENTS.md), not a contract defect; it does not move value.","line":43,"path":"docs/AGENTS.md","reproduction":"Read docs/agents/addresses.json: grep for 'block' returns nothing. Read docs/AGENTS.md line 43: it refers to 'the deployment block in addresses.json'. Expected: addresses.json carries a deploymentBlock (or startBlock) entry per contract that the handoff fills alongside the addresses, or AGENTS.md says to scan from the VerdictMarkets deployment transaction's block (readable from the explorer) and not from addresses.json. Actual: the referenced field does not exist.","severity":"info","snippet":"Scan `VerdictMarkets` logs from the deployment block in `addresses.json`:","title":"docs/AGENTS.md tells agents to scan from a deployment block that docs/agents/addresses.json does not define"}],"hash":"8b74403416f43d612a9df2c042d59f4c764b35d126a73be91c9613e3e19c8be6","nodeId":"956cf790-7c4e-4e78-9843-74868e37e1be","outcome":"completed","summary":"The review is complete. The findings file is written, the scratch directory is removed, and the working tree has no stray files.\n\n**Result: no economic, invariant or flow-gap defect in the two-collateral contracts.** The only item reported is an informational documentation gap.\n\nWhat I checked, against the Economic Security, Invariant and Flow Gap guides:\n\n- **Both ledgers per market.** Every collateral debit (payouts, refunds, fees) and every bounty debit (oracle spend, settler rewards, returned bounty) updates its counter before the transfer, in the token the market recorded at creation. The last winner receives the exact remainder, so no dust is left.\n- **Cross-ledger leakage.** I wrote scratch probes that put a WETH-bounty market (created during an oracle asset rotation) beside an IMD-bounty market in slot 1, then settled and drained both. Contract IMD and WETH balances both ended at zero. The shipped fuzz lifecycle over both slots with settler rewards and price changes also passes.\n- **Price and asset changes.** A price rise after the first ask clips the proposer's reward instead of overdrawing the bounty. An asset rotation makes existing markets revert with OracleAssetMismatch on asks while void, refund and bounty return still work in the recorded token.\n- **Retry economics.** Two resolves, a proposal and a finalize never exceed the five-reward budget. The retry rule that refuses a late first answer is the documented fix for prior audit finding 94b4f1d1, so I recorded its liveness cost in coverage rather than as a defect.\n- **Deliverables.** The exported ABI files match the compiled ABIs byte for byte. The full suite passes (178 tests).\n\nThe one reported item: docs/AGENTS.md tells agents to scan logs from \"the deployment block in addresses.json\", but addresses.json defines no such field. Severity info.\n\nTrust assumptions noted in coverage, not as findings: the oracle owner can rotate asset, price and signer with zero delay, which also means a creator's pending WETH approval could be pulled as bounty if the asset were switched to WETH. Both powers come from the brief's constructor arguments.\n\nCoverage: all 23 listed entry points are marked `holds` with reasons, plus three invariant rows and the ABI check. The only `unreached` row is the live Sepolia token and Intake behaviour, since no RPC was used.","treeHash":null,"usage":{"cachedInputTokens":1500159,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":34969,"runtime":"claude","turns":38,"wallClockMs":1084871}},{"artifacts":[],"attempt":1,"bundleHash":"fee78c44c5bf09bde47cd5b7c9a08bc5631fc41db41a7b7c144e063adc3f7ea6","device":"2bdd77125ec75e6c","findings":[],"hash":"8eb3a4b566643ab14f30e644c51e606c5584e4b9cb5bdefc770b485904e3615c","nodeId":"0518ba9a-2f5b-4264-b6db-47034774dabc","outcome":"completed","summary":"Done. The whole suite passes, 198 tests including 20 new ones, and only paths under test/ changed.\n\n**What I added**\n\n- `test/CollateralAdversarial.t.sol` (18 tests). Fuzzed constructor over both slots' fees and caps, checking each slot's 500 bps ceiling and zero-cap rejection independently and the check order. WETH stakes of one wei against a one-wei cap and at the last wei of the launch cap. A stake taxed to zero, bets after close, while paused, on an unknown outcome or id, and a creator with WETH but no IMD. A fuzzed WETH fee split up to 500 bps with stakes down to one wei that must close the WETH ledger with no dust while the bounty ledger closes in IMD. A WETH token that re-enters claim, finalize, voidMarket and bet from every finalize payout. Claim failure paths, refunds while paused, and a price rise that clips rewards without touching the WETH pool. Bounty-token snapshot cases: an IMD-collateral market opened while the oracle's asset is WETH keeps its two ledgers in swapped tokens, a WETH/WETH market pays the creator once, rotation after a proposal still finalizes in the recorded token, and rotation to an unheld token cannot open markets or reach existing custody. Guardian actions leave both slots untouched, no mutator selector exists, and native ETH and unknown selectors are refused.\n- `test/CollateralRotationInvariant.t.sol`. A second invariant campaign, 256 runs of 64 calls, that opens markets during the sequence in either slot while the oracle asset rotates between IMD and WETH and the price moves. All four collateral/bounty pairings coexist. Every token movement is measured in the token it should use, the other token is asserted not to move, and after each call the contract's balance in each token equals that token's pools still owed plus bounties still held. After each sequence everything is settled and claimed and both balances reach zero. A deterministic walk proves the handler reaches all four pairings, the clipped-reward path and WETH-denominated rewards.\n- `test/TESTING.md` gained a section describing the two suites.\n\n**Findings**\n\nNo defect was found, so no `.imd-findings.json` was written. One observation already recorded in the earlier collateral review stands: the bounty token is a snapshot of the oracle's asset at creation, so if the owner rotates the asset to WETH, new markets take their bounty in WETH. The new tests pin that behaviour and show both ledgers still close correctly in that case.\n\n**Not covered**\n\nNo fork runs against live Sepolia Intake, TestIMD or WETH9. The WETH stand-in is a plain ERC-20 with optional fee and reentrancy hook, which is a superset of what WETH9 does.","treeHash":"5ab8224b4a0eaecbe26b4dfaf1b6966569b327eb","usage":{"cachedInputTokens":1920453,"inputTokens":484,"model":"claude-fable-5-1","outputTokens":49947,"runtime":"claude","turns":34,"wallClockMs":1687020}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"27168b1ff68f84d2","findings":[{"citation":"resolved","description":"_recordSettlerReward reserves one more ask's price before paying a resolve or propose reward, but unlike _ask (line 537, `if (oracle.asset() != address(bountyToken)) revert OracleAssetMismatch();`) it does not check that the oracle's asset still equals the market's bounty token. After the owner rotates the oracle to another asset (zero config delay at this launch), the reserve is a number of the new asset's units while bountyRemaining is in the recorded bounty token (IMD). A large nominal price clips an affordable, advertised reward to zero; a tiny nominal price pays the full reward and reserves nothing. No funds leave the two ledgers (the unpaid part returns to the creator at finalize/void), so the impact is a settler not receiving the reward the market advertises, or a reserve that reserves nothing, under owner action. Merged from audit_math. Minimal fix: when oracle.asset() != address(m.bountyToken) no further ask can be bought (every _ask reverts OracleAssetMismatch), so either skip the reserve or treat the remaining ask as unaffordable; compute the reserve from oracle.price() only when the asset matches.","line":559,"path":"src/VerdictMarkets.sol","reproduction":"Fixture TestBase (VerdictOracle asset = IMD, price 0.5e18, configDelay 0; VerdictMarkets maxSettlerReward 0.25e18). 1) creator calls createMarket with settlerReward = 0.25e18, bounty = 2.25e18 (= 2*price + 5*reward), collateralId 0. 2) alice bets 1e18 on outcome 1. 3) warp to answerFrom; resolve(id, body): bountyRemaining = 2.25e18 - 0.5e18 - 0.25e18 = 1.5e18; the attestation a (true, panel 5) is delivered for that intake request. 4) owner calls proposeConfig(Config(intake, OTHER_TOKEN, signer, action, 1e30)) then acceptConfig(). 5) settler calls propose(id, a). Actual: reserve = 1e30 > bountyRemaining, amount = 0, SettlerRewarded(id, settler, 1, 0), settler IMD balance unchanged, bountyRemaining stays 1.5e18 although only 0.5e18 would need reserving and no further ask is even possible. Expected: reward 0.25e18. Mirror: step 4 with price = 1 pays the full 0.25e18 with a 1 wei reserve. Both sequences run green on the current code as test_reserveInRotatedAssetUnitsClipsRewardToZero and test_reserveInRotatedAssetTinyPricePaysFullReward in test/scratch/Review.t.sol.","severity":"low","snippet":"        if (action < 2 && m.asks < 2) reserve = oracle.price();","title":"Settler-reward reserve is read from oracle.price() in whatever asset the oracle currently sells, not the market's bounty token"},{"citation":"resolved","description":"The retry guard treats 'the first request is still pending on chain' as 'no answer exists yet', but the attestation is public (panel page, Intake.complete calldata in the mempool) before it is delivered. Since propose accepts only primaryRequests[asks - 1] (lines 419-424), a retry does not add a second usable answer; it makes the first one unusable. A losing bettor who sees an unfavourable first answer about to land at least 24 h after the ask sends resolve(id, body) with a higher priority fee in the same block: it passes both checks, spends a second oracle price from the creator's bounty, pays the attacker the resolve settlerReward, and the honest attestation delivered one position later is stored by VerdictOracle but refused by propose with UnauthenticatedAnswer. The market is then decided by a fresh panel (or voids and refunds if it never answers), both strictly better for the losing side than the discarded answer. Precondition: the first answer lands >= 24 h after resolve (an oracle outage or backlog; normal latency is minutes), hence low. Merged from audit_flow. Fix direction needs a design decision because VerdictOracle is unchanged byte for byte: bind acceptance to delivery order (e.g. VerdictOracle records the delivery of each intake request and propose accepts the market's paid primary ask whose answer was delivered first, refusing the other), keeping the 94b4f1d1 property that a proposer never picks between two delivered answers.","line":380,"path":"src/VerdictMarkets.sol","reproduction":"TestBase; slot-0 market with settlerReward 0.1e18, bounty 2*PRICE + 0.5e18; alice bets 100e18 on 1, bob bets 100e18 on 0. (1) At answerFrom a settler calls resolve(id, body) -> request RA, asks = 1. (2) The oracle's answer to RA is true (alice wins) but delivery lands 24 h later. (3) In the delivery block bob calls resolve(id, body) first: block.timestamp >= lastPrimaryAsk + 24h and oracle.hasPendingRequest(RA) is still true, so it succeeds -> request RB, asks = 2, bob receives 0.1e18 IMD (SettlerRewarded action 0), creator's bounty pays a second 0.5e18. (4) RA's attestation aA is delivered: oracle.answerOf(aA) == keccak256(body), but markets.propose(id, aA) reverts UnauthenticatedAnswer because intakeRequestOf(aA.requestId) == RA != primaryRequests[1] == RB. (5) RB is answered false: propose(id, aB) succeeds, outcome = 0, bob wins instead of losing. Expected: a party who benefits from discarding an existing answer to the market's paid ask cannot do so; actual: the losing bettor discards it at zero cost and is paid 0.1e18 for it. Runs green as test_retryFrontRunsLateDeliveryAndDiscardsFirstAnswer in test/scratch/Review.t.sol.","severity":"low","snippet":"            if (!oracle.hasPendingRequest(m.primaryRequests[0])) revert AnswerAlreadyDelivered();","title":"Retry resolve can front-run a late delivery and discard a known unfavourable first answer at the creator's expense"},{"citation":"resolved","description":"_recordSettlerReward (src/VerdictMarkets.sol:560, `if (m.bountyRemaining > reserve) amount = Math.min(m.settlerReward, m.bountyRemaining - reserve);`) pays whatever surplus remains above the reserve, which can be a partial amount, not all-or-nothing. An agent sizing its gas against the documented rule reads the wrong number. Merged from audit_math. Fix: 'reduced to the surplus above the reserve, possibly to zero'.","line":98,"path":"docs/AGENTS.md","reproduction":"price 0.5e18, settlerReward 0.25e18, bounty 2.25e18; resolve leaves bountyRemaining = 1.5e18; owner raises the price to 1.3e18 (same asset); propose: reserve = 1.3e18, surplus = 0.2e18 < 0.25e18, SettlerRewarded amount = 0.2e18 and the proposer receives 0.2e18 IMD, not zero as the guide states. Runs green as test_rewardReducedToSurplusNotZero in test/scratch/Review.t.sol.","severity":"info","snippet":"`escalate` is unrewarded, and a reward is clipped to zero if paying it would leave less than the","title":"docs/AGENTS.md says a settler reward is 'clipped to zero'; the contract reduces it to the surplus above the reserve"},{"citation":"resolved","description":"The guide states that during the dispute window anyone may escalate once if the market has an escalation body. escalate additionally requires m.asks < 2 (src/VerdictMarkets.sol:394, `if (m.asks >= 2) revert AskLimit();`). A market whose primary ask was retried reaches Provisional with asks == 2 and can never be escalated; its outcome can only be the retry's answer. An agent following the guide submits a transaction that cannot succeed. Merged from audit_flow. Fix: say in the escalate and resolve sections that a second primary ask consumes the market's last ask.","line":130,"path":"docs/AGENTS.md","reproduction":"Create a market with an escalation body; bets on both outcomes; warp to answerFrom; resolve(id, body); warp +24h; resolve(id, body) again while the first request is pending -> asks == 2; deliver the retry's attestation and propose(id, a) -> Provisional, disputeEnds = now + 1 day. With block.timestamp < disputeEnds and < answerUntil and escalationBodyHash != 0, call escalate(id, escalationBody). Expected per the guide: succeeds. Actual: reverts AskLimit. Reproduced at the end of test_retryFrontRunsLateDeliveryAndDiscardsFirstAnswer in test/scratch/Review.t.sol.","severity":"info","snippet":"During the dispute window, before `answerUntil`, anyone may call `escalate(id, escalationBody)`","title":"docs/AGENTS.md says escalate is available to any market with an escalation body, but a retried market reverts AskLimit"},{"citation":"resolved","description":"The market-discovery step points to a deployment block in docs/agents/addresses.json, but that file's keys are chainId, network, note, contracts, external, collateralSlots and abi; there is no deploymentBlock or fromBlock, and the handoff described in the note and docs/DEPLOYMENT.md writes only the three addresses. An agent implementing the guide literally has no start block for eth_getLogs. Merged from audit_flow and audit_economics (same root cause). Fix: add a deploymentBlock (null until the handoff fills it) beside the addresses and have the handoff write it, or tell agents to use the block of the VerdictMarkets creation transaction / the first GuardianTransferred(0x0, owner) log.","line":43,"path":"docs/AGENTS.md","reproduction":"Open docs/agents/addresses.json: no key containing 'block' exists (keys: chainId, network, note, contracts, external, collateralSlots, abi). Follow docs/AGENTS.md line 43. Expected: a block number to start the log scan from. Actual: the named file has no such value.","severity":"info","snippet":"Scan `VerdictMarkets` logs from the deployment block in `addresses.json`:","title":"docs/AGENTS.md tells agents to scan from 'the deployment block in addresses.json', which has no such field"}],"hash":"e34c190dc780bcaf943ccde9dafd9fac209c91200e20747c50aa055a08ae39d3","nodeId":"3e34fd88-16e5-472d-8fdc-0851aae824ac","outcome":"completed","summary":"Review complete. The findings are in `.imd-findings.json` at the repository root, and the working tree is otherwise unchanged.\n\n**Outcome.** No critical, high or medium defect reproduced. The two-collateral change is sound: both ledgers stay separate on every transfer path, the constructor rejects bad slots, bytecode and argument counts fit the factory's limits, and the shipped ABI files equal the build. The full suite of 198 tests passes.\n\n**Findings kept** (all reproduced against the code, duplicates merged):\n\n- **Low, reserve in rotated asset units.** The settler-reward reserve reads the oracle price without checking that the oracle's asset still equals the market's bounty token. After an asset rotation a large nominal price clips an affordable reward to zero and a tiny one reserves nothing. Reproduced with concrete balances.\n- **Low, retry front-runs a late delivery.** When a first answer lands at least 24 hours after the ask, a losing bettor can send a retry in the delivery block, get paid the resolve reward from the creator's bounty, and make the known answer unusable. Reproduced end to end. The fix needs a design decision because the oracle contract is unchanged.\n- **Info, three documentation gaps in docs/AGENTS.md.** The reward is reduced to the surplus rather than clipped to zero, a retried market cannot escalate, and the guide points at a deployment block that addresses.json does not contain. The last one was reported by two specialists and is merged into one finding.\n\n**Dropped.** Nothing was dropped. The static-analysis leads on reentrancy, strict equality and uninitialised locals were traced and do not reproduce: every path is guarded and balance-checked.\n\n**Coverage.** All 22 entry points are answered. Two are marked as findings (propose for the reserve units, resolve for the retry front-run), the rest hold, plus two invariant rows for the ledger conservation and the deployment limits.","treeHash":null,"usage":{"cachedInputTokens":726060,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":27573,"runtime":"claude","turns":22,"wallClockMs":755468}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9df7d5d52e83c572","findings":[{"citation":"resolved","description":"Execution-trace / operation-interleaving finding. The retry guard assumes that 'the first request is still pending on chain' means 'no answer to it exists'. It reads on-chain state only, while the answer itself becomes public before it is delivered: the oracle's panel page and the Intake.complete transaction in the mempool carry the full attestation. Since the 94b4f1d1 fix, propose() accepts only primaryRequests[asks-1], so a retry does not add a second usable answer, it makes the first one unusable. Together these let any losing bettor who sees an unfavourable first answer about to land (>= 24h after the ask, i.e. during an oracle delay or backlog) send resolve(id, body) with a higher priority fee in the same block. The retry passes both checks (24h elapsed, first request still pending at execution time), spends a second oracle price from the creator's bounty, pays the attacker the resolve settlerReward, and the honest attestation delivered one position later is stored by VerdictOracle but refused by propose() with UnauthenticatedAnswer. The market is then decided by a fresh panel the attacker bought with someone else's money, or voids and refunds if that panel never answers, both strictly better for the losing side than the discarded answer. The on-chain guard cannot see the pending delivery, so this is a transaction-ordering gap in the guarantee ADAPTATION.md states for the fix ('no caller can choose between two answers'): the caller cannot choose between two answers, but can veto a known one for an unknown one. Preconditions: the first answer is delivered at least 24h after resolve(); normal latency is minutes, so this needs an oracle outage or backlog, which is why this is rated low rather than medium. Fix direction (needs a design decision because the oracle is unchanged byte for byte): bind acceptance to delivery order rather than ask order, e.g. have VerdictOracle record the delivery block per intake request (it already records lastDelivered per body) and let propose() accept the market's paid primary ask whose answer was delivered first, refusing the other; a retry then cannot discard an answer that lands after it was bought but before its own answer. Any change here must keep the 94b4f1d1 property that a proposer never picks between two delivered answers.","line":380,"path":"src/VerdictMarkets.sol","reproduction":"Setup (TestBase): slot-0 market with settlerReward 0.1 IMD, bounty 2*PRICE + 0.5 IMD; alice bets 100 IMD on outcome 1, bob bets 100 IMD on outcome 0. (1) At answerFrom a settler calls resolve(id, body) -> request RA, asks = 1. (2) The oracle answers RA with true (alice wins) but the delivery lands 24h later. (3) In the delivery block bob sends resolve(id, body) first: block.timestamp >= lastPrimaryAsk + 24h and oracle.hasPendingRequest(RA) is still true, so the call succeeds -> request RB, asks = 2, oracleSpend = 2*PRICE, bob receives 0.1 IMD (SettlerRewarded action 0). (4) Intake delivers RA's attestation: VerdictOracle.onOracleResult stores it (answerOf(a) == keccak256(body)), but markets.propose(id, aRA) reverts UnauthenticatedAnswer because intakeRequestOf(aRA.requestId) == RA != primaryRequests[1] == RB. (5) RB is answered false: propose(id, aRB) succeeds and the outcome is 0; bob wins 196 IMD instead of losing 100. Expected: an answer that exists for the market's paid ask should not be discardable by a party that benefits from discarding it; actual: the losing bettor discards it for 0 cost and is paid 0.1 IMD for doing so, while the creator pays a second 0.5 IMD ask. The sequence above runs green as test_retryFrontRunsLateDeliveryAndDiscardsFirstAnswer in test/scratch/ReviewProbes.t.sol (it demonstrates the behaviour on the current code; it is not a failing proof).","severity":"low","snippet":"            if (!oracle.hasPendingRequest(m.primaryRequests[0])) revert AnswerAlreadyDelivered();","title":"Retry ask can front-run a late delivery and discard a known unfavourable first answer at the bounty's expense"},{"citation":"resolved","description":"The guide is the contract an agent operator codes against. It states that escalate is available during the dispute window whenever the market has an escalation body, and that 'It spends the market's last ask'. The contract additionally requires m.asks < 2 (src/VerdictMarkets.sol:394 `if (m.asks >= 2) revert AskLimit();`). A market whose primary ask was retried (resolve twice, 24h apart) reaches Provisional with asks == 2, has an escalation body, is inside its dispute window and before answerUntil, and still reverts AskLimit on escalate. An agent following the guide will submit a transaction that cannot succeed and may conclude the contract is faulty; a disputer relying on the documented escalation path has none. Fix: state in the escalate section (and in the resolve section's note on retries) that a second primary ask consumes the market's last ask, so a retried market can never be escalated and its outcome can only be the retry's answer.","line":130,"path":"docs/AGENTS.md","reproduction":"create() a market (escalationBody set); bet alice 10 IMD on 1 and bob 10 IMD on 0; warp to answerFrom; resolve(id, body); warp +24h; resolve(id, body) again (first request still pending) -> asks == 2; deliver the retry's attestation and propose(id, a) -> status Provisional, disputeEnds = now + 1 day. Now, with block.timestamp < disputeEnds and < answerUntil and escalationBodyHash != 0, call escalate(id, escalationBody). Expected per docs/AGENTS.md: succeeds and extends the window. Actual: reverts AskLimit. Reproduced by test_escalateAfterRetryRevertsAskLimitDespiteDocs in test/scratch/ReviewProbes2.t.sol.","severity":"info","snippet":"During the dispute window, before `answerUntil`, anyone may call `escalate(id, escalationBody)`","title":"docs/AGENTS.md says escalate is available to any market with an escalation body, but a retried market cannot escalate (AskLimit)"},{"citation":"resolved","description":"The brief asks the guide to name 'the exact ABIs and addresses file to use' and how to find markets from events. The guide points to a deployment block number inside docs/agents/addresses.json, but that file's schema is chainId, network, note, contracts (three addresses), external, collateralSlots and abi; there is no deploymentBlock (or fromBlock) key, and the deployment handoff is only described as writing the three addresses. An agent implementing the guide literally has no start block and must either scan from genesis (expensive on Sepolia) or guess. Fix: add a `deploymentBlock` (null until the handoff fills it) next to the contract addresses in docs/agents/addresses.json and have the handoff write it, or change the guide to tell agents to use the block of the VerdictMarkets creation transaction / the first GuardianTransferred(0x0, owner) log.","line":43,"path":"docs/AGENTS.md","reproduction":"Open docs/agents/addresses.json and search for 'block' or 'deploymentBlock': no key exists (keys present: chainId, network, note, contracts, external, collateralSlots, abi). Then follow docs/AGENTS.md line 43: 'Scan VerdictMarkets logs from the deployment block in addresses.json'. Expected: a block number to start the eth_getLogs scan from. Actual: no value is available in the named file.","severity":"info","snippet":"Scan `VerdictMarkets` logs from the deployment block in `addresses.json`:","title":"docs/AGENTS.md tells agents to scan from 'the deployment block in addresses.json', but addresses.json has no such field"}],"hash":"ee4bed81b09967127ce5ffe7fcdc94321112ebd4f737a701bdd24300821b2131","nodeId":"391e0f6a-3221-448b-bdf7-49568f0466e0","outcome":"completed","summary":"The review is complete. The findings file is at the repository root, no tracked file changed, and the scratch probes live only under the ignored test/scratch/ directory.\n\n**Outcome: no critical, high or medium defect in the control flow. One low contract finding and two documentation mismatches, all with concrete reproductions.**\n\nWhat I did\n- Read the three assigned guides (Execution Trace, Periphery, First Principles) plus the Senior Auditor's Mindset and validation gates, then traced every state-changing entry point of VerdictMarkets and VerdictOracle from caller to final transfer.\n- Rebuilt the project and ran the existing suite. All 178 tests pass.\n- Wrote seven scratch probes covering paths the suite does not reach: the retry-versus-late-delivery ordering race, the oracle asset rotated to the slot-1 token (same-token WETH creator payment), fee-on-transfer collateral with bettors on both sides, an unanswered escalation on a WETH market, a replacement outcome with no winning stake, a creator betting on both sides, and escalate after a retried ask. All ledgers closed with zero dust in every variant.\n- Confirmed the agent-doc ABIs are byte-identical to the current build and that the deployment parameters match the brief's constructor arguments.\n\nFindings written to `.imd-findings.json`\n1. **Low, resolve retry ordering.** The retry guard only reads on-chain pending state. A losing bettor who sees an unfavourable first answer about to be delivered at least 24 hours after the ask can front-run the delivery with a retry. That spends a second oracle price from the creator's bounty, pays the attacker the resolve reward, and makes the honest answer unusable under the current latest-ask rule. Rated low because it needs an oracle delay of a day or more. The fix direction needs a design decision since it touches the oracle's unchanged code.\n2. **Info, docs/AGENTS.md escalate section.** The guide says any market with an escalation body can escalate during its dispute window. A market whose primary ask was retried reverts with AskLimit. Reproduced deterministically.\n3. **Info, docs/AGENTS.md event scanning.** The guide tells agents to start scanning from the deployment block in addresses.json, but that file has no such field.\n\nCoverage: all 23 listed entry points have a row, plus four invariant rows. Twenty-one hold, two carry findings, none are unreached. The parts outside my budget were the live Sepolia Intake, TestIMD and WETH contracts, which I could not reach without a network, and the website, which was out of scope.","treeHash":null,"usage":{"cachedInputTokens":2295876,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":62685,"runtime":"claude","turns":40,"wallClockMs":1574174}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2ab0b432477fde6c","findings":[{"citation":"resolved","description":"propose accepts an attestation that answers either of the market's two paid primary requests. The retry in resolve is only allowed while the first request is still pending, but nothing stops the first answer from arriving later. When both arrive and differ (a panel question with evidence \"panel\" is not deterministic, and the retry is a fresh panel), two authenticated answers for the same market coexist and whichever is proposed first becomes the provisional outcome. Any bettor can therefore choose the answer that favours them, and the loser's only remedy is the one escalation, which is itself open to a stranger's pre-emption. The prior revision closed outcome shopping with externally bought answers; it did not close it between the market's own asks. Impact is bounded because both answers come from the trusted oracle and a disagreement means the oracle itself was inconsistent, hence low. A minimal fix that keeps the two-ask design: once a primary answer for request k has been delivered, accept only that one for the first proposal (for example, record which primary request propose authenticated and refuse the other), or accept only the most recent paid request once a retry has been made.","line":338,"path":"src/VerdictMarkets.sol","reproduction":"State: market with escalation body, alice bets 100 IMD on outcome 1, bob bets 100 IMD on outcome 0. At answerFrom anyone calls resolve(id, body) -> request A. At answerFrom + 24h, A still pending, anyone calls resolve(id, body) -> request B. The oracle then delivers A with answer abi.encode(false) and B with answer abi.encode(true), both signed and stored. Bob calls propose(id, attestationA): outcome = 0 and Bob is the winner. From the same state Alice instead calls propose(id, attestationB): outcome = 1 and Alice is the winner. Expected: one market resolves to one answer regardless of who proposes; actual: the first proposer selects between two conflicting answers. Reproduced in test/scratch/Probe.t.sol::test_ownAskShopping using the repository's TestBase and MockIntake.","severity":"low","snippet":"                || (intakeRequestId != m.primaryRequests[0] && (m.asks < 2 || intakeRequestId != m.primaryRequests[1]))","title":"A market's own two primary answers can disagree and the first proposer picks the outcome"},{"citation":"resolved","description":"The tree carries a launch.json whose VerdictMarkets entry has ten constructor arguments (oracle, collateral, treasury, burnSink, guardian, 100, 50, 50, cap, maxSettlerReward) with a 1% creator fee. The brief for this launch changes the constructor to fifteen arguments (two collateral slots) and sets slot 0 to 150/50/50 and slot 1 to Sepolia WETH 150/0/100 with a 1 WETH cap. docs/DEPLOYMENT.md states that the stale manifest had been removed, but it is present again. The launch reference says a launch.json in a builder's tree is checked as a manifest and rejects the work when it does not match the constructor set; nothing a worker runs validates it. script/SepoliaParameters.sol (marketsConstructorArgs) and test/Deployment.t.sol / test/SettlerDeployment.t.sol rehearse the same ten-argument encoding and will fail once the constructor changes. This is not a runtime defect in the deployed code; it is a concrete tripwire for the adapter.","line":23,"path":"launch.json","reproduction":"Input: the adapted VerdictMarkets with the brief's 15-parameter constructor plus the current launch.json. The manifest check reads constructorArgs for VerdictMarkets and finds 10 entries for 15 parameters, so the tree is rejected; forge build fails in script/SepoliaParameters.sol because abi.encode of 10 words no longer matches the constructor the deployment tests feed it. Expected: either no launch.json in the builder's tree (the manifest step writes it) or one with exactly 15 string arguments in declaration order: $contract:VerdictOracle, $owner, $contract:VerdictBurnVault, $owner, 0x44a1cd38474fb1748400e7deb5f8d786cce3f89a, 150, 50, 50, 500000000000000000000, 0xfff9976782d46cc05630d1f6ebab18b2324d6b14, 150, 0, 100, 1000000000000000000, 250000000000000000.","severity":"low","snippet":"        \"$contract:VerdictOracle\",","title":"launch.json and script/SepoliaParameters.sol encode the pre-adaptation 10-argument VerdictMarkets constructor"},{"citation":"resolved","description":"createMarket and bet take a uint256 agentId that is only emitted in MarketCreated and BetPlaced. No check ties it to msg.sender, to any registry, or to a signature. The repository's web UI aggregates volume and results per agentId (the agent table in DESIGN.md, \"agent 0 is people\"), so any caller can inflate or pollute another agent's record, or appear as a person by passing 0. The contract has no NatSpec on either function stating that the value is a label. The brief for the adaptation requires that NatSpec; it is absent in the code as it arrived.","line":275,"path":"src/VerdictMarkets.sol","reproduction":"Input: alice, an EOA with no relation to agent 999999, calls bet(id, 1, 1 ether, 999999). Actual: BetPlaced(id, alice, 1, 1 ether, 999999) is emitted and every consumer that groups by agentId credits agent 999999 with alice's bet. Expected per the brief: the same behaviour, but documented in NatSpec on createMarket and bet as an unverified label so downstream readers do not treat it as identity. Reproduced in test/scratch/Probe.t.sol::test_agentIdIsUnverified.","severity":"low","snippet":"    function bet(uint256 id, uint8 outcome, uint256 amount, uint256 agentId) external nonReentrant entryOpen {","title":"agentId is an unverified caller-supplied label and nothing in the code or NatSpec says so"},{"citation":"resolved","description":"_validateParams only orders the timestamps. answerUntil may be answerFrom + 1 second and voidAfter may be type(uint64).max. An ask is possible only inside that one second and a signed answer cannot be issued inside it, so no proposal is ever valid; voidMarket needs block.timestamp >= voidAfter, so refunds never open. Every bet placed in such a market is locked for the life of the chain. This was raised in the imported audit (no maximum voidAfter) and accepted as a creator trust assumption while the creator allowlist is on; it becomes reachable by anyone once the guardian calls disableAllowlist, which the deployment guide recommends before renouncing. Recorded here so the adapter and the final review see it next to the new WETH collateral, where the locked value is ETH rather than test IMD. Documented, no behaviour change requested by the brief.","line":502,"path":"src/VerdictMarkets.sol","reproduction":"Input: an admitted creator calls createMarket with params answerUntil = answerFrom + 1, voidAfter = type(uint64).max, otherwise valid. alice bets 10 IMD on outcome 1 before closeAt. At answerFrom resolve succeeds and spends one price; at answerFrom + 1 resolve reverts OutsideWindow; any delivered answer has issuedAt > answerUntil and propose reverts InvalidAttestation; at answerFrom + 365 days voidMarket reverts OutsideWindow and alice's claim reverts WrongState. Expected by a bettor: a bound on how long principal can be held; actual: unbounded. Reproduced in test/scratch/Probe.t.sol::test_creatorScheduleLocksBets.","severity":"info","snippet":"                || p.answerFrom >= p.answerUntil || p.answerUntil >= p.voidAfter || p.disputeWindow < 1 hours","title":"A creator can take bets and then make both resolution and timeout refund unreachable for years"},{"citation":"resolved","description":"The launch rules forbid post-deployment initialisation. VerdictMarkets has no initializer, but its constructor leaves allowlistOn = true with no allowed creator, so the contract is inert out of the factory transaction until the guardian ($owner) calls setCreatorAllowed or disableAllowlist. This is the requester's documented design (README, docs/DEPLOYMENT.md After launch) and the brief says to change nothing else in behaviour, so it is recorded as a trust and operations note rather than a defect: the launch's independent review should expect the first createMarket on Sepolia to revert until the owner acts, and should not read that as a broken deployment.","line":146,"path":"src/VerdictMarkets.sol","reproduction":"State: VerdictMarkets freshly constructed with any valid arguments; no guardian call yet. Any address, including the guardian, calls createMarket with valid params and body. Actual: revert CreatorNotAllowed. Expected under the documented design: the same, until setCreatorAllowed(creator, true) or disableAllowlist() has been called by the guardian. Reproduced in test/scratch/Probe.t.sol::test_freshDeploymentCannotCreate.","severity":"info","snippet":"    bool public allowlistOn = true;","title":"Allowlist starts on and empty: a fresh deployment cannot create any market until the guardian transacts"},{"citation":"resolved","description":"The launch sets configDelay = 0, so proposeConfig followed by acceptConfig in the same block swaps intake, asset, signer, actionId and price. Requests already paid keep their pinned intake and signer, but every later ask (a market's first resolve, its retry, its escalation) trusts whatever the owner installed, so the owner can point intake at a contract they control and signer at their own key and then deliver any answer to markets that already hold bets. This is the requested privileged power, documented in README and the deployment guide, and the oracle-consumer reference requires these values to be owner-settable; it is recorded as a trust assumption with its actor and preconditions, not as a bypass. The adapter should keep it as is; the final review should list the owner (0x397dacb1ee8e9a8ce5196988958f56bde0a0a312) as able to decide outcomes of unasked markets.","line":159,"path":"src/VerdictOracle.sol","reproduction":"State: a market Open with bets, asks == 0, before answerFrom. Owner calls proposeConfig({intake: attackerIntake, asset: IMD, signer: attackerKey, actionId, price}) then acceptConfig() in the same block (acceptAfter == block.timestamp, so the check passes). At answerFrom anyone calls resolve: Markets pays attackerIntake, which returns an id; attackerIntake then calls onOracleResult with an attestation signed by attackerKey in VerdictOracle's domain and it is stored; propose with that attestation sets the outcome. Expected by bettors who do not trust the owner: a delay they can react to; actual: none, as configured.","severity":"info","snippet":"        if (!configPending || block.timestamp < acceptAfter) revert ConfigNotReady();","title":"Oracle owner with configDelay 0 can replace Intake and signer in one block and author answers for open markets"},{"citation":"resolved","description":"Today one immutable collateral is both the bet token and the bounty token, so _ask approves the oracle in collateral, VerdictOracle pulls its price with safeTransferFrom in the same token, and _ask then requires collateral.balanceOf(this) == before - cost (line 455). _pull and _pay likewise move only collateral, and createMarket pulls the bounty through _pull. Under the brief, a slot 1 market bets in WETH while its bounty, oracle spend and settler rewards stay in IMD. If the adaptation keeps these four sites on the market's collateral token, a WETH market cannot be asked. Not a defect in the code as it arrived; it marks the exact lines whose token must change and whose accounting the new per-market two-ledger tests must cover.","line":452,"path":"src/VerdictMarkets.sol","reproduction":"State after a naive adaptation: slot 1 market with collateral WETH, bounty 1 IMD pulled in IMD, oracle asset IMD, price 0.5 IMD. resolve(id, body): _ask approves the oracle for 0.5 WETH, VerdictOracle.request calls IMD.safeTransferFrom(markets, oracle, 0.5e18) with zero IMD allowance and reverts; if the approval were in IMD but the balance check stayed on WETH, the WETH balance is unchanged, before - cost != balance and _ask reverts InexactOracleSpend. Expected: the ask succeeds, oracleSpend += 0.5e18 in the IMD ledger, the WETH pool untouched.","severity":"info","snippet":"        collateral.forceApprove(address(oracle), cost);","title":"Adapter note: oracle spend is paid, approved and balance-checked in the collateral token, which must become the bounty token"},{"citation":"resolved","description":"Read in full: src/VerdictMarkets.sol, src/VerdictOracle.sol, src/VerdictBurnVault.sol, src/OracleAttestation.sol, src/interfaces/IIntake.sol, src/interfaces/IVerdictOracle.sol, test/TestBase.sol, test/mocks/MockIMD.sol, test/mocks/MockIntake.sol, test/VerdictImportedAudit.t.sol, selected tests in test/VerdictMarkets.t.sol and test/VerdictLifecycleInvariant.t.sol, launch.json, script/SepoliaParameters.sol, README contract and trust sections, docs/DEPLOYMENT.md, docs/INDEPENDENT_REVIEW.md, docs/REVISION_REVIEW.md, docs/SETTLER_INDEPENDENT_REVIEW.md, and the pinned Pashov, x-ray, Trail of Bits and oracle-consumer references plus the protected factory test. The full existing suite was run: 156 tests in 22 suites pass with Solidity 0.8.26 and via-IR. Every external and public state-changing function of the three contracts was walked for caller, guard, value moved and trust: guardian entry controls, two-step guardian and owner handover, createMarket, bet, resolve, escalate, propose, finalize, voidMarket, claim, request, onOracleResult, proposeConfig, acceptConfig. Checked and found sound against this code: reentrancy (guards plus effects-before-transfer on every payout), bounty and reward conservation (2*price + 5*reward budget covers at most four rewards and two asks), pool-cap arithmetic, fee rounding and last-claimant remainder, replay of attestations (results keyed by signed UUID, pinned intake and signer per request, market-owned request ids), issuedAt and dispute-window boundaries, replacement window restart, void versus finalize exclusivity, and the forbidden-opcode and nonpayable-constructor rules. Not reached: the live Sepolia Intake, TestIMD and WETH contracts (no fork and no RPC used), the oracle service's body validation, and the web/ and dist/ front-end sources beyond their design documentation.","line":5,"path":"src/VerdictBurnVault.sol","reproduction":"Not a defect. Coverage statement required by the assignment.","severity":"info","snippet":"contract VerdictBurnVault {}","title":"Review coverage: what was read and what could not be reached"}],"hash":"f0f1cda5282d9ce38ae273e5083cf00e2ebeec236985d8c7988e0a7b670d9c30","nodeId":"3ce7ff65-2bdd-4277-9043-e772e09404a3","outcome":"completed","summary":"The review is complete. The findings file is written and every path, line and snippet anchor was checked against the tree.\n\n**Outcome.** The three contracts as they arrived are sound at the level of funds and access control. I found no critical or high defect, so no proof files are attached. The full existing suite passes (156 tests, 22 suites) and my four scratch probes under `test/scratch/Probe.t.sol` each reproduced exactly what the corresponding finding states.\n\n**Findings written to `.imd-findings.json`** (3 low, 5 info):\n\n- **Own-ask answer shopping (low).** When a retry is made while the first request is still pending and both answers later arrive with different values, whichever bettor proposes first picks the outcome. Bounded because both answers come from the trusted oracle.\n- **Stale manifest and deploy parameters (low).** The tree carries a `launch.json` and `script/SepoliaParameters.sol` for the current 10-argument constructor with 100/50/50 fees. After the brief's 15-argument change they will fail the manifest check and the deployment rehearsals.\n- **agentId undocumented as a label (low).** Any caller can pass any agent id and the UI aggregates by it. The brief's required NatSpec is absent.\n- **Info notes** for the adapter and final review: a creator can schedule a market so bets are locked indefinitely (previously accepted trust assumption, now relevant to WETH), the allowlist starts on and empty so a fresh deployment is inert until the owner acts, the oracle owner with zero config delay can author answers for not-yet-asked markets, the exact lines in `_ask`, `_pull` and `_pay` whose token must switch to the bounty token, and a coverage statement.\n\n**Coverage.** Read in full: all of `src/`, the test base and mocks, the imported-audit and key lifecycle tests, the manifest, deploy script, and all prior review documents. Not reached: live Sepolia contracts (no fork or RPC), the oracle service's body validation, and the front-end sources.\n\nNo repository files were modified other than the findings file and the disposable scratch test.","treeHash":null,"usage":{"cachedInputTokens":1025148,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":35965,"runtime":"claude","turns":35,"wallClockMs":783379}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2565f234b0a569e9","findings":[{"citation":"resolved","description":"_recordSettlerReward reserves one more ask's price before paying a resolve or propose reward, but it reads oracle.price() without the oracle.asset() == m.bountyToken check that _ask performs (line 537). After the owner rotates the oracle to a different asset (allowed with zero delay at this launch), the reserve is denominated in the new asset's units while bountyRemaining is in the market's recorded bounty token (IMD). Scale mixing (Math Precision: 'variable oracle decimals into code assuming constant decimals'): a large nominal price clips a fully affordable reward to zero; a tiny nominal price pays the reward with no real reserve. No funds leave the two ledgers (amount is still bounded by bountyRemaining and the unpaid part returns to the creator at finalize/void), so the impact is a settler not receiving the reward the market advertises, or a reserve that does not reserve anything. Minimal fix: compute reserve only when oracle.asset() == address(m.bountyToken) and otherwise treat the remaining ask as unaffordable (reserve = 0 with no further asks possible, or skip the reserve since _ask would revert OracleAssetMismatch anyway); either keeps every other behaviour unchanged.","line":559,"path":"src/VerdictMarkets.sol","reproduction":"Fixture: VerdictOracle(asset = IMD, price = 0.5e18, configDelay = 0), VerdictMarkets with maxSettlerReward 0.25e18. 1) creator calls createMarket with settlerReward = 0.25e18, bounty = 2.25e18 (the exact minimum 2*price + 5*reward). 2) alice bets 1e18 on outcome 1. 3) at answerFrom anyone calls resolve: bountyRemaining = 2.25 - 0.5 (ask) - 0.25 (reward) = 1.5e18; the answer is delivered to VerdictOracle. 4) owner calls proposeConfig(Config(intake, OTHER_TOKEN, signer, action, 1e30)) then acceptConfig(). 5) a settler calls propose(id, a) with the valid delivered attestation. Actual: reserve = 1e30 > bountyRemaining 1.5e18, so amount = 0; SettlerRewarded emits 0 and the settler's IMD balance does not change although 1.5e18 IMD sits in the market's bounty ledger and only 0.5e18 would need reserving. Expected: reserve expressed in the bounty token (0.5e18 IMD, or none because no further ask can be bought under a mismatched asset), reward = 0.25e18. Mirror case: step 4 with price = 1 yields reserve = 1 wei, the full 0.25e18 is paid and nothing is reserved for the escalation ask. Verified with test/scratch/MathReview.t.sol::test_reserveReadInRotatedAssetUnits, which passes on the current code (asserts the zero payout).","severity":"low","snippet":"        if (action < 2 && m.asks < 2) reserve = oracle.price();","title":"Settler-reward reserve is read from oracle.price() in whatever asset the oracle currently sells, not the market's bounty token"},{"citation":"resolved","description":"_recordSettlerReward pays amount = min(settlerReward, bountyRemaining - reserve) whenever bountyRemaining > reserve (src/VerdictMarkets.sol:560), so the reward is reduced to whatever surplus remains above the reserve rather than dropped to zero. An agent sizing gas against the documented all-or-nothing rule reads the wrong number from the guide.","line":98,"path":"docs/AGENTS.md","reproduction":"price 0.5e18, settlerReward 0.25e18, bounty 2.25e18. After resolve: bountyRemaining = 2.25e18 - 0.5e18 - 0.25e18 = 1.5e18. Owner raises the price to 1.3e18 (same asset). propose: reserve = 1.3e18, surplus = 1.5e18 - 1.3e18 = 0.2e18 < 0.25e18, so the proposer receives 0.2e18 IMD (SettlerRewarded amount = 0.2e18), not zero as the guide states. Expected documentation: 'reduced to the surplus above the reserve, possibly to zero'.","severity":"info","snippet":"`escalate` is unrewarded, and a reward is clipped to zero if paying it would leave less than the","title":"docs/AGENTS.md says a settler reward is 'clipped to zero'; the contract clips it to the surplus, which can be a partial amount"}],"hash":"f18240f70fbcb7923c25e6112ac9945dc5e3a778e45861c53c8582e01f75b604","nodeId":"52022b63-6dcf-46ee-853c-0c222d2512e1","outcome":"completed","summary":"The review is complete and the findings file is written and validated.\n\n**Outcome.** The arithmetic in the two-collateral Verdict contracts holds up. Both per-market ledgers conserve exactly, with no dust, under fee-on-transfer collateral, random stakes and random claim orders in both slots. I found one low defect and one documentation inaccuracy, both in the settler-reward reserve logic.\n\n**Findings written to `.imd-findings.json`:**\n\n- **Low, `src/VerdictMarkets.sol:559`.** The reward reserve reads the oracle's current price without checking that the oracle's asset still equals the market's bounty token. After an asset rotation the reserve is in the new asset's units. With a nominal price above the remaining IMD, a proposer's reward is clipped to zero although 1.5 IMD is available. With a tiny price the full reward is paid and nothing is reserved. No funds leave the ledgers, so the impact is an unpaid or unreserved reward. A scratch test reproduces the zero payout.\n- **Info, `docs/AGENTS.md:98`.** The guide says a reward is \"clipped to zero\" when the reserve is short. The code pays the surplus above the reserve, so a settler can receive a partial amount. Verified with concrete numbers: a price raised to 1.3 IMD yields a 0.2 IMD reward, not zero.\n\n**What was checked and found sound:**\n\n- Fee split rounds down with a bounded sum, so the remainder always reaches winners.\n- The last winner takes the exact remainder, and the floor-share sum can never exceed the net pool.\n- The bounty minimum check cannot overflow, and the received amount is re-checked for taxed tokens.\n- The pool cap is checked against the credited amount and can never be exceeded.\n- Every timing inequality forms a consistent chain, with finalize and void mutually exclusive.\n- Deployment constants match the brief exactly for both slots, the oracle and the owner.\n\n**Not reported as findings.** A paid ask in the last seconds of the answer window whose answer is issued after `answerUntil` is dead on arrival, and `minAgreed` above `minPanelSize` is accepted. Both are already covered by tests that name them as intended behaviour.\n\n**Coverage.** All 23 entry points have rows, plus three invariant rows. Resolve and propose are marked as carrying finding 1. The rest hold. The existing suite of 178 tests passes, and my scratch tests live under `test/scratch/`, which is discarded.","treeHash":null,"usage":{"cachedInputTokens":1832336,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":42802,"runtime":"claude","turns":30,"wallClockMs":937992}}],"verification":[{"checks":[{"durationMs":130793,"exitCode":0,"name":"build","output":"Compiling 82 files with Solc 0.8.26\nSolc 0.8.26 finished in 130.58s\nCompiler run successful!\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/VerdictOracle.sol:72:9\n   │\n72 │         address asset_,\n   │         ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/VerdictOracle.sol:71:9\n   │\n71 │         address intake_,\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    ╭▸ src/VerdictOracle.sol:114:9\n    │\n114 │         emit Requested(intakeRequestId, bodyHash, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/VerdictOracle.sol:102:13\n    │\n102 │         if (token.balanceOf(address(this)) != beforeBalance + cost) revert InexactPayment();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/VerdictOracle.sol:109:13\n    │\n109 │         if (token.balanceOf(address(this)) != beforeBalance) revert InexactPayment();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictOracle.sol:126:13\n    │\n126 │         if (block.timestamp > a.expiresAt) revert AttestationExpired(a.expiresAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictOracle.sol:127:13\n    │\n127 │         if (a.issuedAt > block.timestamp + ISSUED_AT_TOLERANCE) revert AttestationNotYetValid(a.issuedAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictOracle.sol:137:9\n    │\n137 │         emit Answered(a.requestId, intakeRequestId, p.bodyHash, attHash);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/VerdictOracle.sol:150:66\n    │\n150 │     function proposeConfig(Config calldata c) external onlyOwner nonReentrant {\n    │                                                                  ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/VerdictOracle.sol:158:48\n    │\n158 │     function acceptConfig() external onlyOwner nonReentrant {\n    │                                                ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictOracle.sol:159:31\n    │\n159 │         if (!configPending || block.timestamp < acceptAfter) revert ConfigNotReady();\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:360:13\n    │\n360 │         if (block.timestamp >= m.params.closeAt) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:379:17\n    │\n379 │             if (block.timestamp < m.lastPrimaryAsk + 24 hours) revert RetryNotReady();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:563:9\n    │\n563 │         emit SettlerRewarded(id, msg.sender, action, 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    ╭▸ src/VerdictMarkets.sol:391:13\n    │\n391 │         if (block.timestamp >= m.disputeEnds) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:398:9\n    │\n398 │         emit DisputeExtended(id, m.disputeEnds);\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    ╭▸ src/VerdictMarkets.sol:550:9\n    │\n550 │         emit OracleAsked(id, requestId, escalation, cost);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:406:13\n    │\n406 │         if (block.timestamp < m.params.answerFrom) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:409:17\n    │\n409 │             if (block.timestamp >= m.disputeEnds) revert OutsideWindow();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:411:20\n    │\n411 │         } else if (block.timestamp >= m.params.voidAfter) {\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:448:13\n    │\n448 │         if (block.timestamp < m.disputeEnds) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:575:9\n    │\n575 │         emit BountyReturned(id, m.creator, bounty);\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    ╭▸ src/VerdictMarkets.sol:461:9\n    │\n461 │         emit Finalized(id, m.outcome, creatorFee, burnFee, treasuryFee);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:477:17\n    │\n477 │             if (block.timestamp < m.params.voidAfter) revert OutsideWindow();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:480:17\n    │\n480 │             if (block.timestamp < m.disputeEnds) revert OutsideWindow();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:488:9\n    │\n488 │         emit Voided(id);\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    ╭▸ src/VerdictMarkets.sol:515:9\n    │\n515 │         emit Claimed(id, msg.sender, amount, refund);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:529:13\n    │\n529 │         if (block.timestamp < m.params.answerFrom || block.timestamp >= m.params.answerUntil) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:529:54\n    │\n529 │         if (block.timestamp < m.params.answerFrom || block.timestamp >= m.params.answerUntil) revert OutsideWindow();\n    │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/VerdictMarkets.sol:547:13\n    │\n547 │         if (bountyToken.balanceOf(address(this)) != beforeBalance - cost) revert InexactOracleSpend();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/VerdictMarkets.sol:560:33\n    │\n560 │         if (m.bountyRemaining > reserve) amount = Math.min(m.settlerReward, m.bountyRemaining - reserve);\n    │                                 ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:593:40\n    │\n593 │                 || p.minAgreed == 0 || p.closeAt <= block.timestamp || p.closeAt > p.answerFrom\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/VerdictMarkets.sol:608:53\n    │\n608 │                 if (p.bounds[i] <= p.bounds[i - 1]) revert InvalidParams();\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    ╭▸ src/VerdictMarkets.sol:615:82\n    │\n615 │                 if (p.answerType == 4 && uint256(p.keys[i]) > type(uint160).max) revert InvalidParams();\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    ╭▸ src/VerdictMarkets.sol:617:49\n    │\n617 │                     if (p.keys[i] == p.keys[j]) revert InvalidParams();\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/VerdictMarkets.sol:610:20\n    │\n610 │             return uint8(p.bounds.length + 1);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/VerdictMarkets.sol:620:20\n    │\n620 │             return uint8(p.keys.length + 1);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/VerdictMarkets.sol:647:21\n    │\n647 │                 if (first == p.keys[i]) return i;\n    │                     ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/VerdictMarkets.sol:632:20\n    │\n632 │             return uint8(p.bounds.length);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/VerdictMarkets.sol:650:16\n    │\n650 │         return uint8(p.keys.length);\n    │                ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    ‡\n158 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/CollateralIndependentReview.t.sol:113:9\n    │\n113 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    ‡\n158 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    ‡\n158 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/IndependentReview.t.sol:17:9\n   │\n17 │         vm.warp(p.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/IndependentReview.t.sol:63:9\n   │\n63 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/IndependentReview.t.sol:78:9\n   │\n78 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/IndependentReview.t.sol:123:9\n    │\n123 │         vm.warp(p.answerUntil - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/IndependentReview.t.sol:123:9\n    │\n123 │         vm.warp(p.answerUntil - 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/IndependentReview.t.sol:183:9\n    │\n183 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/IndependentReview.t.sol:198:9\n    │\n198 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionIndependentReview.t.sol:11:9\n   │\n11 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionIndependentReview.t.sol:26:9\n   │\n26 │         vm.warp(markets.getMarket(first).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionIndependentReview.t.sol:39:9\n    │\n 39 │         vm.warp(block.timestamp + 1 hours);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionIndependentReview.t.sol:39:9\n    │\n 39 │         vm.warp(block.timestamp + 1 hours);\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   ╭▸ test/RevisionIndependentReview.t.sol:39:17\n   │\n39 │         vm.warp(block.timestamp + 1 hours);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionIndependentReview.t.sol:51:9\n   │\n51 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionIndependentReview.t.sol:66:9\n   │\n66 │         vm.warp(p.answerUntil - 1);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionRegression.t.sol:11:9\n   │\n11 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionRegression.t.sol:50:9\n   │\n50 │         vm.warp(p.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionRegression.t.sol:80:9\n   │\n80 │         vm.warp(markets.getMarket(first).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:88:9\n    │\n 88 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:88:9\n    │\n 88 │         vm.warp(block.timestamp + 24 hours);\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   ╭▸ test/RevisionRegression.t.sol:88:17\n   │\n88 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:106:9\n    │\n106 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:111:9\n    │\n111 │         vm.warp(until - 10 minutes);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:111:9\n    │\n111 │         vm.warp(until - 10 minutes);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:130:9\n    │\n130 │         vm.warp(block.timestamp + 1 minutes);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:130:9\n    │\n130 │         vm.warp(block.timestamp + 1 minutes);\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    ╭▸ test/RevisionRegression.t.sol:130:17\n    │\n130 │         vm.warp(block.timestamp + 1 minutes);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:148:9\n    │\n148 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/RevisionRegression.t.sol:150:17\n    │\n150 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:222:9\n    │\n222 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:226:9\n    │\n226 │         vm.warp(p.answerUntil - bound(leadSeed, 1, 1 hours - 1));\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:226:9\n    │\n226 │         vm.warp(p.answerUntil - bound(leadSeed, 1, 1 hours - 1));\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    ╭▸ test/RevisionRegression.t.sol:231:31\n    │\n231 │         assertGe(extendedEnd, block.timestamp + 24 hours);\n    │                               ━━━━━━━━━━━━━━━\n232 │         vm.warp(p.answerUntil + bound(latencySeed, 1, extendedEnd - p.answerUntil - 1));\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/SettlerIndependentReview.t.sol:88:9\n   │\n88 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/SettlerIndependentReview.t.sol:102:9\n    │\n102 │         vm.warp(markets.getMarket(id).disputeEnds);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/SettlerIndependentReview.t.sol:102:9\n    │\n102 │         vm.warp(markets.getMarket(id).disputeEnds);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/SettlerIndependentReview.t.sol:280:9\n    │\n280 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictSettlerRewards.t.sol:57:9\n   │\n57 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:124:9\n    │\n124 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/VerdictSettlerRewards.t.sol:128:17\n    │\n128 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:164:9\n    │\n164 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:182:9\n    │\n182 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:211:9\n    │\n211 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:281:9\n    │\n281 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/SettlerLifecycleProperties.t.sol:42:13\n   │\n42 │             vm.warp(p.answerFrom);\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   ╭▸ test/SettlerLifecycleProperties.t.sol:46:25\n   │\n46 │                 vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/SettlerRewardInvariant.t.sol:182:17\n    │\n182 │         vm.warp(block.timestamp + 14 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    ╭▸ test/SettlerRewardSequence.t.sol:393:17\n    │\n393 │         vm.warp(block.timestamp + 30 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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:65:9\n    │\n 65 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:65:9\n    │\n 65 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:157:9\n    │\n157 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:164:9\n    │\n164 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:164:9\n    │\n164 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/VerdictAtomicity.t.sol:164:17\n    │\n164 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictCollateral.t.sol:165:9\n    │\n165 │         vm.warp(m.params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictCollateral.t.sol:254:9\n    │\n254 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictCollateral.t.sol:312:9\n    │\n312 │         vm.warp(markets.getMarket(later).params.answerFrom);\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    ╭▸ test/VerdictCollateralInvariant.t.sol:242:17\n    │\n242 │         vm.warp(block.timestamp + 14 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    ╭▸ test/VerdictInvariant.t.sol:164:17\n    │\n164 │         vm.warp(block.timestamp + 14 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    ╭▸ test/VerdictLifecycleInvariant.t.sol:458:17\n    │\n458 │         vm.warp(block.timestamp + 14 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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictMarkets.t.sol:46:9\n   │\n46 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:90:9\n    │\n 90 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:90:9\n    │\n 90 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:118:9\n    │\n118 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:118:9\n    │\n118 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:121:9\n    │\n121 │         vm.warp(p.voidAfter + 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:121:9\n    │\n121 │         vm.warp(p.voidAfter + 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:142:9\n    │\n142 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:154:9\n    │\n154 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:182:9\n    │\n182 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/VerdictMarkets.t.sol:184:17\n    │\n184 │         vm.warp(block.timestamp + 24 hours - 1);\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    ╭▸ test/VerdictMarkets.t.sol:187:17\n    │\n187 │         vm.warp(block.timestamp + 1);\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    ╭▸ test/VerdictMarkets.t.sol:191:17\n    │\n191 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:203:9\n    │\n203 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:217:9\n    │\n217 │         vm.warp(p.answerUntil);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:239:9\n    │\n239 │         vm.warp(p.answerUntil - 1);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:257:9\n    │\n257 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:257:9\n    │\n257 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:284:9\n    │\n284 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:319:9\n    │\n319 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:168:9\n    │\n168 │         vm.warp(markets.getMarket(id).params.closeAt - 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:269:9\n    │\n269 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:278:9\n    │\n278 │         vm.warp(markets.getMarket(id).params.answerFrom);\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.revertToState`\n    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:356:20\n    │\n356 │         assertTrue(vm.revertToState(snapshot));\n    │                    ────────────────────────── `vm.revertToState` 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.revertToState`\n    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:356:20\n    │\n356 │         assertTrue(vm.revertToState(snapshot));\n    │                    ────────────────────────── `vm.revertToState` 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.revertToState`\n    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:327:20\n    │\n327 │         assertTrue(vm.revertToState(snapshot));\n    │                    ────────────────────────── `vm.revertToState` 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.revertToState`\n    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:327:20\n    │\n327 │         assertTrue(vm.revertToState(snapshot));\n    │                    ────────────────────────── `vm.revertToState` 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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:340:9\n    │\n340 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/VerdictOracle.t.sol:211:17\n    │\n211 │         vm.warp(block.timestamp + 2 days - 1);\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    ╭▸ test/VerdictOracle.t.sol:238:17\n    │\n238 │         vm.warp(block.timestamp + 1 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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictOutcomes.t.sol:11:9\n   │\n11 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictOutcomes.t.sol:11:9\n    │\n 11 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictOutcomes.t.sol:11:9\n    │\n 11 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictOutcomes.t.sol:130:9\n    │\n130 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlementProperties.t.sol:167:9\n    │\n167 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlementProperties.t.sol:184:13\n    │\n184 │             vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlementProperties.t.sol:194:13\n    │\n194 │             vm.warp(p.voidAfter);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlementProperties.t.sol:194:13\n    │\n194 │             vm.warp(p.voidAfter);\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":37509,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 199666)\n[PASS] test_acceptsTheProtocolSignatureAsDelivered() (gas: 190502)\n[PASS] test_callbackSelectorIsCanonical() (gas: 4480)\n[PASS] test_digestMatchesTheProtocol() (gas: 13408)\n[PASS] test_domainIsConsumerChainAndVersionTwo() (gas: 15761)\n[PASS] test_structHashMatchesIndependentEncoding() (gas: 251625)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.65ms (831.27µs CPU time)\n\nRan 1 test for test/SettlerDeployment.t.sol:SettlerDeploymentTest\n[PASS] test_launchHandoffPinsV2AndFifteenConstructorArguments() (gas: 6242619)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.60ms (546.11µs CPU time)\n\nRan 5 tests for test/VerdictImportedAudit.t.sol:VerdictImportedAuditTest\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 575025)\n[PASS] test_creatorCanSetVoidAfterFarInFuture() (gas: 648814)\n[PASS] test_freshDeploymentCannotCreateUntilGuardianActs() (gas: 607635)\n[PASS] test_pauseOnlyBlocksEntryAndReleaseReturnsAllUnspentBounty() (gas: 2110653)\n[PASS] test_strangerEscalatesAtNoCostBurnsBountyAndDelays() (gas: 2632128)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 4.74ms (2.95ms CPU time)\n\nRan 5 tests for test/RevisionIndependentReview.t.sol:RevisionIndependentReviewTest\n[PASS] test_documentedUnusableOwnDeliveryStillBlocksRetry() (gas: 1323997)\n[PASS] test_escalationRejectsIssuanceBeforeItsOwnAsk() (gas: 2078078)\n[PASS] test_identicalBodyOtherMarketAnswerCannotSetOutcome() (gas: 2043253)\n[PASS] test_independentSameBodyCannotBlockOwnRetry() (gas: 1797909)\n[PASS] test_primaryLateIssuanceRemainsOutsideBriefsExplicitRange() (gas: 1436997)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 3.80ms (2.79ms CPU time)\n\nRan 17 tests for test/VerdictOracle.t.sol:VerdictOracleTest\n[PASS] test_bodyLimitsAndExactPaymentRequired() (gas: 586164)\n[PASS] test_configDelayCapAndInvalidConfiguration() (gas: 9288)\n[PASS] test_consumedIntakeIdAndOracleIdCannotBeStoredTwice() (gas: 970882)\n[PASS] test_deliveredAnswerRemainsReadableAfterExpiry() (gas: 524142)\n[PASS] test_expiredFutureMalformedAndTamperedRejected() (gas: 766661)\n[PASS] test_falseAnswerStoredUnder150kGas() (gas: 575766)\nLogs:\n  cold callback gas: 126024\n\n[PASS] test_intakeAndSignerRotationPreservesInflightRequest() (gas: 2174481)\n[PASS] test_maxAnswerUnder150kGas() (gas: 610147)\nLogs:\n  maximum answer cold callback gas: 140592\n\n[PASS] test_replacingConfigProposalRestartsDelay() (gas: 283461)\n[PASS] test_requestPaysExactlyAndPinsConfiguration() (gas: 403481)\n[PASS] test_requestReentrancyFails() (gas: 486117)\n[PASS] test_reusedIntakeRequestIdRollsBackPayment() (gas: 545892)\n[PASS] test_timelockAndOwnable2Step() (gas: 558572)\n[PASS] test_wrongChainDomainStoresNothing() (gas: 417825)\n[PASS] test_wrongConsumerDomainStoresNothing() (gas: 422712)\n[PASS] test_wrongIntakeAndUnknownIdStoreNothing() (gas: 454254)\n[PASS] test_wrongSignerStoresNothingAndNoRefund() (gas: 522119)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 13.17ms (12.46ms CPU time)\n\nRan 15 tests for test/VerdictMarketsValidation.t.sol:VerdictMarketsValidationTest\n[PASS] test_allowlistRemovalAndPermanentDisable() (gas: 1435821)\n[PASS] test_attestationMustMatchEveryMarketFieldAndPanelRequirements() (gas: 5311019)\n[PASS] test_betZeroUnknownOutcomeAndCloseBoundary() (gas: 776164)\n[PASS] test_bodyHashAndBodySizeValidation() (gas: 787161)\n[PASS] test_bountyMustCoverTwoAsksAfterTransferFee() (gas: 238137)\n[PASS] test_creationEmitsBothFullBodies() (gas: 435909)\n[PASS] test_escalationRequiresDoubleCurrentPanelAndCorrectBody() (gas: 2918941)\n[PASS] test_feeCapAndPoolCapConstructor() (gas: 15600)\n[PASS] test_feeOnTransferCreditsOnlyActualBountyAndStakes() (gas: 1300079)\n[PASS] test_firstProposalAtVoidDeadlineCannotResurrectMarket() (gas: 1452097)\n[PASS] test_guardianHandoverIsTwoStepAndNoUnauthorizedPowers() (gas: 371084)\n[PASS] test_invalidTimesPanelsAndTypes() (gas: 617073)\n[PASS] test_minAgreedCanRequireMoreThanMinimumPanelSize() (gas: 1304263)\n[PASS] test_pauseBlocksOnlyEntryAndRenounceRequiresUnpaused() (gas: 3496119)\n[PASS] test_poolCapUsesReceivedBalanceAndFailedBetIsAtomic() (gas: 888525)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 13.19ms (16.41ms CPU time)\n\nRan 12 tests for test/VerdictCollateral.t.sol:VerdictCollateralTest\n[PASS] test_collateralConfigRevertsOutOfRange() (gas: 28148)\n[PASS] test_collateralIdOutOfRangeRevertsWithoutTakingBounty() (gas: 132813)\n[PASS] test_constructorExposesBothSlotsAndRejectsOtherSlots() (gas: 59166)\n[PASS] test_constructorRejectsEqualOrZeroTokensZeroCapsAndFeesOver500() (gas: 17819)\n[PASS] test_imdMarketKeepsCollateralAndBountyLedgersSeparate() (gas: 3044690)\n[PASS] test_marketCreatedEmitsSlotOneCollateral() (gas: 449999)\n[PASS] test_marketsInEachSlotUseTheirOwnFeesAndCaps() (gas: 4583247)\n[PASS] test_oracleAssetMismatchWhenOracleAssetChanges() (gas: 5557068)\n[PASS] test_wethMarketPaysFeesAndPayoutsInWethAndBountyOracleAndRewardsInIMD() (gas: 2664609)\n[PASS] test_wethMarketRefundsInWethAndReturnsBountyInIMDOnVoid() (gas: 1382413)\n[PASS] test_wethMarketRejectsIMDApprovalOnlyAndBetsNeedWeth() (gas: 743282)\n[PASS] test_zeroBurnShareSendsNothingToBurnSink() (gas: 1903502)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 13.88ms (15.80ms CPU time)\n\nRan 10 tests for test/VerdictSettlerRewards.t.sol:VerdictSettlerRewardsTest\n[PASS] test_bountyArithmeticRejectsImpossiblePriceOrRewardWithoutOverflow() (gas: 706573)\n[PASS] test_bountyMinimumChecksBothRequestedAndReceivedAmounts() (gas: 1297007)\n[PASS] test_eachProposalResolveAndFinalizePaysItsCallerOnceEscalatePaysNothing() (gas: 4923872)\n[PASS] test_priceRiseBeforeResolveClipsRewardToExactReserve() (gas: 3375692)\n[PASS] test_proposalUsesCurrentPriceAndPreservesTheLastAsk() (gas: 4512972)\n[PASS] test_retryResolveIsAlsoRewardedOnce() (gas: 3681919)\n[PASS] test_rewardBoundIsInclusiveAndZeroCapDisablesRewards() (gas: 1069197)\n[PASS] test_terminalRewardIsClippedToBountyNeverBettorDepositsOrAnotherMarket() (gas: 3434422)\n[PASS] test_voidWithoutAsksPaysBeforeReturningBountyAndNeverTwice() (gas: 1726023)\n[PASS] test_zeroRewardKeepsLegacyBalancesEventsAndNoNewPriceDependency() (gas: 3012043)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 16.82ms (21.89ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_burnVaultHasNoCallablePathOrEtherReceiver() (gas: 1013344)\n[PASS] test_exactSepoliaFactoryDeploymentWithoutDependencyCode() (gas: 21758607)\n[PASS] test_rehearsalRefusesOtherChains() (gas: 207095)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 44.53ms (44.49ms CPU time)\n\nRan 7 tests for test/VerdictAtomicity.t.sol:VerdictAtomicityTest\n[PASS] testFuzz_failureAtAnyFinalizeRecipientRollsBackEarlierPayments(uint8,bool) (runs: 64, μ: 2500346, ~: 2500039)\n[PASS] test_failedBountyReturnDoesNotVoidMarketOrPreventLaterRefund() (gas: 1197636)\n[PASS] test_failedCallbackIsNotRefundedButMarketRetryAndSettlementRemainReachable() (gas: 2513936)\n[PASS] test_failedEscalationPaymentCannotExtendOrConsumeDisputeWindow() (gas: 2802909)\n[PASS] test_failedPrimaryPaymentRestoresBountyAskCountTimestampAndAllowances() (gas: 1819869)\n[PASS] test_failedRefundCanBeRetriedAndDoesNotConsumeAnotherUsersClaim() (gas: 1543017)\n[PASS] test_guardBlocksCrossMarketReentryFromAnOtherwiseEligibleClaimant() (gas: 4610589)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 88.27ms (74.87ms CPU time)\n\nRan 10 tests for test/SettlerIndependentReview.t.sol:SettlerIndependentReviewTest\n[PASS] testFuzz_rewardRecipientsMayAlsoBeCreatorWinnerOrTreasury(uint8) (runs: 512, μ: 2350456, ~: 2345821)\n[PASS] testFuzz_rewardReserveUsesPriceAfterPaidAsk(uint256) (runs: 512, μ: 1422321, ~: 1426140)\nLogs:\n  Bound result 891232499535825497\n\n[PASS] test_creatorReturnFailureRevertsFinalizeIncludingEarlierReward() (gas: 2606588)\n[PASS] test_creatorReturnFailureRevertsVoidIncludingEarlierReward() (gas: 1330961)\n[PASS] test_failedProposalRewardLeavesStoredAnswerUsableAndPaysOnceOnRetry() (gas: 1932390)\n[PASS] test_finalizeRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 3508414)\n[PASS] test_maximumPriceAfterPaidAskSuppressesRewardWithoutReverting() (gas: 1377344)\n[PASS] test_positiveTerminalRewardsDoNotDependOnAWorkingOraclePrice() (gas: 2960232)\n[PASS] test_rewardFailureRollsBackTheWholePaidAskAndAllowsRetry() (gas: 2097390)\n[PASS] test_voidRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 2148790)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 332.47ms (566.66ms CPU time)\n\nRan 12 tests for test/IndependentReview.t.sol:IndependentReviewTest\n[PASS] testFuzzReviewActualTransfersConserveInAnyClaimOrder(uint96,uint96,uint96,uint8) (runs: 512, μ: 2743968, ~: 2744022)\nLogs:\n  Bound result 85981405131013051089\n  Bound result 20886825\n  Bound result 26705439659222\n\n[PASS] testReviewAgreementMinimumCanExceedMinimumPanel() (gas: 1794321)\n[PASS] testReviewDonationDoesNotAlterPayoutOrAccounting() (gas: 1922129)\n[PASS] testReviewEscalationCannotBeFirstProposalEvenWithLargePanel() (gas: 1287636)\n[PASS] testReviewEscalationCannotVoidAfterDeadline() (gas: 2402024)\n[PASS] testReviewFailedTokenTransferRollsBackClaim() (gas: 2064631)\n[PASS] testReviewLateReplacementPastVoidRemainsFinalizable() (gas: 2687831)\n[PASS] testReviewMaximumAnswerColdCallback() (gas: 1330996)\nLogs:\n  maximum answer cold callback gas: 140592\n\n[PASS] testReviewMixedMarketsCannotCrossSubsidizeClaims() (gas: 3423848)\n[PASS] testReviewNoWinnerIsVoidableAfterWindowPastVoidAfter() (gas: 2062891)\n[PASS] testReviewRotationPreservesOldCallerAndKey() (gas: 2382651)\n[PASS] testReviewSameAttestationCannotOverwriteDifferentRequest() (gas: 1489606)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 338.92ms (350.49ms CPU time)\n\nRan 6 tests for test/VerdictOracleAdversarial.t.sol:VerdictOracleAdversarialTest\n[PASS] testFuzz_rotationsKeepFourInflightSnapshotsInAnyDeliveryOrder(uint256) (runs: 256, μ: 5459941, ~: 5459941)\n[PASS] test_contractSignerIsPinnedAndRevokedSignatureStoresNothing() (gas: 1500716)\n[PASS] test_everyAttestationFieldIsBoundBySignatureAndStoredHash() (gas: 2610090)\n[PASS] test_expiryAndClockToleranceAreInclusiveAtExactBoundary() (gas: 977206)\n[PASS] test_nonCanonicalAndTruncatedSignaturesCannotConsumePendingRequest() (gas: 829148)\n[PASS] test_pendingOwnerCannotAcceptConfigurationAndFormerOwnerLosesAccess() (gas: 434003)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 351.62ms (359.36ms CPU time)\n\nRan 20 tests for test/VerdictMarkets.t.sol:VerdictMarketsTest\n[PASS] testFuzz_terminalConservation(uint96,uint96,uint96,uint8,bool) (runs: 512, μ: 2030599, ~: 2317157)\nLogs:\n  Bound result 351276154\n  Bound result 7973\n  Bound result 19117\n\n[PASS] test_asksBeforeAnswerFromAndAtOrAfterAnswerUntilRevert() (gas: 617425)\n[PASS] test_assetRotationBlocksAsksButNotRefunds() (gas: 2199183)\n[PASS] test_emptyWinningBucketCannotVoidUntilDisputeEnds() (gas: 1897286)\n[PASS] test_escalationAnswerCannotBeFirstProposal() (gas: 1288024)\n[PASS] test_escalationAskAtAnswerUntilRevertsEvenInsideDisputeWindow() (gas: 1347669)\n[PASS] test_externalSponsorCannotDeliverPrimaryOrEscalation() (gas: 4023678)\n[PASS] test_fullSettlementPaysWholePoolFeesAndExactRemainder() (gas: 2497339)\n[PASS] test_lateEscalationBeyondVoidAfterStillFinalizesWithoutAnswer() (gas: 2600797)\n[PASS] test_lateEscalationReplacementRestartsWindowOnceAndFinalizes() (gas: 2946147)\n[PASS] test_noEscalationBodyAndDuplicateEscalationAsk() (gas: 2838199)\n[PASS] test_priceIncreaseCannotSpendBettorsCollateral() (gas: 2371427)\n[PASS] test_primaryRetryBlockedAfterDeliveryEvenWithoutProposal() (gas: 1255959)\n[PASS] test_proposeAfterAnswerUntilWithTimelyStoredAnswer() (gas: 1556642)\n[PASS] test_provisionalWindowBoundariesAreStrict() (gas: 2410423)\n[PASS] test_secondPrimaryAskAfter24HoursAndMaximumTwoAsks() (gas: 1889759)\n[PASS] test_tokenReentrancyBlockedOnDepositAndClaim() (gas: 2252847)\n[PASS] test_voidNoAnswerRefundsEveryOutcomeAndUnspentBounty() (gas: 1845228)\n[PASS] test_wrongBodiesAndResolveAfterProposalRevertWithoutSpend() (gas: 1597610)\n[PASS] test_zeroAndUnknownClaimsAndUnfinishedClaimsRevert() (gas: 758134)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 354.10ms (357.03ms CPU time)\n\nRan 1 test for test/SettlerLifecycleProperties.t.sol:SettlerLifecyclePropertiesTest\n[PASS] testFuzz_allLifecyclePathsConserveActualTransfers(uint96,uint96,uint96,uint96,uint8,uint64,bool) (runs: 512, μ: 3585721, ~: 3839515)\nLogs:\n  Bound result 11434190939982\n  Bound result 55189802546734440495\n  Bound result 10038213387932524141\n  Bound result 56372635357017888\n  Bound result 1366857665\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 359.97ms (357.97ms CPU time)\n\nRan 6 tests for test/CollateralIndependentReview.t.sol:CollateralIndependentReviewTest\n[PASS] test_bountyReturnsInTheTokenItWasPulledInAfterAssetRotation() (gas: 1197593)\n[PASS] test_creatorPaymentIsOneTransferForIMDAndTwoForWeth() (gas: 3304342)\n[PASS] test_feeOnTransferWethCreditsOnlyReceivedAmount() (gas: 1464218)\n[PASS] test_priceRiseBlocksWethAskButRefundsAndBountyReturnStillWork() (gas: 1406474)\n[PASS] test_wethCallbackDuringClaimCannotReenter() (gas: 2503154)\n[PASS] test_wethMarketCannotReachIMDHeldForOthers() (gas: 2993617)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 360.59ms (14.31ms CPU time)\n\nRan 7 tests for test/SettlerBountyBoundaries.t.sol:SettlerBountyBoundariesTest\n[PASS] testFuzz_exactMinimumAndOneWeiShortAcrossUint256(uint256,uint256) (runs: 1000, μ: 1463482, ~: 1466132)\nLogs:\n  Bound result 3473688740895565\n  Bound result 878076186247895483071612909499434114395354033961489216542665356855858194740\n\n[PASS] testFuzz_transferTaxAcceptsExactReceivedMinimumAndRejectsOneWeiLess(uint96,uint16) (runs: 1000, μ: 1330864, ~: 1332837)\nLogs:\n  Bound result 16862\n  Bound result 931\n\n[PASS] testFuzz_unrepresentableMinimumRevertsBeforeTokenTransfer(uint256,uint256) (runs: 1000, μ: 359353, ~: 359334)\nLogs:\n  Bound result 12020725075159286690440677275753977904747848839271349530618317368224224919\n  Bound result 92638479679883020053532964277860627873936854763532849111501963735829950282311\n\n[PASS] test_entireUint256SupplyCanBeReturnedWithoutDust() (gas: 1179254)\n[PASS] test_maximumPriceWithRepresentableBountyAndZeroReward() (gas: 1370215)\n[PASS] test_maximumRepresentableRewardBudget() (gas: 1460633)\n[PASS] test_oneWeiPriceAndOneWeiReward() (gas: 1458679)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 360.73ms (587.82ms CPU time)\n\nRan 11 tests for test/RevisionRegression.t.sol:RevisionRegressionTest\n[PASS] testFuzz_lateEscalationHasFiniteSettlementDeadline(uint32,uint32,uint32,bool) (runs: 256, μ: 2830117, ~: 2592899)\nLogs:\n  Bound result 56360\n  Bound result 50\n  Bound result 22265\n\n[PASS] testFuzz_onlyLatestPaidPrimaryRequestCanProposeRegardlessOfDeliveryOrder(bool,bool) (runs: 256, μ: 3087153, ~: 3087161)\n[PASS] test_escalationCannotUseAnswerIssuedBeforeItsAsk() (gas: 2079675)\n[PASS] test_identicalEscalationBodiesStillRequireEachMarketsOwnPaidAsk() (gas: 5494904)\n[PASS] test_lateEscalationIssuedAfterAnswerUntilSettlesCorrectedOutcome() (gas: 2944638)\n[PASS] test_otherMarketAnswerCannotSetOutcomeOrBlockRetry() (gas: 3155829)\n[PASS] test_oversizeAnswerRefused() (gas: 1037908)\n[PASS] test_renounceRequiresAllowlistDisabledEvenWhenEmpty() (gas: 547493)\n[PASS] test_unusableDeliveryBlocksRetry() (gas: 1324097)\n[PASS] test_zeroBoundRejectedWithoutTakingBounty() (gas: 1641661)\n[PASS] test_zeroDelayAcceptsConfigInSameBlock() (gas: 271514)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 386.47ms (532.70ms CPU time)\n\nRan 7 tests for test/VerdictOutcomes.t.sol:VerdictOutcomesTest\n[PASS] testFuzz_uintBucketDefinition(uint256) (runs: 512, μ: 1407969, ~: 1408030)\n[PASS] test_addressListUsesFirstElementOnlyAndCanonicalAddressKey() (gas: 5141189)\n[PASS] test_booleanOutcomes() (gas: 2442987)\n[PASS] test_bytes32ListUsesFirstElementOnlyAndEmptyMeansNone() (gas: 6343502)\n[PASS] test_malformedEncodedAnswerCannotSetOutcome() (gas: 1362179)\n[PASS] test_numericBucketsIncludeLowerBoundaryExcludeUpper() (gas: 7620203)\n[PASS] test_twoToEightOutcomesAndSortedUniqueDefinitions() (gas: 1904068)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 389.90ms (375.41ms CPU time)\n\nRan 7 tests for test/VerdictSettlementProperties.t.sol:VerdictSettlementPropertiesTest\n[PASS] testFuzz_feeSplitsAndRationalPayoutBoundsInEveryClaimOrder(uint256,uint16,uint16,uint16,uint8) (runs: 1000, μ: 3071599, ~: 3076446)\nLogs:\n  Bound result 90\n  Bound result 51\n  Bound result 247\n  Bound result 26561257503142689348\n  Bound result 11926706939559133060\n  Bound result 37245258948128854594\n  Bound result 19749552418148640127\n\n[PASS] testFuzz_numericOutcomeSatisfiesItsHalfOpenInterval(uint128,uint96,uint256,uint8) (runs: 1000, μ: 1454402, ~: 1445390)\nLogs:\n  Bound result 5\n  Bound result 9162\n  Bound result 127\n\n[PASS] test_malformedListsCannotChangeAnAuthenticatedMarketsOutcome() (gas: 3071650)\n[PASS] test_oneWeiLastWinnerReceivesTheRoundingRemainder() (gas: 2377044)\n[PASS] test_oneWeiWinnerMayRoundToZeroButLastClaimStillDrainsExactly() (gas: 2702870)\n[PASS] test_payoutUsesFullPrecisionWhenIntermediateStakeTimesPoolOverflows256Bits() (gas: 2634565)\n[PASS] test_settlementEventsDescribeWholePoolFeesAndUnspentBounty() (gas: 2082531)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 397.94ms (791.76ms CPU time)\n\nRan 1 test for test/VerdictInvariant.t.sol:VerdictInvariantTest\n[PASS] invariant_actualTokensMatchEveryMarketsAccounting() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+----------------+-------+---------+----------╮\n| Contract       | Selector       | Calls | Reverts | Discards |\n+==============================================================+\n| VerdictHandler | advance        | 841   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | ask            | 832   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | askEscalation  | 826   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | collect        | 819   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | deliverPrimary | 787   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | enter          | 815   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | proposePrimary | 829   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | replaceOutcome | 800   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | settle         | 853   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | togglePause    | 790   | 0       | 0        |\n╰----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2424\n  Bound result 9876\n  Bound result 4101724748\n  Bound result 1000000000000000003\n  Bound result 21573\n  Bound result 624\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.29s (2.27s CPU time)\n\nRan 1 test for test/SettlerRewardInvariant.t.sol:SettlerRewardInvariantTest\n[PASS] invariant_actualTokensMatchEveryMarketsAccounting() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------+----------------+-------+---------+----------╮\n| Contract             | Selector       | Calls | Reverts | Discards |\n+====================================================================+\n| SettlerRewardHandler | advance        | 768   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | ask            | 742   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | askEscalation  | 727   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | changePrice    | 697   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | collect        | 740   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | deliverPrimary | 759   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | enter          | 726   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | proposePrimary | 767   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | replaceOutcome | 714   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | settle         | 780   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | togglePause    | 772   | 0       | 0        |\n╰----------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 112707417\n  Bound result 433296397825788537\n  Bound result 3645\n  Bound result 1250000000000000000\n  Bound result 2904\n  Bound result 9447\n  Bound result 1092\n  Bound result 300000000000000000\n  Bound result 4\n  Bound result 189074566993057651\n  Bound result 4459\n  Bound result 10575\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.33s (2.31s CPU time)\n\nRan 2 tests for test/VerdictCollateralInvariant.t.sol:VerdictCollateralInvariantTest\n[PASS] invariant_bothSlotsKeepSeparateLedgersMatchingTokenBalances() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------------+----------------+-------+---------+----------╮\n| Contract                   | Selector       | Calls | Reverts | Discards |\n+==========================================================================+\n| CollateralLifecycleHandler | advance        | 768   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | ask            | 742   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | askEscalation  | 727   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | changePrice    | 697   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | collect        | 740   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | deliverPrimary | 759   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | enter          | 726   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | proposePrimary | 767   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | replaceOutcome | 714   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | settle         | 780   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | togglePause    | 772   | 0       | 0        |\n╰----------------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2261864592\n  Bound result 23765\n  Bound result 3645\n  Bound result 1250000000000000000\n  Bound result 16238\n  Bound result 10169\n  Bound result 1092\n  Bound result 300000000000000000\n  Bound result 4\n  Bound result 189074566993057651\n  Bound result 4459\n  Bound result 14951\n\n[PASS] test_handlerSettlesBothSlotsWithRewards() (gas: 10721558)\nLogs:\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 21600\n  Bound result 700000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.51s (4.53s CPU time)\n\nRan 2 tests for test/SettlerRewardSequence.t.sol:SettlerRewardSequenceTest\n[PASS] invariant_rewardsAreMaximalAndEscrowIsConserved() (runs: 256, calls: 20480, reverts: 0)\n\n╭------------------------------+---------------+-------+---------+----------╮\n| Contract                     | Selector      | Calls | Reverts | Discards |\n+===========================================================================+\n| SettlerRewardSequenceHandler | advance       | 1524  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | changePrice   | 1562  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | collect       | 1599  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | deliverAnswer | 1523  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | donate        | 1624  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | escalate      | 1548  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | openMarket    | 1557  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | pauseEntry    | 1637  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | probeRejected | 1565  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | propose       | 1652  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | resolve       | 1620  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | settle        | 1503  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | wager         | 1566  | 0       | 0        |\n╰------------------------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 250000000000000000\n  Bound result 0\n  Bound result 100000000000000000\n  Bound result 500000000000000000\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 43000000000000000011\n  Bound result 39881\n  Bound result 58193129225996837\n  Bound result 26788367325650128\n  Bound result 10430\n  Bound result 3513326191\n  Bound result 9370\n  Bound result 22\n  Bound result 83\n  Bound result 37\n  Bound result 9831\n  Bound result 2212157824876411205\n  Bound result 1881\n  Bound result 656\n  Bound result 12363\n  Bound result 20622\n  Bound result 963\n  Bound result 7200\n  Bound result 3500632140584739688\n  Bound result 11\n  Bound result 8943\n  Bound result 14900\n  Bound result 2607874133859452680\n  Bound result 249999999999999217\n  Bound result 10000\n  Bound result 3400000000000000000\n  Bound result 1000\n  Bound result 423\n  Bound result 11333\n  Bound result 21940\n\n[PASS] test_handlerReachesRetryReplacementClippingAndBothTerminalPaths() (gas: 17530817)\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 250000000000000000\n  Bound result 0\n  Bound result 100000000000000000\n  Bound result 500000000000000000\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 43000000000000000011\n  Bound result 3600\n  Bound result 1400000000000000000\n  Bound result 500000000000000000\n  Bound result 43200\n  Bound result 43200\n  Bound result 17\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.82s (10.82s CPU time)\n\nRan 4 tests for test/VerdictLifecycleInvariant.t.sol:VerdictLifecycleInvariantTest\n[PASS] invariant_tokensStakesAndFinalityMatchIndependentLedger() (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------------------+------------------------+-------+---------+----------╮\n| Contract                | Selector               | Calls | Reverts | Discards |\n+===============================================================================+\n| VerdictLifecycleHandler | advance                | 1279  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askEscalation          | 1287  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askPrimary             | 1283  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | collect                | 1272  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | deliverAnswer          | 1278  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | donate                 | 1274  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | openMarket             | 1228  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeBurn              | 1228  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeIndependentAnswer | 1262  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeTerminal          | 1201  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | settle                 | 1287  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | togglePause            | 1266  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | wager                  | 1239  | 0       | 0        |\n╰-------------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 11100\n  Bound result 32\n  Bound result 393\n  Bound result 458\n  Bound result 499999999999999799\n  Bound result 999999999999999900\n  Bound result 7\n  Bound result 735\n  Bound result 1\n  Bound result 1001\n  Bound result 17247\n  Bound result 2976\n\n[PASS] test_handlerIndependentAnswersCannotBlockRetryOrShopOutcomes() (gas: 10412162)\nLogs:\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 21600\n  Bound result 21600\n  Bound result 21600\n  Bound result 21600\n\n[PASS] test_handlerReachesPrimaryEscalationFailureFinalizeAndRefundPaths() (gas: 16922071)\nLogs:\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 31\n  Bound result 17\n  Bound result 11\n\n[PASS] test_handlerUsesActualLateEscalationIssuanceAndStillDrains() (gas: 10004478)\nLogs:\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 37.39s (37.46s CPU time)\n\nRan 25 test suites in 37.39s (61.17s CPU time): 178 tests passed, 0 failed, 0 skipped (178 total tests)\n","passed":true},{"durationMs":95,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"VerdictMarkets.acceptGuardian()\",\"VerdictMarkets.bet(uint256,uint8,uint256,uint256)\",\"VerdictMarkets.claim(uint256)\",\"VerdictMarkets.createMarket((bytes32,uint8,uint256,uint64,uint64,uint16,uint16,uint64,uint64,uint64,uint32,uint64,uint256[],bytes32[],uint256,uint256,uint8),bytes,bytes,string,uint256)\",\"VerdictMarkets.disableAllowlist()\",\"VerdictMarkets.escalate(uint256,bytes)\",\"VerdictMarkets.finalize(uint256)\",\"VerdictMarkets.pause()\",\"VerdictMarkets.propose(uint256,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64))\",\"VerdictMarkets.renounceGuardian()\",\"VerdictMarkets.resolve(uint256,bytes)\",\"VerdictMarkets.setCreatorAllowed(address,bool)\",\"VerdictMarkets.transferGuardian(address)\",\"VerdictMarkets.unpause()\",\"VerdictMarkets.voidMarket(uint256)\",\"VerdictOracle.acceptConfig()\",\"VerdictOracle.acceptOwnership()\",\"VerdictOracle.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"VerdictOracle.proposeConfig((address,address,address,bytes32,uint256))\",\"VerdictOracle.renounceOwnership()\",\"VerdictOracle.request(bytes)\",\"VerdictOracle.transferOwnership(address)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":97,\"DEPENDENCIES.md\":14,\"DESIGN.md\":95,\"LICENSE\":21,\"README.md\":169,\"dist/assets/chain-BQwdJvnv.js\":45,\"dist/assets/index-BbSaev33.css\":1,\"dist/assets/index-ByzN5mJO.js\":1,\"dist/assets/react-DbQ9GvLb.js\":49,\"dist/favicon.svg\":1,\"dist/fonts/archivo-OFL.txt\":93,\"dist/fonts/archivo-expanded-800.woff2\":65,\"dist/fonts/ibm-plex-mono-400.woff2\":58,\"dist/fonts/ibm-plex-mono-500.woff2\":62,\"dist/fonts/ibm-plex-mono-OFL.txt\":93,\"dist/index.html\":6,\"dist/social.png\":106,\"docs/AGENTS.md\":174,\"docs/BETTER_INTERFACE_LICENSE.txt\":220,\"docs/COLLATERAL_INDEPENDENT_REVIEW.md\":65,\"docs/DEPLOYMENT.md\":68,\"docs/INDEPENDENT_REVIEW.md\":67,\"docs/REVISION_REVIEW.md\":41,\"docs/SETTLER_INDEPENDENT_REVIEW.md\":79,\"docs/VERIFICATION.md\":41,\"docs/WEBSITE_VALIDATION.md\":131,\"docs/agents/abi/VerdictBurnVault.json\":1,\"docs/agents/abi/VerdictMarkets.json\":1692,\"docs/agents/abi/VerdictOracle.json\":1191,\"docs/agents/addresses.json\":28,\"foundry.toml\":23,\"launch.json\":42,\"remappings.txt\":2,\"script/SepoliaParameters.sol\":49,\"src/OracleAttestation.sol\":221,\"src/VerdictBurnVault.sol\":5,\"src/VerdictMarkets.sol\":652,\"src/VerdictOracle.sol\":178,\"src/interfaces/IIntake.sol\":14,\"src/interfaces/IVerdictOracle.sol\":14,\"test/CollateralIndependentReview.t.sol\":169,\"test/Deployment.t.sol\":109,\"test/IndependentReview.t.sol\":239,\"test/OracleConsumerConformance.t.sol\":162,\"test/RevisionIndependentReview.t.sol\":77,\"test/RevisionRegression.t.sol\":257,\"test/SETTLER_TEST_REVIEW.md\":95,\"test/SettlerBountyBoundaries.t.sol\":144,\"test/SettlerDeployment.t.sol\":67,\"test/SettlerIndependentReview.t.sol\":342,\"test/SettlerLifecycleProperties.t.sol\":118,\"test/SettlerRewardInvariant.t.sol\":249,\"test/SettlerRewardSequence.t.sol\":483,\"test/TESTING.md\":87,\"test/TestBase.sol\":178,\"test/VerdictAtomicity.t.sol\":214,\"test/VerdictCollateral.t.sol\":354,\"test/VerdictCollateralInvariant.t.sol\":323,\"test/VerdictImportedAudit.t.sol\":87,\"test/VerdictInvariant.t.sol\":213,\"test/VerdictLifecycleInvariant.t.sol\":580,\"test/VerdictMarkets.t.sol\":383,\"test/VerdictMarketsValidation.t.sol\":364,\"test/VerdictOracle.t.sol\":288,\"test/VerdictOracleAdversarial.t.sol\":228,\"test/VerdictOutcomes.t.sol\":148,\"test/VerdictSettlementProperties.t.sol\":217,\"test/VerdictSettlerRewards.t.sol\":297,\"test/mocks/MockIMD.sol\":42,\"test/mocks/MockIntake.sol\":62,\"web/index.html\":2,\"web/package-lock.json\":2003,\"web/package.json\":35,\"web/public/favicon.svg\":1,\"web/public/fonts/archivo-OFL.txt\":93,\"web/public/fonts/archivo-expanded-800.woff2\":65,\"web/public/fonts/ibm-plex-mono-400.woff2\":58,\"web/public/fonts/ibm-plex-mono-500.woff2\":62,\"web/public/fonts/ibm-plex-mono-OFL.txt\":93,\"web/public/social.png\":106,\"web/scripts/browser-check.mjs\":414,\"web/scripts/check-export.mjs\":51,\"web/scripts/isolated.mjs\":108,\"web/scripts/revision-cases.mjs\":179,\"web/scripts/verify-contracts.mjs\":120,\"web/scripts/wallet-check.mjs\":784,\"web/src/App.tsx\":740,\"web/src/CreatePage.tsx\":575,\"web/src/MarketPage.tsx\":884,\"web/src/Portfolio.tsx\":224,\"web/src/abi/VerdictBurnVault.json\":1,\"web/src/abi/VerdictMarkets.json\":1,\"web/src/abi/VerdictOracle.json\":1,\"web/src/abi/provenance.json\":10,\"web/src/chain.ts\":377,\"web/src/components.tsx\":358,\"web/src/config.ts\":75,\"web/src/create.ts\":222,\"web/src/domain.ts\":326,\"web/src/main.tsx\":32,\"web/src/store.tsx\":103,\"web/src/styles.css\":2288,\"web/src/types.ts\":126,\"web/src/wallet.tsx\":385,\"web/tests/chain-fixture.json\":454,\"web/tests/domain.test.ts\":328,\"web/tests/wallet-rpc-fixture.json\":636,\"web/tsconfig.json\":17,\"web/validation/browser-results.json\":193,\"web/validation/contract-verification.json\":25,\"web/validation/export-integrity.json\":80,\"web/validation/revision-before.json\":79,\"web/validation/revision-results.json\":181,\"web/validation/wallet-results.json\":76,\"web/vite.config.ts\":37},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"521e7b6d9711b05f71f90164bd6c948adc665d251c638f876c33cffdb02a2ded","verifiedTreeHash":"4e6a5b0d4449c0f3b7798d6728ec001a59bdbf1b","verifierVersion":"0.1.0+0e08a464"},{"checks":[{"durationMs":128038,"exitCode":0,"name":"build","output":"Compiling 82 files with Solc 0.8.26\nSolc 0.8.26 finished in 127.84s\nCompiler run successful!\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/VerdictOracle.sol:71:9\n   │\n71 │         address intake_,\n   │         ━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/VerdictOracle.sol:72:9\n   │\n72 │         address asset_,\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    ╭▸ src/VerdictOracle.sol:114:9\n    │\n114 │         emit Requested(intakeRequestId, bodyHash, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/VerdictOracle.sol:102:13\n    │\n102 │         if (token.balanceOf(address(this)) != beforeBalance + cost) revert InexactPayment();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/VerdictOracle.sol:109:13\n    │\n109 │         if (token.balanceOf(address(this)) != beforeBalance) revert InexactPayment();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictOracle.sol:126:13\n    │\n126 │         if (block.timestamp > a.expiresAt) revert AttestationExpired(a.expiresAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictOracle.sol:127:13\n    │\n127 │         if (a.issuedAt > block.timestamp + ISSUED_AT_TOLERANCE) revert AttestationNotYetValid(a.issuedAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictOracle.sol:137:9\n    │\n137 │         emit Answered(a.requestId, intakeRequestId, p.bodyHash, attHash);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/VerdictOracle.sol:150:66\n    │\n150 │     function proposeConfig(Config calldata c) external onlyOwner nonReentrant {\n    │                                                                  ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/VerdictOracle.sol:158:48\n    │\n158 │     function acceptConfig() external onlyOwner nonReentrant {\n    │                                                ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictOracle.sol:159:31\n    │\n159 │         if (!configPending || block.timestamp < acceptAfter) revert ConfigNotReady();\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:360:13\n    │\n360 │         if (block.timestamp >= m.params.closeAt) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:379:17\n    │\n379 │             if (block.timestamp < m.lastPrimaryAsk + 24 hours) revert RetryNotReady();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:563:9\n    │\n563 │         emit SettlerRewarded(id, msg.sender, action, 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    ╭▸ src/VerdictMarkets.sol:391:13\n    │\n391 │         if (block.timestamp >= m.disputeEnds) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:398:9\n    │\n398 │         emit DisputeExtended(id, m.disputeEnds);\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    ╭▸ src/VerdictMarkets.sol:550:9\n    │\n550 │         emit OracleAsked(id, requestId, escalation, cost);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:406:13\n    │\n406 │         if (block.timestamp < m.params.answerFrom) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:409:17\n    │\n409 │             if (block.timestamp >= m.disputeEnds) revert OutsideWindow();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:411:20\n    │\n411 │         } else if (block.timestamp >= m.params.voidAfter) {\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:448:13\n    │\n448 │         if (block.timestamp < m.disputeEnds) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:575:9\n    │\n575 │         emit BountyReturned(id, m.creator, bounty);\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    ╭▸ src/VerdictMarkets.sol:461:9\n    │\n461 │         emit Finalized(id, m.outcome, creatorFee, burnFee, treasuryFee);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:477:17\n    │\n477 │             if (block.timestamp < m.params.voidAfter) revert OutsideWindow();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:480:17\n    │\n480 │             if (block.timestamp < m.disputeEnds) revert OutsideWindow();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:488:9\n    │\n488 │         emit Voided(id);\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    ╭▸ src/VerdictMarkets.sol:515:9\n    │\n515 │         emit Claimed(id, msg.sender, amount, refund);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:529:13\n    │\n529 │         if (block.timestamp < m.params.answerFrom || block.timestamp >= m.params.answerUntil) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:529:54\n    │\n529 │         if (block.timestamp < m.params.answerFrom || block.timestamp >= m.params.answerUntil) revert OutsideWindow();\n    │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/VerdictMarkets.sol:547:13\n    │\n547 │         if (bountyToken.balanceOf(address(this)) != beforeBalance - cost) revert InexactOracleSpend();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/VerdictMarkets.sol:560:33\n    │\n560 │         if (m.bountyRemaining > reserve) amount = Math.min(m.settlerReward, m.bountyRemaining - reserve);\n    │                                 ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:593:40\n    │\n593 │                 || p.minAgreed == 0 || p.closeAt <= block.timestamp || p.closeAt > p.answerFrom\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/VerdictMarkets.sol:608:53\n    │\n608 │                 if (p.bounds[i] <= p.bounds[i - 1]) revert InvalidParams();\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    ╭▸ src/VerdictMarkets.sol:615:82\n    │\n615 │                 if (p.answerType == 4 && uint256(p.keys[i]) > type(uint160).max) revert InvalidParams();\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    ╭▸ src/VerdictMarkets.sol:617:49\n    │\n617 │                     if (p.keys[i] == p.keys[j]) revert InvalidParams();\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/VerdictMarkets.sol:610:20\n    │\n610 │             return uint8(p.bounds.length + 1);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/VerdictMarkets.sol:620:20\n    │\n620 │             return uint8(p.keys.length + 1);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/VerdictMarkets.sol:647:21\n    │\n647 │                 if (first == p.keys[i]) return i;\n    │                     ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/VerdictMarkets.sol:632:20\n    │\n632 │             return uint8(p.bounds.length);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/VerdictMarkets.sol:650:16\n    │\n650 │         return uint8(p.keys.length);\n    │                ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    ‡\n158 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/CollateralIndependentReview.t.sol:113:9\n    │\n113 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    ‡\n158 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    ‡\n158 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/IndependentReview.t.sol:17:9\n   │\n17 │         vm.warp(p.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/IndependentReview.t.sol:63:9\n   │\n63 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/IndependentReview.t.sol:78:9\n   │\n78 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/IndependentReview.t.sol:123:9\n    │\n123 │         vm.warp(p.answerUntil - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/IndependentReview.t.sol:123:9\n    │\n123 │         vm.warp(p.answerUntil - 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/IndependentReview.t.sol:183:9\n    │\n183 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/IndependentReview.t.sol:198:9\n    │\n198 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionIndependentReview.t.sol:11:9\n   │\n11 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionIndependentReview.t.sol:26:9\n   │\n26 │         vm.warp(markets.getMarket(first).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionIndependentReview.t.sol:39:9\n    │\n 39 │         vm.warp(block.timestamp + 1 hours);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionIndependentReview.t.sol:39:9\n    │\n 39 │         vm.warp(block.timestamp + 1 hours);\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   ╭▸ test/RevisionIndependentReview.t.sol:39:17\n   │\n39 │         vm.warp(block.timestamp + 1 hours);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionIndependentReview.t.sol:51:9\n   │\n51 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionIndependentReview.t.sol:66:9\n   │\n66 │         vm.warp(p.answerUntil - 1);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionRegression.t.sol:11:9\n   │\n11 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionRegression.t.sol:50:9\n   │\n50 │         vm.warp(p.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionRegression.t.sol:80:9\n   │\n80 │         vm.warp(markets.getMarket(first).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:88:9\n    │\n 88 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:88:9\n    │\n 88 │         vm.warp(block.timestamp + 24 hours);\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   ╭▸ test/RevisionRegression.t.sol:88:17\n   │\n88 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:106:9\n    │\n106 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:111:9\n    │\n111 │         vm.warp(until - 10 minutes);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:111:9\n    │\n111 │         vm.warp(until - 10 minutes);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:130:9\n    │\n130 │         vm.warp(block.timestamp + 1 minutes);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:130:9\n    │\n130 │         vm.warp(block.timestamp + 1 minutes);\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    ╭▸ test/RevisionRegression.t.sol:130:17\n    │\n130 │         vm.warp(block.timestamp + 1 minutes);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:148:9\n    │\n148 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/RevisionRegression.t.sol:150:17\n    │\n150 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:222:9\n    │\n222 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:226:9\n    │\n226 │         vm.warp(p.answerUntil - bound(leadSeed, 1, 1 hours - 1));\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:226:9\n    │\n226 │         vm.warp(p.answerUntil - bound(leadSeed, 1, 1 hours - 1));\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    ╭▸ test/RevisionRegression.t.sol:231:31\n    │\n231 │         assertGe(extendedEnd, block.timestamp + 24 hours);\n    │                               ━━━━━━━━━━━━━━━\n232 │         vm.warp(p.answerUntil + bound(latencySeed, 1, extendedEnd - p.answerUntil - 1));\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/SettlerIndependentReview.t.sol:88:9\n   │\n88 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/SettlerIndependentReview.t.sol:102:9\n    │\n102 │         vm.warp(markets.getMarket(id).disputeEnds);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/SettlerIndependentReview.t.sol:102:9\n    │\n102 │         vm.warp(markets.getMarket(id).disputeEnds);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/SettlerIndependentReview.t.sol:280:9\n    │\n280 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictSettlerRewards.t.sol:57:9\n   │\n57 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:124:9\n    │\n124 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/VerdictSettlerRewards.t.sol:128:17\n    │\n128 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:164:9\n    │\n164 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:182:9\n    │\n182 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:211:9\n    │\n211 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:281:9\n    │\n281 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/SettlerLifecycleProperties.t.sol:42:13\n   │\n42 │             vm.warp(p.answerFrom);\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   ╭▸ test/SettlerLifecycleProperties.t.sol:46:25\n   │\n46 │                 vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/SettlerRewardInvariant.t.sol:182:17\n    │\n182 │         vm.warp(block.timestamp + 14 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    ╭▸ test/SettlerRewardSequence.t.sol:393:17\n    │\n393 │         vm.warp(block.timestamp + 30 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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:65:9\n    │\n 65 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:65:9\n    │\n 65 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:157:9\n    │\n157 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:164:9\n    │\n164 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:164:9\n    │\n164 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/VerdictAtomicity.t.sol:164:17\n    │\n164 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictCollateral.t.sol:165:9\n    │\n165 │         vm.warp(m.params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictCollateral.t.sol:254:9\n    │\n254 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictCollateral.t.sol:312:9\n    │\n312 │         vm.warp(markets.getMarket(later).params.answerFrom);\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    ╭▸ test/VerdictCollateralInvariant.t.sol:242:17\n    │\n242 │         vm.warp(block.timestamp + 14 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    ╭▸ test/VerdictInvariant.t.sol:164:17\n    │\n164 │         vm.warp(block.timestamp + 14 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    ╭▸ test/VerdictLifecycleInvariant.t.sol:458:17\n    │\n458 │         vm.warp(block.timestamp + 14 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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictMarkets.t.sol:46:9\n   │\n46 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:90:9\n    │\n 90 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:90:9\n    │\n 90 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:118:9\n    │\n118 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:118:9\n    │\n118 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:121:9\n    │\n121 │         vm.warp(p.voidAfter + 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:121:9\n    │\n121 │         vm.warp(p.voidAfter + 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:142:9\n    │\n142 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:154:9\n    │\n154 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:182:9\n    │\n182 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/VerdictMarkets.t.sol:184:17\n    │\n184 │         vm.warp(block.timestamp + 24 hours - 1);\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    ╭▸ test/VerdictMarkets.t.sol:187:17\n    │\n187 │         vm.warp(block.timestamp + 1);\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    ╭▸ test/VerdictMarkets.t.sol:191:17\n    │\n191 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:203:9\n    │\n203 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:217:9\n    │\n217 │         vm.warp(p.answerUntil);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:239:9\n    │\n239 │         vm.warp(p.answerUntil - 1);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:257:9\n    │\n257 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:257:9\n    │\n257 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:284:9\n    │\n284 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:319:9\n    │\n319 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:168:9\n    │\n168 │         vm.warp(markets.getMarket(id).params.closeAt - 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:269:9\n    │\n269 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:278:9\n    │\n278 │         vm.warp(markets.getMarket(id).params.answerFrom);\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.revertToState`\n    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:356:20\n    │\n356 │         assertTrue(vm.revertToState(snapshot));\n    │                    ────────────────────────── `vm.revertToState` 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.revertToState`\n    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:356:20\n    │\n356 │         assertTrue(vm.revertToState(snapshot));\n    │                    ────────────────────────── `vm.revertToState` 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.revertToState`\n    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:327:20\n    │\n327 │         assertTrue(vm.revertToState(snapshot));\n    │                    ────────────────────────── `vm.revertToState` 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.revertToState`\n    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:327:20\n    │\n327 │         assertTrue(vm.revertToState(snapshot));\n    │                    ────────────────────────── `vm.revertToState` 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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:340:9\n    │\n340 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/VerdictOracle.t.sol:211:17\n    │\n211 │         vm.warp(block.timestamp + 2 days - 1);\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    ╭▸ test/VerdictOracle.t.sol:238:17\n    │\n238 │         vm.warp(block.timestamp + 1 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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictOutcomes.t.sol:11:9\n   │\n11 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictOutcomes.t.sol:11:9\n    │\n 11 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictOutcomes.t.sol:11:9\n    │\n 11 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictOutcomes.t.sol:130:9\n    │\n130 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlementProperties.t.sol:167:9\n    │\n167 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlementProperties.t.sol:184:13\n    │\n184 │             vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlementProperties.t.sol:194:13\n    │\n194 │             vm.warp(p.voidAfter);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlementProperties.t.sol:194:13\n    │\n194 │             vm.warp(p.voidAfter);\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":37359,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/SettlerDeployment.t.sol:SettlerDeploymentTest\n[PASS] test_launchHandoffPinsV2AndFifteenConstructorArguments() (gas: 6242619)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 720.46µs (577.76µs CPU time)\n\nRan 6 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 199666)\n[PASS] test_acceptsTheProtocolSignatureAsDelivered() (gas: 190502)\n[PASS] test_callbackSelectorIsCanonical() (gas: 4480)\n[PASS] test_digestMatchesTheProtocol() (gas: 13408)\n[PASS] test_domainIsConsumerChainAndVersionTwo() (gas: 15761)\n[PASS] test_structHashMatchesIndependentEncoding() (gas: 251625)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.87ms (687.64µs CPU time)\n\nRan 5 tests for test/VerdictImportedAudit.t.sol:VerdictImportedAuditTest\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 575025)\n[PASS] test_creatorCanSetVoidAfterFarInFuture() (gas: 648814)\n[PASS] test_freshDeploymentCannotCreateUntilGuardianActs() (gas: 607635)\n[PASS] test_pauseOnlyBlocksEntryAndReleaseReturnsAllUnspentBounty() (gas: 2110653)\n[PASS] test_strangerEscalatesAtNoCostBurnsBountyAndDelays() (gas: 2632128)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.33ms (6.26ms CPU time)\n\nRan 5 tests for test/RevisionIndependentReview.t.sol:RevisionIndependentReviewTest\n[PASS] test_documentedUnusableOwnDeliveryStillBlocksRetry() (gas: 1323997)\n[PASS] test_escalationRejectsIssuanceBeforeItsOwnAsk() (gas: 2078078)\n[PASS] test_identicalBodyOtherMarketAnswerCannotSetOutcome() (gas: 2043253)\n[PASS] test_independentSameBodyCannotBlockOwnRetry() (gas: 1797909)\n[PASS] test_primaryLateIssuanceRemainsOutsideBriefsExplicitRange() (gas: 1436997)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 8.80ms (10.06ms CPU time)\n\nRan 12 tests for test/VerdictCollateral.t.sol:VerdictCollateralTest\n[PASS] test_collateralConfigRevertsOutOfRange() (gas: 28148)\n[PASS] test_collateralIdOutOfRangeRevertsWithoutTakingBounty() (gas: 132813)\n[PASS] test_constructorExposesBothSlotsAndRejectsOtherSlots() (gas: 59166)\n[PASS] test_constructorRejectsEqualOrZeroTokensZeroCapsAndFeesOver500() (gas: 17819)\n[PASS] test_imdMarketKeepsCollateralAndBountyLedgersSeparate() (gas: 3044690)\n[PASS] test_marketCreatedEmitsSlotOneCollateral() (gas: 449999)\n[PASS] test_marketsInEachSlotUseTheirOwnFeesAndCaps() (gas: 4583247)\n[PASS] test_oracleAssetMismatchWhenOracleAssetChanges() (gas: 5557068)\n[PASS] test_wethMarketPaysFeesAndPayoutsInWethAndBountyOracleAndRewardsInIMD() (gas: 2664609)\n[PASS] test_wethMarketRefundsInWethAndReturnsBountyInIMDOnVoid() (gas: 1382413)\n[PASS] test_wethMarketRejectsIMDApprovalOnlyAndBetsNeedWeth() (gas: 743282)\n[PASS] test_zeroBurnShareSendsNothingToBurnSink() (gas: 1903502)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 11.83ms (10.92ms CPU time)\n\nRan 17 tests for test/VerdictOracle.t.sol:VerdictOracleTest\n[PASS] test_bodyLimitsAndExactPaymentRequired() (gas: 586164)\n[PASS] test_configDelayCapAndInvalidConfiguration() (gas: 9288)\n[PASS] test_consumedIntakeIdAndOracleIdCannotBeStoredTwice() (gas: 970882)\n[PASS] test_deliveredAnswerRemainsReadableAfterExpiry() (gas: 524142)\n[PASS] test_expiredFutureMalformedAndTamperedRejected() (gas: 766661)\n[PASS] test_falseAnswerStoredUnder150kGas() (gas: 575766)\nLogs:\n  cold callback gas: 126024\n\n[PASS] test_intakeAndSignerRotationPreservesInflightRequest() (gas: 2174481)\n[PASS] test_maxAnswerUnder150kGas() (gas: 610147)\nLogs:\n  maximum answer cold callback gas: 140592\n\n[PASS] test_replacingConfigProposalRestartsDelay() (gas: 283461)\n[PASS] test_requestPaysExactlyAndPinsConfiguration() (gas: 403481)\n[PASS] test_requestReentrancyFails() (gas: 486117)\n[PASS] test_reusedIntakeRequestIdRollsBackPayment() (gas: 545892)\n[PASS] test_timelockAndOwnable2Step() (gas: 558572)\n[PASS] test_wrongChainDomainStoresNothing() (gas: 417825)\n[PASS] test_wrongConsumerDomainStoresNothing() (gas: 422712)\n[PASS] test_wrongIntakeAndUnknownIdStoreNothing() (gas: 454254)\n[PASS] test_wrongSignerStoresNothingAndNoRefund() (gas: 522119)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 12.21ms (15.00ms CPU time)\n\nRan 15 tests for test/VerdictMarketsValidation.t.sol:VerdictMarketsValidationTest\n[PASS] test_allowlistRemovalAndPermanentDisable() (gas: 1435821)\n[PASS] test_attestationMustMatchEveryMarketFieldAndPanelRequirements() (gas: 5311019)\n[PASS] test_betZeroUnknownOutcomeAndCloseBoundary() (gas: 776164)\n[PASS] test_bodyHashAndBodySizeValidation() (gas: 787161)\n[PASS] test_bountyMustCoverTwoAsksAfterTransferFee() (gas: 238137)\n[PASS] test_creationEmitsBothFullBodies() (gas: 435909)\n[PASS] test_escalationRequiresDoubleCurrentPanelAndCorrectBody() (gas: 2918941)\n[PASS] test_feeCapAndPoolCapConstructor() (gas: 15600)\n[PASS] test_feeOnTransferCreditsOnlyActualBountyAndStakes() (gas: 1300079)\n[PASS] test_firstProposalAtVoidDeadlineCannotResurrectMarket() (gas: 1452097)\n[PASS] test_guardianHandoverIsTwoStepAndNoUnauthorizedPowers() (gas: 371084)\n[PASS] test_invalidTimesPanelsAndTypes() (gas: 617073)\n[PASS] test_minAgreedCanRequireMoreThanMinimumPanelSize() (gas: 1304263)\n[PASS] test_pauseBlocksOnlyEntryAndRenounceRequiresUnpaused() (gas: 3496119)\n[PASS] test_poolCapUsesReceivedBalanceAndFailedBetIsAtomic() (gas: 888525)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 14.62ms (20.72ms CPU time)\n\nRan 10 tests for test/VerdictSettlerRewards.t.sol:VerdictSettlerRewardsTest\n[PASS] test_bountyArithmeticRejectsImpossiblePriceOrRewardWithoutOverflow() (gas: 706573)\n[PASS] test_bountyMinimumChecksBothRequestedAndReceivedAmounts() (gas: 1297007)\n[PASS] test_eachProposalResolveAndFinalizePaysItsCallerOnceEscalatePaysNothing() (gas: 4923872)\n[PASS] test_priceRiseBeforeResolveClipsRewardToExactReserve() (gas: 3375692)\n[PASS] test_proposalUsesCurrentPriceAndPreservesTheLastAsk() (gas: 4512972)\n[PASS] test_retryResolveIsAlsoRewardedOnce() (gas: 3681919)\n[PASS] test_rewardBoundIsInclusiveAndZeroCapDisablesRewards() (gas: 1069197)\n[PASS] test_terminalRewardIsClippedToBountyNeverBettorDepositsOrAnotherMarket() (gas: 3434422)\n[PASS] test_voidWithoutAsksPaysBeforeReturningBountyAndNeverTwice() (gas: 1726023)\n[PASS] test_zeroRewardKeepsLegacyBalancesEventsAndNoNewPriceDependency() (gas: 3012043)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 22.71ms (19.61ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_burnVaultHasNoCallablePathOrEtherReceiver() (gas: 1013344)\n[PASS] test_exactSepoliaFactoryDeploymentWithoutDependencyCode() (gas: 21758607)\n[PASS] test_rehearsalRefusesOtherChains() (gas: 207095)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 56.32ms (56.18ms CPU time)\n\nRan 7 tests for test/VerdictAtomicity.t.sol:VerdictAtomicityTest\n[PASS] testFuzz_failureAtAnyFinalizeRecipientRollsBackEarlierPayments(uint8,bool) (runs: 64, μ: 2503195, ~: 2500039)\n[PASS] test_failedBountyReturnDoesNotVoidMarketOrPreventLaterRefund() (gas: 1197636)\n[PASS] test_failedCallbackIsNotRefundedButMarketRetryAndSettlementRemainReachable() (gas: 2513936)\n[PASS] test_failedEscalationPaymentCannotExtendOrConsumeDisputeWindow() (gas: 2802909)\n[PASS] test_failedPrimaryPaymentRestoresBountyAskCountTimestampAndAllowances() (gas: 1819869)\n[PASS] test_failedRefundCanBeRetriedAndDoesNotConsumeAnotherUsersClaim() (gas: 1543017)\n[PASS] test_guardBlocksCrossMarketReentryFromAnOtherwiseEligibleClaimant() (gas: 4610589)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 113.72ms (117.81ms CPU time)\n\nRan 6 tests for test/CollateralIndependentReview.t.sol:CollateralIndependentReviewTest\n[PASS] test_bountyReturnsInTheTokenItWasPulledInAfterAssetRotation() (gas: 1197593)\n[PASS] test_creatorPaymentIsOneTransferForIMDAndTwoForWeth() (gas: 3304342)\n[PASS] test_feeOnTransferWethCreditsOnlyReceivedAmount() (gas: 1464218)\n[PASS] test_priceRiseBlocksWethAskButRefundsAndBountyReturnStillWork() (gas: 1406474)\n[PASS] test_wethCallbackDuringClaimCannotReenter() (gas: 2503154)\n[PASS] test_wethMarketCannotReachIMDHeldForOthers() (gas: 2993617)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 206.70ms (12.43ms CPU time)\n\nRan 20 tests for test/VerdictMarkets.t.sol:VerdictMarketsTest\n[PASS] testFuzz_terminalConservation(uint96,uint96,uint96,uint8,bool) (runs: 512, μ: 2017810, ~: 2317157)\nLogs:\n  Bound result 74555\n  Bound result 66824599\n  Bound result 82827101220297502860\n\n[PASS] test_asksBeforeAnswerFromAndAtOrAfterAnswerUntilRevert() (gas: 617425)\n[PASS] test_assetRotationBlocksAsksButNotRefunds() (gas: 2199183)\n[PASS] test_emptyWinningBucketCannotVoidUntilDisputeEnds() (gas: 1897286)\n[PASS] test_escalationAnswerCannotBeFirstProposal() (gas: 1288024)\n[PASS] test_escalationAskAtAnswerUntilRevertsEvenInsideDisputeWindow() (gas: 1347669)\n[PASS] test_externalSponsorCannotDeliverPrimaryOrEscalation() (gas: 4023678)\n[PASS] test_fullSettlementPaysWholePoolFeesAndExactRemainder() (gas: 2497339)\n[PASS] test_lateEscalationBeyondVoidAfterStillFinalizesWithoutAnswer() (gas: 2600797)\n[PASS] test_lateEscalationReplacementRestartsWindowOnceAndFinalizes() (gas: 2946147)\n[PASS] test_noEscalationBodyAndDuplicateEscalationAsk() (gas: 2838199)\n[PASS] test_priceIncreaseCannotSpendBettorsCollateral() (gas: 2371427)\n[PASS] test_primaryRetryBlockedAfterDeliveryEvenWithoutProposal() (gas: 1255959)\n[PASS] test_proposeAfterAnswerUntilWithTimelyStoredAnswer() (gas: 1556642)\n[PASS] test_provisionalWindowBoundariesAreStrict() (gas: 2410423)\n[PASS] test_secondPrimaryAskAfter24HoursAndMaximumTwoAsks() (gas: 1889759)\n[PASS] test_tokenReentrancyBlockedOnDepositAndClaim() (gas: 2252847)\n[PASS] test_voidNoAnswerRefundsEveryOutcomeAndUnspentBounty() (gas: 1845228)\n[PASS] test_wrongBodiesAndResolveAfterProposalRevertWithoutSpend() (gas: 1597610)\n[PASS] test_zeroAndUnknownClaimsAndUnfinishedClaimsRevert() (gas: 758134)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 291.80ms (312.96ms CPU time)\n\nRan 1 test for test/SettlerLifecycleProperties.t.sol:SettlerLifecyclePropertiesTest\n[PASS] testFuzz_allLifecyclePathsConserveActualTransfers(uint96,uint96,uint96,uint96,uint8,uint64,bool) (runs: 512, μ: 3584898, ~: 3842982)\nLogs:\n  Bound result 16849\n  Bound result 16769\n  Bound result 965\n  Bound result 13961\n  Bound result 300\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 291.96ms (290.22ms CPU time)\n\nRan 6 tests for test/VerdictOracleAdversarial.t.sol:VerdictOracleAdversarialTest\n[PASS] testFuzz_rotationsKeepFourInflightSnapshotsInAnyDeliveryOrder(uint256) (runs: 256, μ: 5459941, ~: 5459941)\n[PASS] test_contractSignerIsPinnedAndRevokedSignatureStoresNothing() (gas: 1500716)\n[PASS] test_everyAttestationFieldIsBoundBySignatureAndStoredHash() (gas: 2610090)\n[PASS] test_expiryAndClockToleranceAreInclusiveAtExactBoundary() (gas: 977206)\n[PASS] test_nonCanonicalAndTruncatedSignaturesCannotConsumePendingRequest() (gas: 829148)\n[PASS] test_pendingOwnerCannotAcceptConfigurationAndFormerOwnerLosesAccess() (gas: 434003)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 299.85ms (311.93ms CPU time)\n\nRan 12 tests for test/IndependentReview.t.sol:IndependentReviewTest\n[PASS] testFuzzReviewActualTransfersConserveInAnyClaimOrder(uint96,uint96,uint96,uint8) (runs: 512, μ: 2743952, ~: 2744022)\nLogs:\n  Bound result 97801592937382128860\n  Bound result 810684388798763\n  Bound result 26\n\n[PASS] testReviewAgreementMinimumCanExceedMinimumPanel() (gas: 1794321)\n[PASS] testReviewDonationDoesNotAlterPayoutOrAccounting() (gas: 1922129)\n[PASS] testReviewEscalationCannotBeFirstProposalEvenWithLargePanel() (gas: 1287636)\n[PASS] testReviewEscalationCannotVoidAfterDeadline() (gas: 2402024)\n[PASS] testReviewFailedTokenTransferRollsBackClaim() (gas: 2064631)\n[PASS] testReviewLateReplacementPastVoidRemainsFinalizable() (gas: 2687831)\n[PASS] testReviewMaximumAnswerColdCallback() (gas: 1330996)\nLogs:\n  maximum answer cold callback gas: 140592\n\n[PASS] testReviewMixedMarketsCannotCrossSubsidizeClaims() (gas: 3423848)\n[PASS] testReviewNoWinnerIsVoidableAfterWindowPastVoidAfter() (gas: 2062891)\n[PASS] testReviewRotationPreservesOldCallerAndKey() (gas: 2382651)\n[PASS] testReviewSameAttestationCannotOverwriteDifferentRequest() (gas: 1489606)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 334.72ms (342.07ms CPU time)\n\nRan 10 tests for test/SettlerIndependentReview.t.sol:SettlerIndependentReviewTest\n[PASS] testFuzz_rewardRecipientsMayAlsoBeCreatorWinnerOrTreasury(uint8) (runs: 512, μ: 2349334, ~: 2341021)\n[PASS] testFuzz_rewardReserveUsesPriceAfterPaidAsk(uint256) (runs: 512, μ: 1422303, ~: 1426116)\nLogs:\n  Bound result 888063920463934182\n\n[PASS] test_creatorReturnFailureRevertsFinalizeIncludingEarlierReward() (gas: 2606588)\n[PASS] test_creatorReturnFailureRevertsVoidIncludingEarlierReward() (gas: 1330961)\n[PASS] test_failedProposalRewardLeavesStoredAnswerUsableAndPaysOnceOnRetry() (gas: 1932390)\n[PASS] test_finalizeRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 3508414)\n[PASS] test_maximumPriceAfterPaidAskSuppressesRewardWithoutReverting() (gas: 1377344)\n[PASS] test_positiveTerminalRewardsDoNotDependOnAWorkingOraclePrice() (gas: 2960232)\n[PASS] test_rewardFailureRollsBackTheWholePaidAskAndAllowsRetry() (gas: 2097390)\n[PASS] test_voidRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 2148790)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 334.70ms (498.13ms CPU time)\n\nRan 7 tests for test/VerdictOutcomes.t.sol:VerdictOutcomesTest\n[PASS] testFuzz_uintBucketDefinition(uint256) (runs: 512, μ: 1408003, ~: 1408030)\n[PASS] test_addressListUsesFirstElementOnlyAndCanonicalAddressKey() (gas: 5141189)\n[PASS] test_booleanOutcomes() (gas: 2442987)\n[PASS] test_bytes32ListUsesFirstElementOnlyAndEmptyMeansNone() (gas: 6343502)\n[PASS] test_malformedEncodedAnswerCannotSetOutcome() (gas: 1362179)\n[PASS] test_numericBucketsIncludeLowerBoundaryExcludeUpper() (gas: 7620203)\n[PASS] test_twoToEightOutcomesAndSortedUniqueDefinitions() (gas: 1904068)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 339.99ms (350.14ms CPU time)\n\nRan 11 tests for test/RevisionRegression.t.sol:RevisionRegressionTest\n[PASS] testFuzz_lateEscalationHasFiniteSettlementDeadline(uint32,uint32,uint32,bool) (runs: 256, μ: 2818929, ~: 2592787)\nLogs:\n  Bound result 256063\n  Bound result 941\n  Bound result 2724\n\n[PASS] testFuzz_onlyLatestPaidPrimaryRequestCanProposeRegardlessOfDeliveryOrder(bool,bool) (runs: 256, μ: 3087152, ~: 3087144)\n[PASS] test_escalationCannotUseAnswerIssuedBeforeItsAsk() (gas: 2079675)\n[PASS] test_identicalEscalationBodiesStillRequireEachMarketsOwnPaidAsk() (gas: 5494904)\n[PASS] test_lateEscalationIssuedAfterAnswerUntilSettlesCorrectedOutcome() (gas: 2944638)\n[PASS] test_otherMarketAnswerCannotSetOutcomeOrBlockRetry() (gas: 3155829)\n[PASS] test_oversizeAnswerRefused() (gas: 1037908)\n[PASS] test_renounceRequiresAllowlistDisabledEvenWhenEmpty() (gas: 547493)\n[PASS] test_unusableDeliveryBlocksRetry() (gas: 1324097)\n[PASS] test_zeroBoundRejectedWithoutTakingBounty() (gas: 1641661)\n[PASS] test_zeroDelayAcceptsConfigInSameBlock() (gas: 271514)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 340.01ms (401.15ms CPU time)\n\nRan 7 tests for test/SettlerBountyBoundaries.t.sol:SettlerBountyBoundariesTest\n[PASS] testFuzz_exactMinimumAndOneWeiShortAcrossUint256(uint256,uint256) (runs: 1000, μ: 1463644, ~: 1466102)\nLogs:\n  Bound result 95\n  Bound result 102847173383443070975068172369279852271555969529035837012967424\n\n[PASS] testFuzz_transferTaxAcceptsExactReceivedMinimumAndRejectsOneWeiLess(uint96,uint16) (runs: 1000, μ: 1330144, ~: 1332837)\nLogs:\n  Bound result 5693\n  Bound result 187\n\n[PASS] testFuzz_unrepresentableMinimumRevertsBeforeTokenTransfer(uint256,uint256) (runs: 1000, μ: 359363, ~: 359334)\nLogs:\n  Bound result 95\n  Bound result 92633671389853059186030171450021301350788357012364722787535596242167516679410\n\n[PASS] test_entireUint256SupplyCanBeReturnedWithoutDust() (gas: 1179254)\n[PASS] test_maximumPriceWithRepresentableBountyAndZeroReward() (gas: 1370215)\n[PASS] test_maximumRepresentableRewardBudget() (gas: 1460633)\n[PASS] test_oneWeiPriceAndOneWeiReward() (gas: 1458679)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 358.55ms (994.78ms CPU time)\n\nRan 7 tests for test/VerdictSettlementProperties.t.sol:VerdictSettlementPropertiesTest\n[PASS] testFuzz_feeSplitsAndRationalPayoutBoundsInEveryClaimOrder(uint256,uint16,uint16,uint16,uint8) (runs: 1000, μ: 3071444, ~: 3076446)\nLogs:\n  Bound result 44\n  Bound result 7\n  Bound result 3\n  Bound result 17135319932825134594\n  Bound result 18044362830469877541\n  Bound result 72829572536938637744\n  Bound result 77115425613240430662\n\n[PASS] testFuzz_numericOutcomeSatisfiesItsHalfOpenInterval(uint128,uint96,uint256,uint8) (runs: 1000, μ: 1454731, ~: 1445429)\nLogs:\n  Bound result 7\n  Bound result 450397778371298926945171019508\n  Bound result 304833988163493709229941658830\n\n[PASS] test_malformedListsCannotChangeAnAuthenticatedMarketsOutcome() (gas: 3071650)\n[PASS] test_oneWeiLastWinnerReceivesTheRoundingRemainder() (gas: 2377044)\n[PASS] test_oneWeiWinnerMayRoundToZeroButLastClaimStillDrainsExactly() (gas: 2702870)\n[PASS] test_payoutUsesFullPrecisionWhenIntermediateStakeTimesPoolOverflows256Bits() (gas: 2634565)\n[PASS] test_settlementEventsDescribeWholePoolFeesAndUnspentBounty() (gas: 2082531)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 358.52ms (679.96ms CPU time)\n\nRan 1 test for test/VerdictInvariant.t.sol:VerdictInvariantTest\n[PASS] invariant_actualTokensMatchEveryMarketsAccounting() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+----------------+-------+---------+----------╮\n| Contract       | Selector       | Calls | Reverts | Discards |\n+==============================================================+\n| VerdictHandler | advance        | 858   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | ask            | 829   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | askEscalation  | 798   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | collect        | 844   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | deliverPrimary | 807   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | enter          | 816   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | proposePrimary | 785   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | replaceOutcome | 808   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | settle         | 846   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | togglePause    | 801   | 0       | 0        |\n╰----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4077\n  Bound result 864\n  Bound result 34218797667207282484\n  Bound result 2817\n  Bound result 2118\n  Bound result 15948\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.94s (1.94s CPU time)\n\nRan 1 test for test/SettlerRewardInvariant.t.sol:SettlerRewardInvariantTest\n[PASS] invariant_actualTokensMatchEveryMarketsAccounting() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------+----------------+-------+---------+----------╮\n| Contract             | Selector       | Calls | Reverts | Discards |\n+====================================================================+\n| SettlerRewardHandler | advance        | 753   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | ask            | 736   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | askEscalation  | 709   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | changePrice    | 756   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | collect        | 708   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | deliverPrimary | 755   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | enter          | 741   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | proposePrimary | 758   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | replaceOutcome | 795   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | settle         | 739   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | togglePause    | 742   | 0       | 0        |\n╰----------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 826074471\n  Bound result 8869\n  Bound result 12361\n  Bound result 15219\n  Bound result 87671944649893120\n  Bound result 4202047189\n  Bound result 10\n  Bound result 82033068599294\n  Bound result 2592001\n  Bound result 2665\n  Bound result 5505\n  Bound result 20332\n  Bound result 2000000000000000000\n  Bound result 21225\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.19s (2.18s CPU time)\n\nRan 2 tests for test/VerdictCollateralInvariant.t.sol:VerdictCollateralInvariantTest\n[PASS] invariant_bothSlotsKeepSeparateLedgersMatchingTokenBalances() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------------+----------------+-------+---------+----------╮\n| Contract                   | Selector       | Calls | Reverts | Discards |\n+==========================================================================+\n| CollateralLifecycleHandler | advance        | 753   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | ask            | 736   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | askEscalation  | 709   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | changePrice    | 756   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | collect        | 708   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | deliverPrimary | 755   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | enter          | 741   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | proposePrimary | 758   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | replaceOutcome | 795   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | settle         | 739   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | togglePause    | 742   | 0       | 0        |\n╰----------------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1720\n  Bound result 8869\n  Bound result 12361\n  Bound result 15180\n  Bound result 87671944649893120\n  Bound result 9392\n  Bound result 10\n  Bound result 82033068599294\n  Bound result 2592001\n  Bound result 2506\n  Bound result 5752\n  Bound result 20332\n  Bound result 2000000000000000000\n  Bound result 21225\n\n[PASS] test_handlerSettlesBothSlotsWithRewards() (gas: 10721558)\nLogs:\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 21600\n  Bound result 700000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.57s (4.57s CPU time)\n\nRan 2 tests for test/SettlerRewardSequence.t.sol:SettlerRewardSequenceTest\n[PASS] invariant_rewardsAreMaximalAndEscrowIsConserved() (runs: 256, calls: 20480, reverts: 0)\n\n╭------------------------------+---------------+-------+---------+----------╮\n| Contract                     | Selector      | Calls | Reverts | Discards |\n+===========================================================================+\n| SettlerRewardSequenceHandler | advance       | 1620  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | changePrice   | 1578  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | collect       | 1656  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | deliverAnswer | 1559  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | donate        | 1646  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | escalate      | 1453  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | openMarket    | 1595  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | pauseEntry    | 1542  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | probeRejected | 1584  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | propose       | 1601  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | resolve       | 1600  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | settle        | 1526  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | wager         | 1520  | 0       | 0        |\n╰------------------------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 250000000000000000\n  Bound result 0\n  Bound result 100000000000000000\n  Bound result 500000000000000000\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 43000000000000000011\n  Bound result 6606\n  Bound result 242751694509636961919\n  Bound result 3637127540973371222\n  Bound result 95\n  Bound result 1266\n  Bound result 172800\n  Bound result 39999999999999998\n  Bound result 25000000000000000\n  Bound result 17441\n  Bound result 17\n  Bound result 2592000\n  Bound result 499999999999999998\n  Bound result 20000000000000000\n  Bound result 1400000000000000000\n  Bound result 1000000000000000000\n  Bound result 3506\n  Bound result 101\n  Bound result 3325\n  Bound result 4000000000000000000\n  Bound result 11410\n  Bound result 11155111\n  Bound result 10535\n  Bound result 201553079\n  Bound result 6006\n  Bound result 0\n  Bound result 360281545648207796\n  Bound result 4080\n  Bound result 259200\n  Bound result 2343449277057587710\n  Bound result 33071\n  Bound result 596298036\n  Bound result 13\n\n[PASS] test_handlerReachesRetryReplacementClippingAndBothTerminalPaths() (gas: 17530817)\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 250000000000000000\n  Bound result 0\n  Bound result 100000000000000000\n  Bound result 500000000000000000\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 43000000000000000011\n  Bound result 3600\n  Bound result 1400000000000000000\n  Bound result 500000000000000000\n  Bound result 43200\n  Bound result 43200\n  Bound result 17\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.58s (10.60s CPU time)\n\nRan 4 tests for test/VerdictLifecycleInvariant.t.sol:VerdictLifecycleInvariantTest\n[PASS] invariant_tokensStakesAndFinalityMatchIndependentLedger() (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------------------+------------------------+-------+---------+----------╮\n| Contract                | Selector               | Calls | Reverts | Discards |\n+===============================================================================+\n| VerdictLifecycleHandler | advance                | 1246  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askEscalation          | 1263  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askPrimary             | 1236  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | collect                | 1252  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | deliverAnswer          | 1229  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | donate                 | 1193  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | openMarket             | 1289  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeBurn              | 1261  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeIndependentAnswer | 1254  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeTerminal          | 1276  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | settle                 | 1349  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | togglePause            | 1239  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | wager                  | 1297  | 0       | 0        |\n╰-------------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 4363\n  Bound result 53\n  Bound result 53\n  Bound result 4495\n  Bound result 250000000000000000\n  Bound result 20673\n  Bound result 19\n  Bound result 228\n  Bound result 50\n  Bound result 11025\n  Bound result 919999999999999801\n  Bound result 12693\n  Bound result 9256\n  Bound result 30\n  Bound result 919999999999999801\n  Bound result 16956\n\n[PASS] test_handlerIndependentAnswersCannotBlockRetryOrShopOutcomes() (gas: 10412162)\nLogs:\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 21600\n  Bound result 21600\n  Bound result 21600\n  Bound result 21600\n\n[PASS] test_handlerReachesPrimaryEscalationFailureFinalizeAndRefundPaths() (gas: 16922071)\nLogs:\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 31\n  Bound result 17\n  Bound result 11\n\n[PASS] test_handlerUsesActualLateEscalationIssuanceAndStillDrains() (gas: 10004478)\nLogs:\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 37.25s (37.29s CPU time)\n\nRan 25 test suites in 37.25s (59.94s CPU time): 178 tests passed, 0 failed, 0 skipped (178 total tests)\n","passed":true},{"durationMs":92,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"VerdictMarkets.acceptGuardian()\",\"VerdictMarkets.bet(uint256,uint8,uint256,uint256)\",\"VerdictMarkets.claim(uint256)\",\"VerdictMarkets.createMarket((bytes32,uint8,uint256,uint64,uint64,uint16,uint16,uint64,uint64,uint64,uint32,uint64,uint256[],bytes32[],uint256,uint256,uint8),bytes,bytes,string,uint256)\",\"VerdictMarkets.disableAllowlist()\",\"VerdictMarkets.escalate(uint256,bytes)\",\"VerdictMarkets.finalize(uint256)\",\"VerdictMarkets.pause()\",\"VerdictMarkets.propose(uint256,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64))\",\"VerdictMarkets.renounceGuardian()\",\"VerdictMarkets.resolve(uint256,bytes)\",\"VerdictMarkets.setCreatorAllowed(address,bool)\",\"VerdictMarkets.transferGuardian(address)\",\"VerdictMarkets.unpause()\",\"VerdictMarkets.voidMarket(uint256)\",\"VerdictOracle.acceptConfig()\",\"VerdictOracle.acceptOwnership()\",\"VerdictOracle.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"VerdictOracle.proposeConfig((address,address,address,bytes32,uint256))\",\"VerdictOracle.renounceOwnership()\",\"VerdictOracle.request(bytes)\",\"VerdictOracle.transferOwnership(address)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":97,\"DEPENDENCIES.md\":14,\"DESIGN.md\":95,\"LICENSE\":21,\"README.md\":169,\"dist/assets/chain-BQwdJvnv.js\":45,\"dist/assets/index-BbSaev33.css\":1,\"dist/assets/index-ByzN5mJO.js\":1,\"dist/assets/react-DbQ9GvLb.js\":49,\"dist/favicon.svg\":1,\"dist/fonts/archivo-OFL.txt\":93,\"dist/fonts/archivo-expanded-800.woff2\":65,\"dist/fonts/ibm-plex-mono-400.woff2\":58,\"dist/fonts/ibm-plex-mono-500.woff2\":62,\"dist/fonts/ibm-plex-mono-OFL.txt\":93,\"dist/index.html\":6,\"dist/social.png\":106,\"docs/AGENTS.md\":174,\"docs/BETTER_INTERFACE_LICENSE.txt\":220,\"docs/COLLATERAL_INDEPENDENT_REVIEW.md\":65,\"docs/DEPLOYMENT.md\":68,\"docs/INDEPENDENT_REVIEW.md\":67,\"docs/REVISION_REVIEW.md\":41,\"docs/SETTLER_INDEPENDENT_REVIEW.md\":79,\"docs/VERIFICATION.md\":41,\"docs/WEBSITE_VALIDATION.md\":131,\"docs/agents/abi/VerdictBurnVault.json\":1,\"docs/agents/abi/VerdictMarkets.json\":1692,\"docs/agents/abi/VerdictOracle.json\":1191,\"docs/agents/addresses.json\":28,\"foundry.toml\":23,\"remappings.txt\":2,\"script/SepoliaParameters.sol\":49,\"src/OracleAttestation.sol\":221,\"src/VerdictBurnVault.sol\":5,\"src/VerdictMarkets.sol\":652,\"src/VerdictOracle.sol\":178,\"src/interfaces/IIntake.sol\":14,\"src/interfaces/IVerdictOracle.sol\":14,\"test/CollateralIndependentReview.t.sol\":169,\"test/Deployment.t.sol\":109,\"test/IndependentReview.t.sol\":239,\"test/OracleConsumerConformance.t.sol\":162,\"test/RevisionIndependentReview.t.sol\":77,\"test/RevisionRegression.t.sol\":257,\"test/SETTLER_TEST_REVIEW.md\":95,\"test/SettlerBountyBoundaries.t.sol\":144,\"test/SettlerDeployment.t.sol\":67,\"test/SettlerIndependentReview.t.sol\":342,\"test/SettlerLifecycleProperties.t.sol\":118,\"test/SettlerRewardInvariant.t.sol\":249,\"test/SettlerRewardSequence.t.sol\":483,\"test/TESTING.md\":87,\"test/TestBase.sol\":178,\"test/VerdictAtomicity.t.sol\":214,\"test/VerdictCollateral.t.sol\":354,\"test/VerdictCollateralInvariant.t.sol\":323,\"test/VerdictImportedAudit.t.sol\":87,\"test/VerdictInvariant.t.sol\":213,\"test/VerdictLifecycleInvariant.t.sol\":580,\"test/VerdictMarkets.t.sol\":383,\"test/VerdictMarketsValidation.t.sol\":364,\"test/VerdictOracle.t.sol\":288,\"test/VerdictOracleAdversarial.t.sol\":228,\"test/VerdictOutcomes.t.sol\":148,\"test/VerdictSettlementProperties.t.sol\":217,\"test/VerdictSettlerRewards.t.sol\":297,\"test/mocks/MockIMD.sol\":42,\"test/mocks/MockIntake.sol\":62,\"web/index.html\":2,\"web/package-lock.json\":2003,\"web/package.json\":35,\"web/public/favicon.svg\":1,\"web/public/fonts/archivo-OFL.txt\":93,\"web/public/fonts/archivo-expanded-800.woff2\":65,\"web/public/fonts/ibm-plex-mono-400.woff2\":58,\"web/public/fonts/ibm-plex-mono-500.woff2\":62,\"web/public/fonts/ibm-plex-mono-OFL.txt\":93,\"web/public/social.png\":106,\"web/scripts/browser-check.mjs\":414,\"web/scripts/check-export.mjs\":51,\"web/scripts/isolated.mjs\":108,\"web/scripts/revision-cases.mjs\":179,\"web/scripts/verify-contracts.mjs\":120,\"web/scripts/wallet-check.mjs\":784,\"web/src/App.tsx\":740,\"web/src/CreatePage.tsx\":575,\"web/src/MarketPage.tsx\":884,\"web/src/Portfolio.tsx\":224,\"web/src/abi/VerdictBurnVault.json\":1,\"web/src/abi/VerdictMarkets.json\":1,\"web/src/abi/VerdictOracle.json\":1,\"web/src/abi/provenance.json\":10,\"web/src/chain.ts\":377,\"web/src/components.tsx\":358,\"web/src/config.ts\":75,\"web/src/create.ts\":222,\"web/src/domain.ts\":326,\"web/src/main.tsx\":32,\"web/src/store.tsx\":103,\"web/src/styles.css\":2288,\"web/src/types.ts\":126,\"web/src/wallet.tsx\":385,\"web/tests/chain-fixture.json\":454,\"web/tests/domain.test.ts\":328,\"web/tests/wallet-rpc-fixture.json\":636,\"web/tsconfig.json\":17,\"web/validation/browser-results.json\":193,\"web/validation/contract-verification.json\":25,\"web/validation/export-integrity.json\":80,\"web/validation/revision-before.json\":79,\"web/validation/revision-results.json\":181,\"web/validation/wallet-results.json\":76,\"web/vite.config.ts\":37},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":5498,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/VerdictOracle.sol:94: Reentrancy in VerdictOracle.request(bytes) (src/VerdictOracle.sol#94-115):\n[high/medium] reentrancy-balance at src/VerdictMarkets.sol:532: Reentrancy in VerdictMarkets._ask(uint256,VerdictMarkets.Market,bytes,bool) (src/VerdictMarkets.sol#532-551):\n[medium/high] incorrect-equality at src/VerdictMarkets.sol:578: VerdictMarkets._pull(IERC20,address,uint256) (src/VerdictMarkets.sol#578-584) uses a dangerous strict equality:\n[medium/medium] uninitialized-local at src/VerdictMarkets.sol:634: VerdictMarkets._outcome(VerdictMarkets.Params,bytes).first (src/VerdictMarkets.sol#634) is a local variable never initialized\n[medium/medium] uninitialized-local at src/VerdictMarkets.sol:556: VerdictMarkets._recordSettlerReward(uint256,VerdictMarkets.Market,uint8).reserve (src/VerdictMarkets.sol#556) is a local variable never initialized\n[low/medium] missing-zero-check at src/VerdictOracle.sol:72: VerdictOracle.constructor(address,address,address,bytes32,uint256,address,uint256).asset_ (src/VerdictOracle.sol#72) lacks a zero-check on :\n[low/medium] missing-zero-check at src/VerdictOracle.sol:71: VerdictOracle.constructor(address,address,address,bytes32,uint256,address,uint256).intake_ (src/VerdictOracle.sol#71) lacks a zero-check on :\n[low/medium] reentrancy-benign at src/VerdictOracle.sol:94: Reentrancy in VerdictOracle.request(bytes) (src/VerdictOracle.sol#94-115):\n[low/medium] timestamp at src/VerdictMarkets.sol:372: VerdictMarkets.resolve(uint256,bytes) (src/VerdictMarkets.sol#372-385) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:387: VerdictMarkets.escalate(uint256,bytes) (src/VerdictMarkets.sol#387-400) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:445: VerdictMarkets.finalize(uint256) (src/VerdictMarkets.sol#445-472) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictOracle.sol:158: VerdictOracle.acceptConfig() (src/VerdictOracle.sol#158-170) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictOracle.sol:117: VerdictOracle.onOracleResult(bytes32,OracleAttestation.Attestation,bytes) (src/VerdictOracle.sol#117-138) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:402: VerdictMarkets.propose(uint256,OracleAttestation.Attestation) (src/VerdictMarkets.sol#402-443) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:357: VerdictMarkets.bet(uint256,uint8,uint256,uint256) (src/VerdictMarkets.sol#357-370) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:528: VerdictMarkets._askWindow(VerdictMarkets.Market) (src/VerdictMarkets.sol#528-530) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:590: VerdictMarkets._validateParams(VerdictMarkets.Params) (src/VerdictMarkets.sol#590-623) uses timestamp for comparisons\n[low/medium] timestamp at src/VerdictMarkets.sol:474: VerdictMarkets.voidMarket(uint256) (src/VerdictMarkets.sol#474-491) uses timestamp for comparisons\n[low/medium] timestamp at src/OracleAttestation.sol:157: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/OracleAttestation.sol#157-165) uses timestamp for comparisons","passed":true},{"durationMs":591,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/VerdictMarkets.sol:331: Reentrancy: State change after external call (9 places)\n[low] centralization-risk at src/VerdictOracle.sol:14: Centralization Risk (3 places)\n[low] large-numeric-literal at src/VerdictMarkets.sol:452: Large Numeric Literal (3 places)\n[low] literal-instead-of-constant at src/VerdictMarkets.sol:202: Literal Instead of Constant (21 places)\n[low] local-variable-shadowing at src/VerdictOracle.sol:19: Local Variable Shadows State Variable (5 places)\n[low] non-reentrant-not-first at src/VerdictOracle.sol:150: `nonReentrant` is Not the First Modifier (2 places)\n[low] require-revert-in-loop at src/VerdictMarkets.sol:607: Loop Contains `require`/`revert` (3 places)\n[low] state-no-address-check at src/VerdictOracle.sol:83: Address State Variable Set Without Checks (2 places)\n[low] uninitialized-local-variable at src/VerdictMarkets.sol:614: Uninitialized Local Variable (4 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"70c605ac6b01ccb05f66e1533095e7fecb453eb9ce22d2c25265f2b7548ac06b","verifiedTreeHash":"5f1e920d7f207667fb79aa7f99bb197408619fb1","verifierVersion":"0.1.0+0e08a464"},{"checks":[{"durationMs":151701,"exitCode":0,"name":"build","output":"Compiling 84 files with Solc 0.8.26\nSolc 0.8.26 finished in 151.45s\nCompiler run successful!\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/VerdictOracle.sol:72:9\n   │\n72 │         address asset_,\n   │         ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/VerdictOracle.sol:71:9\n   │\n71 │         address intake_,\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    ╭▸ src/VerdictOracle.sol:114:9\n    │\n114 │         emit Requested(intakeRequestId, bodyHash, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/VerdictOracle.sol:102:13\n    │\n102 │         if (token.balanceOf(address(this)) != beforeBalance + cost) revert InexactPayment();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/VerdictOracle.sol:109:13\n    │\n109 │         if (token.balanceOf(address(this)) != beforeBalance) revert InexactPayment();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictOracle.sol:126:13\n    │\n126 │         if (block.timestamp > a.expiresAt) revert AttestationExpired(a.expiresAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictOracle.sol:127:13\n    │\n127 │         if (a.issuedAt > block.timestamp + ISSUED_AT_TOLERANCE) revert AttestationNotYetValid(a.issuedAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictOracle.sol:137:9\n    │\n137 │         emit Answered(a.requestId, intakeRequestId, p.bodyHash, attHash);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/VerdictOracle.sol:150:66\n    │\n150 │     function proposeConfig(Config calldata c) external onlyOwner nonReentrant {\n    │                                                                  ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/VerdictOracle.sol:158:48\n    │\n158 │     function acceptConfig() external onlyOwner nonReentrant {\n    │                                                ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictOracle.sol:159:31\n    │\n159 │         if (!configPending || block.timestamp < acceptAfter) revert ConfigNotReady();\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:360:13\n    │\n360 │         if (block.timestamp >= m.params.closeAt) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:379:17\n    │\n379 │             if (block.timestamp < m.lastPrimaryAsk + 24 hours) revert RetryNotReady();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:563:9\n    │\n563 │         emit SettlerRewarded(id, msg.sender, action, 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    ╭▸ src/VerdictMarkets.sol:391:13\n    │\n391 │         if (block.timestamp >= m.disputeEnds) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:398:9\n    │\n398 │         emit DisputeExtended(id, m.disputeEnds);\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    ╭▸ src/VerdictMarkets.sol:550:9\n    │\n550 │         emit OracleAsked(id, requestId, escalation, cost);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:406:13\n    │\n406 │         if (block.timestamp < m.params.answerFrom) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:409:17\n    │\n409 │             if (block.timestamp >= m.disputeEnds) revert OutsideWindow();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:411:20\n    │\n411 │         } else if (block.timestamp >= m.params.voidAfter) {\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:448:13\n    │\n448 │         if (block.timestamp < m.disputeEnds) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:575:9\n    │\n575 │         emit BountyReturned(id, m.creator, bounty);\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    ╭▸ src/VerdictMarkets.sol:461:9\n    │\n461 │         emit Finalized(id, m.outcome, creatorFee, burnFee, treasuryFee);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:477:17\n    │\n477 │             if (block.timestamp < m.params.voidAfter) revert OutsideWindow();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:480:17\n    │\n480 │             if (block.timestamp < m.disputeEnds) revert OutsideWindow();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/VerdictMarkets.sol:488:9\n    │\n488 │         emit Voided(id);\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    ╭▸ src/VerdictMarkets.sol:515:9\n    │\n515 │         emit Claimed(id, msg.sender, amount, refund);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:529:13\n    │\n529 │         if (block.timestamp < m.params.answerFrom || block.timestamp >= m.params.answerUntil) revert OutsideWindow();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:529:54\n    │\n529 │         if (block.timestamp < m.params.answerFrom || block.timestamp >= m.params.answerUntil) revert OutsideWindow();\n    │                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/VerdictMarkets.sol:547:13\n    │\n547 │         if (bountyToken.balanceOf(address(this)) != beforeBalance - cost) revert InexactOracleSpend();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/VerdictMarkets.sol:560:33\n    │\n560 │         if (m.bountyRemaining > reserve) amount = Math.min(m.settlerReward, m.bountyRemaining - reserve);\n    │                                 ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:593:40\n    │\n593 │                 || p.minAgreed == 0 || p.closeAt <= block.timestamp || p.closeAt > p.answerFrom\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/VerdictMarkets.sol:608:53\n    │\n608 │                 if (p.bounds[i] <= p.bounds[i - 1]) revert InvalidParams();\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    ╭▸ src/VerdictMarkets.sol:615:82\n    │\n615 │                 if (p.answerType == 4 && uint256(p.keys[i]) > type(uint160).max) revert InvalidParams();\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    ╭▸ src/VerdictMarkets.sol:617:49\n    │\n617 │                     if (p.keys[i] == p.keys[j]) revert InvalidParams();\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/VerdictMarkets.sol:610:20\n    │\n610 │             return uint8(p.bounds.length + 1);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/VerdictMarkets.sol:620:20\n    │\n620 │             return uint8(p.keys.length + 1);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/VerdictMarkets.sol:647:21\n    │\n647 │                 if (first == p.keys[i]) return i;\n    │                     ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/VerdictMarkets.sol:632:20\n    │\n632 │             return uint8(p.bounds.length);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/VerdictMarkets.sol:650:16\n    │\n650 │         return uint8(p.keys.length);\n    │                ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/CollateralAdversarial.t.sol:297:9\n    │\n297 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    ‡\n158 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/CollateralAdversarial.t.sol:431:9\n    │\n431 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/CollateralAdversarial.t.sol:479:9\n    │\n479 │         vm.warp(m.params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/CollateralAdversarial.t.sol:547:9\n    │\n547 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/CollateralAdversarial.t.sol:580:9\n    │\n580 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/CollateralIndependentReview.t.sol:113:9\n    │\n113 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    ‡\n158 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    ‡\n158 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/CollateralRotationInvariant.t.sol:318:17\n    │\n318 │         vm.warp(block.timestamp + 14 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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/IndependentReview.t.sol:17:9\n   │\n17 │         vm.warp(p.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/IndependentReview.t.sol:63:9\n   │\n63 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/IndependentReview.t.sol:78:9\n   │\n78 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/IndependentReview.t.sol:123:9\n    │\n123 │         vm.warp(p.answerUntil - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/IndependentReview.t.sol:123:9\n    │\n123 │         vm.warp(p.answerUntil - 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/IndependentReview.t.sol:183:9\n    │\n183 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/IndependentReview.t.sol:198:9\n    │\n198 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionIndependentReview.t.sol:11:9\n   │\n11 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionIndependentReview.t.sol:26:9\n   │\n26 │         vm.warp(markets.getMarket(first).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionIndependentReview.t.sol:39:9\n    │\n 39 │         vm.warp(block.timestamp + 1 hours);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionIndependentReview.t.sol:39:9\n    │\n 39 │         vm.warp(block.timestamp + 1 hours);\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   ╭▸ test/RevisionIndependentReview.t.sol:39:17\n   │\n39 │         vm.warp(block.timestamp + 1 hours);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionIndependentReview.t.sol:51:9\n   │\n51 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionIndependentReview.t.sol:66:9\n   │\n66 │         vm.warp(p.answerUntil - 1);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionRegression.t.sol:11:9\n   │\n11 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionRegression.t.sol:50:9\n   │\n50 │         vm.warp(p.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/RevisionRegression.t.sol:80:9\n   │\n80 │         vm.warp(markets.getMarket(first).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:88:9\n    │\n 88 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:88:9\n    │\n 88 │         vm.warp(block.timestamp + 24 hours);\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   ╭▸ test/RevisionRegression.t.sol:88:17\n   │\n88 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:106:9\n    │\n106 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:111:9\n    │\n111 │         vm.warp(until - 10 minutes);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:111:9\n    │\n111 │         vm.warp(until - 10 minutes);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:130:9\n    │\n130 │         vm.warp(block.timestamp + 1 minutes);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:130:9\n    │\n130 │         vm.warp(block.timestamp + 1 minutes);\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    ╭▸ test/RevisionRegression.t.sol:130:17\n    │\n130 │         vm.warp(block.timestamp + 1 minutes);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:148:9\n    │\n148 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/RevisionRegression.t.sol:150:17\n    │\n150 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:222:9\n    │\n222 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:226:9\n    │\n226 │         vm.warp(p.answerUntil - bound(leadSeed, 1, 1 hours - 1));\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/RevisionRegression.t.sol:226:9\n    │\n226 │         vm.warp(p.answerUntil - bound(leadSeed, 1, 1 hours - 1));\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    ╭▸ test/RevisionRegression.t.sol:231:31\n    │\n231 │         assertGe(extendedEnd, block.timestamp + 24 hours);\n    │                               ━━━━━━━━━━━━━━━\n232 │         vm.warp(p.answerUntil + bound(latencySeed, 1, extendedEnd - p.answerUntil - 1));\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/SettlerIndependentReview.t.sol:88:9\n   │\n88 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/SettlerIndependentReview.t.sol:102:9\n    │\n102 │         vm.warp(markets.getMarket(id).disputeEnds);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/SettlerIndependentReview.t.sol:102:9\n    │\n102 │         vm.warp(markets.getMarket(id).disputeEnds);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/SettlerIndependentReview.t.sol:280:9\n    │\n280 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictSettlerRewards.t.sol:57:9\n   │\n57 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:124:9\n    │\n124 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/VerdictSettlerRewards.t.sol:128:17\n    │\n128 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:164:9\n    │\n164 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:182:9\n    │\n182 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:211:9\n    │\n211 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlerRewards.t.sol:281:9\n    │\n281 │         vm.warp(markets.getMarket(id).params.answerFrom);\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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/SettlerLifecycleProperties.t.sol:42:13\n   │\n42 │             vm.warp(p.answerFrom);\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   ╭▸ test/SettlerLifecycleProperties.t.sol:46:25\n   │\n46 │                 vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/SettlerRewardInvariant.t.sol:182:17\n    │\n182 │         vm.warp(block.timestamp + 14 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    ╭▸ test/SettlerRewardSequence.t.sol:393:17\n    │\n393 │         vm.warp(block.timestamp + 30 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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:65:9\n    │\n 65 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:65:9\n    │\n 65 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:157:9\n    │\n157 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:164:9\n    │\n164 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictAtomicity.t.sol:164:9\n    │\n164 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/VerdictAtomicity.t.sol:164:17\n    │\n164 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictCollateral.t.sol:165:9\n    │\n165 │         vm.warp(m.params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictCollateral.t.sol:254:9\n    │\n254 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictCollateral.t.sol:312:9\n    │\n312 │         vm.warp(markets.getMarket(later).params.answerFrom);\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    ╭▸ test/VerdictCollateralInvariant.t.sol:242:17\n    │\n242 │         vm.warp(block.timestamp + 14 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    ╭▸ test/VerdictInvariant.t.sol:164:17\n    │\n164 │         vm.warp(block.timestamp + 14 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    ╭▸ test/VerdictLifecycleInvariant.t.sol:458:17\n    │\n458 │         vm.warp(block.timestamp + 14 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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictMarkets.t.sol:46:9\n   │\n46 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:90:9\n    │\n 90 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:90:9\n    │\n 90 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:118:9\n    │\n118 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:118:9\n    │\n118 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:121:9\n    │\n121 │         vm.warp(p.voidAfter + 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:121:9\n    │\n121 │         vm.warp(p.voidAfter + 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:142:9\n    │\n142 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:154:9\n    │\n154 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:182:9\n    │\n182 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/VerdictMarkets.t.sol:184:17\n    │\n184 │         vm.warp(block.timestamp + 24 hours - 1);\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    ╭▸ test/VerdictMarkets.t.sol:187:17\n    │\n187 │         vm.warp(block.timestamp + 1);\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    ╭▸ test/VerdictMarkets.t.sol:191:17\n    │\n191 │         vm.warp(block.timestamp + 24 hours);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:203:9\n    │\n203 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:217:9\n    │\n217 │         vm.warp(p.answerUntil);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:239:9\n    │\n239 │         vm.warp(p.answerUntil - 1);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:257:9\n    │\n257 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:257:9\n    │\n257 │         vm.warp(markets.getMarket(id).disputeEnds - 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:284:9\n    │\n284 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarkets.t.sol:319:9\n    │\n319 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:168:9\n    │\n168 │         vm.warp(markets.getMarket(id).params.closeAt - 1);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:269:9\n    │\n269 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:278:9\n    │\n278 │         vm.warp(markets.getMarket(id).params.answerFrom);\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.revertToState`\n    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:356:20\n    │\n356 │         assertTrue(vm.revertToState(snapshot));\n    │                    ────────────────────────── `vm.revertToState` 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.revertToState`\n    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:356:20\n    │\n356 │         assertTrue(vm.revertToState(snapshot));\n    │                    ────────────────────────── `vm.revertToState` 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.revertToState`\n    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:327:20\n    │\n327 │         assertTrue(vm.revertToState(snapshot));\n    │                    ────────────────────────── `vm.revertToState` 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.revertToState`\n    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:327:20\n    │\n327 │         assertTrue(vm.revertToState(snapshot));\n    │                    ────────────────────────── `vm.revertToState` 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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictMarketsValidation.t.sol:340:9\n    │\n340 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/VerdictOracle.t.sol:211:17\n    │\n211 │         vm.warp(block.timestamp + 2 days - 1);\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    ╭▸ test/VerdictOracle.t.sol:238:17\n    │\n238 │         vm.warp(block.timestamp + 1 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   ╭▸ test/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictOutcomes.t.sol:11:9\n   │\n11 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictOutcomes.t.sol:11:9\n    │\n 11 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictOutcomes.t.sol:11:9\n    │\n 11 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictOutcomes.t.sol:130:9\n    │\n130 │         vm.warp(markets.getMarket(id).params.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlementProperties.t.sol:167:9\n    │\n167 │         vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlementProperties.t.sol:184:13\n    │\n184 │             vm.warp(p.answerFrom);\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    ╭▸ test/TestBase.sol:138:29\n    │\n138 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlementProperties.t.sol:194:13\n    │\n194 │             vm.warp(p.voidAfter);\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    ╭▸ test/TestBase.sol:139:30\n    │\n139 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/VerdictSettlementProperties.t.sol:194:13\n    │\n194 │             vm.warp(p.voidAfter);\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":37125,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/SettlerDeployment.t.sol:SettlerDeploymentTest\n[PASS] test_launchHandoffPinsV2AndFifteenConstructorArguments() (gas: 6242619)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 935.11µs (804.84µs CPU time)\n\nRan 6 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 199666)\n[PASS] test_acceptsTheProtocolSignatureAsDelivered() (gas: 190502)\n[PASS] test_callbackSelectorIsCanonical() (gas: 4480)\n[PASS] test_digestMatchesTheProtocol() (gas: 13408)\n[PASS] test_domainIsConsumerChainAndVersionTwo() (gas: 15761)\n[PASS] test_structHashMatchesIndependentEncoding() (gas: 251625)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.23ms (907.20µs CPU time)\n\nRan 5 tests for test/VerdictImportedAudit.t.sol:VerdictImportedAuditTest\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 575025)\n[PASS] test_creatorCanSetVoidAfterFarInFuture() (gas: 648814)\n[PASS] test_freshDeploymentCannotCreateUntilGuardianActs() (gas: 607635)\n[PASS] test_pauseOnlyBlocksEntryAndReleaseReturnsAllUnspentBounty() (gas: 2110653)\n[PASS] test_strangerEscalatesAtNoCostBurnsBountyAndDelays() (gas: 2632128)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 4.03ms (2.30ms CPU time)\n\nRan 6 tests for test/CollateralIndependentReview.t.sol:CollateralIndependentReviewTest\n[PASS] test_bountyReturnsInTheTokenItWasPulledInAfterAssetRotation() (gas: 1197593)\n[PASS] test_creatorPaymentIsOneTransferForIMDAndTwoForWeth() (gas: 3304342)\n[PASS] test_feeOnTransferWethCreditsOnlyReceivedAmount() (gas: 1464218)\n[PASS] test_priceRiseBlocksWethAskButRefundsAndBountyReturnStillWork() (gas: 1406474)\n[PASS] test_wethCallbackDuringClaimCannotReenter() (gas: 2503154)\n[PASS] test_wethMarketCannotReachIMDHeldForOthers() (gas: 2993617)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 7.35ms (5.36ms CPU time)\n\nRan 12 tests for test/VerdictCollateral.t.sol:VerdictCollateralTest\n[PASS] test_collateralConfigRevertsOutOfRange() (gas: 28148)\n[PASS] test_collateralIdOutOfRangeRevertsWithoutTakingBounty() (gas: 132813)\n[PASS] test_constructorExposesBothSlotsAndRejectsOtherSlots() (gas: 59166)\n[PASS] test_constructorRejectsEqualOrZeroTokensZeroCapsAndFeesOver500() (gas: 17819)\n[PASS] test_imdMarketKeepsCollateralAndBountyLedgersSeparate() (gas: 3044690)\n[PASS] test_marketCreatedEmitsSlotOneCollateral() (gas: 449999)\n[PASS] test_marketsInEachSlotUseTheirOwnFeesAndCaps() (gas: 4583247)\n[PASS] test_oracleAssetMismatchWhenOracleAssetChanges() (gas: 5557068)\n[PASS] test_wethMarketPaysFeesAndPayoutsInWethAndBountyOracleAndRewardsInIMD() (gas: 2664609)\n[PASS] test_wethMarketRefundsInWethAndReturnsBountyInIMDOnVoid() (gas: 1382413)\n[PASS] test_wethMarketRejectsIMDApprovalOnlyAndBetsNeedWeth() (gas: 743282)\n[PASS] test_zeroBurnShareSendsNothingToBurnSink() (gas: 1903502)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 8.20ms (6.41ms CPU time)\n\nRan 5 tests for test/RevisionIndependentReview.t.sol:RevisionIndependentReviewTest\n[PASS] test_documentedUnusableOwnDeliveryStillBlocksRetry() (gas: 1323997)\n[PASS] test_escalationRejectsIssuanceBeforeItsOwnAsk() (gas: 2078078)\n[PASS] test_identicalBodyOtherMarketAnswerCannotSetOutcome() (gas: 2043253)\n[PASS] test_independentSameBodyCannotBlockOwnRetry() (gas: 1797909)\n[PASS] test_primaryLateIssuanceRemainsOutsideBriefsExplicitRange() (gas: 1436997)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 10.14ms (8.24ms CPU time)\n\nRan 10 tests for test/VerdictSettlerRewards.t.sol:VerdictSettlerRewardsTest\n[PASS] test_bountyArithmeticRejectsImpossiblePriceOrRewardWithoutOverflow() (gas: 706573)\n[PASS] test_bountyMinimumChecksBothRequestedAndReceivedAmounts() (gas: 1297007)\n[PASS] test_eachProposalResolveAndFinalizePaysItsCallerOnceEscalatePaysNothing() (gas: 4924442)\n[PASS] test_priceRiseBeforeResolveClipsRewardToExactReserve() (gas: 3375692)\n[PASS] test_proposalUsesCurrentPriceAndPreservesTheLastAsk() (gas: 4512972)\n[PASS] test_retryResolveIsAlsoRewardedOnce() (gas: 3681919)\n[PASS] test_rewardBoundIsInclusiveAndZeroCapDisablesRewards() (gas: 1069197)\n[PASS] test_terminalRewardIsClippedToBountyNeverBettorDepositsOrAnotherMarket() (gas: 3434422)\n[PASS] test_voidWithoutAsksPaysBeforeReturningBountyAndNeverTwice() (gas: 1726023)\n[PASS] test_zeroRewardKeepsLegacyBalancesEventsAndNoNewPriceDependency() (gas: 3011471)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 13.24ms (11.37ms CPU time)\n\nRan 17 tests for test/VerdictOracle.t.sol:VerdictOracleTest\n[PASS] test_bodyLimitsAndExactPaymentRequired() (gas: 586164)\n[PASS] test_configDelayCapAndInvalidConfiguration() (gas: 9288)\n[PASS] test_consumedIntakeIdAndOracleIdCannotBeStoredTwice() (gas: 970882)\n[PASS] test_deliveredAnswerRemainsReadableAfterExpiry() (gas: 524142)\n[PASS] test_expiredFutureMalformedAndTamperedRejected() (gas: 766661)\n[PASS] test_falseAnswerStoredUnder150kGas() (gas: 575766)\nLogs:\n  cold callback gas: 126024\n\n[PASS] test_intakeAndSignerRotationPreservesInflightRequest() (gas: 2174481)\n[PASS] test_maxAnswerUnder150kGas() (gas: 610147)\nLogs:\n  maximum answer cold callback gas: 140592\n\n[PASS] test_replacingConfigProposalRestartsDelay() (gas: 283461)\n[PASS] test_requestPaysExactlyAndPinsConfiguration() (gas: 403481)\n[PASS] test_requestReentrancyFails() (gas: 486117)\n[PASS] test_reusedIntakeRequestIdRollsBackPayment() (gas: 545892)\n[PASS] test_timelockAndOwnable2Step() (gas: 558572)\n[PASS] test_wrongChainDomainStoresNothing() (gas: 417825)\n[PASS] test_wrongConsumerDomainStoresNothing() (gas: 422712)\n[PASS] test_wrongIntakeAndUnknownIdStoreNothing() (gas: 454254)\n[PASS] test_wrongSignerStoresNothingAndNoRefund() (gas: 522119)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 17.61ms (5.30ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_burnVaultHasNoCallablePathOrEtherReceiver() (gas: 1013344)\n[PASS] test_exactSepoliaFactoryDeploymentWithoutDependencyCode() (gas: 21758607)\n[PASS] test_rehearsalRefusesOtherChains() (gas: 207095)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 35.22ms (35.14ms CPU time)\n\nRan 7 tests for test/VerdictAtomicity.t.sol:VerdictAtomicityTest\n[PASS] testFuzz_failureAtAnyFinalizeRecipientRollsBackEarlierPayments(uint8,bool) (runs: 64, μ: 2504161, ~: 2500039)\n[PASS] test_failedBountyReturnDoesNotVoidMarketOrPreventLaterRefund() (gas: 1197636)\n[PASS] test_failedCallbackIsNotRefundedButMarketRetryAndSettlementRemainReachable() (gas: 2513936)\n[PASS] test_failedEscalationPaymentCannotExtendOrConsumeDisputeWindow() (gas: 2802909)\n[PASS] test_failedPrimaryPaymentRestoresBountyAskCountTimestampAndAllowances() (gas: 1819869)\n[PASS] test_failedRefundCanBeRetriedAndDoesNotConsumeAnotherUsersClaim() (gas: 1543017)\n[PASS] test_guardBlocksCrossMarketReentryFromAnOtherwiseEligibleClaimant() (gas: 4610589)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 57.87ms (70.57ms CPU time)\n\nRan 15 tests for test/VerdictMarketsValidation.t.sol:VerdictMarketsValidationTest\n[PASS] test_allowlistRemovalAndPermanentDisable() (gas: 1435821)\n[PASS] test_attestationMustMatchEveryMarketFieldAndPanelRequirements() (gas: 5311019)\n[PASS] test_betZeroUnknownOutcomeAndCloseBoundary() (gas: 776164)\n[PASS] test_bodyHashAndBodySizeValidation() (gas: 787161)\n[PASS] test_bountyMustCoverTwoAsksAfterTransferFee() (gas: 238137)\n[PASS] test_creationEmitsBothFullBodies() (gas: 435909)\n[PASS] test_escalationRequiresDoubleCurrentPanelAndCorrectBody() (gas: 2918941)\n[PASS] test_feeCapAndPoolCapConstructor() (gas: 15600)\n[PASS] test_feeOnTransferCreditsOnlyActualBountyAndStakes() (gas: 1300079)\n[PASS] test_firstProposalAtVoidDeadlineCannotResurrectMarket() (gas: 1452097)\n[PASS] test_guardianHandoverIsTwoStepAndNoUnauthorizedPowers() (gas: 371084)\n[PASS] test_invalidTimesPanelsAndTypes() (gas: 617073)\n[PASS] test_minAgreedCanRequireMoreThanMinimumPanelSize() (gas: 1304263)\n[PASS] test_pauseBlocksOnlyEntryAndRenounceRequiresUnpaused() (gas: 3496119)\n[PASS] test_poolCapUsesReceivedBalanceAndFailedBetIsAtomic() (gas: 888525)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 138.41ms (18.55ms CPU time)\n\nRan 20 tests for test/VerdictMarkets.t.sol:VerdictMarketsTest\n[PASS] testFuzz_terminalConservation(uint96,uint96,uint96,uint8,bool) (runs: 512, μ: 1984263, ~: 2317157)\nLogs:\n  Bound result 25\n  Bound result 60185951266814915520\n  Bound result 1\n\n[PASS] test_asksBeforeAnswerFromAndAtOrAfterAnswerUntilRevert() (gas: 617425)\n[PASS] test_assetRotationBlocksAsksButNotRefunds() (gas: 2199183)\n[PASS] test_emptyWinningBucketCannotVoidUntilDisputeEnds() (gas: 1897286)\n[PASS] test_escalationAnswerCannotBeFirstProposal() (gas: 1288024)\n[PASS] test_escalationAskAtAnswerUntilRevertsEvenInsideDisputeWindow() (gas: 1347669)\n[PASS] test_externalSponsorCannotDeliverPrimaryOrEscalation() (gas: 4023678)\n[PASS] test_fullSettlementPaysWholePoolFeesAndExactRemainder() (gas: 2497339)\n[PASS] test_lateEscalationBeyondVoidAfterStillFinalizesWithoutAnswer() (gas: 2600797)\n[PASS] test_lateEscalationReplacementRestartsWindowOnceAndFinalizes() (gas: 2946147)\n[PASS] test_noEscalationBodyAndDuplicateEscalationAsk() (gas: 2838199)\n[PASS] test_priceIncreaseCannotSpendBettorsCollateral() (gas: 2371427)\n[PASS] test_primaryRetryBlockedAfterDeliveryEvenWithoutProposal() (gas: 1255959)\n[PASS] test_proposeAfterAnswerUntilWithTimelyStoredAnswer() (gas: 1556642)\n[PASS] test_provisionalWindowBoundariesAreStrict() (gas: 2410423)\n[PASS] test_secondPrimaryAskAfter24HoursAndMaximumTwoAsks() (gas: 1889759)\n[PASS] test_tokenReentrancyBlockedOnDepositAndClaim() (gas: 2252847)\n[PASS] test_voidNoAnswerRefundsEveryOutcomeAndUnspentBounty() (gas: 1845228)\n[PASS] test_wrongBodiesAndResolveAfterProposalRevertWithoutSpend() (gas: 1597610)\n[PASS] test_zeroAndUnknownClaimsAndUnfinishedClaimsRevert() (gas: 758134)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 269.63ms (290.00ms CPU time)\n\nRan 7 tests for test/VerdictOutcomes.t.sol:VerdictOutcomesTest\n[PASS] testFuzz_uintBucketDefinition(uint256) (runs: 512, μ: 1407965, ~: 1408030)\n[PASS] test_addressListUsesFirstElementOnlyAndCanonicalAddressKey() (gas: 5141189)\n[PASS] test_booleanOutcomes() (gas: 2442987)\n[PASS] test_bytes32ListUsesFirstElementOnlyAndEmptyMeansNone() (gas: 6343502)\n[PASS] test_malformedEncodedAnswerCannotSetOutcome() (gas: 1362179)\n[PASS] test_numericBucketsIncludeLowerBoundaryExcludeUpper() (gas: 7620203)\n[PASS] test_twoToEightOutcomesAndSortedUniqueDefinitions() (gas: 1904068)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 323.64ms (335.61ms CPU time)\n\nRan 6 tests for test/VerdictOracleAdversarial.t.sol:VerdictOracleAdversarialTest\n[PASS] testFuzz_rotationsKeepFourInflightSnapshotsInAnyDeliveryOrder(uint256) (runs: 256, μ: 5459941, ~: 5459941)\n[PASS] test_contractSignerIsPinnedAndRevokedSignatureStoresNothing() (gas: 1500716)\n[PASS] test_everyAttestationFieldIsBoundBySignatureAndStoredHash() (gas: 2610090)\n[PASS] test_expiryAndClockToleranceAreInclusiveAtExactBoundary() (gas: 977206)\n[PASS] test_nonCanonicalAndTruncatedSignaturesCannotConsumePendingRequest() (gas: 829148)\n[PASS] test_pendingOwnerCannotAcceptConfigurationAndFormerOwnerLosesAccess() (gas: 434003)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 325.30ms (338.67ms CPU time)\n\nRan 1 test for test/SettlerLifecycleProperties.t.sol:SettlerLifecyclePropertiesTest\n[PASS] testFuzz_allLifecyclePathsConserveActualTransfers(uint96,uint96,uint96,uint96,uint8,uint64,bool) (runs: 512, μ: 3614717, ~: 3669545)\nLogs:\n  Bound result 113284101\n  Bound result 14747\n  Bound result 8877\n  Bound result 5462\n  Bound result 3600\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 353.59ms (351.84ms CPU time)\n\nRan 7 tests for test/SettlerBountyBoundaries.t.sol:SettlerBountyBoundariesTest\n[PASS] testFuzz_exactMinimumAndOneWeiShortAcrossUint256(uint256,uint256) (runs: 1000, μ: 1462898, ~: 1465922)\nLogs:\n  Bound result 456991903177597861211656454114794942099392984940215307\n  Bound result 1285\n\n[PASS] testFuzz_transferTaxAcceptsExactReceivedMinimumAndRejectsOneWeiLess(uint96,uint16) (runs: 1000, μ: 1330146, ~: 1332837)\nLogs:\n  Bound result 129916070488\n  Bound result 52\n\n[PASS] testFuzz_unrepresentableMinimumRevertsBeforeTokenTransfer(uint256,uint256) (runs: 1000, μ: 359352, ~: 359322)\nLogs:\n  Bound result 1461501637330902918203684832716283019655932542976\n  Bound result 92633671389852956338856788007534926937548348899793925164652580414192876729548\n\n[PASS] test_entireUint256SupplyCanBeReturnedWithoutDust() (gas: 1179254)\n[PASS] test_maximumPriceWithRepresentableBountyAndZeroReward() (gas: 1370215)\n[PASS] test_maximumRepresentableRewardBudget() (gas: 1460633)\n[PASS] test_oneWeiPriceAndOneWeiReward() (gas: 1458679)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 354.45ms (1.01s CPU time)\n\nRan 12 tests for test/IndependentReview.t.sol:IndependentReviewTest\n[PASS] testFuzzReviewActualTransfersConserveInAnyClaimOrder(uint96,uint96,uint96,uint8) (runs: 512, μ: 2743953, ~: 2743992)\nLogs:\n  Bound result 5997\n  Bound result 15915\n  Bound result 10371\n\n[PASS] testReviewAgreementMinimumCanExceedMinimumPanel() (gas: 1794321)\n[PASS] testReviewDonationDoesNotAlterPayoutOrAccounting() (gas: 1922129)\n[PASS] testReviewEscalationCannotBeFirstProposalEvenWithLargePanel() (gas: 1287636)\n[PASS] testReviewEscalationCannotVoidAfterDeadline() (gas: 2402024)\n[PASS] testReviewFailedTokenTransferRollsBackClaim() (gas: 2064631)\n[PASS] testReviewLateReplacementPastVoidRemainsFinalizable() (gas: 2687831)\n[PASS] testReviewMaximumAnswerColdCallback() (gas: 1330996)\nLogs:\n  maximum answer cold callback gas: 140592\n\n[PASS] testReviewMixedMarketsCannotCrossSubsidizeClaims() (gas: 3423848)\n[PASS] testReviewNoWinnerIsVoidableAfterWindowPastVoidAfter() (gas: 2062891)\n[PASS] testReviewRotationPreservesOldCallerAndKey() (gas: 2382651)\n[PASS] testReviewSameAttestationCannotOverwriteDifferentRequest() (gas: 1489606)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 370.00ms (384.39ms CPU time)\n\nRan 7 tests for test/VerdictSettlementProperties.t.sol:VerdictSettlementPropertiesTest\n[PASS] testFuzz_feeSplitsAndRationalPayoutBoundsInEveryClaimOrder(uint256,uint16,uint16,uint16,uint8) (runs: 1000, μ: 3071155, ~: 3076446)\nLogs:\n  Bound result 500\n  Bound result 0\n  Bound result 0\n  Bound result 11003781054285787943\n  Bound result 94317616569124958230\n  Bound result 71965085623116308881\n  Bound result 90000000000000000000\n\n[PASS] testFuzz_numericOutcomeSatisfiesItsHalfOpenInterval(uint128,uint96,uint256,uint8) (runs: 1000, μ: 1453690, ~: 1445270)\nLogs:\n  Bound result 5\n  Bound result 23797035463256\n  Bound result 115094120456491373928930716\n\n[PASS] test_malformedListsCannotChangeAnAuthenticatedMarketsOutcome() (gas: 3071650)\n[PASS] test_oneWeiLastWinnerReceivesTheRoundingRemainder() (gas: 2377044)\n[PASS] test_oneWeiWinnerMayRoundToZeroButLastClaimStillDrainsExactly() (gas: 2702870)\n[PASS] test_payoutUsesFullPrecisionWhenIntermediateStakeTimesPoolOverflows256Bits() (gas: 2634565)\n[PASS] test_settlementEventsDescribeWholePoolFeesAndUnspentBounty() (gas: 2082531)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 370.15ms (566.34ms CPU time)\n\nRan 11 tests for test/RevisionRegression.t.sol:RevisionRegressionTest\n[PASS] testFuzz_lateEscalationHasFiniteSettlementDeadline(uint32,uint32,uint32,bool) (runs: 256, μ: 2833888, ~: 3071379)\nLogs:\n  Bound result 135067\n  Bound result 2105\n  Bound result 1334\n\n[PASS] testFuzz_onlyLatestPaidPrimaryRequestCanProposeRegardlessOfDeliveryOrder(bool,bool) (runs: 256, μ: 3087154, ~: 3087161)\n[PASS] test_escalationCannotUseAnswerIssuedBeforeItsAsk() (gas: 2079675)\n[PASS] test_identicalEscalationBodiesStillRequireEachMarketsOwnPaidAsk() (gas: 5494904)\n[PASS] test_lateEscalationIssuedAfterAnswerUntilSettlesCorrectedOutcome() (gas: 2944638)\n[PASS] test_otherMarketAnswerCannotSetOutcomeOrBlockRetry() (gas: 3155829)\n[PASS] test_oversizeAnswerRefused() (gas: 1037908)\n[PASS] test_renounceRequiresAllowlistDisabledEvenWhenEmpty() (gas: 547493)\n[PASS] test_unusableDeliveryBlocksRetry() (gas: 1324097)\n[PASS] test_zeroBoundRejectedWithoutTakingBounty() (gas: 1641661)\n[PASS] test_zeroDelayAcceptsConfigInSameBlock() (gas: 271514)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 378.94ms (577.95ms CPU time)\n\nRan 18 tests for test/CollateralAdversarial.t.sol:CollateralAdversarialTest\n[PASS] testFuzz_constructorChecksEachSlotIndependently(uint16,uint16,uint16,uint16,uint16,uint16,uint256,uint256) (runs: 512, μ: 54774, ~: 44668)\nLogs:\n  Bound result 24\n  Bound result 1\n  Bound result 415\n  Bound result 225\n  Bound result 278\n  Bound result 52\n  Bound result 74244874892194183213271738731540918077\n  Bound result 1116350055339795143277159632461627478779014147908913\n\n[PASS] testFuzz_wethFeeSplitConservesPoolExactly(uint16,uint16,uint16,uint256,uint256,uint256,uint256) (runs: 512, μ: 3224768, ~: 3234043)\nLogs:\n  Bound result 0\n  Bound result 347\n  Bound result 104\n  Bound result 79446960526270590\n  Bound result 275007619679615483\n  Bound result 131691426926629984\n  Bound result 204605203066691782\n\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 754506)\n[PASS] test_assetRotationAfterProposalStillFinalizesInRecordedToken() (gas: 2725731)\n[PASS] test_assetRotationToUnheldTokenCannotOpenMarketsOrTouchExistingCustody() (gas: 2277117)\n[PASS] test_constructorBoundaryCapsAndCheckOrder() (gas: 40338)\n[PASS] test_guardianCannotAlterSlots() (gas: 396460)\n[PASS] test_imdCollateralWithWethBountyKeepsLedgersInSwappedTokens() (gas: 2829338)\n[PASS] test_wethBetFailurePathsLeaveCustodyUntouched() (gas: 1013462)\n[PASS] test_wethCallbackDuringFinalizeCannotReenter() (gas: 4719399)\n[PASS] test_wethCapBoundaryAtLaunchCap() (gas: 1506043)\n[PASS] test_wethCapIsExactAtOneWei() (gas: 1162115)\n[PASS] test_wethClaimFailurePaths() (gas: 2296638)\n[PASS] test_wethCollateralWithWethBountyPaysCreatorOnce() (gas: 2337818)\n[PASS] test_wethMarketCreationNeedsIMDBounty() (gas: 318758)\n[PASS] test_wethPoolNeverSubsidisesSettlerRewards() (gas: 2581750)\n[PASS] test_wethRefundsWhilePausedReturnBothSides() (gas: 1333273)\n[PASS] test_wethStakeTaxedToZeroReverts() (gas: 674706)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 379.02ms (391.03ms CPU time)\n\nRan 10 tests for test/SettlerIndependentReview.t.sol:SettlerIndependentReviewTest\n[PASS] testFuzz_rewardRecipientsMayAlsoBeCreatorWinnerOrTreasury(uint8) (runs: 512, μ: 2349791, ~: 2341021)\n[PASS] testFuzz_rewardReserveUsesPriceAfterPaidAsk(uint256) (runs: 512, μ: 1423022, ~: 1426140)\nLogs:\n  Bound result 700000000000000003\n\n[PASS] test_creatorReturnFailureRevertsFinalizeIncludingEarlierReward() (gas: 2606588)\n[PASS] test_creatorReturnFailureRevertsVoidIncludingEarlierReward() (gas: 1330961)\n[PASS] test_failedProposalRewardLeavesStoredAnswerUsableAndPaysOnceOnRetry() (gas: 1932390)\n[PASS] test_finalizeRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 3508414)\n[PASS] test_maximumPriceAfterPaidAskSuppressesRewardWithoutReverting() (gas: 1377344)\n[PASS] test_positiveTerminalRewardsDoNotDependOnAWorkingOraclePrice() (gas: 2960232)\n[PASS] test_rewardFailureRollsBackTheWholePaidAskAndAllowsRetry() (gas: 2097390)\n[PASS] test_voidRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 2148790)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 378.94ms (703.23ms CPU time)\n\nRan 1 test for test/VerdictInvariant.t.sol:VerdictInvariantTest\n[PASS] invariant_actualTokensMatchEveryMarketsAccounting() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+----------------+-------+---------+----------╮\n| Contract       | Selector       | Calls | Reverts | Discards |\n+==============================================================+\n| VerdictHandler | advance        | 830   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | ask            | 827   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | askEscalation  | 841   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | collect        | 834   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | deliverPrimary | 805   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | enter          | 779   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | proposePrimary | 796   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | replaceOutcome | 777   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | settle         | 854   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | togglePause    | 849   | 0       | 0        |\n╰----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 12656\n  Bound result 9421\n  Bound result 20191\n  Bound result 1082\n  Bound result 24\n  Bound result 10683\n  Bound result 50\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.18s (2.18s CPU time)\n\nRan 1 test for test/SettlerRewardInvariant.t.sol:SettlerRewardInvariantTest\n[PASS] invariant_actualTokensMatchEveryMarketsAccounting() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------+----------------+-------+---------+----------╮\n| Contract             | Selector       | Calls | Reverts | Discards |\n+====================================================================+\n| SettlerRewardHandler | advance        | 736   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | ask            | 737   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | askEscalation  | 722   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | changePrice    | 819   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | collect        | 719   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | deliverPrimary | 736   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | enter          | 763   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | proposePrimary | 720   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | replaceOutcome | 726   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | settle         | 780   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | togglePause    | 734   | 0       | 0        |\n╰----------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 750000000000000000\n  Bound result 21569\n  Bound result 802\n  Bound result 7060\n  Bound result 1\n  Bound result 242983844603512969\n  Bound result 1621\n  Bound result 300000000000000000\n  Bound result 16178\n  Bound result 2000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.32s (2.32s CPU time)\n\nRan 2 tests for test/VerdictCollateralInvariant.t.sol:VerdictCollateralInvariantTest\n[PASS] invariant_bothSlotsKeepSeparateLedgersMatchingTokenBalances() (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------------+----------------+-------+---------+----------╮\n| Contract                   | Selector       | Calls | Reverts | Discards |\n+==========================================================================+\n| CollateralLifecycleHandler | advance        | 736   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | ask            | 737   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | askEscalation  | 722   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | changePrice    | 819   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | collect        | 719   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | deliverPrimary | 736   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | enter          | 763   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | proposePrimary | 720   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | replaceOutcome | 726   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | settle         | 780   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | togglePause    | 734   | 0       | 0        |\n╰----------------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 750000000000000000\n  Bound result 374607431768211455\n  Bound result 2473\n  Bound result 1078\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 242983844603512969\n  Bound result 5504\n  Bound result 300000000000000000\n  Bound result 351276154\n  Bound result 2000000000000000000\n\n[PASS] test_handlerSettlesBothSlotsWithRewards() (gas: 10721558)\nLogs:\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 21600\n  Bound result 700000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.70s (4.70s CPU time)\n\nRan 2 tests for test/CollateralRotationInvariant.t.sol:CollateralRotationInvariantTest\n[PASS] invariant_everyTokenCustodyEqualsItsLedgersAcrossRotations() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------------+----------------+-------+---------+----------╮\n| Contract                  | Selector       | Calls | Reverts | Discards |\n+=========================================================================+\n| CollateralRotationHandler | advance        | 1351  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | ask            | 1375  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | askEscalation  | 1390  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | collect        | 1390  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | deliverPrimary | 1395  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | enter          | 1378  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | open           | 1387  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | proposePrimary | 1352  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | replaceOutcome | 1312  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | rotate         | 1345  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | settle         | 1370  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | togglePause    | 1339  | 0       | 0        |\n╰---------------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 50000000000000000\n  Bound result 0\n  Bound result 17354\n  Bound result 247211\n  Bound result 87028\n  Bound result 50000000000000000\n  Bound result 0\n  Bound result 17354\n  Bound result 247211\n  Bound result 87028\n  Bound result 1400000000000004132\n  Bound result 6117\n  Bound result 1400000000000028801\n  Bound result 941521966540340636\n  Bound result 199999999999999978\n  Bound result 1452\n  Bound result 3264\n  Bound result 200000000000000000\n  Bound result 23624\n  Bound result 1400000000000004347\n  Bound result 2612\n  Bound result 13929\n  Bound result 822770327669704734\n  Bound result 28799\n\n[PASS] test_handlerReachesAllFourTokenPairings() (gas: 21298128)\nLogs:\n  Bound result 50000000000000000\n  Bound result 0\n  Bound result 17354\n  Bound result 247211\n  Bound result 87028\n  Bound result 50000000000000000\n  Bound result 0\n  Bound result 17354\n  Bound result 247211\n  Bound result 87028\n  Bound result 500000000000000000\n  Bound result 100000000000000000\n  Bound result 0\n  Bound result 17354\n  Bound result 247211\n  Bound result 87028\n  Bound result 100000000000000000\n  Bound result 0\n  Bound result 17354\n  Bound result 247211\n  Bound result 87028\n  Bound result 700000000000000000\n  Bound result 100000000000000000\n  Bound result 0\n  Bound result 17354\n  Bound result 247211\n  Bound result 87028\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 300000000000000000\n  Bound result 200000000000000000\n  Bound result 28800\n  Bound result 28800\n  Bound result 400000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.47s (6.49s CPU time)\n\nRan 2 tests for test/SettlerRewardSequence.t.sol:SettlerRewardSequenceTest\n[PASS] invariant_rewardsAreMaximalAndEscrowIsConserved() (runs: 256, calls: 20480, reverts: 0)\n\n╭------------------------------+---------------+-------+---------+----------╮\n| Contract                     | Selector      | Calls | Reverts | Discards |\n+===========================================================================+\n| SettlerRewardSequenceHandler | advance       | 1598  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | changePrice   | 1576  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | collect       | 1566  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | deliverAnswer | 1596  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | donate        | 1568  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | escalate      | 1666  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | openMarket    | 1527  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | pauseEntry    | 1561  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | probeRejected | 1578  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | propose       | 1551  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | resolve       | 1561  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | settle        | 1612  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | wager         | 1520  | 0       | 0        |\n╰------------------------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 250000000000000000\n  Bound result 0\n  Bound result 100000000000000000\n  Bound result 500000000000000000\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 43000000000000000011\n  Bound result 629670342972516245\n  Bound result 3619319347948781181\n  Bound result 1476\n  Bound result 442\n  Bound result 100\n  Bound result 10000000000000000\n  Bound result 604800\n  Bound result 83\n  Bound result 37303\n  Bound result 5252\n  Bound result 5861\n  Bound result 999999999999999905\n  Bound result 5114\n  Bound result 226735370600182716\n  Bound result 289386071115149265\n  Bound result 162\n  Bound result 2440063939239267303\n  Bound result 39732\n  Bound result 6644\n  Bound result 11454\n  Bound result 770277085954388404\n  Bound result 4841068840560809\n\n[PASS] test_handlerReachesRetryReplacementClippingAndBothTerminalPaths() (gas: 17530817)\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 250000000000000000\n  Bound result 0\n  Bound result 100000000000000000\n  Bound result 500000000000000000\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 31000000000000000001\n  Bound result 37000000000000000003\n  Bound result 41000000000000000007\n  Bound result 43000000000000000011\n  Bound result 3600\n  Bound result 1400000000000000000\n  Bound result 500000000000000000\n  Bound result 43200\n  Bound result 43200\n  Bound result 17\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.70s (10.71s CPU time)\n\nRan 4 tests for test/VerdictLifecycleInvariant.t.sol:VerdictLifecycleInvariantTest\n[PASS] invariant_tokensStakesAndFinalityMatchIndependentLedger() (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------------------+------------------------+-------+---------+----------╮\n| Contract                | Selector               | Calls | Reverts | Discards |\n+===============================================================================+\n| VerdictLifecycleHandler | advance                | 1257  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askEscalation          | 1245  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askPrimary             | 1232  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | collect                | 1233  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | deliverAnswer          | 1296  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | donate                 | 1216  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | openMarket             | 1260  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeBurn              | 1313  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeIndependentAnswer | 1285  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeTerminal          | 1244  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | settle                 | 1275  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | togglePause            | 1256  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | wager                  | 1272  | 0       | 0        |\n╰-------------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 999999999999999967\n  Bound result 15914\n  Bound result 100\n  Bound result 20400\n  Bound result 505355907330443426\n  Bound result 40000000000000000\n  Bound result 18567\n  Bound result 6284\n  Bound result 6111\n  Bound result 7396\n  Bound result 999999999999999978\n\n[PASS] test_handlerIndependentAnswersCannotBlockRetryOrShopOutcomes() (gas: 10412162)\nLogs:\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 21600\n  Bound result 21600\n  Bound result 21600\n  Bound result 21600\n\n[PASS] test_handlerReachesPrimaryEscalationFailureFinalizeAndRefundPaths() (gas: 16922071)\nLogs:\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 31\n  Bound result 17\n  Bound result 11\n\n[PASS] test_handlerUsesActualLateEscalationIssuanceAndStillDrains() (gas: 10004478)\nLogs:\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n  Bound result 0\n  Bound result 101\n  Bound result 202\n  Bound result 307\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 37.00s (37.05s CPU time)\n\nRan 27 test suites in 37.01s (67.16s CPU time): 198 tests passed, 0 failed, 0 skipped (198 total tests)\n","passed":true},{"durationMs":85,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"VerdictMarkets.acceptGuardian()\",\"VerdictMarkets.bet(uint256,uint8,uint256,uint256)\",\"VerdictMarkets.claim(uint256)\",\"VerdictMarkets.createMarket((bytes32,uint8,uint256,uint64,uint64,uint16,uint16,uint64,uint64,uint64,uint32,uint64,uint256[],bytes32[],uint256,uint256,uint8),bytes,bytes,string,uint256)\",\"VerdictMarkets.disableAllowlist()\",\"VerdictMarkets.escalate(uint256,bytes)\",\"VerdictMarkets.finalize(uint256)\",\"VerdictMarkets.pause()\",\"VerdictMarkets.propose(uint256,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64))\",\"VerdictMarkets.renounceGuardian()\",\"VerdictMarkets.resolve(uint256,bytes)\",\"VerdictMarkets.setCreatorAllowed(address,bool)\",\"VerdictMarkets.transferGuardian(address)\",\"VerdictMarkets.unpause()\",\"VerdictMarkets.voidMarket(uint256)\",\"VerdictOracle.acceptConfig()\",\"VerdictOracle.acceptOwnership()\",\"VerdictOracle.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"VerdictOracle.proposeConfig((address,address,address,bytes32,uint256))\",\"VerdictOracle.renounceOwnership()\",\"VerdictOracle.request(bytes)\",\"VerdictOracle.transferOwnership(address)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":97,\"DEPENDENCIES.md\":14,\"DESIGN.md\":95,\"LICENSE\":21,\"README.md\":169,\"dist/assets/chain-BQwdJvnv.js\":45,\"dist/assets/index-BbSaev33.css\":1,\"dist/assets/index-ByzN5mJO.js\":1,\"dist/assets/react-DbQ9GvLb.js\":49,\"dist/favicon.svg\":1,\"dist/fonts/archivo-OFL.txt\":93,\"dist/fonts/archivo-expanded-800.woff2\":65,\"dist/fonts/ibm-plex-mono-400.woff2\":58,\"dist/fonts/ibm-plex-mono-500.woff2\":62,\"dist/fonts/ibm-plex-mono-OFL.txt\":93,\"dist/index.html\":6,\"dist/social.png\":106,\"docs/AGENTS.md\":174,\"docs/BETTER_INTERFACE_LICENSE.txt\":220,\"docs/COLLATERAL_INDEPENDENT_REVIEW.md\":65,\"docs/DEPLOYMENT.md\":68,\"docs/INDEPENDENT_REVIEW.md\":67,\"docs/REVISION_REVIEW.md\":41,\"docs/SETTLER_INDEPENDENT_REVIEW.md\":79,\"docs/VERIFICATION.md\":41,\"docs/WEBSITE_VALIDATION.md\":131,\"docs/agents/abi/VerdictBurnVault.json\":1,\"docs/agents/abi/VerdictMarkets.json\":1692,\"docs/agents/abi/VerdictOracle.json\":1191,\"docs/agents/addresses.json\":28,\"foundry.toml\":23,\"remappings.txt\":2,\"script/SepoliaParameters.sol\":49,\"src/OracleAttestation.sol\":221,\"src/VerdictBurnVault.sol\":5,\"src/VerdictMarkets.sol\":652,\"src/VerdictOracle.sol\":178,\"src/interfaces/IIntake.sol\":14,\"src/interfaces/IVerdictOracle.sol\":14,\"test/CollateralAdversarial.t.sol\":652,\"test/CollateralIndependentReview.t.sol\":169,\"test/CollateralRotationInvariant.t.sol\":446,\"test/Deployment.t.sol\":109,\"test/IndependentReview.t.sol\":239,\"test/OracleConsumerConformance.t.sol\":162,\"test/RevisionIndependentReview.t.sol\":77,\"test/RevisionRegression.t.sol\":257,\"test/SETTLER_TEST_REVIEW.md\":95,\"test/SettlerBountyBoundaries.t.sol\":144,\"test/SettlerDeployment.t.sol\":67,\"test/SettlerIndependentReview.t.sol\":342,\"test/SettlerLifecycleProperties.t.sol\":118,\"test/SettlerRewardInvariant.t.sol\":249,\"test/SettlerRewardSequence.t.sol\":483,\"test/TESTING.md\":119,\"test/TestBase.sol\":178,\"test/VerdictAtomicity.t.sol\":214,\"test/VerdictCollateral.t.sol\":354,\"test/VerdictCollateralInvariant.t.sol\":323,\"test/VerdictImportedAudit.t.sol\":87,\"test/VerdictInvariant.t.sol\":213,\"test/VerdictLifecycleInvariant.t.sol\":580,\"test/VerdictMarkets.t.sol\":383,\"test/VerdictMarketsValidation.t.sol\":364,\"test/VerdictOracle.t.sol\":288,\"test/VerdictOracleAdversarial.t.sol\":228,\"test/VerdictOutcomes.t.sol\":148,\"test/VerdictSettlementProperties.t.sol\":217,\"test/VerdictSettlerRewards.t.sol\":297,\"test/mocks/MockIMD.sol\":42,\"test/mocks/MockIntake.sol\":62,\"web/index.html\":2,\"web/package-lock.json\":2003,\"web/package.json\":35,\"web/public/favicon.svg\":1,\"web/public/fonts/archivo-OFL.txt\":93,\"web/public/fonts/archivo-expanded-800.woff2\":65,\"web/public/fonts/ibm-plex-mono-400.woff2\":58,\"web/public/fonts/ibm-plex-mono-500.woff2\":62,\"web/public/fonts/ibm-plex-mono-OFL.txt\":93,\"web/public/social.png\":106,\"web/scripts/browser-check.mjs\":414,\"web/scripts/check-export.mjs\":51,\"web/scripts/isolated.mjs\":108,\"web/scripts/revision-cases.mjs\":179,\"web/scripts/verify-contracts.mjs\":120,\"web/scripts/wallet-check.mjs\":784,\"web/src/App.tsx\":740,\"web/src/CreatePage.tsx\":575,\"web/src/MarketPage.tsx\":884,\"web/src/Portfolio.tsx\":224,\"web/src/abi/VerdictBurnVault.json\":1,\"web/src/abi/VerdictMarkets.json\":1,\"web/src/abi/VerdictOracle.json\":1,\"web/src/abi/provenance.json\":10,\"web/src/chain.ts\":377,\"web/src/components.tsx\":358,\"web/src/config.ts\":75,\"web/src/create.ts\":222,\"web/src/domain.ts\":326,\"web/src/main.tsx\":32,\"web/src/store.tsx\":103,\"web/src/styles.css\":2288,\"web/src/types.ts\":126,\"web/src/wallet.tsx\":385,\"web/tests/chain-fixture.json\":454,\"web/tests/domain.test.ts\":328,\"web/tests/wallet-rpc-fixture.json\":636,\"web/tsconfig.json\":17,\"web/validation/browser-results.json\":193,\"web/validation/contract-verification.json\":25,\"web/validation/export-integrity.json\":80,\"web/validation/revision-before.json\":79,\"web/validation/revision-results.json\":181,\"web/validation/wallet-results.json\":76,\"web/vite.config.ts\":37},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8eb3a4b566643ab14f30e644c51e606c5584e4b9cb5bdefc770b485904e3615c","verifiedTreeHash":"5ab8224b4a0eaecbe26b4dfaf1b6966569b327eb","verifierVersion":"0.1.0+0e08a464"}]}