{"assessments":[],"deployments":[{"attestationHash":"99855afce1eda99c7cfbbcea76d8997892a83b9307b54fd5e7f4c77dd623b01b","chainId":1,"contracts":[{"address":"0x279ac25fb2ef2239241c439a007f39c42f99e334","blockNumber":26172752,"name":"VerdictMarkets","role":"other","txHash":"0x85cdf24af3837b8f802200ebadbde7219ba9be8283458fe378d4b5cc3f90b84a"},{"address":"0xb1dfe46f912543e366175201edb298263911a1aa","blockNumber":26172752,"name":"VerdictBurnVault","role":"other","txHash":"0x85cdf24af3837b8f802200ebadbde7219ba9be8283458fe378d4b5cc3f90b84a"},{"address":"0x8ce069975ae8c69bf7cb2bd225aafa43ba307931","blockNumber":26172752,"name":"VerdictOracle","role":"other","txHash":"0x85cdf24af3837b8f802200ebadbde7219ba9be8283458fe378d4b5cc3f90b84a"}],"id":"f738bb79-c5d4-41ed-8031-23b6c934f2f8","manifestHash":"562603b896bd5d73b6565f998e88ffcbe312a5b0665a14f6b7501ab4c7d820f4","status":"live"}],"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":"8f416162-687e-4cda-b965-c20116b36ff0","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"1af775f319be6ece3b22438cfcb7477f01861a81c75c410c48b10e810922ccc3","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":"f7d955ece8ce238e61030eb7bf202213831fb57f7bffd68576f489b33a2005c1","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":"adfd1aab32d30a66868bb6d8691ef2bd7650dfd2ada1face23a9c491df12da05","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":"d31bd585f0ac3a6212f151ecf11861504c1de793a1a535396ed8cf79339f397f","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":"fac34908b47cef05801c594be6cf1c6a5276e85d1b54daf2e049aa597830e14d","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":"4d86269786348acba01fa4495ad4feb361c25b043b09b42aca468ccc35a2b2ae","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":"c935c94a816f4956e8e48b747e5626ee0928e461a64921a8c08c8dbc88998eff","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":"2145dad23c4afd925942e213d0a0ad8044784ac000718dd013a5bcf4aeed3f52","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"e409995888e3b3fef50eb94df0f72167db0e6c736f90b0cdecaf2cdac572b21b","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":"Deploy this repository's audited Verdict contracts (src/VerdictBurnVault.sol, src/VerdictOracle.sol, src/VerdictMarkets.sol, as reviewed and deployed on Sepolia in launch 1301) on Ethereum mainnet (chain 1) without changing their behaviour. Re-run every existing test and the independent review, then deploy all three in the order VerdictBurnVault, VerdictOracle, VerdictMarkets. Leave web/ and dist/ untouched; a later job updates the site. Fill docs/agents/addresses.json with the mainnet addresses and deploy block.\n\nWhat it is: parimutuel prediction markets created by allowlisted agents and settled by IMD's oracle through IMD's Intake version 2. Each market takes bets in one of two collateral tokens, IMD or WETH, while bounties, oracle fees and settler rewards are paid in IMD.\n\nMainnet settings:\n- VerdictOracle uses IMD's Intake v2 0xa43e6f75ee006411f79ac1c84120606c2330de82, the IMD token 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, oracle signer 0x5598aa9146215bc13eb26f2c692ad1461fd32982, action oracle.request@oracle-1 and price 0.5 IMD, with a 48-hour config delay.\n- Collateral slot 0 is IMD (1.5% to the market creator, 0.5% burned to VerdictBurnVault, 0.5% to the treasury; 500 IMD cap per market). Slot 1 is WETH9 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 (1.5% to the creator, no burn, 1% to the treasury; 1 WETH cap per market). Total fee 2.5% in both slots.\n- Maximum settler reward 0.25 IMD per action.\n- Owner and guardian are 0x397dacb1ee8e9a8ce5196988958f56bde0a0a312, the launch owner. The treasury is a separate wallet, 0x2a85072b71908ca9255934250bfc6ceff82d0231, and receives only the treasury fee share. The creator allowlist starts on and empty; the guardian approves creators after deployment.\n\nEthereum mainnet only. GitHub publication is approved. Contracts only: no token, no pool, no proxy. Constructor arguments: VerdictBurnVault(); VerdictOracle(0xa43e6f75ee006411f79ac1c84120606c2330de82, 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, 0x5598aa9146215bc13eb26f2c692ad1461fd32982, 0x6f7261636c652e72657175657374406f7261636c652d31000000000000000000, 500000000000000000, 0x397dacb1ee8e9a8ce5196988958f56bde0a0a312, 172800); VerdictMarkets($contract:VerdictOracle, 0x2a85072b71908ca9255934250bfc6ceff82d0231, $contract:VerdictBurnVault, 0x397dacb1ee8e9a8ce5196988958f56bde0a0a312, 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, 150, 50, 50, 500000000000000000000, 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2, 150, 0, 100, 1000000000000000000, 250000000000000000). Solidity 0.8.26, OpenZeppelin v5 as vendored.","parentJobId":null,"planHash":"31ae7b0086cc9a24d81171503036be6af1e27d0b684103462255a02ab1be059a","previousHash":"d56dbe514c09b628610bfd6ef8592366157c80dc9ce780786237ac3c3988e1ac","projectId":"8f416162-687e-4cda-b965-c20116b36ff0","publication":{"commit":"083060a91b138c0668a87be8b44231bca380713e","deliveredAt":"2026-10-12T00:15:30.217Z","repoUrl":"https://github.com/identity-md-launches/launch-1346-deploy-repository-s-audited-verdict"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"43bd511ece881fb480f16b909c8f98072dfdc697e586b43cc9fe0af4d2df7cb8","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"a4fe75ca26e431cd44cfa5ea936744aa52d50065d63ff985faac28a4c0ee7d42","device":"483b1030f62fc40e","findings":[],"hash":"1af775f319be6ece3b22438cfcb7477f01861a81c75c410c48b10e810922ccc3","nodeId":"a675b7cd-82a3-4ca6-b59b-aeb71a550ab5","outcome":"completed","summary":"Fixed the lockup finding: request windows must span at least one hour, and timeout deadlines must fall within 365 days of creation.\n\nBuild, reviewer proof, independent-review suites, and all 219 delivered tests pass offline. All 11 findings have responses; ADAPTATION.md records the changes. `web/` and `dist/` are untouched.\n\nLive deployment and confirmed addresses remain pending the launch service.","treeHash":"4d95a38dabff49c6c4156bee409ddc066e17d059","usage":{"cachedInputTokens":4590720,"inputTokens":156555,"model":"gpt-6-astra","outputTokens":31969,"runtime":"codex","turns":10,"wallClockMs":992253}},{"artifacts":[],"attempt":1,"bundleHash":"3a405d24f10b267219dc571cb1da9405466044c199145ba62b1f3ac7ffa40495","device":"63c29c49a249ab7e","findings":[],"hash":"2145dad23c4afd925942e213d0a0ad8044784ac000718dd013a5bcf4aeed3f52","nodeId":"7a92f5c6-167b-419e-9523-49ad21c97454","outcome":"completed","summary":"Done. `launch.json` is written at the repository root and is the only file changed outside the scratch area.\n\n**What the manifest contains**\n\n- Kind `evm_contracts`, three contracts in dependency order: VerdictBurnVault, VerdictOracle, VerdictMarkets.\n- VerdictBurnVault takes no arguments.\n- VerdictOracle takes the Intake v2, IMD token, oracle signer, the `oracle.request@oracle-1` action id, 0.5 IMD price, `$owner` and the 48-hour delay. `$owner` resolves to the launch owner 0x397d…a312, which the brief names.\n- VerdictMarkets takes `$contract:VerdictOracle`, the treasury wallet 0x2a85…0231, `$contract:VerdictBurnVault`, `$owner` as guardian, then the IMD slot (150/50/50 bps, 500 IMD cap), the WETH9 slot (150/0/100 bps, 1 WETH cap) and the 0.25 IMD settler reward cap. That is 15 arguments, within the 16 limit.\n- Notes explain each argument and role in under 2,400 characters.\n\n**Verification**\n\n- A scratch test embedded the manifest, resolved `$owner` and `$contract:` references, ABI-encoded every argument, and asserted the bytes equal the accepted `MainnetParameters` encodings. It then deployed all three on an empty chain, checked runtime size, and read back owner, treasury, guardian, both collateral slots, price, delay and reward cap. It passed.\n- `forge build` succeeds. The full existing suite, including every independent review and the mainnet launch test, passed with no failures.\n\n| Result | Count |\n| --- | --- |\n| Test suites | 28 |\n| Tests passed | 202 |\n| Tests failed | 0 |\n\n- `git status` shows only the new `launch.json` plus ignored scratch output. Config files, `lib/`, `web/` and `dist/` are untouched.\n\n**Outside this task's scope**: the mainnet addresses and deploy block in `docs/agents/addresses.json` stay `null`. They are filled by the deployment handoff after the launch service deploys, since this assignment may only write the manifest.","treeHash":"1a5dec438a4be02ac2a23be8329c443e76bdee51","usage":{"cachedInputTokens":623956,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":10674,"runtime":"claude","turns":20,"wallClockMs":522179}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b57ae3a96321a0e1","findings":[{"citation":"resolved","description":"Merged from audit_flow (medium). _validateParams only orders closeAt <= answerFrom < answerUntil < voidAfter. It accepts an ask window of one second and a voidAfter of type(uint64).max. Once bets are in, every exit reverts: resolve/escalate revert OutsideWindow (window passed), propose has no ask to authenticate, voidMarket reverts OutsideWindow until voidAfter, finalize/claim revert WrongState. The guardian has no token powers, so the collateral (up to 500 IMD or 1 WETH per market, unlimited markets) and the creator's bounty are stuck in VerdictMarkets with no rescue path. Requires a malicious or careless allowlisted creator today (anyone after disableAllowlist). The README records 'No maximum lifetime or minimum gap between answerUntil and voidAfter is imposed' as a limitation; it is reported because the result is an irreversible loss of third-party funds that a two-line bound in _validateParams prevents without changing the design. Fix: require answerUntil - answerFrom >= a floor (e.g. 1 hour, matching the dispute floor) and voidAfter - closeAt <= a ceiling (e.g. 365 days).","line":594,"path":"src/VerdictMarkets.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {VerdictOracle} from \"src/VerdictOracle.sol\";\nimport {VerdictMarkets} from \"src/VerdictMarkets.sol\";\nimport {VerdictBurnVault} from \"src/VerdictBurnVault.sol\";\nimport {IIntake} from \"src/interfaces/IIntake.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract LockToken is ERC20 {\n    constructor() ERC20(\"T\", \"T\") {}\n\n    function mint(address to, uint256 amount) external {\n        _mint(to, amount);\n    }\n}\n\ncontract LockIntake is IIntake {\n    uint256 public nonce;\n\n    function request(bytes32, bytes calldata, Callback calldata, address asset, uint256 amount)\n        external\n        payable\n        returns (bytes32 id)\n    {\n        ERC20(asset).transferFrom(msg.sender, address(this), amount);\n        id = keccak256(abi.encode(address(this), ++nonce));\n    }\n}\n\n/// @notice A creator can pick `answerUntil = answerFrom + 1` and `voidAfter = type(uint64).max`.\n/// Nothing can then be asked (the one-second ask window is unreachable in practice) and nothing can\n/// ever be voided, so every bettor's collateral is locked in the contract for ever.\n/// Fails on the current code because `_validateParams` accepts these values. Passes once the\n/// lifetime (`voidAfter`) and the ask window (`answerUntil - answerFrom`) are bounded.\ncontract VoidAfterLockTest is Test {\n    LockToken imd;\n    LockToken weth;\n    LockIntake intake;\n    VerdictOracle oracle;\n    VerdictMarkets markets;\n    address creator = makeAddr(\"creator\");\n    address alice = makeAddr(\"alice\");\n\n    function setUp() public {\n        vm.warp(1_800_000_000);\n        vm.chainId(1);\n        imd = new LockToken();\n        weth = new LockToken();\n        intake = new LockIntake();\n        oracle = new VerdictOracle(address(intake), address(imd), vm.addr(1), bytes32(\"a\"), 0.5 ether, address(this), 0);\n        VerdictBurnVault burn = new VerdictBurnVault();\n        markets = new VerdictMarkets(\n            address(oracle), makeAddr(\"treasury\"), address(burn), address(this), address(imd), 150, 50, 50,\n            500 ether, address(weth), 150, 0, 100, 1 ether, 0.25 ether\n        );\n        markets.setCreatorAllowed(creator, true);\n        imd.mint(creator, 10 ether);\n        imd.mint(alice, 100 ether);\n        vm.prank(creator);\n        imd.approve(address(markets), type(uint256).max);\n        vm.prank(alice);\n        imd.approve(address(markets), type(uint256).max);\n    }\n\n    function lockingParams() internal view returns (VerdictMarkets.Params memory p) {\n        p.questionHash = keccak256(\"q\");\n        p.answerType = 0;\n        p.dataChainId = 1;\n        p.fromBlock = 100;\n        p.toBlock = 200;\n        p.minPanelSize = 5;\n        p.minAgreed = 4;\n        p.closeAt = uint64(block.timestamp + 1 hours);\n        p.answerFrom = p.closeAt;\n        p.answerUntil = p.answerFrom + 1; // one-second ask window\n        p.disputeWindow = 1 hours;\n        p.voidAfter = type(uint64).max; // never voidable\n        p.bounty = 1 ether;\n        p.settlerReward = 0;\n        p.collateralId = 0;\n    }\n\n    function test_creatorCannotCreateAMarketThatLocksCollateralForever() public {\n        VerdictMarkets.Params memory p = lockingParams();\n        vm.prank(creator);\n        vm.expectRevert(VerdictMarkets.InvalidParams.selector);\n        markets.createMarket(p, \"body\", \"\", \"\", 0);\n    }\n}","reproduction":"Fresh deployment (mainnet terms), creator allowlisted, alice holds 100 IMD. Creator calls createMarket with closeAt = now + 1h, answerFrom = closeAt, answerUntil = answerFrom + 1, voidAfter = type(uint64).max, disputeWindow = 1h, bounty = 1e18, settlerReward 0, collateralId 0, answerType 0, minPanelSize 5, minAgreed 4, dataChainId 1, fromBlock 100, toBlock 200. Expected: InvalidParams. Actual: market 1 is created (verified: the attached proof fails on this tree with 'next call did not revert as expected'). alice calls bet(1, 1, 100e18, 0): succeeds, contract holds 101 IMD. At answerFrom + 2, resolve(1, body) reverts OutsideWindow; at any later time voidMarket(1) reverts OutsideWindow, finalize(1) and claim(1) revert WrongState. The 101 IMD can never leave the contract.","severity":"medium","snippet":"                || p.answerFrom >= p.answerUntil || p.answerUntil >= p.voidAfter || p.disputeWindow < 1 hours","title":"Creator-chosen windows can lock bettor collateral forever: no minimum ask window and no bound on voidAfter"},{"citation":"resolved","description":"Merged from audit_permissions (low). resolve() lets anyone buy a second primary ask 24h after the first while the first intake request is still pending (lines 377-381) and pays the caller the settler reward (line 384). The retry consumes the second of the two bounty-funded asks, and escalate() refuses once asks >= 2 (line 394). propose() then refuses the genuine first answer (line 419). When the panel is slow (>24h) the Intake writer's onOracleResult carries the signed attestation in public calldata, so a bettor who sees the answer favours them can front-run it with resolve(id, body): the authentic answer is stored but unproposable, the retry answer (normally the same result) is proposed, and the losing side's escalate() reverts AskLimit. Nothing requires the retry buyer to be disinterested. Bounded by one market's stake and by needing a slow panel; the market still settles on the panel's answer, so it is a loss of the documented dispute right, not of principal. Suggested fix preserving the two-ask economics: let escalate() proceed whenever bountyRemaining >= price regardless of asks, or refuse the retry to an address with stake in the market.","line":394,"path":"src/VerdictMarkets.sol","reproduction":"test/scratch/JudgeRepro.t.sol::test_retryByBettorKillsEscalation passes on this tree. State: market with bounty 3 IMD, settlerReward 0.25 IMD, alice 10 IMD on outcome 1, bob 10 IMD on outcome 0. At answerFrom resolve(id, body) -> first ask. 24h later, with first still pending, alice calls resolve(id, body): succeeds, asks == 2, alice receives 0.25 IMD. The Intake delivers a1 for the first request: propose(id, a1) reverts UnauthenticatedAnswer. a2 for the retry is delivered and proposed by alice. bob calls escalate(id, escalationBody) inside the dispute window: reverts AskLimit. Expected per README step 5: anyone may escalate once during the dispute window. Actual: dispute impossible.","severity":"low","snippet":"        if (m.asks >= 2) revert AskLimit();","title":"Permissionless retry shares the two-ask budget with escalation: an interested bettor can buy the retry while the first answer is deliverable and remove the dispute right"},{"citation":"resolved","description":"Merged from audit_flow (low). The retry gate asks only whether the first intake request is still pending in VerdictOracle. VerdictOracle clears pending on any callback that is from the recorded intake, in window and correctly signed; it does not know the market's minPanelSize, minAgreed, questionHash, block window or answer type. An attestation the oracle accepts but propose() rejects (panelSize below minPanelSize, agreed < quorum, a different questionHash or window, a malformed abi answer) leaves the market with no proposable answer and no retry; escalate is unreachable because the market stays Open. The only exit is voidMarket at voidAfter: bettors wait, collateral is refunded, the oracle fee is lost. The README documents this as the 'no-delivery' retry rule, so it is a design limitation with a concrete cost; a behaviour-preserving mitigation is to allow the retry when the delivered answer failed the market's own checks, or to document that minPanelSize must equal the body's panelSize.","line":380,"path":"src/VerdictMarkets.sol","reproduction":"test/scratch/JudgeRepro.t.sol::test_unusableAnswerBlocksRetry passes on this tree. State: market with minPanelSize 5, alice 10 IMD on outcome 1; at answerFrom resolve(id, body) -> requestId. Deliver an attestation with panelSize 4, agreed 4, quorum 4 signed by the oracle signer: hasPendingRequest(requestId) becomes false. propose(id, a) reverts InvalidAttestation. 24h+1 later resolve(id, body) reverts AnswerAlreadyDelivered; escalate reverts WrongState. At voidAfter voidMarket(id) succeeds with oracleSpend == 0.5 IMD lost. Expected: a retry is possible since no usable answer exists.","severity":"low","snippet":"            if (!oracle.hasPendingRequest(m.primaryRequests[0])) revert AnswerAlreadyDelivered();","title":"A signed delivery the market cannot use clears the oracle's pending slot and blocks both proposal and retry; market stalls to voidAfter with the fee spent"},{"citation":"resolved","description":"Merged from audit_math (low). Betting closes at closeAt <= answerFrom, so at resolve time the pool is final. With m.pool == 0 no outcome can have winning stake: finalize always reverts NoWinningStake and the only terminal state is Voided, which needs no oracle answer. resolve still sells an ask (0.5 IMD from the bounty) and pays the caller a settler reward, propose pays another, voidMarket a third; with a slow panel a retry adds a second ask and a fourth reward. The bounty ledger stays conserved, so this is a loss to the creator under a specific state rather than an accounting break. Fix preserving the design: revert resolve when m.pool == 0 and let voidMarket at voidAfter (optionally from closeAt when pool == 0) be the exit.","line":372,"path":"src/VerdictMarkets.sol","reproduction":"test/scratch/JudgeRepro.t.sol::test_emptyPoolDrain passes on this tree. Mainnet terms (price 0.5e18, maxSettlerReward 0.25e18). Creator creates a bool market with settlerReward 0.25e18 and bounty 2.25e18; nobody bets. At answerFrom carol calls resolve: oracleSpend 0.5e18, carol +0.25e18. Oracle delivers; carol calls propose: +0.25e18. At disputeEnds finalize reverts NoWinningStake; carol calls voidMarket: +0.25e18, creator receives 1.0e18. Expected for a market with no stake: no oracle purchase, one void reward, creator gets 2.0e18 back. Actual: settler 0.75e18, oracle 0.5e18, creator 1.0e18.","severity":"low","snippet":"    function resolve(uint256 id, bytes calldata body) external nonReentrant returns (bytes32 requestId) {","title":"resolve/propose/void on a market with zero pool spend the creator's bounty on asks and settler rewards that can never produce a payout"},{"citation":"resolved","description":"Merged from audit_math (low). A replacement must carry panelSize >= 2 * m.panelSize. The paid oracle door caps panelSize at 100 today (oracle-consumer reference, limits.maxPanelSize), so once the primary attestation's panelSize is 51 or more no sellable escalation answer can pass line 410. escalate() (lines 387-400) does not consult m.panelSize before committing: it marks escalationAsked, extends disputeEnds to at least now + 24h and spends oracle.price() from the creator's bounty. Anyone may call it at no cost to themselves, so on any market whose primary panel exceeded 50 a third party can burn 0.5 IMD of the bounty and delay finalization by up to 24h for no possible benefit. Principal is not at risk. Fix preserving the design: refuse escalation when 2 * m.panelSize exceeds the largest panel the oracle sells (constructor value or constant), or document that creators attaching an escalation body must keep the primary panel at most 50.","line":410,"path":"src/VerdictMarkets.sol","reproduction":"test/scratch/JudgeRepro.t.sol::test_escalateWithPanelAbove50 passes on this tree. Market with escalation body, bets on both sides, primary answer with panelSize 60 proposed (m.panelSize == 60). escalate(id, escalationBody) succeeds: bountyRemaining drops by 0.5e18, disputeEnds >= previous. The oracle answers with the maximum sellable panel, 100: propose(id, r) reverts InvalidAttestation since 100 < 120. Expected: an escalation that cannot be answered within the oracle's limits is refused before the bounty is spent.","severity":"low","snippet":"            if (uint256(a.panelSize) < uint256(m.panelSize) * 2) revert InvalidAttestation();","title":"escalate spends the bounty and extends the dispute window even when the doubled-panel requirement cannot be met by the oracle (primary panel > 50 against the 100-seat cap)"},{"citation":"resolved","description":"Merged from audit_permissions (low). Ownable2Step makes transferOwnership two-step but inherits Ownable.renounceOwnership() unchanged: one call by the owner sets owner to address(0) with no pending step and no precondition. proposeConfig and acceptConfig are onlyOwner, so the intake, action id (oracle-1 -> oracle-2), asset, price and signer can then never change, and a config already pending at renounce time is stranded. The oracle-consumer reference says these values must not need a redeploy; if IMD retires the action or moves the price, every VerdictMarkets ask reverts and every open market times out to void. VerdictMarkets applies the opposite discipline to its own role: renounceGuardian refuses while paused or while the allowlist is on. This is an admin action, reported as a recoverability gap, not an exploit. Minimal fix: override renounceOwnership() to revert, or to require !configPending.","line":14,"path":"src/VerdictOracle.sol","reproduction":"test/scratch/JudgeRepro.t.sol::test_oracleRenounceOneStep passes on this tree. Owner calls proposeConfig(Config(intake, IMD, signer, bytes32('oracle.request@oracle-2'), 0.5e18)) then renounceOwnership(): one transaction, owner() == address(0), configPending still true, acceptConfig() reverts OwnableUnauthorizedAccount for every caller forever. Compare: markets.renounceGuardian() by the guardian on the fresh deployment reverts MustDisableAllowlist.","severity":"low","snippet":"contract VerdictOracle is OracleAttestationConsumer, Ownable2Step, ReentrancyGuard {","title":"VerdictOracle.renounceOwnership() is one-step and unguarded: it permanently strands every oracle parameter the brief requires to be owner-settable, unlike the guarded renounceGuardian"},{"citation":"resolved","description":"Own finding (manifest). The brief states the owner and guardian address literally (0x397dacb1ee8e9a8ce5196988958f56bde0a0a312) and its constructor-argument list writes that literal in both VerdictOracle argument 6 (line 16) and VerdictMarkets argument 4 (line 26). The evm-contracts-launch recipe says an owner address the brief itself states for a contract is written as that static address instead of $owner. The manifest instead writes the placeholder and asserts in its notes that it resolves to that wallet. If $owner is resolved from the paying wallet or a request owner field that differs from 0x397d..., the oracle owner and the markets guardian land on the wrong address and, because both roles are two-step-transferable only by their holder, cannot be corrected afterwards. Harmless only if the resolution is exactly the stated wallet, which the manifest cannot enforce. Fix: replace the two \"$owner\" entries with \"0x397dacb1ee8e9a8ce5196988958f56bde0a0a312\". Everything else in the manifest matches the brief: three contracts in dependency order, 7 and 15 arguments in declaration order, fee and cap values, notes of 2331 characters.","line":16,"path":"launch.json","reproduction":"Compare launch.json lines 16 and 26 ('$owner') with the brief's constructor list, which gives 0x397dacb1ee8e9a8ce5196988958f56bde0a0a312 at those positions. Expected per the recipe: the static address. Actual: the placeholder. Consequence if the placeholder resolves to any other wallet W: VerdictOracle.owner() == W and VerdictMarkets.guardian() == W after deployment; the stated owner cannot call proposeConfig, setCreatorAllowed or pause, so no creator can ever be admitted.","severity":"low","snippet":"        \"$owner\",","title":"launch.json writes $owner where the brief states the owner/guardian address statically"},{"citation":"resolved","description":"Merged from audit_flow (info). request() pays exactly the stored price and requires the Intake to pull exactly that amount (InexactPayment otherwise). A price move on the Intake needs proposeConfig + 48h + acceptConfig; during that window every resolve/escalate reverts while retry and escalation deadlines keep running, so markets whose window passes void at voidAfter and refund. No principal is lost. The configured 0.5 IMD matches the live price per the pinned reference.","line":99,"path":"src/VerdictOracle.sol","reproduction":"test/scratch/JudgeRepro.t.sol::test_lowerIntakePriceRevertsInexactPayment passes on this tree: with the mock intake pulling less than the stored price, resolve(id, body) reverts VerdictOracle.InexactPayment. With a higher Intake price the Intake's own pull of 0.5e18 fails and the ask reverts. Expected per the reference: the consumer pays the current Intake price.","severity":"info","snippet":"        uint256 cost = price;","title":"Oracle price is a stored config, never read from Intake.priceOf; an Intake-side price move stalls every ask for at least the 48-hour config delay"},{"citation":"resolved","description":"Merged from audit_flow (info). Documented, not a bypass. (1) Each pending request stores the signer at purchase time, so a rotation accepted later does not cover in-flight requests; a leaked signer key can author any outcome for a market whose ask is pending, and pause stops only new bets and markets. (2) SignatureChecker tries ERC-1271 when the signer has code; if the operator attaches EIP-7702 delegation code to the signer EOA whose isValidSignature does not accept raw ECDSA, every callback reverts BadSignature inside the Intake's try, the fee is spent and the request is lost until a config change ages 48h. Operational constraints for the oracle operator and the launch owner.","line":129,"path":"src/VerdictOracle.sol","reproduction":"(1) Market with a pending primary ask; an attacker holding the signer key signs an attestation for that intake request id; the Intake writer forwards it; onOracleResult accepts and propose accepts the attacker's outcome; the owner's rotation cannot take effect for 48h and would not cover this request. (2) Signer EOA with 7702 code whose isValidSignature returns false: any honest callback reverts BadSignature and is recorded as not delivered.","severity":"info","snippet":"        if (!SignatureChecker.isValidSignatureNowCalldata(p.signer, attestationDigest(a), signature)) {","title":"Trust assumptions: per-request captured signer, 48h-delayed rotation, and an EIP-7702 delegated signer EOA switches verification to ERC-1271"}],"hash":"3a70e2c37fcb11738f779ffb63414abe20967416d268dc2abd5821ccea692f09","nodeId":"71b49e93-28ca-4367-b28d-207cdcc50273","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json`. Git shows no tracked file changed, only the findings file and my scratch tests.\n\n**Outcome:** all eight specialist findings reproduced against the code and were kept, with severities unchanged. One finding of my own was added on the manifest. No critical or high defects exist. The existing suite passes in full.\n\n| | Count |\n|---|---|\n| Existing tests passed | 224 of 224 |\n| Findings kept | 9 (1 medium, 6 low, 2 info) |\n| Coverage rows answered | 25 of 25, including all 23 entry points |\n\n**Findings, most severe first**\n\n1. **Medium, createMarket.** No minimum ask window and no bound on voidAfter, so a creator can publish a market whose collateral can never be asked, voided or claimed. The specialist's attached proof fails on this tree as stated, so it is carried on the finding.\n2. **Low, resolve/escalate.** The permissionless, rewarded 24-hour retry shares the two-ask budget with escalation, so an interested bettor can buy it ahead of a slow answer and remove the dispute right.\n3. **Low, resolve.** A signed delivery the market cannot use clears the pending slot, blocking both proposal and retry until voidAfter.\n4. **Low, resolve.** Markets with an empty pool still sell asks and pay three settler rewards from the creator's bounty.\n5. **Low, escalate.** Escalation is sold and the window extended even when the doubled panel exceeds the oracle's 100-seat cap.\n6. **Low, VerdictOracle.** Inherited one-step renounceOwnership strands every owner-settable parameter, unlike the guarded renounceGuardian.\n7. **Low, launch.json (mine).** Both owner arguments use the `$owner` placeholder where the brief states the owner address literally and the recipe asks for the static address. Harmless only if the placeholder resolves to that exact wallet, which the manifest cannot enforce.\n8. **Info.** The oracle price is stored config, so an Intake-side price move stalls asks for the 48-hour config delay.\n9. **Info.** Trust assumptions around the captured per-request signer and an EIP-7702 delegated signer.\n\n**Verification done:** every kept behaviour runs in `test/scratch/JudgeRepro.t.sol`, six demonstration tests that pass on the current code. Contract sizes are within limits and the constructors make no external calls, so the factory rehearsal is unaffected. The manifest's shape, argument counts, order and values match the brief apart from the owner placeholder.","treeHash":null,"usage":{"cachedInputTokens":1134503,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":30266,"runtime":"claude","turns":22,"wallClockMs":637481}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fd5402086dce252e","findings":[{"citation":"resolved","description":"Seam boundary x invariant. Once answerFrom is reached betting is closed (closeAt <= answerFrom), so at resolve time the pool is final. When m.pool == 0 no outcome can ever have winning stake: finalize always reverts NoWinningStake and the only terminal state is Voided, which needs no oracle answer. resolve still accepts such a market, spends oracle.price() from the bounty, pays the resolver a settler reward, propose pays another, and voidMarket pays a third. The useful path (one voidMarket at voidAfter, one reward) costs the creator settlerReward; the permissionless path costs price + 3*settlerReward (and, if the first answer is still pending after 24h, a second ask and reward: price*2 + 4*settlerReward, i.e. the whole minimum bounty). With mainnet settings (price 0.5 IMD, settlerReward 0.25 IMD, minimum bounty 2.25 IMD) a settler extracts 0.75 IMD instead of 0.25 IMD and the creator receives 1.0 IMD back instead of 2.0 IMD. The bounty-ledger invariant (oracleSpend + rewardsPaid + returnedBounty == bounty) is preserved, so this is a loss to the creator under a specific state, not an accounting break. Minimal fix that keeps the design: in resolve, revert when m.pool == 0 (asks are only meaningful with stake), leaving voidMarket at voidAfter as the exit for empty markets; optionally also allow voidMarket for an Open market with m.pool == 0 once block.timestamp >= closeAt.","line":372,"path":"src/VerdictMarkets.sol","reproduction":"State: mainnet terms (price 0.5e18, maxSettlerReward 0.25e18). Creator creates a bool market with settlerReward = 0.25e18, bounty = 2.25e18 (exactly 2*price + 5*reward). Nobody bets. At answerFrom a settler calls resolve(id, body): asks=1, oracleSpend=0.5e18, settler receives 0.25e18 (bountyRemaining 1.5e18). The oracle delivers; the settler calls propose(id, a): receives 0.25e18 (bountyRemaining 1.25e18). At disputeEnds finalize(id) reverts NoWinningStake (expected, pool is 0); settler calls voidMarket(id): receives 0.25e18 and the creator gets 1.0e18 back. Expected for a market with no stake: no oracle purchase, one void reward of 0.25e18, creator gets 2.0e18 back. Actual: settler 0.75e18, oracle 0.5e18, creator 1.0e18. Verified with test/scratch/MathBoundaries.t.sol::test_emptyPoolMarketSettlerDrain (settler earned 750000000000000000, creator got back 1000000000000000000, oracle spend 500000000000000000).","severity":"low","snippet":"    function resolve(uint256 id, bytes calldata body) external nonReentrant returns (bytes32 requestId) {\n        Market storage m = _market(id);\n        if (m.status != Status.Open) revert WrongState();\n        _askWindow(m);","title":"resolve/propose/void on a market with zero pool spend the creator's bounty on asks and settler rewards that can never produce a payout"},{"citation":"resolved","description":"Boundary x invariant. A replacement must carry a signed panelSize of at least twice the primary's actual panelSize. The paid oracle door caps panelSize at 100 (oracle-consumer reference, limits.maxPanelSize), so whenever the primary attestation's panelSize is 51 or more no escalation answer can satisfy line 410 (a larger body is refused by the oracle with the price spent). escalate (lines 387-400) does not look at m.panelSize before committing: it marks escalationAsked, extends disputeEnds to at least now + 24h and pays oracle.price() out of the creator's bounty for an answer the market will reject by construction. Anyone may call escalate at no cost to themselves, so on every market whose primary panel exceeded 50 seats a third party can burn 0.5 IMD of the creator's bounty and delay finalization by up to 24h with no possible benefit. The market still finalizes on the primary outcome, so no principal is at risk. Minimal fix preserving the design: in escalate, revert EscalationUnavailable when uint256(m.panelSize) * 2 exceeds the largest panel the oracle sells (a constant 100 today, or a value passed at construction), so the bounty is not spent on an unreachable replacement; alternatively document that creators must request primary panels of at most 50 when they attach an escalation body.","line":410,"path":"src/VerdictMarkets.sol","reproduction":"State: market with an escalation body, bets on both outcomes, primary ask answered with a.panelSize = 60 (any value >= 51) and proposed, so m.panelSize = 60 and disputeEnds = now + disputeWindow. Anyone calls escalate(id, escalationBody) before disputeEnds and answerUntil: it succeeds, asks becomes 2, bountyRemaining drops by price (0.5e18 on mainnet) and disputeEnds becomes max(disputeEnds, now + 24h). The oracle answers the escalation with the maximum sellable panel, a.panelSize = 100: propose(id, a) reverts InvalidAttestation because 100 < 120. Expected: an escalation that cannot be answered within the oracle's limits is refused before the bounty is spent and the window extended. Actual: 0.5 IMD of bounty spent, finalization delayed up to 24h, replacement impossible. Verified with test/scratch/MathBoundaries.t.sol::test_escalationCannotEverReplaceWhenPrimaryPanelAbove50.","severity":"low","snippet":"            if (uint256(a.panelSize) < uint256(m.panelSize) * 2) revert InvalidAttestation();","title":"escalate spends the bounty and extends the dispute window even when the doubled-panel requirement can never be met by the oracle (primary panel > 50 against the 100-seat cap)"}],"hash":"4d86269786348acba01fa4495ad4feb361c25b043b09b42aca468ccc35a2b2ae","nodeId":"62d63eb5-f59d-482c-918a-b8db3abe4a5e","outcome":"completed","summary":"Review complete. The findings file is written and validated against the tree.\n\n**Outcome.** The math in the three Verdict contracts holds. I found no precision, overflow, rounding or boundary defect that loses or misroutes funds. Two low-severity boundary issues are reported, both in `src/VerdictMarkets.sol`.\n\n**Findings written to .imd-findings.json**\n\n- **Low, empty-pool markets drain bounty.** Once betting closes with zero stake, no outcome can ever pay out, yet `resolve` still buys an oracle answer and pays a settler reward, `propose` pays another, and `voidMarket` a third. On mainnet terms the creator gets back 1.0 IMD of a 2.25 IMD bounty instead of 2.0 IMD. Reproduced in a scratch test.\n- **Low, unreachable escalation still spends bounty.** A replacement needs twice the primary panel, but the oracle sells at most 100 seats. When the primary panel was 51 or more, `escalate` still spends 0.5 IMD of bounty and extends the dispute window by up to 24 hours for an answer `propose` will always reject. Reproduced in a scratch test.\n\n**What I verified as holding**\n\n- Bounty minimum check is an exact, overflow-free equivalent of `2 × price + 5 × reward` (fuzzed).\n- Fees round down individually from the whole pool, winners get floor shares, the last winner takes the exact remainder, and both ledgers conserve in every claim order (fuzzed).\n- Pool cap is inclusive at the boundary in both slots. Settler reserve logic never pays a reward that makes the next ask unaffordable unless the bounty was already short after a price change.\n- Time windows for propose, escalate, finalize and void are mutually exclusive at their boundaries.\n- Constructor arguments in the parameters library and launch test match the brief.\n\n**Test runs.** Every existing suite passes, including all five invariant campaigns. One environment note: the sandbox caps memory at 1.5 GB, so a single `forge test` over all 85 files is killed by the kernel during via-IR compilation. I ran each suite individually with skip filters instead. That is a machine limit, not a code defect, and the verifier's earlier builds show it compiles elsewhere.\n\n**Coverage.** All 23 listed entry points have a row, plus three invariant rows. Four rows point at the two findings; the rest hold. Nothing was left unreached.","treeHash":null,"usage":{"cachedInputTokens":2460332,"inputTokens":738,"model":"claude-fable-5-1","outputTokens":45323,"runtime":"claude","turns":41,"wallClockMs":1530110}},{"artifacts":[],"attempt":1,"bundleHash":"d72453a86ccc908b287797bb81a82dea2b6a07e5a02492ee74e3623e1f9856e2","device":"5835e48821d8827d","findings":[],"hash":"58d3e3752f16cb0f977672aaa3b69831dc0a9fcb6bb0019dca1390b1cd973246","nodeId":"a675b7cd-82a3-4ca6-b59b-aeb71a550ab5","outcome":"completed","summary":"The mainnet adaptation is complete and verified.\n\n**What changed**\n\n- `script/MainnetParameters.sol` replaces the Sepolia parameter library with the brief's mainnet values: IMD Intake v2, IMD, WETH9, signer, action, 0.5 IMD price, the launch owner as oracle owner and guardian, the separate treasury wallet, and a 48-hour config delay.\n- The stale Sepolia `launch.json` from launch 1301 is removed. The manifest step writes the mainnet one.\n- `test/Deployment.t.sol` and `test/SettlerDeployment.t.sol` rehearse the exact mainnet arguments on chain 1 with no code at the dependency addresses, and the rehearsal factory now refuses other chains.\n- New `test/MainnetLaunch.t.sol` reproduces the audit's low finding (the committed Sepolia arguments deployed on chain 1 cannot create or resolve any market, pay treasury fees to the owner and have a zero delay), then runs a market in each slot against mock code at the real mainnet addresses, and pins the 48-hour delay.\n- `test/VerdictImportedAudit.t.sol` gains a regression documenting the info finding that an unproposable delivery blocks the retry and the market voids with full refunds.\n- Test fixtures sign in the chain-1 EIP-712 domain; the protocol's Sepolia conformance vector is kept as a fixture.\n- `docs/agents/addresses.json` carries chain 1 and every mainnet external address, with the contract addresses and deploy block left `null` for the deployment handoff, since the worker holds no keys.\n- `docs/DEPLOYMENT.md`, `docs/AGENTS.md`, `README.md` and `ADAPTATION.md` describe the mainnet launch, the treasury's role and the 48-hour delay. `web/` and `dist/` are untouched.\n\n**The three contracts are byte-for-byte unchanged.** No reproduced audit finding was a defect in them. The info findings are recorded as trust assumptions.\n\n**Verification**\n\n| Check | Result |\n| --- | --- |\n| `forge build` | passes |\n| `forge test` | 202 passed, 0 failed, 28 suites |\n| Pinned protected factory test with the real mainnet init code on chain 1 | passes |\n| Live mainnet reads of IMD, WETH9, Intake price, owner and treasury | match the brief; owner, treasury and signer have no code |\n\nNothing was committed or broadcast. The deployment handoff fills the three addresses and the deploy block after the launch service deploys.","treeHash":"bb4bd0f0c79997599b6fa81df4b74b6ecaa89808","usage":{"cachedInputTokens":1517942,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":38254,"runtime":"claude","turns":43,"wallClockMs":1250110}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6d0f746f68a99ddf","findings":[],"hash":"89eaeb2de56f9920518768029b15df4d83db94b31c5ca89a28ad503171bb22b6","nodeId":"7a92f5c6-167b-419e-9523-49ad21c97454","outcome":"failed","summary":"the task produced no changes; the agent's last message was: No files changed. The environment rejected repository reads, `forge build`, and `forge test`. Its read-only filesystem also prevented writing `.imd-responses.json`.\n\nThe finding is disputable under your explicit task rules. The intended response is:\n\n```json\n{\n  \"responses\": [\n    {\n      \"finding\": \"c23307bf78e4fb427f28e43db399252c3dc92873684b38f2a680a9dff5aa374b\",\n      \"verdict\": \"disputed\",\n      \"detail\": \"The task explicitly requires $owner for privileged owner arguments and gives its rules precedence over the background recipe. Replacing these references with literal addresses would contradict that requirement. Repository inspection and Foundry checks were blocked by execution policy, so file-level reproduction was not possible.\"\n    }\n  ]\n}\n```","treeHash":null,"usage":{"cachedInputTokens":57216,"inputTokens":20971,"model":"gpt-6-astra","outputTokens":1292,"runtime":"codex","turns":3,"wallClockMs":62862}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a7b8747ac077deb9","findings":[{"citation":"resolved","description":"_validateParams only requires closeAt <= answerFrom < answerUntil < voidAfter. It imposes no minimum length on the ask window [answerFrom, answerUntil) and no upper bound on voidAfter (uint64, ~5.8e11 years). A creator can therefore publish a market whose ask window is one second (so resolve() is unreachable in practice and any answer's issuedAt would fail the issuedAt <= answerUntil check in propose()) and whose voidAfter is type(uint64).max. Once bets are placed, every exit path reverts: resolve/escalate revert OutsideWindow, propose can never succeed (no ask), voidMarket reverts OutsideWindow until voidAfter, finalize/claim revert WrongState. The collateral (up to 500 IMD or 1 WETH per market, unlimited markets) and the creator's own bounty are held by VerdictMarkets with no rescue path (the guardian has no token powers by design). Today creators are allowlisted by the guardian, so this requires a malicious or careless allowlisted creator; after disableAllowlist() (irreversible) any address can do it. The parameters are visible on chain, but the README documents 'No maximum lifetime or minimum gap between answerUntil and voidAfter is imposed' as a limitation, and the UI warns only about schedule estimates. Minimal fix preserving the design: in _validateParams require answerUntil - answerFrom >= some minimum (e.g. 1 hour, matching the dispute-window floor) and voidAfter - closeAt <= a maximum lifetime (e.g. 1 year).","line":594,"path":"src/VerdictMarkets.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {VerdictOracle} from \"src/VerdictOracle.sol\";\nimport {VerdictMarkets} from \"src/VerdictMarkets.sol\";\nimport {VerdictBurnVault} from \"src/VerdictBurnVault.sol\";\nimport {IIntake} from \"src/interfaces/IIntake.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract LockToken is ERC20 {\n    constructor() ERC20(\"T\", \"T\") {}\n\n    function mint(address to, uint256 amount) external {\n        _mint(to, amount);\n    }\n}\n\ncontract LockIntake is IIntake {\n    uint256 public nonce;\n\n    function request(bytes32, bytes calldata, Callback calldata, address asset, uint256 amount)\n        external\n        payable\n        returns (bytes32 id)\n    {\n        ERC20(asset).transferFrom(msg.sender, address(this), amount);\n        id = keccak256(abi.encode(address(this), ++nonce));\n    }\n}\n\n/// @notice A creator can pick `answerUntil = answerFrom + 1` and `voidAfter = type(uint64).max`.\n/// Nothing can then be asked (the one-second ask window is unreachable in practice) and nothing can\n/// ever be voided, so every bettor's collateral is locked in the contract for ever.\n/// Fails on the current code because `_validateParams` accepts these values. Passes once the\n/// lifetime (`voidAfter`) and the ask window (`answerUntil - answerFrom`) are bounded.\ncontract VoidAfterLockTest is Test {\n    LockToken imd;\n    LockToken weth;\n    LockIntake intake;\n    VerdictOracle oracle;\n    VerdictMarkets markets;\n    address creator = makeAddr(\"creator\");\n    address alice = makeAddr(\"alice\");\n\n    function setUp() public {\n        vm.warp(1_800_000_000);\n        vm.chainId(1);\n        imd = new LockToken();\n        weth = new LockToken();\n        intake = new LockIntake();\n        oracle = new VerdictOracle(address(intake), address(imd), vm.addr(1), bytes32(\"a\"), 0.5 ether, address(this), 0);\n        VerdictBurnVault burn = new VerdictBurnVault();\n        markets = new VerdictMarkets(\n            address(oracle), makeAddr(\"treasury\"), address(burn), address(this), address(imd), 150, 50, 50,\n            500 ether, address(weth), 150, 0, 100, 1 ether, 0.25 ether\n        );\n        markets.setCreatorAllowed(creator, true);\n        imd.mint(creator, 10 ether);\n        imd.mint(alice, 100 ether);\n        vm.prank(creator);\n        imd.approve(address(markets), type(uint256).max);\n        vm.prank(alice);\n        imd.approve(address(markets), type(uint256).max);\n    }\n\n    function lockingParams() internal view returns (VerdictMarkets.Params memory p) {\n        p.questionHash = keccak256(\"q\");\n        p.answerType = 0;\n        p.dataChainId = 1;\n        p.fromBlock = 100;\n        p.toBlock = 200;\n        p.minPanelSize = 5;\n        p.minAgreed = 4;\n        p.closeAt = uint64(block.timestamp + 1 hours);\n        p.answerFrom = p.closeAt;\n        p.answerUntil = p.answerFrom + 1; // one-second ask window\n        p.disputeWindow = 1 hours;\n        p.voidAfter = type(uint64).max; // never voidable\n        p.bounty = 1 ether;\n        p.settlerReward = 0;\n        p.collateralId = 0;\n    }\n\n    function test_creatorCannotCreateAMarketThatLocksCollateralForever() public {\n        VerdictMarkets.Params memory p = lockingParams();\n        vm.prank(creator);\n        vm.expectRevert(VerdictMarkets.InvalidParams.selector);\n        markets.createMarket(p, \"body\", \"\", \"\", 0);\n    }\n}","reproduction":"State: fresh deployment, creator allowlisted, Alice holds 100 IMD. Inputs: creator calls createMarket with Params{closeAt = now + 1h, answerFrom = closeAt, answerUntil = answerFrom + 1, voidAfter = type(uint64).max, disputeWindow = 1h, bounty = 1e18, collateralId = 0, questionHash = keccak('q'), answerType 0, dataChainId 1, fromBlock 100, toBlock 200, minPanelSize 5, minAgreed 4}. Expected: InvalidParams. Actual: market id 1 is created. Alice calls bet(1, 1, 100e18, 0): succeeds, markets holds 101 IMD. At answerFrom + 2 resolve(1, body) reverts OutsideWindow. At any later time (tested +1000 years) voidMarket(1) reverts OutsideWindow, finalize(1) reverts WrongState, claim(1) reverts WrongState. The 101 IMD can never leave the contract.","severity":"medium","snippet":"                || p.answerFrom >= p.answerUntil || p.answerUntil >= p.voidAfter || p.disputeWindow < 1 hours","title":"Creator-chosen windows can lock bettor collateral forever: no bound on voidAfter and no minimum ask window"},{"citation":"resolved","description":"resolve()'s retry gate asks the oracle whether the first intake request is still pending. VerdictOracle clears pending on any callback that is from the recorded intake, in window and correctly signed; it does not know the market's minPanelSize/minAgreed/questionHash/block-window requirements. So an attestation that the oracle accepts but propose() rejects (panelSize 4 against minPanelSize 5, agreed < quorum, a different questionHash or block window, a wrong answerType, or a malformed abi answer) leaves the market with no proposable answer and no retry. Because the market stays Open, escalate() is also unreachable. The only exit is voidMarket at voidAfter: bettors wait until then, collateral is refunded, the oracle fee is not. The author has documented this as the brief's 'no-delivery' retry rule and disputed a redesign; it is reported here from the control-flow side so the judge can weigh it: the retry condition tests the oracle's pending slot, not whether the market can use what was delivered. A behaviour-preserving mitigation is to let the retry proceed when the delivered answer failed the market's own checks (e.g. track in propose() a rejected-delivery flag for primaryRequests[0]), or to document that creators must set minPanelSize equal to the body's panelSize so a signed delivery is always proposable.","line":380,"path":"src/VerdictMarkets.sol","reproduction":"Using test/TestBase.sol: id = create() (minPanelSize 5); betAs(id, alice, 1, 10e18); warp to answerFrom; requestId = resolve(id, body); deliver an attestation with panelSize = 4, agreed = 4, quorum = 4 signed by the oracle signer for that requestId (oracle accepts, pending cleared). propose(id, a) reverts InvalidAttestation. Warp +24h+1: resolve(id, body) reverts AnswerAlreadyDelivered (expected: a retry is possible since no usable answer exists). escalate(id, escalationBody) reverts WrongState (market is Open). At voidAfter, voidMarket(id) succeeds: oracleSpend = 0.5e18 lost, returnedBounty = 0.5e18, bets refunded. Reproduced in test/scratch/UnusableAnswerBlocksRetry.t.sol (passes as a demonstration on current code).","severity":"low","snippet":"            if (!oracle.hasPendingRequest(m.primaryRequests[0])) revert AnswerAlreadyDelivered();","title":"A signature-valid but market-invalid delivery clears the pending slot and blocks both proposal and retry; market stalls until voidAfter with the oracle fee spent"},{"citation":"resolved","description":"request() pays exactly the stored `price` (0.5 IMD at launch) and then requires the Intake to pull exactly that amount (InexactPayment otherwise). The oracle-consumer reference says the live price is read with Intake.priceOf(action, asset) and that a moved price must not need a redeploy. Here it does not need a redeploy, but it does need proposeConfig + 48h + acceptConfig. During that window every VerdictMarkets.resolve/escalate reverts inside the Intake (price raised) or with InexactPayment (price lowered), and the retry/escalation deadlines of open markets keep running. Markets whose answerUntil passes in that window void at voidAfter and refund; no principal is lost. The live priceOf(action, IMD) on chain 1 was read during this review and equals the configured 500000000000000000, so the launch configuration is correct.","line":99,"path":"src/VerdictOracle.sol","reproduction":"State: deployed contracts, an Open market in its ask window. Input: IMD's Intake owner changes priceOf(oracle.request@oracle-1, IMD) from 0.5e18 to 0.6e18 (or 0.4e18). Call resolve(id, body). Expected (per reference): the consumer pays the current Intake price. Actual: with 0.6e18 the Intake reverts pulling 0.5e18 (ask fails); with 0.4e18 the oracle's post-call balance check reverts InexactPayment. No ask on any market succeeds until proposeConfig({price: new}) has aged 48 hours and acceptConfig() runs.","severity":"info","snippet":"        uint256 cost = price;","title":"Oracle price is a stored config, never read from Intake.priceOf; an Intake-side price move stalls every ask for at least the 48-hour config delay"},{"citation":"resolved","description":"Documented, not a bypass. (1) Each pending request stores the signer at purchase time, so a signer change accepted later does not apply to in-flight requests: if the signer key leaks, the owner's rotation (itself 48h delayed) cannot protect requests already paid; a leaked key can author any outcome for any market whose ask is pending, and the guardian's pause stops only new bets and markets, not propose/finalize. (2) The vendored SignatureChecker tests `signer.code.length == 0` before trying ECDSA. On mainnet the signer 0x5598aa91... is an EOA today (cast code returned 0x). If the operator ever attaches EIP-7702 delegation code to that EOA, every callback is routed to the delegate's isValidSignature instead of ecrecover; an implementation that does not accept raw ECDSA for the account breaks all deliveries (recorded as not delivered, fee spent) until a config change ages 48h. These are operational constraints for the oracle operator and the launch owner.","line":129,"path":"src/VerdictOracle.sol","reproduction":"(1) State: market id with a pending primary ask; signer key compromised. Input: attacker-signed attestation for that intake request id delivered by the Intake writer (the writer forwards whatever the plane signs). onOracleResult accepts; propose() accepts the attacker's outcome; owner's proposeConfig(new signer) cannot take effect for 48h and would not cover this request anyway. (2) State: signer EOA with 7702 code whose isValidSignature returns false for raw ECDSA. Input: any honest callback. Actual: BadSignature revert in the Intake's try, request lost.","severity":"info","snippet":"        if (!SignatureChecker.isValidSignatureNowCalldata(p.signer, attestationDigest(a), signature)) {","title":"Trust assumptions in the control flow: captured per-request signer, 48h-delayed rotation, signer EOA with code (EIP-7702) switches verification to ERC-1271"}],"hash":"adfd1aab32d30a66868bb6d8691ef2bd7650dfd2ada1face23a9c491df12da05","nodeId":"38753318-65ce-4700-aa9f-f54cf719dd38","outcome":"completed","summary":"Review complete. The findings file is written and validated, and all probes behaved as the code intends.\n\n**What I did**\n\n- Read the Senior Auditor's Mindset and the Execution Trace, Periphery and First Principles guides, then traced every state-changing entry point of VerdictMarkets and VerdictOracle through its guards, state writes, external calls and failure paths.\n- Ran the full existing suite: 202 tests pass on this tree. Probed mainnet: the Intake's live price for the action equals the configured 0.5 IMD, IMD and WETH have code, and the signer is a plain EOA.\n- Wrote scratch tests under `test/scratch/` for the edge cases I found and for the paths I was least sure about (re-presented primary attestation, replacement past `voidAfter`, claim remainder arithmetic under fuzzing). All behaved as the design states except the items below.\n\n**Findings written to `.imd-findings.json`**\n\n1. **Medium.** Schedule validation in `_validateParams` accepts a one-second ask window and `voidAfter = type(uint64).max`. A creator can publish such a market, bettors deposit, and every exit path reverts for ever. Proof test included; it fails on current code.\n2. **Low.** The retry gate in `resolve` reads the oracle's pending slot. A signed delivery the market cannot use clears that slot, so neither proposal nor retry is possible and the market stalls until `voidAfter` with the fee spent. Documented and disputed by the author; reported from the control-flow side with exact inputs.\n3. **Info.** The oracle pays its stored price rather than reading the Intake's. An Intake-side price move blocks every ask for at least the 48-hour config delay. Launch configuration itself verified correct.\n4. **Info.** Trust assumptions: per-request captured signer, delayed rotation, and the vendored SignatureChecker switching to ERC-1271 if the signer EOA ever carries EIP-7702 code.\n\n**Coverage**\n\nAll 23 listed entry points have a row, plus two invariant rows. Two entry points carry findings, the rest hold. Nothing was left unreached.","treeHash":null,"usage":{"cachedInputTokens":2130450,"inputTokens":516,"model":"claude-fable-5-1","outputTokens":58594,"runtime":"claude","turns":37,"wallClockMs":1607558}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bc1e515ca5c78ac4","findings":[{"citation":"resolved","description":"resolve() lets anyone buy a second primary ask once 24 hours have passed and the first intake request is still pending (lines 377-381). The retry is meant to be bought blind, and the design accepts that a late answer to the first ask is then refused (propose, line 419). But the retry is permissionless, rewarded (settlerReward paid to msg.sender, line 384), and shares the two-ask budget with escalation (escalate, line 394: `if (m.asks >= 2) revert AskLimit();`). When the oracle is slow (>24h) the Intake writer's `onOracleResult` transaction carries the full attestation in public calldata, so a bettor who sees the answer favours them can front-run it with resolve(id, body). The authentic first answer then lands in VerdictOracle but can never be proposed; the retry answer (normally the same panel result) is proposed; and the losing side's escalate() reverts AskLimit because both bounty-funded asks are gone. The front-runner is paid 0.25 IMD of the creator's bounty for doing so. The asymmetry is that the retry (a liveness device) and escalation (a dispute device) draw on the same two-ask budget, so whoever spends the second ask first decides whether the market can be disputed, and nothing requires the retry buyer to be disinterested or the first request to be genuinely dead. Precondition: the first primary request pending for at least 24 hours with answerUntil still ahead (creators are told to budget multi-day windows, so this state is reachable). Impact: the dispute right documented for bettors is removed by an interested party; bounded by one market's stake (<= 500 IMD or 1 WETH) and by needing a slow panel. Suggested minimal fix preserving the two-ask economics: let escalate() proceed when `bountyRemaining >= price` regardless of asks (a third bounty-funded ask only when the creator funded it), or require the retry buyer to have no stake in the market, or refuse a retry while an answer for the first ask is deliverable (e.g. require `block.timestamp >= lastPrimaryAsk + 24 hours` AND the retry to be bought by the creator).","line":380,"path":"src/VerdictMarkets.sol","reproduction":"State: chain 1, VerdictOracle(price 0.5 IMD), VerdictMarkets with maxSettlerReward 0.25 IMD. Creator (allowlisted) creates market id=1 with answerType 0, bounty 3 IMD, settlerReward 0.25 IMD, closeAt=T+1h, answerFrom=closeAt, answerUntil=answerFrom+4d, disputeWindow 1d, escalation body present. alice bets 10 IMD on outcome 1, bob bets 10 IMD on outcome 0. At answerFrom anyone calls resolve(1, body) -> first = primaryRequests[0], asks=1. No delivery for 24h. At answerFrom+24h the Intake's onOracleResult(first, a1{answer=true}, sig) is pending in the mempool. alice calls resolve(1, body) first: succeeds (asks=2, 0.5 IMD spent from bounty, alice receives 0.25 IMD reward). Intake then delivers a1 for `first`: stored in VerdictOracle, but propose(1, a1) reverts UnauthenticatedAnswer (intakeRequestOf(a1.requestId) == first != primaryRequests[1]). Intake delivers a2 for the retry; alice calls propose(1, a2): Provisional with outcome 1, alice paid another 0.25 IMD. bob calls escalate(1, escalationBody) inside the dispute window: reverts AskLimit. Expected per README ('Escalation ... anyone may escalate once during the dispute window'): bob can dispute. Actual: dispute impossible, 1.75 IMD of the creator's 3 IMD bounty spent, outcome 1 finalizes after disputeEnds. Verified in test/scratch/RetryFrontRun.t.sol::test_bettorFrontRunsSlowAnswerWithRetryAndKillsEscalation (passes on current code, i.e. the behaviour is present).","severity":"low","snippet":"            if (!oracle.hasPendingRequest(m.primaryRequests[0])) revert AnswerAlreadyDelivered();","title":"Unprivileged bettor can buy the 24-hour retry while the first answer is in the mempool, invalidating it and consuming the only escalation ask (trust gap: economics x asymmetry)"},{"citation":"resolved","description":"Ownable2Step makes transferOwnership two-step, but inherits Ownable.renounceOwnership() unchanged: a single call by the owner sets owner to address(0) immediately, with no pending/accept step and no precondition. Every oracle parameter the pinned oracle-consumer reference says 'must not need a redeploy' (intake, action id `oracle-1` -> `oracle-2`, asset and price, signer) can then never be changed: proposeConfig and acceptConfig are onlyOwner. VerdictMarkets applies the opposite discipline to its own role: renounceGuardian() (src/VerdictMarkets.sol:303-310) refuses while paused or while the allowlist is on, so the guardian cannot leave the system in an unrecoverable state. The oracle has no such guard: a renounce while a config is pending (configPending == true) strands the proposal forever, and a renounce at any time strands the oracle at the current Intake/action/price/signer. When IMD retires `oracle.request@oracle-1` or changes the price, every VerdictMarkets ask reverts (Intake refusal or InexactPayment), every open market times out and voids, and the creator's oracle spend on already-bought asks is lost. This is an admin action, so it is reported as a trust/recoverability gap rather than an exploit; it is in scope for the Access Control guide ('trigger renounceRole to leave the system unrecoverable'). Minimal fix without changing the agreed ownership model: override renounceOwnership() to revert (or to require !configPending), mirroring renounceGuardian's guards.","line":14,"path":"src/VerdictOracle.sol","reproduction":"Deploy VerdictOracle with the mainnet arguments (owner 0x397dacb1ee8e9a8ce5196988958f56bde0a0a312). Owner calls renounceOwnership(): succeeds in one transaction, owner() == address(0). Any later proposeConfig(Config(intake, IMD, signer, bytes32('oracle.request@oracle-2'), 0.5e18)) reverts OwnableUnauthorizedAccount for every caller. Compare: markets.renounceGuardian() by the guardian on the fresh deployment reverts MustDisableAllowlist. Verified in test/scratch/RetryFrontRun.t.sol::test_oracleOwnerRenounceIsOneStepUnlikeGuardian.","severity":"low","snippet":"contract VerdictOracle is OracleAttestationConsumer, Ownable2Step, ReentrancyGuard {","title":"VerdictOracle.renounceOwnership() is a one-step, unguarded irreversible action while the guardian's renounce is guarded (admin-variant asymmetry)"}],"hash":"c935c94a816f4956e8e48b747e5626ee0928e461a64921a8c08c8dbc88998eff","nodeId":"6a10d3a5-42cc-4cfa-8311-a0d0c4797aaa","outcome":"completed","summary":"The review is complete. Findings are written to `.imd-findings.json` with both snippets verified against the tree, 23 coverage rows (one per listed entry point plus one deployment-arguments invariant), and the working tree is unchanged apart from the gitignored `test/scratch/` reproduction.\n\n**Outcome**\n\nThe three contracts hold up well under the Access Control, Trust Gap and Asymmetry guides. All 202 existing tests pass, the committed ABIs equal this build, and the mainnet constructor arguments in `script/MainnetParameters.sol` and the deployment tests match the brief exactly (owner and guardian are the launch owner, treasury is the separate static wallet, Intake v2, IMD, WETH9, signer, action id, 0.5 IMD price, 48-hour delay, both fee slots and caps, 0.25 IMD settler reward). No critical, high or medium defect was found.\n\n**Two low findings, both reproduced in `test/scratch/RetryFrontRun.t.sol`:**\n\n1. **Retry can be used to remove the dispute right.** The 24-hour retry in `resolve` is permissionless and rewarded, and it shares the two-ask budget with `escalate`. When the oracle is slow, a bettor who sees the pending answer in the mempool can front-run it with a retry. The authentic first answer is then refused, the retry answer is proposed, and the losing side's escalate reverts with `AskLimit`. The front-runner is paid 0.25 IMD of the creator's bounty for it. Bounded by one market's stake and by needing a panel slower than 24 hours.\n\n2. **One-step oracle renounce.** `VerdictOracle` inherits an unguarded `renounceOwnership`, while the guardian's renounce is guarded against stranding the system. A single owner call permanently freezes intake, action id, asset, price and signer, so a later IMD action or price change voids every open market. Reported as a recoverability gap, not an exploit.\n\n**Coverage.** Every listed entry point is traced and marked `holds` except `resolve` (finding 1) and `renounceOwnership` (finding 2). Documented trust assumptions were checked and not re-reported: guardian pause and allowlist powers, the owner's delayed config rotation, free stranger escalation, and the accepted rule that an unusable delivered answer blocks the retry. Not verified offline: that the live mainnet IMD token has no transfer restrictions, and that Intake v2 at the given address behaves as the mock does. The deployment doc records a read-only RPC check of symbol, decimals and price for these.","treeHash":null,"usage":{"cachedInputTokens":1471029,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":44385,"runtime":"claude","turns":26,"wallClockMs":1054173}},{"artifacts":[],"attempt":1,"bundleHash":"2199d3aba125a7a141703feac82dce7d0efb6179eeb276056f3b614c984d3051","device":"63458a1bd2b2d376","findings":[],"hash":"cdd1520bd995a0b4db611b381d22c34bb7083ccc6abd3c4d0e630b0e1991a097","nodeId":"d014398e-1266-4ccc-8abb-3c9baee00f14","outcome":"completed","summary":"Done. The lint notes are the same `block.timestamp` pattern the existing accepted suites use, and nothing in the new files reads a saved timestamp across a warp, so I left them.\n\n## Summary\n\n**Outcome:** `forge build` and `forge test` pass. The full suite is now 224 tests across 30 suites, all green. The 22 new tests cover the Ethereum mainnet launch specifically; no defect was found, so `.imd-findings.json` was not written.\n\n**What I added (all under `test/`):**\n\n- `test/mocks/MainnetBytecode.sol` holds WETH9's real runtime bytecode, read from chain 1 at block 26172235 and committed as a Solidity literal. The suite needs no RPC. IMD's 23 KB runtime crashes solc as a literal, so slot 0 keeps the OpenZeppelin-based mock at the IMD address.\n- `test/MainnetFixture.sol` builds chain 1 with the brief's dependency addresses populated, deploys the three contracts from the exact constructor bytes in the launch order, and walks the launch owner through the real 48-hour signer rotation because the launch signer's key is unavailable.\n- `test/MainnetDependencies.t.sol` has 20 tests on the brief's settings and their failure paths: every misconfigured constructor argument rejected, the chain-1 EIP-712 domain, the Sepolia vector signature refused on mainnet, the full WETH flow through WETH9's payable fallback and `withdraw`, exact fee splits at both caps, caps to the wei and per market, the allowlist starting on and empty, two-step guardian and owner handover, the restarted 48-hour clock, a pre-rotation request keeping the launch signer, the 0.25 IMD reward ceiling with the 2.25 IMD bounty floor, and a 1000-run fuzz closing both ledgers with the owner receiving nothing.\n- `test/MainnetInvariant.t.sol` runs 160 random sequences of 64 calls against that deployment, including price rotations through the delay and outsider attempts at privileged calls. It checks custody per token, that treasury, burn vault and owner hold exactly their share, the reward ceiling, and that roles stay as deployed. Every sequence then drains to zero.\n- `test/TESTING.md` documents the new suites.\n\n**Verified against live state** through a public RPC today: IMD, WETH9 and Intake v2 have code, the symbols and decimals match, and the Intake prices the action at 0.5 IMD.\n\n**Observations, not findings:**\n\n- VerdictOracle uses `request` rather than Intake v2's `requestWithFailure`. The deployment doc records this as intended, and the void timeout covers a missing answer.\n- Under via-IR, solc may re-read `block.timestamp` after `vm.warp` instead of keeping a saved local. This only affects test code. The new tests derive deadlines from contract getters to avoid it.\n\n**Still owed:** a fork run against live mainnet state for the IMD token itself, since only its ERC20 semantics are modelled locally. The files are left uncommitted in the working tree for the harness to pick up.","treeHash":"d92a07bbce3ce575edef8191ab6b46970ee40153","usage":{"cachedInputTokens":2193888,"inputTokens":578,"model":"claude-fable-5-1","outputTokens":62912,"runtime":"claude","turns":32,"wallClockMs":1507994}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"4576f670afa0131d","findings":[{"citation":"resolved","description":"The tree arrives with the launch-1301 Sepolia manifest. Its VerdictOracle asset (line 12) and VerdictMarkets slot-0 token (line 27) are TestIMD 0x44a1cd38...f89a, slot 1 (line 32) is Sepolia WETH 0xfff99767...6b14, the treasury argument (line 24) is $owner, the oracle configDelay (line 17) is 0, and notes says 'Sepolia only (chain 11155111)'. On Ethereum mainnet eth_getCode for 0x44a1cd38...f89a and 0xfff99767...6b14 returns 0x (checked live over the local RPC at block 0x18f5a3b). The mainnet brief requires asset/slot-0 IMD 0xd34a99bc...63b7 (22,990 bytes of code, a LayerZero OFT ERC-20 named BridgedFP with plain OZ ERC20 transfers, no fee, pause or blacklist), slot-1 WETH9 0xC02aaA39...6Cc2, treasury 0x2a85072b...0231 (distinct from the owner), and configDelay 172800. The same Sepolia values are hard-coded in script/SepoliaParameters.sol (IMD, WETH, CHAIN_ID 11155111, configDelay 0, treasury = OWNER) and docs/agents/addresses.json (chainId 11155111, external.imd, external.weth), and test/Deployment.t.sol and test/SettlerDeployment.t.sol assert those literals. None of this is a defect in the three contracts, whose constructors accept the brief's arguments (verified by deploying all three on a mainnet fork with the exact brief arguments and driving oracle.request through the live Intake at 0xa43e6f75...de82, which pulled exactly 0.5 IMD, the live priceOf(action, IMD)), but the adapter must rewrite the manifest, parameters library, addresses file and deployment tests for chain 1 and must write the treasury as the static address 0x2a85072b71908ca9255934250bfc6ceff82d0231 rather than $owner.","line":12,"path":"launch.json","reproduction":"State: chain id 1; deploy VerdictBurnVault, then VerdictOracle(0xa43e6f75..., 0x44a1cd38...f89a, 0x5598aa91..., bytes32('oracle.request@oracle-1'), 5e17, 0x397dacb1..., 0) and VerdictMarkets(oracle, 0x397dacb1... /*treasury*/, vault, 0x397dacb1..., 0x44a1cd38...f89a, 150, 50, 50, 500e18, 0xfff99767...6b14, 150, 0, 100, 1e18, 25e16) exactly as the committed launch.json lists. Then guardian calls setCreatorAllowed(c, true) and c calls createMarket(validParams with collateralId 0, bounty 3e18, body '{}'). Expected: a market id. Actual: revert, because _pull calls balanceOf on 0x44a1cd38...f89a which has no code on chain 1; oracle.request('{}') reverts for the same reason, so no market can ever be created or resolved. Also markets.treasury() == 0x397dacb1... (the brief's treasury is 0x2a85072b...0231) and oracle.configDelay() == 0 (brief: 172800). test/scratch/StaleManifest.t.sol reproduces all of this and passes on this tree; with the brief's mainnet arguments the same flow succeeds on a mainnet fork (test/scratch/MainnetFork.t.sol).","severity":"low","snippet":"        \"0x44a1cd38474fb1748400e7deb5f8d786cce3f89a\",","title":"Committed launch.json, addresses.json and SepoliaParameters still describe the Sepolia deployment; deployed as-is on chain 1 every market call reverts and the treasury/config-delay disagree with the m"},{"citation":"resolved","description":"The retry in resolve() is allowed only while the first intake request is still pending in VerdictOracle. VerdictOracle.onOracleResult accepts and stores any signed attestation for the request regardless of its panel figures, so an answer with agreed < quorum (possible for chain evidence per OracleAttestation's own comment), agreed < minAgreed, panelSize < minPanelSize, issuedAt outside [answerFrom, answerUntil], or an answer whose bytes do not abi-decode under answerType, is 'delivered' and clears pending, yet propose() reverts InvalidAttestation on it. The market then has no settlement path except voidMarket at voidAfter: bettors are refunded in full, the creator gets the bounty minus the 0.5 IMD spend, no funds are lost to a third party. README.md lines 106 and 150 document this as intended. Reported so the adapter and the final panel treat it as an accepted trust/liveness limit rather than rediscovering it; the only alternative design (letting an unproposable delivery re-open a retry) would reintroduce the two-answer outcome-shopping that audit 94b4f1d1 removed.","line":380,"path":"src/VerdictMarkets.sol","reproduction":"Market with params(): minPanelSize 5, minAgreed 4, bounty 1 IMD, settlerReward 0; alice bets 10 IMD on outcome 1. At answerFrom, resolve(id, body) -> request R. Intake delivers an attestation for R signed by the oracle signer with panelSize 5, quorum 4, agreed 3 (all else matching). propose(id, a) reverts InvalidAttestation (agreed < quorum). At answerFrom + 24h, resolve(id, body) reverts AnswerAlreadyDelivered (expected by a user: a second ask). At voidAfter, voidMarket(id) succeeds: status Voided, oracleSpend 0.5 IMD, returnedBounty 0.5 IMD, alice can claim her 10 IMD. test/scratch/Probe.t.sol::test_unproposableDeliveryBlocksRetry shows the sequence.","severity":"info","snippet":"            if (!oracle.hasPendingRequest(m.primaryRequests[0])) revert AnswerAlreadyDelivered();","title":"A delivered answer that fails the market's own filter permanently blocks the 24-hour retry; the market can only void and the oracle spend is lost (documented design limit)"},{"citation":"resolved","description":"Not defects; the brief asks for these roles and the launch owner 0x397dacb1... holds both. (1) VerdictOracle owner (Ownable2Step) may proposeConfig then acceptConfig after configDelay (172800 s on mainnet) to change intake, asset, actionId, price and oracleSigner together. Requests already paid keep the intake and signer captured at payment (Pending.intake/signer), and VerdictMarkets markets refuse further asks when the asset changes (OracleAssetMismatch), but a market whose ask is paid after a signer rotation accepts answers from the new signer, so an owner controlling the new signer could decide any market asked after the 48-hour notice. (2) VerdictMarkets guardian may pause() createMarket and bet only; resolve, escalate, propose, finalize, voidMarket and claim never check paused, so no holder balance can be frozen or seized and there is no mint, proxy, initializer, DELEGATECALL, CALLCODE or SELFDESTRUCT in the three contracts (Slither 0.11.6: no High or Medium hits in src/). The creator allowlist is post-deployment configuration the brief explicitly requests, with a one-way disableAllowlist. (3) escalate() is permissionless, pays no reward, spends one oracle price from the creator's bounty and moves disputeEnds to at least now + 24 h once per market; a creator who does not want this passes an empty escalationBody. Verified on mainnet: owner, guardian/treasury and signer addresses are EOAs (no code), so the ERC-1271 path is unused.","line":158,"path":"src/VerdictOracle.sol","reproduction":"Design facts, not a failing input. Example of (3): market with disputeWindow 1 h, primary outcome proposed at T so disputeEnds = T + 1 h; any address calls escalate(id, escalationBody) at T + 10 min; disputeEnds becomes T + 10 min + 24 h and finalize(id) reverts OutsideWindow until then, while the creator's bountyRemaining drops by 0.5 IMD (oracleSpend becomes 1 IMD). test/scratch/Probe.t.sol::test_permissionlessEscalateDelaysFinalize shows it.","severity":"info","snippet":"    function acceptConfig() external onlyOwner nonReentrant {","title":"Privileged powers to record as trust assumptions: oracle owner can rotate intake, asset, action, price and signer after the 48-hour delay; guardian can pause entry and gate creators; anyone can escala"}],"hash":"d31bd585f0ac3a6212f151ecf11861504c1de793a1a535396ed8cf79339f397f","nodeId":"7b97bb04-4f49-46b3-add9-80cc3770e094","outcome":"completed","summary":"The review is complete. No tracked file changed; the only writes are `.imd-findings.json` and my scratch tests under `test/scratch/`, which are ignored.\n\n**Outcome: no defect found in the three contracts.** The findings file holds one low and two info entries.\n\n**What was read and run**\n- Read in full: `src/VerdictMarkets.sol`, `src/VerdictOracle.sol`, `src/VerdictBurnVault.sol`, `src/OracleAttestation.sol`, both interfaces, `launch.json`, the deploy parameters library, the test base and mocks. Nothing in scope was unreachable.\n- All 198 existing tests pass, and they pass again with a second fuzz seed. Slither reports no High or Medium detector hits in `src/`.\n- Every state-changing entry point was traced for caller, guard and value moved. The two ledgers (collateral and IMD bounty) stay separate, fee rounding favours bettors with the last winner taking the exact remainder, every external call sits behind a reentrancy guard and after state changes, and the attestation path pins body hash, the market's own latest intake request id, question hash, chain, block window, panel minima and issuance window.\n- On a mainnet fork over the local RPC I deployed all three contracts with the brief's exact constructor arguments, created a WETH market, bet, and sent a request through the live Intake. The Intake pulled exactly 0.5 IMD, matching its live `priceOf`, and the settler reward paid out as designed. The oracle callback stays under the 200k stipend even with a 16 KiB answer.\n\n**Findings**\n- **Low, launch.json line 12.** The committed manifest, `script/SepoliaParameters.sol`, `docs/agents/addresses.json` and the two deployment tests still carry Sepolia values. Deployed unchanged on chain 1, every `createMarket` and `request` reverts because the TestIMD and Sepolia WETH addresses have no code there. The manifest also routes treasury fees to the owner and sets no config delay, where the brief wants treasury 0x2a85…0231 and 172800 seconds. The adapter must rewrite these for mainnet.\n- **Info.** A delivered attestation that fails the market's filter blocks the retry and forces a void. This is documented behaviour and refunds everyone except the 0.5 IMD oracle spend.\n- **Info.** Trust assumptions to carry forward: the oracle owner can rotate signer and intake after the 48-hour delay, the guardian can pause entry only, and anyone can escalate once at the creator's expense.\n\n**Mainnet dependency facts verified live.** IMD at 0xd34a…63b7 is a verified LayerZero OFT ERC-20 named BridgedFP with plain transfers and no fee, pause or blacklist. WETH9 moves exact amounts. Owner, treasury and signer are EOAs.","treeHash":null,"usage":{"cachedInputTokens":1871555,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":43351,"runtime":"claude","turns":30,"wallClockMs":1451554}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"d73af718d55ba788","findings":[],"hash":"de67f68098ae357d9b97409d84499edc61ea64d0636a331be6ffff5260e42b24","nodeId":"7a92f5c6-167b-419e-9523-49ad21c97454","outcome":"no_change","summary":"The finding was evaluated and disputed. No code or manifest changed.\n\n**What I checked**\n\n- The manifest in launch.json matches the brief's constructor list word for word: three contracts in dependency order, with 0, 7 and 15 arguments in declaration order, and notes of 2331 characters.\n- The build and the full suite pass offline, 219 of 219 tests, including the mainnet launch test that asserts the oracle owner and markets guardian equal the stated launch owner.\n- No tracked file differs from the accepted tree.\n\n**Why the finding is disputed**\n\nThe reviewer asked to replace the two `$owner` placeholders with the literal owner address. The task rules, which override the background recipe, say to use `$owner` for privileged owner arguments. The brief also states that the owner is 0x397dacb1ee8e9a8ce5196988958f56bde0a0a312 and that `$owner` resolves to it. The verifier signs that owner into the deployment context, so the finding's scenario of `$owner` landing on a different wallet cannot occur without the launch itself being refused. Changing the placeholders would contradict the explicit rule and alter an accepted manifest for no behavioural gain.\n\n**Deliverable**\n\nThe answer is recorded in `.imd-responses.json` with verdict disputed and the reproduction detail above. The manifest is left as accepted.","treeHash":null,"usage":{"cachedInputTokens":378888,"inputTokens":292,"model":"claude-fable-5-1","outputTokens":4480,"runtime":"claude","turns":11,"wallClockMs":903186}},{"artifacts":[],"attempt":1,"bundleHash":"b19bad879f4176e0ee7063f275419261ee0712b364b69de070bdc361ae73c7bf","device":"6b16b4979d227241","findings":[],"hash":"e409995888e3b3fef50eb94df0f72167db0e6c736f90b0cdecaf2cdac572b21b","nodeId":"d014398e-1266-4ccc-8abb-3c9baee00f14","outcome":"completed","summary":"Done. The revised source (the new creation-time schedule bounds in `_validateParams`) did not break anything in my mainnet suite, and I found no defect in the revision, so no findings file was written.\n\n**What changed since my accepted round**\nAnother contributor fixed audit finding 73ad1052 by rejecting ask windows under one hour and timeouts more than 365 days after creation. My existing mainnet fixture, dependency tests and invariant campaign passed unchanged against it.\n\n**What I added, all under `test/`**\n- `test/MainnetDependencies.t.sol`: three tests pinning the new bounds at the exact mainnet deployment. In both slots, a window one second short, a timeout one second long, a distant close and two unordered schedules are refused before any bounty moves and without consuming a market id. Exactly one hour and exactly 365 days are accepted, and a market at each cap with the 0.25 IMD reward ceiling asks in the window's last second, is refused at the window end, voids at the timeout, pays the keeper once and refunds the full stake with nothing to the treasury, vault or owner. A 600-run fuzz over close, answer start, window and lifetime asserts acceptance exactly when both bounds hold and that an accepted market returns its untouched bounty at timeout.\n- `test/MainnetInvariant.t.sol`: a `probeSchedule` handler action that offers an out-of-bounds schedule at any point of a random sequence and asserts refusal, untouched custody and unchanged market count, or `EntryPaused` first while paused. The deterministic reachability test drives all three bounds plus the paused case.\n- `test/TESTING.md`: a revision section describing the above.\n\n**One harness issue worth knowing**\nA first draft of the boundary test failed because, under via-IR, the optimizer hoisted a `block.timestamp` expression out of a loop containing `vm.warp`, so the second slot reused the first slot's deadline. The new tests read the clock through `vm.getBlockTimestamp()`. This is a test artifact, not contract behaviour, and is noted in `TESTING.md`.\n\n**Verification**\n\n| Check | Result |\n| --- | --- |\n| `forge build` | clean |\n| `forge test` (full suite) | 244 passed, 0 failed, 32 suites |\n| Invariant campaign | 160 runs, 10,240 calls, 0 reverts, `probeSchedule` hit 747 times |\n| Changed paths | only the three files under `test/` |\n\nNothing was installed, no configuration file was touched, and the working tree is left uncommitted for the harness to pick up.","treeHash":"b4f82f67a8806e91effdab2ba605bd4817cf705d","usage":{"cachedInputTokens":1422962,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":23672,"runtime":"claude","turns":31,"wallClockMs":746537}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3516474d8a268bd8","findings":[],"hash":"f7d955ece8ce238e61030eb7bf202213831fb57f7bffd68576f489b33a2005c1","nodeId":"7c9f6b85-b3a8-47eb-bb0a-8baa98d4d414","outcome":"completed","summary":"The review is complete. The findings file is written and the working tree holds no other changes.\n\n**Result: no economic defect found.** `.imd-findings.json` has an empty findings list and 27 coverage rows, one for each of the 23 listed entry points plus four invariant and dependency rows. All 23 entry points are marked `holds`.\n\n**What I checked, from the Economic Security, Invariant and Flow Gap guides**\n\n- Both ledgers conserve on every path. Collateral: payouts plus refunds plus fees equals the pool. Bounty: oracle spend plus rewards plus the returned remainder equals the creator's deposit. I traced every writer and executed the mainnet terms (1.5/0.5/0.5 on IMD, 1.5/0/1 on WETH, 0.5 IMD price, 0.25 IMD reward) in a scratch test. Both slots drain the contract to zero.\n- The settler reward reserve never starves a promised ask. A market has at most two asks and at most four rewarded actions on any sequence, and creation requires two prices plus five rewards, so the minimum 2.25 IMD bounty always covers the retry or escalation path and returns 0.25 IMD.\n- Outcome binding: a proposal must present the oracle's stored attestation for the market's own latest paid ask. Third-party purchases through the oracle, answers to other markets, and stale first-ask answers after a retry are all refused.\n- Terminal paths are exclusive: finalize needs winning stake, void needs none; propose stops at `voidAfter` exactly where void begins.\n- Griefing economics: filling the 500 IMD cap blocks others but costs the griefer 2.5% at most and nothing if wrong. Escalation is free to the caller by documented design and bounded to one ask of the creator's own bounty.\n- Live dependencies on chain 1: the Intake exposes the exact `request` and `priceOf` selectors the oracle calls, and prices the action at 0.5 IMD. IMD is a LayerZero OFT ERC-20 with no pause or blocklist selectors, and a traced transfer moves the exact nominal amount. WETH9 is canonical.\n\n**What I did not reach.** The mainnet Intake runtime differs from the Sepolia one by 35 bytes in one region, which looks like embedded immutables, but I did not decompile its internal logic. That row is marked `unreached`.\n\n**Timing limits that are documented, not defects.** A primary proposal made at or after `answerUntil` cannot be escalated, and an ask paid just before the cutoff may return an unusable answer. Both reproduce as the README describes and only cost the creator one 0.5 IMD ask, never bettor principal.\n\nThe full suite passed before I started (202 tests, including the lifecycle, collateral and reward invariant campaigns), and my scratch directory was removed after use.","treeHash":null,"usage":{"cachedInputTokens":1524968,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":55446,"runtime":"claude","turns":29,"wallClockMs":986849}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"de319b702da6aa2e","findings":[],"hash":"fac34908b47cef05801c594be6cf1c6a5276e85d1b54daf2e049aa597830e14d","nodeId":"71b49e93-28ca-4367-b28d-207cdcc50273","outcome":"completed","summary":"The one medium finding from last round is fixed, and none of the earlier findings stays open. `.imd-findings.json` has an empty findings list and a coverage record for all 22 entry points, each marked `holds`.\n\n**Medium (collateral locked forever): fixed.** `_validateParams` in `src/VerdictMarkets.sol` (line 601) now rejects markets whose answer window is under 1 hour, or whose `voidAfter` is more than 365 days after creation. Measuring from creation also stops a distant `closeAt` from getting around the limit. The checks above it guarantee both subtractions can't underflow. I copied both supplied proofs (`Proof_73ad105210ae`, `Proof_e8e371f10ea6`) into `test/scratch/` and ran them: both now pass, because the reported input reverts `InvalidParams`. Last round the same proof failed. With the bound in place, every market reaches a final state: an open one can be voided within 365 days and refunded, and a provisional one can be finalized or voided once its dispute deadline passes.\n\n**Low and info advisories: settled, not reopened.** The author reproduced each one with their own test, and I agree with the result. They declined code changes and documented each behaviour in the README and operator guides instead. That is the right answer here, because the brief asks to deploy the audited contracts *without changing their behaviour*. None of them loses principal or bypasses a permission:\n- A retry ask uses up the escalation ask.\n- A signed answer that fails the market's own checks blocks the retry. The new 365-day limit now caps the wait.\n- On a market with no bets, the creator's bounty is still spent on oracle asks and settler rewards.\n- Escalation can't succeed when the first panel had more than 50 members.\n- `renounceOwnership` on the oracle is one step.\n- The oracle uses its stored price rather than reading the Intake's live price.\n- Signer trust assumptions.\n\n**`$owner` in `launch.json`: dropped.** The brief names 0x397dacb1ee8e9a8ce5196988958f56bde0a0a312 as the launch owner, so `$owner` resolves to that address. I can't reproduce the failure where the role lands on a different wallet. The other constructor arguments match the brief position for position.\n\n**New code and other checks:**\n- **Tests:** the full suite passes (246 tests).\n- **Size:** `VerdictMarkets` is 17,837 bytes deployed, under the 24,576 limit.\n- **Untouched paths:** no commit touches `web/` or `dist/`, and `docs/agents/addresses.json` still holds null addresses for the deployment step to fill.\n- **Changed lines:** I read them as new code and found no new defects.\n- **Static-analysis leads:** the reentrancy, strict-equality and uninitialized-local lines don't reproduce as defects. The external calls go only to the configured oracle and Intake, and both are covered by exact-balance checks.\n\nThe fix is a small, deliberate tightening of `createMarket` compared with what was deployed on Sepolia in launch 1301. The author records it as the only behaviour change. I deleted my scratch copies, and no tracked file was changed.","treeHash":null,"usage":{"cachedInputTokens":764044,"inputTokens":20,"model":"claude-opus-5-5","outputTokens":7825,"runtime":"claude","turns":11,"wallClockMs":375918}}],"verification":[{"checks":[{"durationMs":169662,"exitCode":0,"name":"build","output":"Compiling 87 files with Solc 0.8.26\nSolc 0.8.26 finished in 169.45s\nCompiler run successful with warnings:\nWarning (2072): Unused local variable.\n   --> test/MainnetLaunch.t.sol:103:9:\n    |\n103 |         MockIntake intake = MockIntake(MainnetParameters.INTAKE);\n    |         ^^^^^^^^^^^^^^^^^\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[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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:601:55\n    │\n601 │         if (p.answerUntil - p.answerFrom < 1 hours || uint256(p.voidAfter) - block.timestamp > 365 days) {\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:613:53\n    │\n613 │                 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:620:82\n    │\n620 │                 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:622:49\n    │\n622 │                     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:615:20\n    │\n615 │             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:625:20\n    │\n625 │             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:652:21\n    │\n652 │                 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:637:20\n    │\n637 │             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:655:16\n    │\n655 │         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/MainnetAdvisoryReview.t.sol:61:9\n   │\n61 │         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/MainnetAdvisoryReview.t.sol:92:9\n   │\n92 │         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/MainnetAdvisoryReview.t.sol:119:9\n    │\n119 │         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/MainnetAdvisoryReview.t.sol:148:9\n    │\n148 │         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/MainnetAdvisoryReview.t.sol:153:9\n    │\n153 │         vm.warp(vm.getBlockTimestamp() + 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/MainnetAdvisoryReview.t.sol:153:9\n    │\n153 │         vm.warp(vm.getBlockTimestamp() + 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:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/MainnetAdvisoryReview.t.sol:226:9\n    │\n226 │         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/MainnetAdvisoryReview.t.sol:249:9\n    │\n249 │         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/MainnetLaunch.t.sol:192:17\n    │\n192 │         vm.warp(block.timestamp + 48 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: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/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictImportedAudit.t.sol:83:9\n   │\n83 │         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/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/VerdictMarketTiming.t.sol:63:30\n    │\n 63 │         p.voidAfter = uint64(block.timestamp + 365 days);\n    │                              ━━━━━━━━━━━━━━━\n    ‡\n114 │         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/VerdictMarketTiming.t.sol:87:28\n    │\n 87 │         p.closeAt = uint64(block.timestamp + bound(closeDelay, 1, 180 days));\n    │                            ━━━━━━━━━━━━━━━\n    ‡\n114 │         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   │\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":38750,"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.21ms (767.84µs CPU time)\n\nRan 1 test for test/SettlerDeployment.t.sol:SettlerDeploymentTest\n[PASS] test_launchHandoffPinsV2AndFifteenConstructorArguments() (gas: 6284157)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.03ms (4.84ms CPU time)\n\nRan 3 tests for test/MainnetLaunch.t.sol:MainnetLaunchTest\n[PASS] test_mainnetArgumentsRunTheFullFlowAgainstTheBriefDependencies() (gas: 8836373)\n[PASS] test_mainnetOracleConfigurationWaitsFortyEightHours() (gas: 361945)\n[PASS] test_staleSepoliaArgumentsOnMainnetCannotCreateOrResolveAnyMarket() (gas: 183727)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 5.74ms (5.82ms CPU time)\n\nRan 6 tests for test/VerdictImportedAudit.t.sol:VerdictImportedAuditTest\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 575487)\n[PASS] test_creatorCannotSetVoidAfterFarInFuture() (gas: 78456)\n[PASS] test_freshDeploymentCannotCreateUntilGuardianActs() (gas: 608097)\n[PASS] test_pauseOnlyBlocksEntryAndReleaseReturnsAllUnspentBounty() (gas: 2111310)\n[PASS] test_strangerEscalatesAtNoCostBurnsBountyAndDelays() (gas: 2632698)\n[PASS] test_unproposableDeliveryBlocksRetryAndMarketVoidsWithRefunds() (gas: 1952350)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 6.26ms (4.90ms CPU time)\n\nRan 5 tests for test/RevisionIndependentReview.t.sol:RevisionIndependentReviewTest\n[PASS] test_documentedUnusableOwnDeliveryStillBlocksRetry() (gas: 1324459)\n[PASS] test_escalationRejectsIssuanceBeforeItsOwnAsk() (gas: 2078552)\n[PASS] test_identicalBodyOtherMarketAnswerCannotSetOutcome() (gas: 2044189)\n[PASS] test_independentSameBodyCannotBlockOwnRetry() (gas: 1798383)\n[PASS] test_primaryLateIssuanceRemainsOutsideBriefsExplicitRange() (gas: 1437459)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.77ms (5.75ms CPU time)\n\nRan 6 tests for test/CollateralIndependentReview.t.sol:CollateralIndependentReviewTest\n[PASS] test_bountyReturnsInTheTokenItWasPulledInAfterAssetRotation() (gas: 1198055)\n[PASS] test_creatorPaymentIsOneTransferForIMDAndTwoForWeth() (gas: 3305278)\n[PASS] test_feeOnTransferWethCreditsOnlyReceivedAmount() (gas: 1464680)\n[PASS] test_priceRiseBlocksWethAskButRefundsAndBountyReturnStillWork() (gas: 1406936)\n[PASS] test_wethCallbackDuringClaimCannotReenter() (gas: 2503628)\n[PASS] test_wethMarketCannotReachIMDHeldForOthers() (gas: 2994541)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 8.24ms (6.74ms CPU time)\n\nRan 15 tests for test/VerdictMarketsValidation.t.sol:VerdictMarketsValidationTest\n[PASS] test_allowlistRemovalAndPermanentDisable() (gas: 1437207)\n[PASS] test_attestationMustMatchEveryMarketFieldAndPanelRequirements() (gas: 5311505)\n[PASS] test_betZeroUnknownOutcomeAndCloseBoundary() (gas: 776626)\n[PASS] test_bodyHashAndBodySizeValidation() (gas: 789471)\n[PASS] test_bountyMustCoverTwoAsksAfterTransferFee() (gas: 239061)\n[PASS] test_creationEmitsBothFullBodies() (gas: 436371)\n[PASS] test_escalationRequiresDoubleCurrentPanelAndCorrectBody() (gas: 2919415)\n[PASS] test_feeCapAndPoolCapConstructor() (gas: 15600)\n[PASS] test_feeOnTransferCreditsOnlyActualBountyAndStakes() (gas: 1300541)\n[PASS] test_firstProposalAtVoidDeadlineCannotResurrectMarket() (gas: 1452571)\n[PASS] test_guardianHandoverIsTwoStepAndNoUnauthorizedPowers() (gas: 371084)\n[PASS] test_invalidTimesPanelsAndTypes() (gas: 618459)\n[PASS] test_minAgreedCanRequireMoreThanMinimumPanelSize() (gas: 1304725)\n[PASS] test_pauseBlocksOnlyEntryAndRenounceRequiresUnpaused() (gas: 3497055)\n[PASS] test_poolCapUsesReceivedBalanceAndFailedBetIsAtomic() (gas: 888987)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 13.49ms (11.96ms CPU time)\n\nRan 10 tests for test/VerdictSettlerRewards.t.sol:VerdictSettlerRewardsTest\n[PASS] test_bountyArithmeticRejectsImpossiblePriceOrRewardWithoutOverflow() (gas: 707497)\n[PASS] test_bountyMinimumChecksBothRequestedAndReceivedAmounts() (gas: 1298855)\n[PASS] test_eachProposalResolveAndFinalizePaysItsCallerOnceEscalatePaysNothing() (gas: 4924916)\n[PASS] test_priceRiseBeforeResolveClipsRewardToExactReserve() (gas: 3376166)\n[PASS] test_proposalUsesCurrentPriceAndPreservesTheLastAsk() (gas: 4512819)\n[PASS] test_retryResolveIsAlsoRewardedOnce() (gas: 3682381)\n[PASS] test_rewardBoundIsInclusiveAndZeroCapDisablesRewards() (gas: 1070121)\n[PASS] test_terminalRewardIsClippedToBountyNeverBettorDepositsOrAnotherMarket() (gas: 3435346)\n[PASS] test_voidWithoutAsksPaysBeforeReturningBountyAndNeverTwice() (gas: 1726485)\n[PASS] test_zeroRewardKeepsLegacyBalancesEventsAndNoNewPriceDependency() (gas: 3012517)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 13.87ms (12.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: 970870)\n[PASS] test_deliveredAnswerRemainsReadableAfterExpiry() (gas: 524142)\n[PASS] test_expiredFutureMalformedAndTamperedRejected() (gas: 766673)\n[PASS] test_falseAnswerStoredUnder150kGas() (gas: 575766)\nLogs:\n  cold callback gas: 126024\n\n[PASS] test_intakeAndSignerRotationPreservesInflightRequest() (gas: 2174481)\n[PASS] test_maxAnswerUnder150kGas() (gas: 610171)\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 29.86ms (16.87ms CPU time)\n\nRan 7 tests for test/VerdictAtomicity.t.sol:VerdictAtomicityTest\n[PASS] testFuzz_failureAtAnyFinalizeRecipientRollsBackEarlierPayments(uint8,bool) (runs: 64, μ: 2499017, ~: 2500513)\n[PASS] test_failedBountyReturnDoesNotVoidMarketOrPreventLaterRefund() (gas: 1198098)\n[PASS] test_failedCallbackIsNotRefundedButMarketRetryAndSettlementRemainReachable() (gas: 2514386)\n[PASS] test_failedEscalationPaymentCannotExtendOrConsumeDisputeWindow() (gas: 2803383)\n[PASS] test_failedPrimaryPaymentRestoresBountyAskCountTimestampAndAllowances() (gas: 1820331)\n[PASS] test_failedRefundCanBeRetriedAndDoesNotConsumeAnotherUsersClaim() (gas: 1543479)\n[PASS] test_guardBlocksCrossMarketReentryFromAnOtherwiseEligibleClaimant() (gas: 4611525)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 67.73ms (71.55ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_burnVaultHasNoCallablePathOrEtherReceiver() (gas: 1013389)\n[PASS] test_exactMainnetFactoryDeploymentWithoutDependencyCode() (gas: 21542549)\n[PASS] test_rehearsalRefusesOtherChains() (gas: 208630)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 93.94ms (26.44ms CPU time)\n\nRan 12 tests for test/VerdictCollateral.t.sol:VerdictCollateralTest\n[PASS] test_collateralConfigRevertsOutOfRange() (gas: 28148)\n[PASS] test_collateralIdOutOfRangeRevertsWithoutTakingBounty() (gas: 133737)\n[PASS] test_constructorExposesBothSlotsAndRejectsOtherSlots() (gas: 59166)\n[PASS] test_constructorRejectsEqualOrZeroTokensZeroCapsAndFeesOver500() (gas: 17819)\n[PASS] test_imdMarketKeepsCollateralAndBountyLedgersSeparate() (gas: 3045614)\n[PASS] test_marketCreatedEmitsSlotOneCollateral() (gas: 450461)\n[PASS] test_marketsInEachSlotUseTheirOwnFeesAndCaps() (gas: 4584183)\n[PASS] test_oracleAssetMismatchWhenOracleAssetChanges() (gas: 5558928)\n[PASS] test_wethMarketPaysFeesAndPayoutsInWethAndBountyOracleAndRewardsInIMD() (gas: 2665083)\n[PASS] test_wethMarketRefundsInWethAndReturnsBountyInIMDOnVoid() (gas: 1382875)\n[PASS] test_wethMarketRejectsIMDApprovalOnlyAndBetsNeedWeth() (gas: 743744)\n[PASS] test_zeroBurnShareSendsNothingToBurnSink() (gas: 1903976)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 117.78ms (7.41ms CPU time)\n\nRan 12 tests for test/IndependentReview.t.sol:IndependentReviewTest\n[PASS] testFuzzReviewActualTransfersConserveInAnyClaimOrder(uint96,uint96,uint96,uint8) (runs: 512, μ: 2744200, ~: 2744460)\nLogs:\n  Bound result 14264337593543950333\n  Bound result 7\n  Bound result 63255\n\n[PASS] testReviewAgreementMinimumCanExceedMinimumPanel() (gas: 1794783)\n[PASS] testReviewDonationDoesNotAlterPayoutOrAccounting() (gas: 1922603)\n[PASS] testReviewEscalationCannotBeFirstProposalEvenWithLargePanel() (gas: 1288098)\n[PASS] testReviewEscalationCannotVoidAfterDeadline() (gas: 2402498)\n[PASS] testReviewFailedTokenTransferRollsBackClaim() (gas: 2065105)\n[PASS] testReviewLateReplacementPastVoidRemainsFinalizable() (gas: 2688293)\n[PASS] testReviewMaximumAnswerColdCallback() (gas: 1331446)\nLogs:\n  maximum answer cold callback gas: 140592\n\n[PASS] testReviewMixedMarketsCannotCrossSubsidizeClaims() (gas: 3424784)\n[PASS] testReviewNoWinnerIsVoidableAfterWindowPastVoidAfter() (gas: 2063365)\n[PASS] testReviewRotationPreservesOldCallerAndKey() (gas: 2383113)\n[PASS] testReviewSameAttestationCannotOverwriteDifferentRequest() (gas: 1490092)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 338.87ms (347.78ms CPU time)\n\nRan 20 tests for test/VerdictMarkets.t.sol:VerdictMarketsTest\n[PASS] testFuzz_terminalConservation(uint96,uint96,uint96,uint8,bool) (runs: 512, μ: 1988605, ~: 2317607)\nLogs:\n  Bound result 23243\n  Bound result 23244\n  Bound result 6000\n\n[PASS] test_asksBeforeAnswerFromAndAtOrAfterAnswerUntilRevert() (gas: 617887)\n[PASS] test_assetRotationBlocksAsksButNotRefunds() (gas: 2199645)\n[PASS] test_emptyWinningBucketCannotVoidUntilDisputeEnds() (gas: 1897760)\n[PASS] test_escalationAnswerCannotBeFirstProposal() (gas: 1288486)\n[PASS] test_escalationAskAtAnswerUntilRevertsEvenInsideDisputeWindow() (gas: 1348143)\n[PASS] test_externalSponsorCannotDeliverPrimaryOrEscalation() (gas: 4024128)\n[PASS] test_fullSettlementPaysWholePoolFeesAndExactRemainder() (gas: 2497813)\n[PASS] test_lateEscalationBeyondVoidAfterStillFinalizesWithoutAnswer() (gas: 2601271)\n[PASS] test_lateEscalationReplacementRestartsWindowOnceAndFinalizes() (gas: 2946609)\n[PASS] test_noEscalationBodyAndDuplicateEscalationAsk() (gas: 2839135)\n[PASS] test_priceIncreaseCannotSpendBettorsCollateral() (gas: 2371901)\n[PASS] test_primaryRetryBlockedAfterDeliveryEvenWithoutProposal() (gas: 1256421)\n[PASS] test_proposeAfterAnswerUntilWithTimelyStoredAnswer() (gas: 1557116)\n[PASS] test_provisionalWindowBoundariesAreStrict() (gas: 2410897)\n[PASS] test_secondPrimaryAskAfter24HoursAndMaximumTwoAsks() (gas: 1890221)\n[PASS] test_tokenReentrancyBlockedOnDepositAndClaim() (gas: 2253321)\n[PASS] test_voidNoAnswerRefundsEveryOutcomeAndUnspentBounty() (gas: 1845690)\n[PASS] test_wrongBodiesAndResolveAfterProposalRevertWithoutSpend() (gas: 1598084)\n[PASS] test_zeroAndUnknownClaimsAndUnfinishedClaimsRevert() (gas: 758596)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 354.55ms (366.69ms 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, μ: 3598027, ~: 3839844)\nLogs:\n  Bound result 83514866503549\n  Bound result 717087008049362096\n  Bound result 7031900695961485336\n  Bound result 10336178274864297086\n  Bound result 67115\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 357.26ms (355.22ms CPU time)\n\nRan 7 tests for test/VerdictOutcomes.t.sol:VerdictOutcomesTest\n[PASS] testFuzz_uintBucketDefinition(uint256) (runs: 512, μ: 1408407, ~: 1408492)\n[PASS] test_addressListUsesFirstElementOnlyAndCanonicalAddressKey() (gas: 5143049)\n[PASS] test_booleanOutcomes() (gas: 2443911)\n[PASS] test_bytes32ListUsesFirstElementOnlyAndEmptyMeansNone() (gas: 6345836)\n[PASS] test_malformedEncodedAnswerCannotSetOutcome() (gas: 1362641)\n[PASS] test_numericBucketsIncludeLowerBoundaryExcludeUpper() (gas: 7622987)\n[PASS] test_twoToEightOutcomesAndSortedUniqueDefinitions() (gas: 1910074)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 357.50ms (369.42ms CPU time)\n\nRan 8 tests for test/MainnetAdvisoryReview.t.sol:MainnetAdvisoryReviewTest\n[PASS] test_emptyPoolStillPaysForSuccessfulActionsFromCreatorBounty() (gas: 1774378)\n[PASS] test_intakePriceMismatchRollsBackAskAndOwnerUpdateTakesFortyEightHours() (gas: 2390625)\n[PASS] test_onlyOwnerCanRenounceAndPendingConfigurationIsThenUnreachable() (gas: 370084)\n[PASS] test_primaryPanelAboveFiftyNeedsReplacementBeyondCurrentServiceCap() (gas: 2900224)\n[PASS] test_retryByBettorUsesRemainingAskAndPrecludesEscalation() (gas: 2902178)\n[PASS] test_signerRotationKeepsPurchasedRequestsPinnedToOldSigner() (gas: 2267241)\n[PASS] test_signerWithRejectingCodeUsesERC1271AndCallbackFails() (gas: 1403747)\n[PASS] test_unusableSmallPanelDeliveryBlocksRetryButRefundsPrincipal() (gas: 1881620)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 360.20ms (8.01ms CPU time)\n\nRan 9 tests for test/VerdictMarketTiming.t.sol:VerdictMarketTimingTest\n[PASS] testFuzz_rejectsEveryAskWindowBelowOneHour(uint256) (runs: 512, μ: 117981, ~: 118108)\nLogs:\n  Bound result 3332\n\n[PASS] testFuzz_rejectsEveryVoidDeadlineBeyondOneYear(uint256) (runs: 512, μ: 118518, ~: 118574)\nLogs:\n  Bound result 13009889340046352267\n\n[PASS] testFuzz_validWindowsAlwaysReachTimeoutRefund(uint256,uint256,uint256,uint256,bool) (runs: 512, μ: 1115488, ~: 1100590)\nLogs:\n  Bound result 14962\n  Bound result 795\n  Bound result 7479\n  Bound result 770\n\n[PASS] test_distantCloseCannotBypassMaximumLifetime() (gas: 114874)\n[PASS] test_exactMinimumAskAndMaximumLifetimeRefundIMD() (gas: 1158444)\n[PASS] test_exactMinimumAskAndMaximumLifetimeRefundWETH() (gas: 1190382)\n[PASS] test_nearUint64LimitAcceptsValidWindowsWithoutOverflow() (gas: 1088294)\n[PASS] test_rejectsOneSecondAskAndMaximumVoidDeadlineBeforeTakingBounty() (gas: 114717)\n[PASS] test_unorderedTimesRevertInvalidParamsInsteadOfArithmeticPanic() (gas: 340558)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 360.19ms (766.90ms 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, μ: 56600, ~: 44668)\nLogs:\n  Bound result 27\n  Bound result 536\n  Bound result 26\n  Bound result 20\n  Bound result 400\n  Bound result 442\n  Bound result 376\n  Bound result 7238\n\n[PASS] testFuzz_wethFeeSplitConservesPoolExactly(uint16,uint16,uint16,uint256,uint256,uint256,uint256) (runs: 512, μ: 3225227, ~: 3234637)\nLogs:\n  Bound result 316\n  Bound result 30\n  Bound result 150\n  Bound result 29\n  Bound result 3489\n  Bound result 14570\n  Bound result 6045\n\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 754968)\n[PASS] test_assetRotationAfterProposalStillFinalizesInRecordedToken() (gas: 2726205)\n[PASS] test_assetRotationToUnheldTokenCannotOpenMarketsOrTouchExistingCustody() (gas: 2278041)\n[PASS] test_constructorBoundaryCapsAndCheckOrder() (gas: 40338)\n[PASS] test_guardianCannotAlterSlots() (gas: 396460)\n[PASS] test_imdCollateralWithWethBountyKeepsLedgersInSwappedTokens() (gas: 2829800)\n[PASS] test_wethBetFailurePathsLeaveCustodyUntouched() (gas: 1013924)\n[PASS] test_wethCallbackDuringFinalizeCannotReenter() (gas: 4719873)\n[PASS] test_wethCapBoundaryAtLaunchCap() (gas: 1506967)\n[PASS] test_wethCapIsExactAtOneWei() (gas: 1162577)\n[PASS] test_wethClaimFailurePaths() (gas: 2297112)\n[PASS] test_wethCollateralWithWethBountyPaysCreatorOnce() (gas: 2338292)\n[PASS] test_wethMarketCreationNeedsIMDBounty() (gas: 319220)\n[PASS] test_wethPoolNeverSubsidisesSettlerRewards() (gas: 2582224)\n[PASS] test_wethRefundsWhilePausedReturnBothSides() (gas: 1333735)\n[PASS] test_wethStakeTaxedToZeroReverts() (gas: 675168)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 360.42ms (404.78ms CPU time)\n\nRan 6 tests for test/VerdictOracleAdversarial.t.sol:VerdictOracleAdversarialTest\n[PASS] testFuzz_rotationsKeepFourInflightSnapshotsInAnyDeliveryOrder(uint256) (runs: 256, μ: 5459977, ~: 5459977)\n[PASS] test_contractSignerIsPinnedAndRevokedSignatureStoresNothing() (gas: 1500716)\n[PASS] test_everyAttestationFieldIsBoundBySignatureAndStoredHash() (gas: 2610090)\n[PASS] test_expiryAndClockToleranceAreInclusiveAtExactBoundary() (gas: 977218)\n[PASS] test_nonCanonicalAndTruncatedSignaturesCannotConsumePendingRequest() (gas: 829148)\n[PASS] test_pendingOwnerCannotAcceptConfigurationAndFormerOwnerLosesAccess() (gas: 434003)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 368.26ms (367.87ms CPU time)\n\nRan 10 tests for test/SettlerIndependentReview.t.sol:SettlerIndependentReviewTest\n[PASS] testFuzz_rewardRecipientsMayAlsoBeCreatorWinnerOrTreasury(uint8) (runs: 512, μ: 2350170, ~: 2346295)\n[PASS] testFuzz_rewardReserveUsesPriceAfterPaidAsk(uint256) (runs: 512, μ: 1423325, ~: 1426602)\nLogs:\n  Bound result 612542375132049732\n\n[PASS] test_creatorReturnFailureRevertsFinalizeIncludingEarlierReward() (gas: 2607062)\n[PASS] test_creatorReturnFailureRevertsVoidIncludingEarlierReward() (gas: 1331423)\n[PASS] test_failedProposalRewardLeavesStoredAnswerUsableAndPaysOnceOnRetry() (gas: 1932864)\n[PASS] test_finalizeRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 3508888)\n[PASS] test_maximumPriceAfterPaidAskSuppressesRewardWithoutReverting() (gas: 1377806)\n[PASS] test_positiveTerminalRewardsDoNotDependOnAWorkingOraclePrice() (gas: 2961168)\n[PASS] test_rewardFailureRollsBackTheWholePaidAskAndAllowsRetry() (gas: 2097852)\n[PASS] test_voidRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 2149252)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 368.44ms (552.80ms CPU time)\n\nRan 11 tests for test/RevisionRegression.t.sol:RevisionRegressionTest\n[PASS] testFuzz_lateEscalationHasFiniteSettlementDeadline(uint32,uint32,uint32,bool) (runs: 256, μ: 2798416, ~: 2592817)\nLogs:\n  Bound result 58972\n  Bound result 14\n  Bound result 44\n\n[PASS] testFuzz_onlyLatestPaidPrimaryRequestCanProposeRegardlessOfDeliveryOrder(bool,bool) (runs: 256, μ: 3087606, ~: 3087606)\n[PASS] test_escalationCannotUseAnswerIssuedBeforeItsAsk() (gas: 2080149)\n[PASS] test_identicalEscalationBodiesStillRequireEachMarketsOwnPaidAsk() (gas: 5495828)\n[PASS] test_lateEscalationIssuedAfterAnswerUntilSettlesCorrectedOutcome() (gas: 2945112)\n[PASS] test_otherMarketAnswerCannotSetOutcomeOrBlockRetry() (gas: 3156765)\n[PASS] test_oversizeAnswerRefused() (gas: 1038370)\n[PASS] test_renounceRequiresAllowlistDisabledEvenWhenEmpty() (gas: 547955)\n[PASS] test_unusableDeliveryBlocksRetry() (gas: 1324559)\n[PASS] test_zeroBoundRejectedWithoutTakingBounty() (gas: 1642585)\n[PASS] test_zeroDelayAcceptsConfigInSameBlock() (gas: 271514)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 373.44ms (726.72ms CPU time)\n\nRan 7 tests for test/VerdictSettlementProperties.t.sol:VerdictSettlementPropertiesTest\n[PASS] testFuzz_feeSplitsAndRationalPayoutBoundsInEveryClaimOrder(uint256,uint16,uint16,uint16,uint8) (runs: 1000, μ: 3071999, ~: 3076920)\nLogs:\n  Bound result 101\n  Bound result 2\n  Bound result 5\n  Bound result 47373740765573846069\n  Bound result 86927344358167041409\n  Bound result 55460569451332876552\n  Bound result 5980164677558550413\n\n[PASS] testFuzz_numericOutcomeSatisfiesItsHalfOpenInterval(uint128,uint96,uint256,uint8) (runs: 1000, μ: 1456581, ~: 1446020)\nLogs:\n  Bound result 6\n  Bound result 16036\n  Bound result 150\n\n[PASS] test_malformedListsCannotChangeAnAuthenticatedMarketsOutcome() (gas: 3072574)\n[PASS] test_oneWeiLastWinnerReceivesTheRoundingRemainder() (gas: 2377518)\n[PASS] test_oneWeiWinnerMayRoundToZeroButLastClaimStillDrainsExactly() (gas: 2703344)\n[PASS] test_payoutUsesFullPrecisionWhenIntermediateStakeTimesPoolOverflows256Bits() (gas: 2635039)\n[PASS] test_settlementEventsDescribeWholePoolFeesAndUnspentBounty() (gas: 2083005)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 373.38ms (626.58ms CPU time)\n\nRan 7 tests for test/SettlerBountyBoundaries.t.sol:SettlerBountyBoundariesTest\n[PASS] testFuzz_exactMinimumAndOneWeiShortAcrossUint256(uint256,uint256) (runs: 1000, μ: 1464045, ~: 1467038)\nLogs:\n  Bound result 15471229502554707295159289897320\n  Bound result 1710663104690226194512674445666367418292804319377707\n\n[PASS] testFuzz_transferTaxAcceptsExactReceivedMinimumAndRejectsOneWeiLess(uint96,uint16) (runs: 1000, μ: 1331606, ~: 1333761)\nLogs:\n  Bound result 2531\n  Bound result 83\n\n[PASS] testFuzz_unrepresentableMinimumRevertsBeforeTokenTransfer(uint256,uint256) (runs: 1000, μ: 359819, ~: 359796)\nLogs:\n  Bound result 15471229502554707295159289897320\n  Bound result 92633671389852956338856789717613430972842182251375388698955368417198539048583\n\n[PASS] test_entireUint256SupplyCanBeReturnedWithoutDust() (gas: 1179716)\n[PASS] test_maximumPriceWithRepresentableBountyAndZeroReward() (gas: 1371139)\n[PASS] test_maximumRepresentableRewardBudget() (gas: 1461557)\n[PASS] test_oneWeiPriceAndOneWeiReward() (gas: 1459603)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 373.65ms (976.35ms 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        | 844   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | ask            | 833   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | askEscalation  | 809   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | collect        | 797   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | deliverPrimary | 825   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | enter          | 866   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | proposePrimary | 835   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | replaceOutcome | 775   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | settle         | 824   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | togglePause    | 784   | 0       | 0        |\n╰----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 50000000000000000000\n  Bound result 11859\n  Bound result 20332\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.14s (2.13s 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        | 725   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | ask            | 754   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | askEscalation  | 710   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | changePrice    | 757   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | collect        | 760   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | deliverPrimary | 723   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | enter          | 782   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | proposePrimary | 737   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | replaceOutcome | 752   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | settle         | 759   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | togglePause    | 733   | 0       | 0        |\n╰----------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2223\n  Bound result 49152\n  Bound result 6000000000000000000\n  Bound result 3223\n  Bound result 14068\n  Bound result 3492\n  Bound result 11176\n  Bound result 172800\n  Bound result 0\n  Bound result 18529\n  Bound result 21507\n  Bound result 21599\n  Bound result 1603113172\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.30s (2.30s 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        | 725   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | ask            | 754   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | askEscalation  | 710   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | changePrice    | 757   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | collect        | 760   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | deliverPrimary | 723   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | enter          | 782   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | proposePrimary | 737   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | replaceOutcome | 752   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | settle         | 759   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | togglePause    | 733   | 0       | 0        |\n╰----------------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2244\n  Bound result 49152\n  Bound result 1000000000000000000\n  Bound result 202\n  Bound result 13709\n  Bound result 4438\n  Bound result 12023\n  Bound result 172800\n  Bound result 0\n  Bound result 18529\n  Bound result 21507\n  Bound result 21599\n  Bound result 731264865829167633\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.80s (4.79s 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        | 1399  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | ask            | 1353  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | askEscalation  | 1382  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | collect        | 1345  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | deliverPrimary | 1334  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | enter          | 1363  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | open           | 1359  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | proposePrimary | 1435  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | replaceOutcome | 1397  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | rotate         | 1306  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | settle         | 1360  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | togglePause    | 1351  | 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 28780\n  Bound result 28798\n  Bound result 24345\n  Bound result 1400000000000004357\n  Bound result 15000000000000000\n  Bound result 28\n  Bound result 20401\n  Bound result 8696\n  Bound result 122738\n  Bound result 1400000000000012502\n  Bound result 3233\n  Bound result 49999999999999999997\n  Bound result 1220\n  Bound result 26218\n  Bound result 1400000000000017861\n  Bound result 999999999999999970\n  Bound result 3254\n  Bound result 83\n  Bound result 36148\n  Bound result 203327\n  Bound result 79641\n  Bound result 195074654948758754\n  Bound result 599999999999999977\n\n[PASS] test_handlerReachesAllFourTokenPairings() (gas: 21299514)\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.36s (6.37s 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       | 1580  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | changePrice   | 1607  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | collect       | 1636  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | deliverAnswer | 1570  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | donate        | 1562  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | escalate      | 1536  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | openMarket    | 1559  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | pauseEntry    | 1599  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | probeRejected | 1564  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | propose       | 1634  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | resolve       | 1564  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | settle        | 1539  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | wager         | 1530  | 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 875000000000000000\n  Bound result 13580\n  Bound result 174244600136986528\n  Bound result 43200\n  Bound result 1623\n  Bound result 60\n  Bound result 4775\n  Bound result 13632\n  Bound result 1000000000000000000\n  Bound result 8316\n  Bound result 12\n  Bound result 13\n  Bound result 3585461284\n  Bound result 77699172684722878\n  Bound result 105308632906866207\n  Bound result 4701\n  Bound result 530\n  Bound result 2\n  Bound result 2282\n  Bound result 3575649756102769489\n  Bound result 22803\n  Bound result 1000000000000000000\n  Bound result 42\n  Bound result 902\n  Bound result 149999\n  Bound result 185323120567785577\n  Bound result 239047609557688791\n  Bound result 42\n  Bound result 249999999999999401\n  Bound result 728\n  Bound result 38897\n  Bound result 1970\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 11.14s (11.15s 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                | 1268  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askEscalation          | 1256  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askPrimary             | 1263  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | collect                | 1276  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | deliverAnswer          | 1269  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | donate                 | 1192  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | openMarket             | 1305  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeBurn              | 1269  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeIndependentAnswer | 1286  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeTerminal          | 1289  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | settle                 | 1281  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | togglePause            | 1188  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | wager                  | 1242  | 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 1800000000\n  Bound result 1137\n  Bound result 150\n  Bound result 2159\n  Bound result 16026\n  Bound result 379788021810785759\n  Bound result 9\n  Bound result 83\n  Bound result 765710316349485724\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: 16922533)\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 38.63s (38.68s CPU time)\n\nRan 30 test suites in 38.64s (70.09s CPU time): 219 tests passed, 0 failed, 0 skipped (219 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\":237,\"DEPENDENCIES.md\":14,\"DESIGN.md\":95,\"LICENSE\":21,\"README.md\":175,\"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\":186,\"docs/BETTER_INTERFACE_LICENSE.txt\":220,\"docs/COLLATERAL_INDEPENDENT_REVIEW.md\":65,\"docs/DEPLOYMENT.md\":69,\"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\":34,\"foundry.toml\":23,\"remappings.txt\":2,\"script/MainnetParameters.sol\":53,\"src/OracleAttestation.sol\":221,\"src/VerdictBurnVault.sol\":5,\"src/VerdictMarkets.sol\":657,\"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\":110,\"test/IndependentReview.t.sol\":239,\"test/MainnetAdvisoryReview.t.sol\":266,\"test/MainnetLaunch.t.sol\":202,\"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\":69,\"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\":115,\"test/VerdictInvariant.t.sol\":213,\"test/VerdictLifecycleInvariant.t.sol\":580,\"test/VerdictMarketTiming.t.sol\":133,\"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":5954,"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:639: VerdictMarkets._outcome(VerdictMarkets.Params,bytes).first (src/VerdictMarkets.sol#639) 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:590: VerdictMarkets._validateParams(VerdictMarkets.Params) (src/VerdictMarkets.sol#590-628) 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: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":678,"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:612: 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:619: Uninitialized Local Variable (4 places)","passed":true},{"durationMs":9576,"exitCode":0,"name":"proof 73ad105210ae","output":"Compiling 57 files with Solc 0.8.26\nSolc 0.8.26 finished in 8.97s\nCompiler run successful!\n\nRan 1 test for test/imd-proof-14ca11b3/Proof_73ad105210ae.t.sol:VoidAfterLockTest\n[PASS] test_creatorCannotCreateAMarketThatLocksCollateralForever() (gas: 50545)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.29ms (100.70µs CPU time)\n\nRan 1 test suite in 3.50ms (1.29ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"1af775f319be6ece3b22438cfcb7477f01861a81c75c410c48b10e810922ccc3","verifiedTreeHash":"4d95a38dabff49c6c4156bee409ddc066e17d059","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":148522,"exitCode":0,"name":"build","output":"Compiling 85 files with Solc 0.8.26\nSolc 0.8.26 finished in 148.30s\nCompiler run successful with warnings:\nWarning (2072): Unused local variable.\n   --> test/MainnetLaunch.t.sol:103:9:\n    |\n103 |         MockIntake intake = MockIntake(MainnetParameters.INTAKE);\n    |         ^^^^^^^^^^^^^^^^^\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[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/MainnetLaunch.t.sol:192:17\n    │\n192 │         vm.warp(block.timestamp + 48 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: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/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictImportedAudit.t.sol:86:9\n   │\n86 │         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/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":37446,"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: 6257376)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 745.25µs (591.00µs CPU time)\n\nRan 3 tests for test/MainnetLaunch.t.sol:MainnetLaunchTest\n[PASS] test_mainnetArgumentsRunTheFullFlowAgainstTheBriefDependencies() (gas: 8808822)\n[PASS] test_mainnetOracleConfigurationWaitsFortyEightHours() (gas: 361945)\n[PASS] test_staleSepoliaArgumentsOnMainnetCannotCreateOrResolveAnyMarket() (gas: 183265)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.93ms (2.94ms CPU time)\n\nRan 5 tests for test/RevisionIndependentReview.t.sol:RevisionIndependentReviewTest\n[PASS] test_documentedUnusableOwnDeliveryStillBlocksRetry() (gas: 1323997)\n[PASS] test_escalationRejectsIssuanceBeforeItsOwnAsk() (gas: 2078090)\n[PASS] test_identicalBodyOtherMarketAnswerCannotSetOutcome() (gas: 2043265)\n[PASS] test_independentSameBodyCannotBlockOwnRetry() (gas: 1797921)\n[PASS] test_primaryLateIssuanceRemainsOutsideBriefsExplicitRange() (gas: 1436997)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 5.73ms (3.81ms CPU time)\n\nRan 6 tests for test/CollateralIndependentReview.t.sol:CollateralIndependentReviewTest\n[PASS] test_bountyReturnsInTheTokenItWasPulledInAfterAssetRotation() (gas: 1197593)\n[PASS] test_creatorPaymentIsOneTransferForIMDAndTwoForWeth() (gas: 3304354)\n[PASS] test_feeOnTransferWethCreditsOnlyReceivedAmount() (gas: 1464218)\n[PASS] test_priceRiseBlocksWethAskButRefundsAndBountyReturnStillWork() (gas: 1406474)\n[PASS] test_wethCallbackDuringClaimCannotReenter() (gas: 2503166)\n[PASS] test_wethMarketCannotReachIMDHeldForOthers() (gas: 2993617)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 5.98ms (4.52ms 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: 4923884)\n[PASS] test_priceRiseBeforeResolveClipsRewardToExactReserve() (gas: 3375704)\n[PASS] test_proposalUsesCurrentPriceAndPreservesTheLastAsk() (gas: 4512984)\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: 3012055)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 7.55ms (11.04ms CPU time)\n\nRan 6 tests for test/VerdictImportedAudit.t.sol:VerdictImportedAuditTest\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 575025)\n[PASS] test_creatorCanSetVoidAfterFarInFuture() (gas: 648803)\n[PASS] test_freshDeploymentCannotCreateUntilGuardianActs() (gas: 607635)\n[PASS] test_pauseOnlyBlocksEntryAndReleaseReturnsAllUnspentBounty() (gas: 2110848)\n[PASS] test_strangerEscalatesAtNoCostBurnsBountyAndDelays() (gas: 2632233)\n[PASS] test_unproposableDeliveryBlocksRetryAndMarketVoidsWithRefunds() (gas: 1951988)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 9.47ms (4.03ms 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 9.50ms (1.46ms 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: 4583259)\n[PASS] test_oracleAssetMismatchWhenOracleAssetChanges() (gas: 5557080)\n[PASS] test_wethMarketPaysFeesAndPayoutsInWethAndBountyOracleAndRewardsInIMD() (gas: 2664621)\n[PASS] test_wethMarketRefundsInWethAndReturnsBountyInIMDOnVoid() (gas: 1382413)\n[PASS] test_wethMarketRejectsIMDApprovalOnlyAndBetsNeedWeth() (gas: 743282)\n[PASS] test_zeroBurnShareSendsNothingToBurnSink() (gas: 1903514)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 14.76ms (9.24ms CPU time)\n\nRan 15 tests for test/VerdictMarketsValidation.t.sol:VerdictMarketsValidationTest\n[PASS] test_allowlistRemovalAndPermanentDisable() (gas: 1435821)\n[PASS] test_attestationMustMatchEveryMarketFieldAndPanelRequirements() (gas: 5311043)\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: 2918953)\n[PASS] test_feeCapAndPoolCapConstructor() (gas: 15600)\n[PASS] test_feeOnTransferCreditsOnlyActualBountyAndStakes() (gas: 1300079)\n[PASS] test_firstProposalAtVoidDeadlineCannotResurrectMarket() (gas: 1452109)\n[PASS] test_guardianHandoverIsTwoStepAndNoUnauthorizedPowers() (gas: 371084)\n[PASS] test_invalidTimesPanelsAndTypes() (gas: 617073)\n[PASS] test_minAgreedCanRequireMoreThanMinimumPanelSize() (gas: 1304263)\n[PASS] test_pauseBlocksOnlyEntryAndRenounceRequiresUnpaused() (gas: 3496131)\n[PASS] test_poolCapUsesReceivedBalanceAndFailedBetIsAtomic() (gas: 888525)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 19.41ms (16.22ms CPU time)\n\nRan 7 tests for test/VerdictAtomicity.t.sol:VerdictAtomicityTest\n[PASS] testFuzz_failureAtAnyFinalizeRecipientRollsBackEarlierPayments(uint8,bool) (runs: 64, μ: 2500564, ~: 2500051)\n[PASS] test_failedBountyReturnDoesNotVoidMarketOrPreventLaterRefund() (gas: 1197636)\n[PASS] test_failedCallbackIsNotRefundedButMarketRetryAndSettlementRemainReachable() (gas: 2513924)\n[PASS] test_failedEscalationPaymentCannotExtendOrConsumeDisputeWindow() (gas: 2802921)\n[PASS] test_failedPrimaryPaymentRestoresBountyAskCountTimestampAndAllowances() (gas: 1819869)\n[PASS] test_failedRefundCanBeRetriedAndDoesNotConsumeAnotherUsersClaim() (gas: 1543017)\n[PASS] test_guardBlocksCrossMarketReentryFromAnOtherwiseEligibleClaimant() (gas: 4610601)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 57.61ms (61.60ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_burnVaultHasNoCallablePathOrEtherReceiver() (gas: 1013389)\n[PASS] test_exactMainnetFactoryDeploymentWithoutDependencyCode() (gas: 21450651)\n[PASS] test_rehearsalRefusesOtherChains() (gas: 208630)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 139.07ms (40.26ms CPU time)\n\nRan 6 tests for test/VerdictOracleAdversarial.t.sol:VerdictOracleAdversarialTest\n[PASS] testFuzz_rotationsKeepFourInflightSnapshotsInAnyDeliveryOrder(uint256) (runs: 256, μ: 5459977, ~: 5459977)\n[PASS] test_contractSignerIsPinnedAndRevokedSignatureStoresNothing() (gas: 1500716)\n[PASS] test_everyAttestationFieldIsBoundBySignatureAndStoredHash() (gas: 2610090)\n[PASS] test_expiryAndClockToleranceAreInclusiveAtExactBoundary() (gas: 977218)\n[PASS] test_nonCanonicalAndTruncatedSignaturesCannotConsumePendingRequest() (gas: 829148)\n[PASS] test_pendingOwnerCannotAcceptConfigurationAndFormerOwnerLosesAccess() (gas: 434003)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 245.17ms (247.36ms 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: 970870)\n[PASS] test_deliveredAnswerRemainsReadableAfterExpiry() (gas: 524142)\n[PASS] test_expiredFutureMalformedAndTamperedRejected() (gas: 766673)\n[PASS] test_falseAnswerStoredUnder150kGas() (gas: 575766)\nLogs:\n  cold callback gas: 126024\n\n[PASS] test_intakeAndSignerRotationPreservesInflightRequest() (gas: 2174481)\n[PASS] test_maxAnswerUnder150kGas() (gas: 610171)\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 312.32ms (7.88ms CPU time)\n\nRan 7 tests for test/VerdictOutcomes.t.sol:VerdictOutcomesTest\n[PASS] testFuzz_uintBucketDefinition(uint256) (runs: 512, μ: 1408002, ~: 1408042)\n[PASS] test_addressListUsesFirstElementOnlyAndCanonicalAddressKey() (gas: 5141201)\n[PASS] test_booleanOutcomes() (gas: 2442987)\n[PASS] test_bytes32ListUsesFirstElementOnlyAndEmptyMeansNone() (gas: 6343526)\n[PASS] test_malformedEncodedAnswerCannotSetOutcome() (gas: 1362179)\n[PASS] test_numericBucketsIncludeLowerBoundaryExcludeUpper() (gas: 7620215)\n[PASS] test_twoToEightOutcomesAndSortedUniqueDefinitions() (gas: 1904068)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 336.58ms (344.49ms CPU time)\n\nRan 12 tests for test/IndependentReview.t.sol:IndependentReviewTest\n[PASS] testFuzzReviewActualTransfersConserveInAnyClaimOrder(uint96,uint96,uint96,uint8) (runs: 512, μ: 2743765, ~: 2744022)\nLogs:\n  Bound result 549341\n  Bound result 16538846060817210984\n  Bound result 32094070718\n\n[PASS] testReviewAgreementMinimumCanExceedMinimumPanel() (gas: 1794321)\n[PASS] testReviewDonationDoesNotAlterPayoutOrAccounting() (gas: 1922141)\n[PASS] testReviewEscalationCannotBeFirstProposalEvenWithLargePanel() (gas: 1287636)\n[PASS] testReviewEscalationCannotVoidAfterDeadline() (gas: 2402036)\n[PASS] testReviewFailedTokenTransferRollsBackClaim() (gas: 2064643)\n[PASS] testReviewLateReplacementPastVoidRemainsFinalizable() (gas: 2687831)\n[PASS] testReviewMaximumAnswerColdCallback() (gas: 1330984)\nLogs:\n  maximum answer cold callback gas: 140592\n\n[PASS] testReviewMixedMarketsCannotCrossSubsidizeClaims() (gas: 3423860)\n[PASS] testReviewNoWinnerIsVoidableAfterWindowPastVoidAfter() (gas: 2062903)\n[PASS] testReviewRotationPreservesOldCallerAndKey() (gas: 2382651)\n[PASS] testReviewSameAttestationCannotOverwriteDifferentRequest() (gas: 1489630)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 336.67ms (345.52ms 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, μ: 55938, ~: 44668)\nLogs:\n  Bound result 552\n  Bound result 301\n  Bound result 120\n  Bound result 162\n  Bound result 27\n  Bound result 310\n  Bound result 0\n  Bound result 147000000000000000000\n\n[PASS] testFuzz_wethFeeSplitConservesPoolExactly(uint16,uint16,uint16,uint256,uint256,uint256,uint256) (runs: 512, μ: 3223562, ~: 3234055)\nLogs:\n  Bound result 83\n  Bound result 244\n  Bound result 33\n  Bound result 200000000000000000\n  Bound result 66355200\n  Bound result 242\n  Bound result 18842\n\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 754506)\n[PASS] test_assetRotationAfterProposalStillFinalizesInRecordedToken() (gas: 2725743)\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: 4719411)\n[PASS] test_wethCapBoundaryAtLaunchCap() (gas: 1506043)\n[PASS] test_wethCapIsExactAtOneWei() (gas: 1162115)\n[PASS] test_wethClaimFailurePaths() (gas: 2296650)\n[PASS] test_wethCollateralWithWethBountyPaysCreatorOnce() (gas: 2337830)\n[PASS] test_wethMarketCreationNeedsIMDBounty() (gas: 318758)\n[PASS] test_wethPoolNeverSubsidisesSettlerRewards() (gas: 2581762)\n[PASS] test_wethRefundsWhilePausedReturnBothSides() (gas: 1333273)\n[PASS] test_wethStakeTaxedToZeroReverts() (gas: 674706)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 336.78ms (385.12ms CPU time)\n\nRan 10 tests for test/SettlerIndependentReview.t.sol:SettlerIndependentReviewTest\n[PASS] testFuzz_rewardRecipientsMayAlsoBeCreatorWinnerOrTreasury(uint8) (runs: 512, μ: 2350323, ~: 2345833)\n[PASS] testFuzz_rewardReserveUsesPriceAfterPaidAsk(uint256) (runs: 512, μ: 1422305, ~: 1426140)\nLogs:\n  Bound result 220720338469969681\n\n[PASS] test_creatorReturnFailureRevertsFinalizeIncludingEarlierReward() (gas: 2606600)\n[PASS] test_creatorReturnFailureRevertsVoidIncludingEarlierReward() (gas: 1330961)\n[PASS] test_failedProposalRewardLeavesStoredAnswerUsableAndPaysOnceOnRetry() (gas: 1932402)\n[PASS] test_finalizeRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 3508426)\n[PASS] test_maximumPriceAfterPaidAskSuppressesRewardWithoutReverting() (gas: 1377344)\n[PASS] test_positiveTerminalRewardsDoNotDependOnAWorkingOraclePrice() (gas: 2960244)\n[PASS] test_rewardFailureRollsBackTheWholePaidAskAndAllowsRetry() (gas: 2097390)\n[PASS] test_voidRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 2148790)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 339.00ms (397.62ms CPU time)\n\nRan 20 tests for test/VerdictMarkets.t.sol:VerdictMarketsTest\n[PASS] testFuzz_terminalConservation(uint96,uint96,uint96,uint8,bool) (runs: 512, μ: 2024544, ~: 2317169)\nLogs:\n  Bound result 29\n  Bound result 4396\n  Bound result 8060\n\n[PASS] test_asksBeforeAnswerFromAndAtOrAfterAnswerUntilRevert() (gas: 617425)\n[PASS] test_assetRotationBlocksAsksButNotRefunds() (gas: 2199183)\n[PASS] test_emptyWinningBucketCannotVoidUntilDisputeEnds() (gas: 1897298)\n[PASS] test_escalationAnswerCannotBeFirstProposal() (gas: 1288024)\n[PASS] test_escalationAskAtAnswerUntilRevertsEvenInsideDisputeWindow() (gas: 1347681)\n[PASS] test_externalSponsorCannotDeliverPrimaryOrEscalation() (gas: 4023666)\n[PASS] test_fullSettlementPaysWholePoolFeesAndExactRemainder() (gas: 2497351)\n[PASS] test_lateEscalationBeyondVoidAfterStillFinalizesWithoutAnswer() (gas: 2600809)\n[PASS] test_lateEscalationReplacementRestartsWindowOnceAndFinalizes() (gas: 2946147)\n[PASS] test_noEscalationBodyAndDuplicateEscalationAsk() (gas: 2838211)\n[PASS] test_priceIncreaseCannotSpendBettorsCollateral() (gas: 2371439)\n[PASS] test_primaryRetryBlockedAfterDeliveryEvenWithoutProposal() (gas: 1255959)\n[PASS] test_proposeAfterAnswerUntilWithTimelyStoredAnswer() (gas: 1556654)\n[PASS] test_provisionalWindowBoundariesAreStrict() (gas: 2410435)\n[PASS] test_secondPrimaryAskAfter24HoursAndMaximumTwoAsks() (gas: 1889759)\n[PASS] test_tokenReentrancyBlockedOnDepositAndClaim() (gas: 2252859)\n[PASS] test_voidNoAnswerRefundsEveryOutcomeAndUnspentBounty() (gas: 1845228)\n[PASS] test_wrongBodiesAndResolveAfterProposalRevertWithoutSpend() (gas: 1597622)\n[PASS] test_zeroAndUnknownClaimsAndUnfinishedClaimsRevert() (gas: 758134)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 339.09ms (354.42ms 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, μ: 3593382, ~: 3842697)\nLogs:\n  Bound result 18531\n  Bound result 6589\n  Bound result 9699\n  Bound result 4168\n  Bound result 29054\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 339.19ms (336.01ms CPU time)\n\nRan 11 tests for test/RevisionRegression.t.sol:RevisionRegressionTest\n[PASS] testFuzz_lateEscalationHasFiniteSettlementDeadline(uint32,uint32,uint32,bool) (runs: 256, μ: 2811397, ~: 2592592)\nLogs:\n  Bound result 3603\n  Bound result 2187\n  Bound result 55534\n\n[PASS] testFuzz_onlyLatestPaidPrimaryRequestCanProposeRegardlessOfDeliveryOrder(bool,bool) (runs: 256, μ: 3087146, ~: 3087144)\n[PASS] test_escalationCannotUseAnswerIssuedBeforeItsAsk() (gas: 2079687)\n[PASS] test_identicalEscalationBodiesStillRequireEachMarketsOwnPaidAsk() (gas: 5494904)\n[PASS] test_lateEscalationIssuedAfterAnswerUntilSettlesCorrectedOutcome() (gas: 2944650)\n[PASS] test_otherMarketAnswerCannotSetOutcomeOrBlockRetry() (gas: 3155841)\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 367.67ms (714.16ms CPU time)\n\nRan 7 tests for test/SettlerBountyBoundaries.t.sol:SettlerBountyBoundariesTest\n[PASS] testFuzz_exactMinimumAndOneWeiShortAcrossUint256(uint256,uint256) (runs: 1000, μ: 1463059, ~: 1466162)\nLogs:\n  Bound result 8006869727572165099574693421013\n  Bound result 1452520092114406723963374425207973672096545265626001193751352\n\n[PASS] testFuzz_transferTaxAcceptsExactReceivedMinimumAndRejectsOneWeiLess(uint96,uint16) (runs: 1000, μ: 1331225, ~: 1332837)\nLogs:\n  Bound result 222218966044\n  Bound result 350\n\n[PASS] testFuzz_unrepresentableMinimumRevertsBeforeTokenTransfer(uint256,uint256) (runs: 1000, μ: 359347, ~: 359334)\nLogs:\n  Bound result 500000000000000000001\n  Bound result 92633671389852956338856788006950326282615987732512451231766067206330503711955\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 374.80ms (888.93ms CPU time)\n\nRan 7 tests for test/VerdictSettlementProperties.t.sol:VerdictSettlementPropertiesTest\n[PASS] testFuzz_feeSplitsAndRationalPayoutBoundsInEveryClaimOrder(uint256,uint16,uint16,uint16,uint8) (runs: 1000, μ: 3071180, ~: 3076458)\nLogs:\n  Bound result 95\n  Bound result 30\n  Bound result 175\n  Bound result 41071404791504443732\n  Bound result 42935398689640320444\n  Bound result 28411438840218449508\n  Bound result 5955\n\n[PASS] testFuzz_numericOutcomeSatisfiesItsHalfOpenInterval(uint128,uint96,uint256,uint8) (runs: 1000, μ: 1454171, ~: 1445279)\nLogs:\n  Bound result 1\n  Bound result 380403703460654606570450\n  Bound result 0\n\n[PASS] test_malformedListsCannotChangeAnAuthenticatedMarketsOutcome() (gas: 3071650)\n[PASS] test_oneWeiLastWinnerReceivesTheRoundingRemainder() (gas: 2377056)\n[PASS] test_oneWeiWinnerMayRoundToZeroButLastClaimStillDrainsExactly() (gas: 2702882)\n[PASS] test_payoutUsesFullPrecisionWhenIntermediateStakeTimesPoolOverflows256Bits() (gas: 2634577)\n[PASS] test_settlementEventsDescribeWholePoolFeesAndUnspentBounty() (gas: 2082543)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 374.87ms (680.63ms 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        | 781   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | ask            | 843   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | askEscalation  | 803   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | collect        | 836   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | deliverPrimary | 837   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | enter          | 848   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | proposePrimary | 836   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | replaceOutcome | 816   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | settle         | 801   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | togglePause    | 791   | 0       | 0        |\n╰----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 300000000000000000\n  Bound result 5591\n  Bound result 1202\n  Bound result 6900526820034337410\n  Bound result 634\n  Bound result 21597\n  Bound result 1001\n  Bound result 12543\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.09s (2.09s 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        | 760   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | ask            | 698   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | askEscalation  | 720   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | changePrice    | 757   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | collect        | 776   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | deliverPrimary | 732   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | enter          | 722   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | proposePrimary | 747   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | replaceOutcome | 765   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | settle         | 745   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | togglePause    | 770   | 0       | 0        |\n╰----------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 96\n  Bound result 60\n  Bound result 20896\n  Bound result 1000000000000000000\n  Bound result 2338\n  Bound result 10214895197239785\n  Bound result 6434\n  Bound result 20946\n  Bound result 500\n  Bound result 96\n  Bound result 3844601568\n  Bound result 4655\n  Bound result 1001\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.30s (2.29s 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        | 760   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | ask            | 698   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | askEscalation  | 720   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | changePrice    | 757   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | collect        | 776   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | deliverPrimary | 732   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | enter          | 722   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | proposePrimary | 747   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | replaceOutcome | 765   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | settle         | 745   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | togglePause    | 770   | 0       | 0        |\n╰----------------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 96\n  Bound result 60\n  Bound result 20896\n  Bound result 1000000000000000000\n  Bound result 2338\n  Bound result 10214895197239785\n  Bound result 5597\n  Bound result 12487\n  Bound result 500\n  Bound result 96\n  Bound result 4201\n  Bound result 5949\n  Bound result 1001\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.74s (4.74s 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        | 1367  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | ask            | 1370  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | askEscalation  | 1334  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | collect        | 1337  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | deliverPrimary | 1386  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | enter          | 1361  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | open           | 1380  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | proposePrimary | 1355  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | replaceOutcome | 1417  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | rotate         | 1377  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | settle         | 1380  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | togglePause    | 1320  | 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 12257\n  Bound result 1005\n  Bound result 11937\n  Bound result 160\n  Bound result 0\n  Bound result 0\n  Bound result 6012\n  Bound result 500\n  Bound result 24058\n  Bound result 93\n  Bound result 0\n  Bound result 19097\n  Bound result 170\n  Bound result 5615\n  Bound result 19557\n  Bound result 6847\n  Bound result 26\n  Bound result 0\n  Bound result 999999999999999981\n  Bound result 1400000000000002551\n  Bound result 30111028613354319608\n  Bound result 249999999995999999\n  Bound result 6766\n  Bound result 9100\n  Bound result 205382\n  Bound result 98415\n  Bound result 13736\n  Bound result 1400000000000000126\n  Bound result 12509\n  Bound result 9876\n  Bound result 14985\n  Bound result 11048\n  Bound result 1299999999999999892\n  Bound result 4021\n  Bound result 601\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.38s (6.40s 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       | 1541  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | changePrice   | 1449  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | collect       | 1629  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | deliverAnswer | 1577  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | donate        | 1614  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | escalate      | 1533  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | openMarket    | 1590  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | pauseEntry    | 1633  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | probeRejected | 1587  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | propose       | 1698  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | resolve       | 1539  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | settle        | 1545  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | wager         | 1545  | 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 131070\n  Bound result 307\n  Bound result 179370147803489897\n  Bound result 5870\n  Bound result 600000000000000000\n  Bound result 1835\n  Bound result 1000000000000000000\n  Bound result 119880699554596699525\n  Bound result 700\n  Bound result 1193046\n  Bound result 7348804806585346523\n  Bound result 50000000000000000\n  Bound result 23825\n  Bound result 16821\n  Bound result 1193046\n  Bound result 12939\n  Bound result 4995\n  Bound result 22554\n  Bound result 249999999999999985\n  Bound result 919999999999999811\n  Bound result 1529035837012967424\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.81s (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                | 1205  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askEscalation          | 1313  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askPrimary             | 1265  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | collect                | 1249  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | deliverAnswer          | 1283  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | donate                 | 1261  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | openMarket             | 1272  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeBurn              | 1203  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeIndependentAnswer | 1188  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeTerminal          | 1333  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | settle                 | 1221  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | togglePause            | 1290  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | wager                  | 1301  | 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 7\n  Bound result 1022\n  Bound result 2293517444\n  Bound result 356168950430231879\n  Bound result 1\n  Bound result 15998\n  Bound result 400\n  Bound result 499999999999999927\n  Bound result 814978\n  Bound result 999794809742089073\n  Bound result 9511\n  Bound result 3842201716\n  Bound result 10000\n  Bound result 95\n  Bound result 4275\n  Bound result 400\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.35s (37.39s CPU time)\n\nRan 28 test suites in 37.35s (67.65s CPU time): 202 tests passed, 0 failed, 0 skipped (202 total tests)\n","passed":true},{"durationMs":78,"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\":131,\"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\":179,\"docs/BETTER_INTERFACE_LICENSE.txt\":220,\"docs/COLLATERAL_INDEPENDENT_REVIEW.md\":65,\"docs/DEPLOYMENT.md\":69,\"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\":34,\"foundry.toml\":23,\"launch.json\":42,\"remappings.txt\":2,\"script/MainnetParameters.sol\":53,\"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\":110,\"test/IndependentReview.t.sol\":239,\"test/MainnetLaunch.t.sol\":202,\"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\":69,\"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\":118,\"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":"2145dad23c4afd925942e213d0a0ad8044784ac000718dd013a5bcf4aeed3f52","verifiedTreeHash":"1a5dec438a4be02ac2a23be8329c443e76bdee51","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":170644,"exitCode":0,"name":"build","output":"Compiling 85 files with Solc 0.8.26\nSolc 0.8.26 finished in 170.40s\nCompiler run successful with warnings:\nWarning (2072): Unused local variable.\n   --> test/MainnetLaunch.t.sol:103:9:\n    |\n103 |         MockIntake intake = MockIntake(MainnetParameters.INTAKE);\n    |         ^^^^^^^^^^^^^^^^^\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[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    │\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/MainnetLaunch.t.sol:192:17\n    │\n192 │         vm.warp(block.timestamp + 48 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: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/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictImportedAudit.t.sol:86:9\n   │\n86 │         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/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":37619,"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: 6257376)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.40ms (1.19ms CPU time)\n\nRan 3 tests for test/MainnetLaunch.t.sol:MainnetLaunchTest\n[PASS] test_mainnetArgumentsRunTheFullFlowAgainstTheBriefDependencies() (gas: 8808822)\n[PASS] test_mainnetOracleConfigurationWaitsFortyEightHours() (gas: 361945)\n[PASS] test_staleSepoliaArgumentsOnMainnetCannotCreateOrResolveAnyMarket() (gas: 183265)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.03ms (2.69ms 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: 4583259)\n[PASS] test_oracleAssetMismatchWhenOracleAssetChanges() (gas: 5557080)\n[PASS] test_wethMarketPaysFeesAndPayoutsInWethAndBountyOracleAndRewardsInIMD() (gas: 2664621)\n[PASS] test_wethMarketRefundsInWethAndReturnsBountyInIMDOnVoid() (gas: 1382413)\n[PASS] test_wethMarketRejectsIMDApprovalOnlyAndBetsNeedWeth() (gas: 743282)\n[PASS] test_zeroBurnShareSendsNothingToBurnSink() (gas: 1903514)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 8.59ms (6.65ms CPU time)\n\nRan 6 tests for test/VerdictImportedAudit.t.sol:VerdictImportedAuditTest\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 575025)\n[PASS] test_creatorCanSetVoidAfterFarInFuture() (gas: 648803)\n[PASS] test_freshDeploymentCannotCreateUntilGuardianActs() (gas: 607635)\n[PASS] test_pauseOnlyBlocksEntryAndReleaseReturnsAllUnspentBounty() (gas: 2110848)\n[PASS] test_strangerEscalatesAtNoCostBurnsBountyAndDelays() (gas: 2632233)\n[PASS] test_unproposableDeliveryBlocksRetryAndMarketVoidsWithRefunds() (gas: 1951988)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 10.41ms (4.66ms CPU time)\n\nRan 5 tests for test/RevisionIndependentReview.t.sol:RevisionIndependentReviewTest\n[PASS] test_documentedUnusableOwnDeliveryStillBlocksRetry() (gas: 1323997)\n[PASS] test_escalationRejectsIssuanceBeforeItsOwnAsk() (gas: 2078090)\n[PASS] test_identicalBodyOtherMarketAnswerCannotSetOutcome() (gas: 2043265)\n[PASS] test_independentSameBodyCannotBlockOwnRetry() (gas: 1797921)\n[PASS] test_primaryLateIssuanceRemainsOutsideBriefsExplicitRange() (gas: 1436997)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 35.70ms (6.00ms CPU time)\n\nRan 7 tests for test/VerdictAtomicity.t.sol:VerdictAtomicityTest\n[PASS] testFuzz_failureAtAnyFinalizeRecipientRollsBackEarlierPayments(uint8,bool) (runs: 64, μ: 2501128, ~: 2500051)\n[PASS] test_failedBountyReturnDoesNotVoidMarketOrPreventLaterRefund() (gas: 1197636)\n[PASS] test_failedCallbackIsNotRefundedButMarketRetryAndSettlementRemainReachable() (gas: 2513924)\n[PASS] test_failedEscalationPaymentCannotExtendOrConsumeDisputeWindow() (gas: 2802921)\n[PASS] test_failedPrimaryPaymentRestoresBountyAskCountTimestampAndAllowances() (gas: 1819869)\n[PASS] test_failedRefundCanBeRetriedAndDoesNotConsumeAnotherUsersClaim() (gas: 1543017)\n[PASS] test_guardBlocksCrossMarketReentryFromAnOtherwiseEligibleClaimant() (gas: 4610601)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 68.38ms (75.85ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_burnVaultHasNoCallablePathOrEtherReceiver() (gas: 1013389)\n[PASS] test_exactMainnetFactoryDeploymentWithoutDependencyCode() (gas: 21450651)\n[PASS] test_rehearsalRefusesOtherChains() (gas: 208630)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 136.40ms (45.50ms 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 356.55ms (1.76ms 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: 4923884)\n[PASS] test_priceRiseBeforeResolveClipsRewardToExactReserve() (gas: 3375704)\n[PASS] test_proposalUsesCurrentPriceAndPreservesTheLastAsk() (gas: 4512984)\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: 3012055)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 356.55ms (17.37ms CPU time)\n\nRan 6 tests for test/CollateralIndependentReview.t.sol:CollateralIndependentReviewTest\n[PASS] test_bountyReturnsInTheTokenItWasPulledInAfterAssetRotation() (gas: 1197593)\n[PASS] test_creatorPaymentIsOneTransferForIMDAndTwoForWeth() (gas: 3304354)\n[PASS] test_feeOnTransferWethCreditsOnlyReceivedAmount() (gas: 1464218)\n[PASS] test_priceRiseBlocksWethAskButRefundsAndBountyReturnStillWork() (gas: 1406474)\n[PASS] test_wethCallbackDuringClaimCannotReenter() (gas: 2503166)\n[PASS] test_wethMarketCannotReachIMDHeldForOthers() (gas: 2993617)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 356.80ms (4.25ms CPU time)\n\nRan 20 tests for test/VerdictMarkets.t.sol:VerdictMarketsTest\n[PASS] testFuzz_terminalConservation(uint96,uint96,uint96,uint8,bool) (runs: 512, μ: 1974910, ~: 2317157)\nLogs:\n  Bound result 1295\n  Bound result 13723\n  Bound result 11986\n\n[PASS] test_asksBeforeAnswerFromAndAtOrAfterAnswerUntilRevert() (gas: 617425)\n[PASS] test_assetRotationBlocksAsksButNotRefunds() (gas: 2199183)\n[PASS] test_emptyWinningBucketCannotVoidUntilDisputeEnds() (gas: 1897298)\n[PASS] test_escalationAnswerCannotBeFirstProposal() (gas: 1288024)\n[PASS] test_escalationAskAtAnswerUntilRevertsEvenInsideDisputeWindow() (gas: 1347681)\n[PASS] test_externalSponsorCannotDeliverPrimaryOrEscalation() (gas: 4023666)\n[PASS] test_fullSettlementPaysWholePoolFeesAndExactRemainder() (gas: 2497351)\n[PASS] test_lateEscalationBeyondVoidAfterStillFinalizesWithoutAnswer() (gas: 2600809)\n[PASS] test_lateEscalationReplacementRestartsWindowOnceAndFinalizes() (gas: 2946147)\n[PASS] test_noEscalationBodyAndDuplicateEscalationAsk() (gas: 2838211)\n[PASS] test_priceIncreaseCannotSpendBettorsCollateral() (gas: 2371439)\n[PASS] test_primaryRetryBlockedAfterDeliveryEvenWithoutProposal() (gas: 1255959)\n[PASS] test_proposeAfterAnswerUntilWithTimelyStoredAnswer() (gas: 1556654)\n[PASS] test_provisionalWindowBoundariesAreStrict() (gas: 2410435)\n[PASS] test_secondPrimaryAskAfter24HoursAndMaximumTwoAsks() (gas: 1889759)\n[PASS] test_tokenReentrancyBlockedOnDepositAndClaim() (gas: 2252859)\n[PASS] test_voidNoAnswerRefundsEveryOutcomeAndUnspentBounty() (gas: 1845228)\n[PASS] test_wrongBodiesAndResolveAfterProposalRevertWithoutSpend() (gas: 1597622)\n[PASS] test_zeroAndUnknownClaimsAndUnfinishedClaimsRevert() (gas: 758134)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 356.77ms (349.05ms CPU time)\n\nRan 11 tests for test/RevisionRegression.t.sol:RevisionRegressionTest\n[PASS] testFuzz_lateEscalationHasFiniteSettlementDeadline(uint32,uint32,uint32,bool) (runs: 256, μ: 2828323, ~: 2592793)\nLogs:\n  Bound result 3600\n  Bound result 26\n  Bound result 63873\n\n[PASS] testFuzz_onlyLatestPaidPrimaryRequestCanProposeRegardlessOfDeliveryOrder(bool,bool) (runs: 256, μ: 3087145, ~: 3087144)\n[PASS] test_escalationCannotUseAnswerIssuedBeforeItsAsk() (gas: 2079687)\n[PASS] test_identicalEscalationBodiesStillRequireEachMarketsOwnPaidAsk() (gas: 5494904)\n[PASS] test_lateEscalationIssuedAfterAnswerUntilSettlesCorrectedOutcome() (gas: 2944650)\n[PASS] test_otherMarketAnswerCannotSetOutcomeOrBlockRetry() (gas: 3155841)\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 356.88ms (597.15ms 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, μ: 55667, ~: 44668)\nLogs:\n  Bound result 43\n  Bound result 1\n  Bound result 3\n  Bound result 1\n  Bound result 1\n  Bound result 6\n  Bound result 233\n  Bound result 919874150681652118539231057188199682426651039515586320879\n\n[PASS] testFuzz_wethFeeSplitConservesPoolExactly(uint16,uint16,uint16,uint256,uint256,uint256,uint256) (runs: 512, μ: 3223754, ~: 3234139)\nLogs:\n  Bound result 96\n  Bound result 268\n  Bound result 61\n  Bound result 14602\n  Bound result 185000000000000000\n  Bound result 53\n  Bound result 249999999999999391\n\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 754506)\n[PASS] test_assetRotationAfterProposalStillFinalizesInRecordedToken() (gas: 2725743)\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: 4719411)\n[PASS] test_wethCapBoundaryAtLaunchCap() (gas: 1506043)\n[PASS] test_wethCapIsExactAtOneWei() (gas: 1162115)\n[PASS] test_wethClaimFailurePaths() (gas: 2296650)\n[PASS] test_wethCollateralWithWethBountyPaysCreatorOnce() (gas: 2337830)\n[PASS] test_wethMarketCreationNeedsIMDBounty() (gas: 318758)\n[PASS] test_wethPoolNeverSubsidisesSettlerRewards() (gas: 2581762)\n[PASS] test_wethRefundsWhilePausedReturnBothSides() (gas: 1333273)\n[PASS] test_wethStakeTaxedToZeroReverts() (gas: 674706)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 357.58ms (707.92ms CPU time)\n\nRan 10 tests for test/SettlerIndependentReview.t.sol:SettlerIndependentReviewTest\n[PASS] testFuzz_rewardRecipientsMayAlsoBeCreatorWinnerOrTreasury(uint8) (runs: 512, μ: 2349737, ~: 2345833)\n[PASS] testFuzz_rewardReserveUsesPriceAfterPaidAsk(uint256) (runs: 512, μ: 1422497, ~: 1426152)\nLogs:\n  Bound result 993924359528188\n\n[PASS] test_creatorReturnFailureRevertsFinalizeIncludingEarlierReward() (gas: 2606600)\n[PASS] test_creatorReturnFailureRevertsVoidIncludingEarlierReward() (gas: 1330961)\n[PASS] test_failedProposalRewardLeavesStoredAnswerUsableAndPaysOnceOnRetry() (gas: 1932402)\n[PASS] test_finalizeRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 3508426)\n[PASS] test_maximumPriceAfterPaidAskSuppressesRewardWithoutReverting() (gas: 1377344)\n[PASS] test_positiveTerminalRewardsDoNotDependOnAWorkingOraclePrice() (gas: 2960244)\n[PASS] test_rewardFailureRollsBackTheWholePaidAskAndAllowsRetry() (gas: 2097390)\n[PASS] test_voidRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 2148790)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 360.61ms (690.82ms CPU time)\n\nRan 7 tests for test/VerdictOutcomes.t.sol:VerdictOutcomesTest\n[PASS] testFuzz_uintBucketDefinition(uint256) (runs: 512, μ: 1408017, ~: 1408054)\n[PASS] test_addressListUsesFirstElementOnlyAndCanonicalAddressKey() (gas: 5141201)\n[PASS] test_booleanOutcomes() (gas: 2442987)\n[PASS] test_bytes32ListUsesFirstElementOnlyAndEmptyMeansNone() (gas: 6343526)\n[PASS] test_malformedEncodedAnswerCannotSetOutcome() (gas: 1362179)\n[PASS] test_numericBucketsIncludeLowerBoundaryExcludeUpper() (gas: 7620215)\n[PASS] test_twoToEightOutcomesAndSortedUniqueDefinitions() (gas: 1904068)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 361.49ms (375.35ms 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: 970870)\n[PASS] test_deliveredAnswerRemainsReadableAfterExpiry() (gas: 524142)\n[PASS] test_expiredFutureMalformedAndTamperedRejected() (gas: 766673)\n[PASS] test_falseAnswerStoredUnder150kGas() (gas: 575766)\nLogs:\n  cold callback gas: 126024\n\n[PASS] test_intakeAndSignerRotationPreservesInflightRequest() (gas: 2174481)\n[PASS] test_maxAnswerUnder150kGas() (gas: 610171)\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 361.56ms (9.30ms CPU time)\n\nRan 15 tests for test/VerdictMarketsValidation.t.sol:VerdictMarketsValidationTest\n[PASS] test_allowlistRemovalAndPermanentDisable() (gas: 1435821)\n[PASS] test_attestationMustMatchEveryMarketFieldAndPanelRequirements() (gas: 5311043)\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: 2918953)\n[PASS] test_feeCapAndPoolCapConstructor() (gas: 15600)\n[PASS] test_feeOnTransferCreditsOnlyActualBountyAndStakes() (gas: 1300079)\n[PASS] test_firstProposalAtVoidDeadlineCannotResurrectMarket() (gas: 1452109)\n[PASS] test_guardianHandoverIsTwoStepAndNoUnauthorizedPowers() (gas: 371084)\n[PASS] test_invalidTimesPanelsAndTypes() (gas: 617073)\n[PASS] test_minAgreedCanRequireMoreThanMinimumPanelSize() (gas: 1304263)\n[PASS] test_pauseBlocksOnlyEntryAndRenounceRequiresUnpaused() (gas: 3496131)\n[PASS] test_poolCapUsesReceivedBalanceAndFailedBetIsAtomic() (gas: 888525)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 361.63ms (9.82ms CPU time)\n\nRan 12 tests for test/IndependentReview.t.sol:IndependentReviewTest\n[PASS] testFuzzReviewActualTransfersConserveInAnyClaimOrder(uint96,uint96,uint96,uint8) (runs: 512, μ: 2744009, ~: 2744050)\nLogs:\n  Bound result 768\n  Bound result 49402234050738272295\n  Bound result 4901038710\n\n[PASS] testReviewAgreementMinimumCanExceedMinimumPanel() (gas: 1794321)\n[PASS] testReviewDonationDoesNotAlterPayoutOrAccounting() (gas: 1922141)\n[PASS] testReviewEscalationCannotBeFirstProposalEvenWithLargePanel() (gas: 1287636)\n[PASS] testReviewEscalationCannotVoidAfterDeadline() (gas: 2402036)\n[PASS] testReviewFailedTokenTransferRollsBackClaim() (gas: 2064643)\n[PASS] testReviewLateReplacementPastVoidRemainsFinalizable() (gas: 2687831)\n[PASS] testReviewMaximumAnswerColdCallback() (gas: 1330984)\nLogs:\n  maximum answer cold callback gas: 140592\n\n[PASS] testReviewMixedMarketsCannotCrossSubsidizeClaims() (gas: 3423860)\n[PASS] testReviewNoWinnerIsVoidableAfterWindowPastVoidAfter() (gas: 2062903)\n[PASS] testReviewRotationPreservesOldCallerAndKey() (gas: 2382651)\n[PASS] testReviewSameAttestationCannotOverwriteDifferentRequest() (gas: 1489630)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 361.76ms (372.18ms 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, μ: 3703281, ~: 3874541)\nLogs:\n  Bound result 1002729035524\n  Bound result 64758\n  Bound result 62038262\n  Bound result 1\n  Bound result 446653828096354455\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 361.85ms (359.29ms CPU time)\n\nRan 7 tests for test/VerdictSettlementProperties.t.sol:VerdictSettlementPropertiesTest\n[PASS] testFuzz_feeSplitsAndRationalPayoutBoundsInEveryClaimOrder(uint256,uint16,uint16,uint16,uint8) (runs: 1000, μ: 3071834, ~: 3076458)\nLogs:\n  Bound result 76\n  Bound result 190\n  Bound result 97\n  Bound result 41067599784288085605\n  Bound result 11228182089641483704\n  Bound result 68986804107250379457\n  Bound result 12582111675580\n\n[PASS] testFuzz_numericOutcomeSatisfiesItsHalfOpenInterval(uint128,uint96,uint256,uint8) (runs: 1000, μ: 1455719, ~: 1445531)\nLogs:\n  Bound result 4\n  Bound result 29686333805\n  Bound result 85386134318316091104839773315\n\n[PASS] test_malformedListsCannotChangeAnAuthenticatedMarketsOutcome() (gas: 3071650)\n[PASS] test_oneWeiLastWinnerReceivesTheRoundingRemainder() (gas: 2377056)\n[PASS] test_oneWeiWinnerMayRoundToZeroButLastClaimStillDrainsExactly() (gas: 2702882)\n[PASS] test_payoutUsesFullPrecisionWhenIntermediateStakeTimesPoolOverflows256Bits() (gas: 2634577)\n[PASS] test_settlementEventsDescribeWholePoolFeesAndUnspentBounty() (gas: 2082543)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 362.03ms (732.74ms CPU time)\n\nRan 7 tests for test/SettlerBountyBoundaries.t.sol:SettlerBountyBoundariesTest\n[PASS] testFuzz_exactMinimumAndOneWeiShortAcrossUint256(uint256,uint256) (runs: 1000, μ: 1463729, ~: 1466042)\nLogs:\n  Bound result 266650786516467428022041141398770916172938598783\n  Bound result 10900407557875549030589929519033877497015731939997329396306205257929317422\n\n[PASS] testFuzz_transferTaxAcceptsExactReceivedMinimumAndRejectsOneWeiLess(uint96,uint16) (runs: 1000, μ: 1330959, ~: 1332837)\nLogs:\n  Bound result 65280\n  Bound result 912\n\n[PASS] testFuzz_unrepresentableMinimumRevertsBeforeTokenTransfer(uint256,uint256) (runs: 1000, μ: 359366, ~: 359334)\nLogs:\n  Bound result 1500000000000000000\n  Bound result 92633671389852956338856788006950326282615987732512451231566667206330503712712\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 363.39ms (625.33ms CPU time)\n\nRan 6 tests for test/VerdictOracleAdversarial.t.sol:VerdictOracleAdversarialTest\n[PASS] testFuzz_rotationsKeepFourInflightSnapshotsInAnyDeliveryOrder(uint256) (runs: 256, μ: 5459977, ~: 5459977)\n[PASS] test_contractSignerIsPinnedAndRevokedSignatureStoresNothing() (gas: 1500716)\n[PASS] test_everyAttestationFieldIsBoundBySignatureAndStoredHash() (gas: 2610090)\n[PASS] test_expiryAndClockToleranceAreInclusiveAtExactBoundary() (gas: 977218)\n[PASS] test_nonCanonicalAndTruncatedSignaturesCannotConsumePendingRequest() (gas: 829148)\n[PASS] test_pendingOwnerCannotAcceptConfigurationAndFormerOwnerLosesAccess() (gas: 434003)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 363.43ms (366.78ms 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        | 763   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | ask            | 787   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | askEscalation  | 885   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | collect        | 814   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | deliverPrimary | 828   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | enter          | 809   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | proposePrimary | 829   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | replaceOutcome | 814   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | settle         | 783   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | togglePause    | 880   | 0       | 0        |\n╰----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 11\n  Bound result 1790\n  Bound result 307\n  Bound result 20394\n  Bound result 16872\n  Bound result 999\n  Bound result 10684\n  Bound result 2367\n  Bound result 3468\n  Bound result 21482\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.14s (2.13s 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        | 711   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | ask            | 720   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | askEscalation  | 787   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | changePrice    | 768   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | collect        | 758   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | deliverPrimary | 741   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | enter          | 789   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | proposePrimary | 707   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | replaceOutcome | 767   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | settle         | 704   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | togglePause    | 740   | 0       | 0        |\n╰----------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 6438\n  Bound result 16346\n  Bound result 21573\n  Bound result 5\n  Bound result 13453\n  Bound result 1209600\n  Bound result 109781574354466289\n  Bound result 15210\n  Bound result 5703499776\n  Bound result 38397452450084013\n  Bound result 826074472\n  Bound result 21481\n  Bound result 16217\n  Bound result 3136\n  Bound result 1999999999999999998\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.33s (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        | 711   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | ask            | 720   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | askEscalation  | 787   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | changePrice    | 768   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | collect        | 758   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | deliverPrimary | 741   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | enter          | 789   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | proposePrimary | 707   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | replaceOutcome | 767   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | settle         | 704   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | togglePause    | 740   | 0       | 0        |\n╰----------------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 6438\n  Bound result 18678\n  Bound result 21573\n  Bound result 5\n  Bound result 13453\n  Bound result 1209600\n  Bound result 109781574354466289\n  Bound result 15304\n  Bound result 5703499776\n  Bound result 38397452450084013\n  Bound result 1721\n  Bound result 21481\n  Bound result 17317\n  Bound result 7090\n  Bound result 1999999999999999998\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.82s (4.83s 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        | 1347  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | ask            | 1355  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | askEscalation  | 1463  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | collect        | 1407  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | deliverPrimary | 1320  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | enter          | 1328  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | open           | 1399  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | proposePrimary | 1385  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | replaceOutcome | 1324  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | rotate         | 1337  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | settle         | 1368  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | togglePause    | 1351  | 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 1400000000001193047\n  Bound result 1400000000000049153\n  Bound result 1287650781938909397\n  Bound result 14399\n  Bound result 25503\n  Bound result 23310\n  Bound result 28383\n  Bound result 1000\n  Bound result 1400000000000008467\n  Bound result 628686329312295009\n  Bound result 22654\n  Bound result 14445\n  Bound result 5158\n  Bound result 1400000000000029055\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.48s (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       | 1550  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | changePrice   | 1568  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | collect       | 1597  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | deliverAnswer | 1618  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | donate        | 1529  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | escalate      | 1571  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | openMarket    | 1561  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | pauseEntry    | 1605  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | probeRejected | 1529  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | propose       | 1593  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | resolve       | 1516  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | settle        | 1662  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | wager         | 1581  | 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 256\n  Bound result 6757266\n  Bound result 26754\n  Bound result 256\n  Bound result 8265\n  Bound result 1000000000000000000\n  Bound result 592417102759672675\n  Bound result 902\n  Bound result 75917921177057296\n  Bound result 13047\n  Bound result 20804\n  Bound result 587\n  Bound result 150001\n  Bound result 1325310402\n  Bound result 37889\n  Bound result 17147486741\n  Bound result 19011\n  Bound result 23575\n  Bound result 700\n  Bound result 11155111\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.51s (10.51s 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                | 1304  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askEscalation          | 1276  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askPrimary             | 1273  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | collect                | 1337  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | deliverAnswer          | 1263  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | donate                 | 1284  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | openMarket             | 1218  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeBurn              | 1199  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeIndependentAnswer | 1279  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeTerminal          | 1284  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | settle                 | 1194  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | togglePause            | 1234  | 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 244\n  Bound result 1694\n  Bound result 730000000000000000\n  Bound result 9650\n  Bound result 1\n  Bound result 258984688\n  Bound result 127\n  Bound result 3273\n  Bound result 480\n  Bound result 173853915566828205\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.49s (37.51s CPU time)\n\nRan 28 test suites in 37.49s (69.41s CPU time): 202 tests passed, 0 failed, 0 skipped (202 total tests)\n","passed":true},{"durationMs":89,"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\":131,\"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\":179,\"docs/BETTER_INTERFACE_LICENSE.txt\":220,\"docs/COLLATERAL_INDEPENDENT_REVIEW.md\":65,\"docs/DEPLOYMENT.md\":69,\"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\":34,\"foundry.toml\":23,\"remappings.txt\":2,\"script/MainnetParameters.sol\":53,\"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\":110,\"test/IndependentReview.t.sol\":239,\"test/MainnetLaunch.t.sol\":202,\"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\":69,\"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\":118,\"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":"58d3e3752f16cb0f977672aaa3b69831dc0a9fcb6bb0019dca1390b1cd973246","verifiedTreeHash":"bb4bd0f0c79997599b6fa81df4b74b6ecaa89808","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":195430,"exitCode":0,"name":"build","output":"Compiling 89 files with Solc 0.8.26\nSolc 0.8.26 finished in 195.16s\nCompiler run successful with warnings:\nWarning (2072): Unused local variable.\n   --> test/MainnetLaunch.t.sol:103:9:\n    |\n103 |         MockIntake intake = MockIntake(MainnetParameters.INTAKE);\n    |         ^^^^^^^^^^^^^^^^^\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[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    │\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/MainnetFixture.sol:137:28\n    │\n137 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    ‡\n196 │         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/MainnetFixture.sol:179:29\n    │\n179 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    ‡\n196 │         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/MainnetFixture.sol:180:30\n    │\n180 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    ‡\n196 │         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/MainnetFixture.sol:137:28\n    │\n137 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/MainnetDependencies.t.sol:678:9\n    │\n678 │         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/MainnetFixture.sol:137:28\n    │\n137 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/MainnetDependencies.t.sol:704:9\n    │\n704 │         vm.warp(markets.getMarket(id).params.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/MainnetFixture.sol:137:28\n    │\n137 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/MainnetDependencies.t.sol:740:9\n    │\n740 │         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/MainnetInvariant.t.sol:301:17\n    │\n301 │         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/MainnetLaunch.t.sol:192:17\n    │\n192 │         vm.warp(block.timestamp + 48 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: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/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictImportedAudit.t.sol:86:9\n   │\n86 │         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/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":38580,"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.63ms (1.27ms CPU time)\n\nRan 1 test for test/SettlerDeployment.t.sol:SettlerDeploymentTest\n[PASS] test_launchHandoffPinsV2AndFifteenConstructorArguments() (gas: 6257376)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.65ms (1.12ms CPU time)\n\nRan 3 tests for test/MainnetLaunch.t.sol:MainnetLaunchTest\n[PASS] test_mainnetArgumentsRunTheFullFlowAgainstTheBriefDependencies() (gas: 8808822)\n[PASS] test_mainnetOracleConfigurationWaitsFortyEightHours() (gas: 361945)\n[PASS] test_staleSepoliaArgumentsOnMainnetCannotCreateOrResolveAnyMarket() (gas: 183265)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.88ms (2.59ms CPU time)\n\nRan 6 tests for test/VerdictImportedAudit.t.sol:VerdictImportedAuditTest\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 575025)\n[PASS] test_creatorCanSetVoidAfterFarInFuture() (gas: 648803)\n[PASS] test_freshDeploymentCannotCreateUntilGuardianActs() (gas: 607635)\n[PASS] test_pauseOnlyBlocksEntryAndReleaseReturnsAllUnspentBounty() (gas: 2110848)\n[PASS] test_strangerEscalatesAtNoCostBurnsBountyAndDelays() (gas: 2632233)\n[PASS] test_unproposableDeliveryBlocksRetryAndMarketVoidsWithRefunds() (gas: 1951988)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 6.39ms (4.17ms CPU time)\n\nRan 5 tests for test/RevisionIndependentReview.t.sol:RevisionIndependentReviewTest\n[PASS] test_documentedUnusableOwnDeliveryStillBlocksRetry() (gas: 1323997)\n[PASS] test_escalationRejectsIssuanceBeforeItsOwnAsk() (gas: 2078090)\n[PASS] test_identicalBodyOtherMarketAnswerCannotSetOutcome() (gas: 2043265)\n[PASS] test_independentSameBodyCannotBlockOwnRetry() (gas: 1797921)\n[PASS] test_primaryLateIssuanceRemainsOutsideBriefsExplicitRange() (gas: 1436997)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.71ms (4.98ms CPU time)\n\nRan 6 tests for test/CollateralIndependentReview.t.sol:CollateralIndependentReviewTest\n[PASS] test_bountyReturnsInTheTokenItWasPulledInAfterAssetRotation() (gas: 1197593)\n[PASS] test_creatorPaymentIsOneTransferForIMDAndTwoForWeth() (gas: 3304354)\n[PASS] test_feeOnTransferWethCreditsOnlyReceivedAmount() (gas: 1464218)\n[PASS] test_priceRiseBlocksWethAskButRefundsAndBountyReturnStillWork() (gas: 1406474)\n[PASS] test_wethCallbackDuringClaimCannotReenter() (gas: 2503166)\n[PASS] test_wethMarketCannotReachIMDHeldForOthers() (gas: 2993617)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 8.98ms (4.08ms 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: 4583259)\n[PASS] test_oracleAssetMismatchWhenOracleAssetChanges() (gas: 5557080)\n[PASS] test_wethMarketPaysFeesAndPayoutsInWethAndBountyOracleAndRewardsInIMD() (gas: 2664621)\n[PASS] test_wethMarketRefundsInWethAndReturnsBountyInIMDOnVoid() (gas: 1382413)\n[PASS] test_wethMarketRejectsIMDApprovalOnlyAndBetsNeedWeth() (gas: 743282)\n[PASS] test_zeroBurnShareSendsNothingToBurnSink() (gas: 1903514)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 10.33ms (9.09ms 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: 4924454)\n[PASS] test_priceRiseBeforeResolveClipsRewardToExactReserve() (gas: 3375704)\n[PASS] test_proposalUsesCurrentPriceAndPreservesTheLastAsk() (gas: 4512984)\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: 3012055)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 11.24ms (12.61ms CPU time)\n\nRan 15 tests for test/VerdictMarketsValidation.t.sol:VerdictMarketsValidationTest\n[PASS] test_allowlistRemovalAndPermanentDisable() (gas: 1435821)\n[PASS] test_attestationMustMatchEveryMarketFieldAndPanelRequirements() (gas: 5311043)\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: 2918953)\n[PASS] test_feeCapAndPoolCapConstructor() (gas: 15600)\n[PASS] test_feeOnTransferCreditsOnlyActualBountyAndStakes() (gas: 1300079)\n[PASS] test_firstProposalAtVoidDeadlineCannotResurrectMarket() (gas: 1452109)\n[PASS] test_guardianHandoverIsTwoStepAndNoUnauthorizedPowers() (gas: 371084)\n[PASS] test_invalidTimesPanelsAndTypes() (gas: 617073)\n[PASS] test_minAgreedCanRequireMoreThanMinimumPanelSize() (gas: 1304263)\n[PASS] test_pauseBlocksOnlyEntryAndRenounceRequiresUnpaused() (gas: 3496131)\n[PASS] test_poolCapUsesReceivedBalanceAndFailedBetIsAtomic() (gas: 888525)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 11.62ms (9.47ms 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: 970870)\n[PASS] test_deliveredAnswerRemainsReadableAfterExpiry() (gas: 524142)\n[PASS] test_expiredFutureMalformedAndTamperedRejected() (gas: 766673)\n[PASS] test_falseAnswerStoredUnder150kGas() (gas: 575766)\nLogs:\n  cold callback gas: 126024\n\n[PASS] test_intakeAndSignerRotationPreservesInflightRequest() (gas: 2174481)\n[PASS] test_maxAnswerUnder150kGas() (gas: 610171)\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.98ms (8.76ms CPU time)\n\nRan 7 tests for test/VerdictAtomicity.t.sol:VerdictAtomicityTest\n[PASS] testFuzz_failureAtAnyFinalizeRecipientRollsBackEarlierPayments(uint8,bool) (runs: 64, μ: 2499201, ~: 2500051)\n[PASS] test_failedBountyReturnDoesNotVoidMarketOrPreventLaterRefund() (gas: 1197636)\n[PASS] test_failedCallbackIsNotRefundedButMarketRetryAndSettlementRemainReachable() (gas: 2513924)\n[PASS] test_failedEscalationPaymentCannotExtendOrConsumeDisputeWindow() (gas: 2802921)\n[PASS] test_failedPrimaryPaymentRestoresBountyAskCountTimestampAndAllowances() (gas: 1819869)\n[PASS] test_failedRefundCanBeRetriedAndDoesNotConsumeAnotherUsersClaim() (gas: 1543017)\n[PASS] test_guardBlocksCrossMarketReentryFromAnOtherwiseEligibleClaimant() (gas: 4610601)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 52.74ms (62.21ms CPU time)\n\nRan 7 tests for test/VerdictOutcomes.t.sol:VerdictOutcomesTest\n[PASS] testFuzz_uintBucketDefinition(uint256) (runs: 512, μ: 1408036, ~: 1408030)\n[PASS] test_addressListUsesFirstElementOnlyAndCanonicalAddressKey() (gas: 5141201)\n[PASS] test_booleanOutcomes() (gas: 2442987)\n[PASS] test_bytes32ListUsesFirstElementOnlyAndEmptyMeansNone() (gas: 6343526)\n[PASS] test_malformedEncodedAnswerCannotSetOutcome() (gas: 1362179)\n[PASS] test_numericBucketsIncludeLowerBoundaryExcludeUpper() (gas: 7620215)\n[PASS] test_twoToEightOutcomesAndSortedUniqueDefinitions() (gas: 1904068)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 248.54ms (261.13ms 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, μ: 3548293, ~: 3584382)\nLogs:\n  Bound result 4438\n  Bound result 6790\n  Bound result 340\n  Bound result 16737\n  Bound result 2111\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 388.49ms (385.43ms CPU time)\n\nRan 20 tests for test/VerdictMarkets.t.sol:VerdictMarketsTest\n[PASS] testFuzz_terminalConservation(uint96,uint96,uint96,uint8,bool) (runs: 512, μ: 2030033, ~: 2317175)\nLogs:\n  Bound result 79361950166287710128\n  Bound result 8444656709\n  Bound result 17021826982\n\n[PASS] test_asksBeforeAnswerFromAndAtOrAfterAnswerUntilRevert() (gas: 617425)\n[PASS] test_assetRotationBlocksAsksButNotRefunds() (gas: 2199183)\n[PASS] test_emptyWinningBucketCannotVoidUntilDisputeEnds() (gas: 1897298)\n[PASS] test_escalationAnswerCannotBeFirstProposal() (gas: 1288024)\n[PASS] test_escalationAskAtAnswerUntilRevertsEvenInsideDisputeWindow() (gas: 1347681)\n[PASS] test_externalSponsorCannotDeliverPrimaryOrEscalation() (gas: 4023666)\n[PASS] test_fullSettlementPaysWholePoolFeesAndExactRemainder() (gas: 2497351)\n[PASS] test_lateEscalationBeyondVoidAfterStillFinalizesWithoutAnswer() (gas: 2600809)\n[PASS] test_lateEscalationReplacementRestartsWindowOnceAndFinalizes() (gas: 2946147)\n[PASS] test_noEscalationBodyAndDuplicateEscalationAsk() (gas: 2838211)\n[PASS] test_priceIncreaseCannotSpendBettorsCollateral() (gas: 2371439)\n[PASS] test_primaryRetryBlockedAfterDeliveryEvenWithoutProposal() (gas: 1255959)\n[PASS] test_proposeAfterAnswerUntilWithTimelyStoredAnswer() (gas: 1556654)\n[PASS] test_provisionalWindowBoundariesAreStrict() (gas: 2410435)\n[PASS] test_secondPrimaryAskAfter24HoursAndMaximumTwoAsks() (gas: 1889759)\n[PASS] test_tokenReentrancyBlockedOnDepositAndClaim() (gas: 2252859)\n[PASS] test_voidNoAnswerRefundsEveryOutcomeAndUnspentBounty() (gas: 1845228)\n[PASS] test_wrongBodiesAndResolveAfterProposalRevertWithoutSpend() (gas: 1597622)\n[PASS] test_zeroAndUnknownClaimsAndUnfinishedClaimsRevert() (gas: 758134)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 428.34ms (445.92ms CPU time)\n\nRan 11 tests for test/RevisionRegression.t.sol:RevisionRegressionTest\n[PASS] testFuzz_lateEscalationHasFiniteSettlementDeadline(uint32,uint32,uint32,bool) (runs: 256, μ: 2820716, ~: 2592793)\nLogs:\n  Bound result 255702\n  Bound result 240\n  Bound result 20\n\n[PASS] testFuzz_onlyLatestPaidPrimaryRequestCanProposeRegardlessOfDeliveryOrder(bool,bool) (runs: 256, μ: 3087145, ~: 3087144)\n[PASS] test_escalationCannotUseAnswerIssuedBeforeItsAsk() (gas: 2079687)\n[PASS] test_identicalEscalationBodiesStillRequireEachMarketsOwnPaidAsk() (gas: 5494904)\n[PASS] test_lateEscalationIssuedAfterAnswerUntilSettlesCorrectedOutcome() (gas: 2944650)\n[PASS] test_otherMarketAnswerCannotSetOutcomeOrBlockRetry() (gas: 3155841)\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 441.20ms (472.68ms CPU time)\n\nRan 6 tests for test/VerdictOracleAdversarial.t.sol:VerdictOracleAdversarialTest\n[PASS] testFuzz_rotationsKeepFourInflightSnapshotsInAnyDeliveryOrder(uint256) (runs: 256, μ: 5459977, ~: 5459977)\n[PASS] test_contractSignerIsPinnedAndRevokedSignatureStoresNothing() (gas: 1500716)\n[PASS] test_everyAttestationFieldIsBoundBySignatureAndStoredHash() (gas: 2610090)\n[PASS] test_expiryAndClockToleranceAreInclusiveAtExactBoundary() (gas: 977218)\n[PASS] test_nonCanonicalAndTruncatedSignaturesCannotConsumePendingRequest() (gas: 829148)\n[PASS] test_pendingOwnerCannotAcceptConfigurationAndFormerOwnerLosesAccess() (gas: 434003)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 441.30ms (444.71ms 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, μ: 56942, ~: 44668)\nLogs:\n  Bound result 53\n  Bound result 63\n  Bound result 503\n  Bound result 24\n  Bound result 3\n  Bound result 532\n  Bound result 51102672863289444876706239167195937249567217235395195481483489\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129639934\n\n[PASS] testFuzz_wethFeeSplitConservesPoolExactly(uint16,uint16,uint16,uint256,uint256,uint256,uint256) (runs: 512, μ: 3224147, ~: 3234067)\nLogs:\n  Bound result 286\n  Bound result 36\n  Bound result 11\n  Bound result 193782792835301376\n  Bound result 79379852185187000\n  Bound result 12050\n  Bound result 7467\n\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 754506)\n[PASS] test_assetRotationAfterProposalStillFinalizesInRecordedToken() (gas: 2725743)\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: 4719411)\n[PASS] test_wethCapBoundaryAtLaunchCap() (gas: 1506043)\n[PASS] test_wethCapIsExactAtOneWei() (gas: 1162115)\n[PASS] test_wethClaimFailurePaths() (gas: 2296650)\n[PASS] test_wethCollateralWithWethBountyPaysCreatorOnce() (gas: 2337830)\n[PASS] test_wethMarketCreationNeedsIMDBounty() (gas: 318758)\n[PASS] test_wethPoolNeverSubsidisesSettlerRewards() (gas: 2581762)\n[PASS] test_wethRefundsWhilePausedReturnBothSides() (gas: 1333273)\n[PASS] test_wethStakeTaxedToZeroReverts() (gas: 674706)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 441.49ms (450.89ms CPU time)\n\nRan 12 tests for test/IndependentReview.t.sol:IndependentReviewTest\n[PASS] testFuzzReviewActualTransfersConserveInAnyClaimOrder(uint96,uint96,uint96,uint8) (runs: 512, μ: 2743690, ~: 2744022)\nLogs:\n  Bound result 1232\n  Bound result 10578680509622535524\n  Bound result 52265791\n\n[PASS] testReviewAgreementMinimumCanExceedMinimumPanel() (gas: 1794321)\n[PASS] testReviewDonationDoesNotAlterPayoutOrAccounting() (gas: 1922141)\n[PASS] testReviewEscalationCannotBeFirstProposalEvenWithLargePanel() (gas: 1287636)\n[PASS] testReviewEscalationCannotVoidAfterDeadline() (gas: 2402036)\n[PASS] testReviewFailedTokenTransferRollsBackClaim() (gas: 2064643)\n[PASS] testReviewLateReplacementPastVoidRemainsFinalizable() (gas: 2687831)\n[PASS] testReviewMaximumAnswerColdCallback() (gas: 1330984)\nLogs:\n  maximum answer cold callback gas: 140592\n\n[PASS] testReviewMixedMarketsCannotCrossSubsidizeClaims() (gas: 3423860)\n[PASS] testReviewNoWinnerIsVoidableAfterWindowPastVoidAfter() (gas: 2062903)\n[PASS] testReviewRotationPreservesOldCallerAndKey() (gas: 2382651)\n[PASS] testReviewSameAttestationCannotOverwriteDifferentRequest() (gas: 1489630)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 480.77ms (488.35ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_burnVaultHasNoCallablePathOrEtherReceiver() (gas: 1013389)\n[PASS] test_exactMainnetFactoryDeploymentWithoutDependencyCode() (gas: 21450651)\n[PASS] test_rehearsalRefusesOtherChains() (gas: 208630)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 497.57ms (41.75ms CPU time)\n\nRan 10 tests for test/SettlerIndependentReview.t.sol:SettlerIndependentReviewTest\n[PASS] testFuzz_rewardRecipientsMayAlsoBeCreatorWinnerOrTreasury(uint8) (runs: 512, μ: 2350183, ~: 2345833)\n[PASS] testFuzz_rewardReserveUsesPriceAfterPaidAsk(uint256) (runs: 512, μ: 1422500, ~: 1426152)\nLogs:\n  Bound result 11058707533642244\n\n[PASS] test_creatorReturnFailureRevertsFinalizeIncludingEarlierReward() (gas: 2606600)\n[PASS] test_creatorReturnFailureRevertsVoidIncludingEarlierReward() (gas: 1330961)\n[PASS] test_failedProposalRewardLeavesStoredAnswerUsableAndPaysOnceOnRetry() (gas: 1932402)\n[PASS] test_finalizeRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 3508426)\n[PASS] test_maximumPriceAfterPaidAskSuppressesRewardWithoutReverting() (gas: 1377344)\n[PASS] test_positiveTerminalRewardsDoNotDependOnAWorkingOraclePrice() (gas: 2960244)\n[PASS] test_rewardFailureRollsBackTheWholePaidAskAndAllowsRetry() (gas: 2097390)\n[PASS] test_voidRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 2148790)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 497.76ms (639.69ms CPU time)\n\nRan 7 tests for test/SettlerBountyBoundaries.t.sol:SettlerBountyBoundariesTest\n[PASS] testFuzz_exactMinimumAndOneWeiShortAcrossUint256(uint256,uint256) (runs: 1000, μ: 1463120, ~: 1466018)\nLogs:\n  Bound result 1919\n  Bound result 300\n\n[PASS] testFuzz_transferTaxAcceptsExactReceivedMinimumAndRejectsOneWeiLess(uint96,uint16) (runs: 1000, μ: 1331601, ~: 1332837)\nLogs:\n  Bound result 3832\n  Bound result 100\n\n[PASS] testFuzz_unrepresentableMinimumRevertsBeforeTokenTransfer(uint256,uint256) (runs: 1000, μ: 359359, ~: 359334)\nLogs:\n  Bound result 1919\n  Bound result 92633671389852956338856788006950326282615987732512451231566067206330503713016\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 497.81ms (1.05s CPU time)\n\nRan 20 tests for test/MainnetDependencies.t.sol:MainnetDependenciesTest\n[PASS] testFuzz_mainnetFeeSplitsConserveEveryPool(uint256,uint256,uint256) (runs: 1000, μ: 4482464, ~: 4493066)\nLogs:\n  Bound result 489163837504231883633\n  Bound result 202\n  Bound result 1\n\n[PASS] test_allowlistStartsOnAndEmpty() (gas: 7496292)\n[PASS] test_configRotationFailurePathsAndRestartedClock() (gas: 746042)\n[PASS] test_constructorArgumentListsFitTheManifest() (gas: 5751)\n[PASS] test_constructorsRejectMisconfiguredMainnetArguments() (gas: 3535500)\n[PASS] test_guardianHandoverIsTwoStepAndRenounceIsGated() (gas: 415502)\n[PASS] test_imdSlotFeesAtTheCapAndCreatorPaidInOneTransfer() (gas: 2141530)\n[PASS] test_launchOrderAndWiringMatchTheBrief() (gas: 103354)\n[PASS] test_oracleDomainIsChainOneAndTheDeployedOracle() (gas: 14800)\n[PASS] test_oracleOwnershipIsTwoStep() (gas: 235453)\n[PASS] test_pauseStopsEntryOnlyAndIsIdempotentChecked() (gas: 2073082)\n[PASS] test_poolCapsAreExactAndPerMarket() (gas: 1963289)\n[PASS] test_requestsPaidBeforeRotationKeepTheLaunchSigner() (gas: 9438300)\n[PASS] test_sepoliaVectorSignatureDoesNotReplayOnMainnet() (gas: 2273947)\n[PASS] test_settlerRewardCeilingAndBountyFloor() (gas: 2622992)\n[PASS] test_thirdCollateralSlotDoesNotExist() (gas: 84549)\n[PASS] test_unknownMarketAndClosedEntry() (gas: 971197)\n[PASS] test_voidPaysNoFeesToAnyone() (gas: 1381700)\n[PASS] test_wethBetNeedsAllowanceBalanceAndRejectsEther() (gas: 901098)\n[PASS] test_wethSlotFullFlowAgainstRealWeth9() (gas: 2510738)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 497.89ms (506.29ms CPU time)\n\nRan 7 tests for test/VerdictSettlementProperties.t.sol:VerdictSettlementPropertiesTest\n[PASS] testFuzz_feeSplitsAndRationalPayoutBoundsInEveryClaimOrder(uint256,uint16,uint16,uint16,uint8) (runs: 1000, μ: 3072389, ~: 3076458)\nLogs:\n  Bound result 391\n  Bound result 1\n  Bound result 52\n  Bound result 71509452114121653058\n  Bound result 92755947546376751412\n  Bound result 46798366698129421427\n  Bound result 35297236836204316031\n\n[PASS] testFuzz_numericOutcomeSatisfiesItsHalfOpenInterval(uint128,uint96,uint256,uint8) (runs: 1000, μ: 1454799, ~: 1445603)\nLogs:\n  Bound result 1\n  Bound result 17184\n  Bound result 7470\n\n[PASS] test_malformedListsCannotChangeAnAuthenticatedMarketsOutcome() (gas: 3071650)\n[PASS] test_oneWeiLastWinnerReceivesTheRoundingRemainder() (gas: 2377056)\n[PASS] test_oneWeiWinnerMayRoundToZeroButLastClaimStillDrainsExactly() (gas: 2702882)\n[PASS] test_payoutUsesFullPrecisionWhenIntermediateStakeTimesPoolOverflows256Bits() (gas: 2634577)\n[PASS] test_settlementEventsDescribeWholePoolFeesAndUnspentBounty() (gas: 2082543)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 497.94ms (899.11ms 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        | 846   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | ask            | 831   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | askEscalation  | 850   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | collect        | 838   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | deliverPrimary | 806   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | enter          | 794   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | proposePrimary | 839   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | replaceOutcome | 809   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | settle         | 775   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | togglePause    | 804   | 0       | 0        |\n╰----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4206\n  Bound result 17235\n  Bound result 15635\n  Bound result 9743\n  Bound result 16503\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.13s (2.13s 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        | 754   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | ask            | 718   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | askEscalation  | 744   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | changePrice    | 715   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | collect        | 761   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | deliverPrimary | 765   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | enter          | 742   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | proposePrimary | 745   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | replaceOutcome | 728   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | settle         | 764   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | togglePause    | 756   | 0       | 0        |\n╰----------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 29\n  Bound result 21178\n  Bound result 19039\n  Bound result 1000000000000000000\n  Bound result 16503\n  Bound result 1000000000000000000\n  Bound result 3917\n  Bound result 7917\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.50s (2.50s CPU time)\n\nRan 2 tests for test/MainnetInvariant.t.sol:MainnetInvariantTest\n[PASS] invariant_mainnetCustodyRecipientsAndRolesHold() (runs: 160, calls: 10240, reverts: 0)\n\n╭-------------------------+----------------+-------+---------+----------╮\n| Contract                | Selector       | Calls | Reverts | Discards |\n+=======================================================================+\n| MainnetLifecycleHandler | advance        | 801   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | ask            | 782   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | askEscalation  | 749   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | collect        | 790   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | deliverPrimary | 790   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | enter          | 1613  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | probeAdmin     | 758   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | proposePrimary | 787   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | replaceOutcome | 816   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | rotatePrice    | 781   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | settle         | 781   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | togglePause    | 792   | 0       | 0        |\n╰-------------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 10370\n  Bound result 1099999999999999999\n  Bound result 8\n  Bound result 13189\n  Bound result 2549\n  Bound result 21598\n\n[PASS] test_handlerReachesSettlementInBothSlots() (gas: 10232534)\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.49s (4.49s 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        | 754   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | ask            | 718   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | askEscalation  | 744   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | changePrice    | 715   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | collect        | 761   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | deliverPrimary | 765   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | enter          | 742   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | proposePrimary | 745   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | replaceOutcome | 728   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | settle         | 764   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | togglePause    | 756   | 0       | 0        |\n╰----------------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 29\n  Bound result 21178\n  Bound result 20097\n  Bound result 1000000000000000000\n  Bound result 16503\n  Bound result 1000000000000000000\n  Bound result 1855308653467622174\n  Bound result 7917\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.83s (4.83s 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        | 1321  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | ask            | 1378  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | askEscalation  | 1370  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | collect        | 1386  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | deliverPrimary | 1326  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | enter          | 1359  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | open           | 1382  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | proposePrimary | 1323  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | replaceOutcome | 1387  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | rotate         | 1367  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | settle         | 1387  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | togglePause    | 1398  | 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 1856\n  Bound result 399999999999999996\n  Bound result 706\n  Bound result 99999999999999994\n  Bound result 877500000000000000\n  Bound result 5227\n  Bound result 194324\n  Bound result 63815\n  Bound result 15205\n  Bound result 46493841224906017516\n  Bound result 11000000000000000000\n  Bound result 1400000000000029055\n  Bound result 1199999999999999983\n  Bound result 28800\n  Bound result 4150827655\n  Bound result 43181\n  Bound result 3375\n  Bound result 13\n  Bound result 29999999999999997\n  Bound result 1538\n  Bound result 16393\n  Bound result 217817\n  Bound result 47426\n  Bound result 149\n  Bound result 698391321037379916\n  Bound result 28392\n  Bound result 117129\n  Bound result 7273\n  Bound result 244\n  Bound result 1400000000000011988\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.63s (6.64s 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       | 1629  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | changePrice   | 1612  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | collect       | 1562  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | deliverAnswer | 1512  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | donate        | 1605  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | escalate      | 1596  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | openMarket    | 1528  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | pauseEntry    | 1572  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | probeRejected | 1625  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | propose       | 1541  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | resolve       | 1566  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | settle        | 1606  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | wager         | 1526  | 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 176224206866481979608\n  Bound result 33835648168911094\n  Bound result 1153\n  Bound result 2021\n  Bound result 20000000000000000\n  Bound result 13157\n  Bound result 1000000000000000000\n  Bound result 1539\n  Bound result 7369\n  Bound result 8680\n  Bound result 20448\n  Bound result 604800\n  Bound result 10715\n  Bound result 21039\n  Bound result 13721\n  Bound result 1508\n  Bound result 477061731889948270\n  Bound result 375000000000000000\n  Bound result 1459964985281061773\n  Bound result 600000000000000000\n  Bound result 249999999999999801\n  Bound result 999999999999999902\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.95s (10.97s 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                | 1238  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askEscalation          | 1248  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askPrimary             | 1271  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | collect                | 1302  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | deliverAnswer          | 1265  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | donate                 | 1275  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | openMarket             | 1310  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeBurn              | 1302  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeIndependentAnswer | 1270  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeTerminal          | 1247  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | settle                 | 1241  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | togglePause            | 1168  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | wager                  | 1247  | 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 999999999999999971\n  Bound result 6464\n  Bound result 20\n  Bound result 400\n  Bound result 3195\n  Bound result 499999999999999951\n  Bound result 17453\n  Bound result 259201\n  Bound result 5046\n  Bound result 446744073709551597\n  Bound result 21600\n  Bound result 2\n  Bound result 6908\n  Bound result 14372\n  Bound result 14400\n  Bound result 16937\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 38.46s (38.49s CPU time)\n\nRan 30 test suites in 38.46s (75.48s CPU time): 224 tests passed, 0 failed, 0 skipped (224 total tests)\n","passed":true},{"durationMs":91,"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\":131,\"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\":179,\"docs/BETTER_INTERFACE_LICENSE.txt\":220,\"docs/COLLATERAL_INDEPENDENT_REVIEW.md\":65,\"docs/DEPLOYMENT.md\":69,\"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\":34,\"foundry.toml\":23,\"remappings.txt\":2,\"script/MainnetParameters.sol\":53,\"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\":110,\"test/IndependentReview.t.sol\":239,\"test/MainnetDependencies.t.sol\":752,\"test/MainnetFixture.sol\":207,\"test/MainnetInvariant.t.sol\":390,\"test/MainnetLaunch.t.sol\":202,\"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\":69,\"test/SettlerIndependentReview.t.sol\":342,\"test/SettlerLifecycleProperties.t.sol\":118,\"test/SettlerRewardInvariant.t.sol\":249,\"test/SettlerRewardSequence.t.sol\":483,\"test/TESTING.md\":164,\"test/TestBase.sol\":178,\"test/VerdictAtomicity.t.sol\":214,\"test/VerdictCollateral.t.sol\":354,\"test/VerdictCollateralInvariant.t.sol\":323,\"test/VerdictImportedAudit.t.sol\":118,\"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/MainnetBytecode.sol\":29,\"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":"cdd1520bd995a0b4db611b381d22c34bb7083ccc6abd3c4d0e630b0e1991a097","verifiedTreeHash":"d92a07bbce3ce575edef8191ab6b46970ee40153","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":207959,"exitCode":0,"name":"build","output":"Compiling 91 files with Solc 0.8.26\nSolc 0.8.26 finished in 207.72s\nCompiler run successful with warnings:\nWarning (2072): Unused local variable.\n   --> test/MainnetLaunch.t.sol:103:9:\n    |\n103 |         MockIntake intake = MockIntake(MainnetParameters.INTAKE);\n    |         ^^^^^^^^^^^^^^^^^\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[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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VerdictMarkets.sol:601:55\n    │\n601 │         if (p.answerUntil - p.answerFrom < 1 hours || uint256(p.voidAfter) - block.timestamp > 365 days) {\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:613:53\n    │\n613 │                 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:620:82\n    │\n620 │                 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:622:49\n    │\n622 │                     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:615:20\n    │\n615 │             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:625:20\n    │\n625 │             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:652:21\n    │\n652 │                 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:637:20\n    │\n637 │             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:655:16\n    │\n655 │         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/MainnetAdvisoryReview.t.sol:61:9\n   │\n61 │         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/MainnetAdvisoryReview.t.sol:92:9\n   │\n92 │         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/MainnetAdvisoryReview.t.sol:119:9\n    │\n119 │         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/MainnetAdvisoryReview.t.sol:148:9\n    │\n148 │         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/MainnetAdvisoryReview.t.sol:153:9\n    │\n153 │         vm.warp(vm.getBlockTimestamp() + 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/MainnetAdvisoryReview.t.sol:153:9\n    │\n153 │         vm.warp(vm.getBlockTimestamp() + 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:96:28\n    │\n 96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/MainnetAdvisoryReview.t.sol:226:9\n    │\n226 │         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/MainnetAdvisoryReview.t.sol:249:9\n    │\n249 │         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/MainnetFixture.sol:137:28\n    │\n137 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    ‡\n196 │         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/MainnetFixture.sol:179:29\n    │\n179 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    ‡\n196 │         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/MainnetFixture.sol:180:30\n    │\n180 │         a.expiresAt = uint64(block.timestamp + 7 days);\n    │                              ━━━━━━━━━━━━━━━\n    ‡\n196 │         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/MainnetFixture.sol:137:28\n    │\n137 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/MainnetDependencies.t.sol:678:9\n    │\n678 │         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/MainnetFixture.sol:137:28\n    │\n137 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/MainnetDependencies.t.sol:761:13\n    │\n761 │             vm.warp(stored.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/MainnetFixture.sol:137:28\n    │\n137 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/MainnetDependencies.t.sol:839:9\n    │\n839 │         vm.warp(markets.getMarket(id).params.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/MainnetFixture.sol:137:28\n    │\n137 │         p.closeAt = uint64(block.timestamp + 1 hours);\n    │                            ━━━━━━━━━━━━━━━\n    │\n    ⸬  test/MainnetDependencies.t.sol:875:9\n    │\n875 │         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/MainnetInvariant.t.sol:335:17\n    │\n335 │         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/MainnetLaunch.t.sol:192:17\n    │\n192 │         vm.warp(block.timestamp + 48 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: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/TestBase.sol:96:28\n   │\n96 │         p.closeAt = uint64(block.timestamp + 1 hours);\n   │                            ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/VerdictImportedAudit.t.sol:83:9\n   │\n83 │         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/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/VerdictMarketTiming.t.sol:63:30\n    │\n 63 │         p.voidAfter = uint64(block.timestamp + 365 days);\n    │                              ━━━━━━━━━━━━━━━\n    ‡\n114 │         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/VerdictMarketTiming.t.sol:87:28\n    │\n 87 │         p.closeAt = uint64(block.timestamp + bound(closeDelay, 1, 180 days));\n    │                            ━━━━━━━━━━━━━━━\n    ‡\n114 │         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   │\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":36162,"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: 6284157)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.10ms (1.39ms 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.29ms (1.24ms CPU time)\n\nRan 3 tests for test/MainnetLaunch.t.sol:MainnetLaunchTest\n[PASS] test_mainnetArgumentsRunTheFullFlowAgainstTheBriefDependencies() (gas: 8836373)\n[PASS] test_mainnetOracleConfigurationWaitsFortyEightHours() (gas: 361945)\n[PASS] test_staleSepoliaArgumentsOnMainnetCannotCreateOrResolveAnyMarket() (gas: 183727)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.60ms (3.76ms CPU time)\n\nRan 5 tests for test/RevisionIndependentReview.t.sol:RevisionIndependentReviewTest\n[PASS] test_documentedUnusableOwnDeliveryStillBlocksRetry() (gas: 1324459)\n[PASS] test_escalationRejectsIssuanceBeforeItsOwnAsk() (gas: 2078552)\n[PASS] test_identicalBodyOtherMarketAnswerCannotSetOutcome() (gas: 2044189)\n[PASS] test_independentSameBodyCannotBlockOwnRetry() (gas: 1798383)\n[PASS] test_primaryLateIssuanceRemainsOutsideBriefsExplicitRange() (gas: 1437459)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 4.90ms (3.56ms CPU time)\n\nRan 6 tests for test/CollateralIndependentReview.t.sol:CollateralIndependentReviewTest\n[PASS] test_bountyReturnsInTheTokenItWasPulledInAfterAssetRotation() (gas: 1198055)\n[PASS] test_creatorPaymentIsOneTransferForIMDAndTwoForWeth() (gas: 3305278)\n[PASS] test_feeOnTransferWethCreditsOnlyReceivedAmount() (gas: 1464680)\n[PASS] test_priceRiseBlocksWethAskButRefundsAndBountyReturnStillWork() (gas: 1406936)\n[PASS] test_wethCallbackDuringClaimCannotReenter() (gas: 2503628)\n[PASS] test_wethMarketCannotReachIMDHeldForOthers() (gas: 2994541)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 6.43ms (6.67ms CPU time)\n\nRan 6 tests for test/VerdictImportedAudit.t.sol:VerdictImportedAuditTest\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 575487)\n[PASS] test_creatorCannotSetVoidAfterFarInFuture() (gas: 78456)\n[PASS] test_freshDeploymentCannotCreateUntilGuardianActs() (gas: 608097)\n[PASS] test_pauseOnlyBlocksEntryAndReleaseReturnsAllUnspentBounty() (gas: 2111310)\n[PASS] test_strangerEscalatesAtNoCostBurnsBountyAndDelays() (gas: 2632698)\n[PASS] test_unproposableDeliveryBlocksRetryAndMarketVoidsWithRefunds() (gas: 1952350)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 6.61ms (4.25ms 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: 970870)\n[PASS] test_deliveredAnswerRemainsReadableAfterExpiry() (gas: 524142)\n[PASS] test_expiredFutureMalformedAndTamperedRejected() (gas: 766673)\n[PASS] test_falseAnswerStoredUnder150kGas() (gas: 575766)\nLogs:\n  cold callback gas: 126024\n\n[PASS] test_intakeAndSignerRotationPreservesInflightRequest() (gas: 2174481)\n[PASS] test_maxAnswerUnder150kGas() (gas: 610171)\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 9.63ms (7.81ms CPU time)\n\nRan 12 tests for test/VerdictCollateral.t.sol:VerdictCollateralTest\n[PASS] test_collateralConfigRevertsOutOfRange() (gas: 28148)\n[PASS] test_collateralIdOutOfRangeRevertsWithoutTakingBounty() (gas: 133737)\n[PASS] test_constructorExposesBothSlotsAndRejectsOtherSlots() (gas: 59166)\n[PASS] test_constructorRejectsEqualOrZeroTokensZeroCapsAndFeesOver500() (gas: 17819)\n[PASS] test_imdMarketKeepsCollateralAndBountyLedgersSeparate() (gas: 3045614)\n[PASS] test_marketCreatedEmitsSlotOneCollateral() (gas: 450461)\n[PASS] test_marketsInEachSlotUseTheirOwnFeesAndCaps() (gas: 4584183)\n[PASS] test_oracleAssetMismatchWhenOracleAssetChanges() (gas: 5558928)\n[PASS] test_wethMarketPaysFeesAndPayoutsInWethAndBountyOracleAndRewardsInIMD() (gas: 2665083)\n[PASS] test_wethMarketRefundsInWethAndReturnsBountyInIMDOnVoid() (gas: 1382875)\n[PASS] test_wethMarketRejectsIMDApprovalOnlyAndBetsNeedWeth() (gas: 743744)\n[PASS] test_zeroBurnShareSendsNothingToBurnSink() (gas: 1903976)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 10.54ms (10.44ms CPU time)\n\nRan 15 tests for test/VerdictMarketsValidation.t.sol:VerdictMarketsValidationTest\n[PASS] test_allowlistRemovalAndPermanentDisable() (gas: 1437207)\n[PASS] test_attestationMustMatchEveryMarketFieldAndPanelRequirements() (gas: 5311505)\n[PASS] test_betZeroUnknownOutcomeAndCloseBoundary() (gas: 776626)\n[PASS] test_bodyHashAndBodySizeValidation() (gas: 789471)\n[PASS] test_bountyMustCoverTwoAsksAfterTransferFee() (gas: 239061)\n[PASS] test_creationEmitsBothFullBodies() (gas: 436371)\n[PASS] test_escalationRequiresDoubleCurrentPanelAndCorrectBody() (gas: 2919415)\n[PASS] test_feeCapAndPoolCapConstructor() (gas: 15600)\n[PASS] test_feeOnTransferCreditsOnlyActualBountyAndStakes() (gas: 1300541)\n[PASS] test_firstProposalAtVoidDeadlineCannotResurrectMarket() (gas: 1452571)\n[PASS] test_guardianHandoverIsTwoStepAndNoUnauthorizedPowers() (gas: 371084)\n[PASS] test_invalidTimesPanelsAndTypes() (gas: 618459)\n[PASS] test_minAgreedCanRequireMoreThanMinimumPanelSize() (gas: 1304725)\n[PASS] test_pauseBlocksOnlyEntryAndRenounceRequiresUnpaused() (gas: 3497055)\n[PASS] test_poolCapUsesReceivedBalanceAndFailedBetIsAtomic() (gas: 888987)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 14.37ms (16.72ms CPU time)\n\nRan 8 tests for test/MainnetAdvisoryReview.t.sol:MainnetAdvisoryReviewTest\n[PASS] test_emptyPoolStillPaysForSuccessfulActionsFromCreatorBounty() (gas: 1774378)\n[PASS] test_intakePriceMismatchRollsBackAskAndOwnerUpdateTakesFortyEightHours() (gas: 2390625)\n[PASS] test_onlyOwnerCanRenounceAndPendingConfigurationIsThenUnreachable() (gas: 370084)\n[PASS] test_primaryPanelAboveFiftyNeedsReplacementBeyondCurrentServiceCap() (gas: 2900224)\n[PASS] test_retryByBettorUsesRemainingAskAndPrecludesEscalation() (gas: 2902178)\n[PASS] test_signerRotationKeepsPurchasedRequestsPinnedToOldSigner() (gas: 2267241)\n[PASS] test_signerWithRejectingCodeUsesERC1271AndCallbackFails() (gas: 1403747)\n[PASS] test_unusableSmallPanelDeliveryBlocksRetryButRefundsPrincipal() (gas: 1881620)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 16.90ms (10.87ms CPU time)\n\nRan 10 tests for test/VerdictSettlerRewards.t.sol:VerdictSettlerRewardsTest\n[PASS] test_bountyArithmeticRejectsImpossiblePriceOrRewardWithoutOverflow() (gas: 707497)\n[PASS] test_bountyMinimumChecksBothRequestedAndReceivedAmounts() (gas: 1298855)\n[PASS] test_eachProposalResolveAndFinalizePaysItsCallerOnceEscalatePaysNothing() (gas: 4924916)\n[PASS] test_priceRiseBeforeResolveClipsRewardToExactReserve() (gas: 3376166)\n[PASS] test_proposalUsesCurrentPriceAndPreservesTheLastAsk() (gas: 4513446)\n[PASS] test_retryResolveIsAlsoRewardedOnce() (gas: 3682381)\n[PASS] test_rewardBoundIsInclusiveAndZeroCapDisablesRewards() (gas: 1070121)\n[PASS] test_terminalRewardIsClippedToBountyNeverBettorDepositsOrAnotherMarket() (gas: 3435346)\n[PASS] test_voidWithoutAsksPaysBeforeReturningBountyAndNeverTwice() (gas: 1726485)\n[PASS] test_zeroRewardKeepsLegacyBalancesEventsAndNoNewPriceDependency() (gas: 3012517)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 20.84ms (17.40ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_burnVaultHasNoCallablePathOrEtherReceiver() (gas: 1013389)\n[PASS] test_exactMainnetFactoryDeploymentWithoutDependencyCode() (gas: 21542549)\n[PASS] test_rehearsalRefusesOtherChains() (gas: 208630)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 44.96ms (25.74ms CPU time)\n\nRan 7 tests for test/VerdictAtomicity.t.sol:VerdictAtomicityTest\n[PASS] testFuzz_failureAtAnyFinalizeRecipientRollsBackEarlierPayments(uint8,bool) (runs: 64, μ: 2503436, ~: 2503126)\n[PASS] test_failedBountyReturnDoesNotVoidMarketOrPreventLaterRefund() (gas: 1198098)\n[PASS] test_failedCallbackIsNotRefundedButMarketRetryAndSettlementRemainReachable() (gas: 2514386)\n[PASS] test_failedEscalationPaymentCannotExtendOrConsumeDisputeWindow() (gas: 2803383)\n[PASS] test_failedPrimaryPaymentRestoresBountyAskCountTimestampAndAllowances() (gas: 1820331)\n[PASS] test_failedRefundCanBeRetriedAndDoesNotConsumeAnotherUsersClaim() (gas: 1543479)\n[PASS] test_guardBlocksCrossMarketReentryFromAnOtherwiseEligibleClaimant() (gas: 4611525)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 59.00ms (63.42ms CPU time)\n\nRan 9 tests for test/VerdictMarketTiming.t.sol:VerdictMarketTimingTest\n[PASS] testFuzz_rejectsEveryAskWindowBelowOneHour(uint256) (runs: 512, μ: 117988, ~: 118108)\nLogs:\n  Bound result 3459\n\n[PASS] testFuzz_rejectsEveryVoidDeadlineBeyondOneYear(uint256) (runs: 512, μ: 118496, ~: 118574)\nLogs:\n  Bound result 1070289985164429459\n\n[PASS] testFuzz_validWindowsAlwaysReachTimeoutRefund(uint256,uint256,uint256,uint256,bool) (runs: 512, μ: 1117694, ~: 1131527)\nLogs:\n  Bound result 14329559\n  Bound result 956122\n  Bound result 16039897\n  Bound result 139482\n\n[PASS] test_distantCloseCannotBypassMaximumLifetime() (gas: 114874)\n[PASS] test_exactMinimumAskAndMaximumLifetimeRefundIMD() (gas: 1158444)\n[PASS] test_exactMinimumAskAndMaximumLifetimeRefundWETH() (gas: 1190382)\n[PASS] test_nearUint64LimitAcceptsValidWindowsWithoutOverflow() (gas: 1088294)\n[PASS] test_rejectsOneSecondAskAndMaximumVoidDeadlineBeforeTakingBounty() (gas: 114717)\n[PASS] test_unorderedTimesRevertInvalidParamsInsteadOfArithmeticPanic() (gas: 340558)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 324.28ms (322.81ms CPU time)\n\nRan 20 tests for test/VerdictMarkets.t.sol:VerdictMarketsTest\n[PASS] testFuzz_terminalConservation(uint96,uint96,uint96,uint8,bool) (runs: 512, μ: 1985626, ~: 2317631)\nLogs:\n  Bound result 19198\n  Bound result 1982607802\n  Bound result 5974\n\n[PASS] test_asksBeforeAnswerFromAndAtOrAfterAnswerUntilRevert() (gas: 617887)\n[PASS] test_assetRotationBlocksAsksButNotRefunds() (gas: 2199645)\n[PASS] test_emptyWinningBucketCannotVoidUntilDisputeEnds() (gas: 1897760)\n[PASS] test_escalationAnswerCannotBeFirstProposal() (gas: 1288486)\n[PASS] test_escalationAskAtAnswerUntilRevertsEvenInsideDisputeWindow() (gas: 1348143)\n[PASS] test_externalSponsorCannotDeliverPrimaryOrEscalation() (gas: 4024128)\n[PASS] test_fullSettlementPaysWholePoolFeesAndExactRemainder() (gas: 2497813)\n[PASS] test_lateEscalationBeyondVoidAfterStillFinalizesWithoutAnswer() (gas: 2601271)\n[PASS] test_lateEscalationReplacementRestartsWindowOnceAndFinalizes() (gas: 2946609)\n[PASS] test_noEscalationBodyAndDuplicateEscalationAsk() (gas: 2839135)\n[PASS] test_priceIncreaseCannotSpendBettorsCollateral() (gas: 2371901)\n[PASS] test_primaryRetryBlockedAfterDeliveryEvenWithoutProposal() (gas: 1256421)\n[PASS] test_proposeAfterAnswerUntilWithTimelyStoredAnswer() (gas: 1557116)\n[PASS] test_provisionalWindowBoundariesAreStrict() (gas: 2410897)\n[PASS] test_secondPrimaryAskAfter24HoursAndMaximumTwoAsks() (gas: 1890221)\n[PASS] test_tokenReentrancyBlockedOnDepositAndClaim() (gas: 2253321)\n[PASS] test_voidNoAnswerRefundsEveryOutcomeAndUnspentBounty() (gas: 1845690)\n[PASS] test_wrongBodiesAndResolveAfterProposalRevertWithoutSpend() (gas: 1598084)\n[PASS] test_zeroAndUnknownClaimsAndUnfinishedClaimsRevert() (gas: 758596)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 347.80ms (362.88ms 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, μ: 3681210, ~: 3875264)\nLogs:\n  Bound result 164550748619068748\n  Bound result 1\n  Bound result 3890309830288\n  Bound result 984\n  Bound result 434246486096\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 396.59ms (392.81ms CPU time)\n\nRan 10 tests for test/SettlerIndependentReview.t.sol:SettlerIndependentReviewTest\n[PASS] testFuzz_rewardRecipientsMayAlsoBeCreatorWinnerOrTreasury(uint8) (runs: 512, μ: 2351297, ~: 2346295)\n[PASS] testFuzz_rewardReserveUsesPriceAfterPaidAsk(uint256) (runs: 512, μ: 1422407, ~: 1426614)\nLogs:\n  Bound result 1070289985164429459\n\n[PASS] test_creatorReturnFailureRevertsFinalizeIncludingEarlierReward() (gas: 2607062)\n[PASS] test_creatorReturnFailureRevertsVoidIncludingEarlierReward() (gas: 1331423)\n[PASS] test_failedProposalRewardLeavesStoredAnswerUsableAndPaysOnceOnRetry() (gas: 1932864)\n[PASS] test_finalizeRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 3508888)\n[PASS] test_maximumPriceAfterPaidAskSuppressesRewardWithoutReverting() (gas: 1377806)\n[PASS] test_positiveTerminalRewardsDoNotDependOnAWorkingOraclePrice() (gas: 2961168)\n[PASS] test_rewardFailureRollsBackTheWholePaidAskAndAllowsRetry() (gas: 2097852)\n[PASS] test_voidRewardCallbackSeesCompleteAccountingAndCannotReenter() (gas: 2149252)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 482.95ms (781.15ms CPU time)\n\nRan 11 tests for test/RevisionRegression.t.sol:RevisionRegressionTest\n[PASS] testFuzz_lateEscalationHasFiniteSettlementDeadline(uint32,uint32,uint32,bool) (runs: 256, μ: 2838113, ~: 3072197)\nLogs:\n  Bound result 255621\n  Bound result 2020\n  Bound result 28\n\n[PASS] testFuzz_onlyLatestPaidPrimaryRequestCanProposeRegardlessOfDeliveryOrder(bool,bool) (runs: 256, μ: 3087607, ~: 3087608)\n[PASS] test_escalationCannotUseAnswerIssuedBeforeItsAsk() (gas: 2080149)\n[PASS] test_identicalEscalationBodiesStillRequireEachMarketsOwnPaidAsk() (gas: 5495828)\n[PASS] test_lateEscalationIssuedAfterAnswerUntilSettlesCorrectedOutcome() (gas: 2945112)\n[PASS] test_otherMarketAnswerCannotSetOutcomeOrBlockRetry() (gas: 3156765)\n[PASS] test_oversizeAnswerRefused() (gas: 1038370)\n[PASS] test_renounceRequiresAllowlistDisabledEvenWhenEmpty() (gas: 547955)\n[PASS] test_unusableDeliveryBlocksRetry() (gas: 1324559)\n[PASS] test_zeroBoundRejectedWithoutTakingBounty() (gas: 1642585)\n[PASS] test_zeroDelayAcceptsConfigInSameBlock() (gas: 271514)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 494.45ms (686.81ms CPU time)\n\nRan 12 tests for test/IndependentReview.t.sol:IndependentReviewTest\n[PASS] testFuzzReviewActualTransfersConserveInAnyClaimOrder(uint96,uint96,uint96,uint8) (runs: 512, μ: 2744236, ~: 2744544)\nLogs:\n  Bound result 14264337593543950333\n  Bound result 127201069\n  Bound result 37682031093\n\n[PASS] testReviewAgreementMinimumCanExceedMinimumPanel() (gas: 1794783)\n[PASS] testReviewDonationDoesNotAlterPayoutOrAccounting() (gas: 1922603)\n[PASS] testReviewEscalationCannotBeFirstProposalEvenWithLargePanel() (gas: 1288098)\n[PASS] testReviewEscalationCannotVoidAfterDeadline() (gas: 2402498)\n[PASS] testReviewFailedTokenTransferRollsBackClaim() (gas: 2065105)\n[PASS] testReviewLateReplacementPastVoidRemainsFinalizable() (gas: 2688293)\n[PASS] testReviewMaximumAnswerColdCallback() (gas: 1331446)\nLogs:\n  maximum answer cold callback gas: 140592\n\n[PASS] testReviewMixedMarketsCannotCrossSubsidizeClaims() (gas: 3424784)\n[PASS] testReviewNoWinnerIsVoidableAfterWindowPastVoidAfter() (gas: 2063365)\n[PASS] testReviewRotationPreservesOldCallerAndKey() (gas: 2383113)\n[PASS] testReviewSameAttestationCannotOverwriteDifferentRequest() (gas: 1490092)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 494.70ms (501.99ms CPU time)\n\nRan 6 tests for test/VerdictOracleAdversarial.t.sol:VerdictOracleAdversarialTest\n[PASS] testFuzz_rotationsKeepFourInflightSnapshotsInAnyDeliveryOrder(uint256) (runs: 256, μ: 5459977, ~: 5459977)\n[PASS] test_contractSignerIsPinnedAndRevokedSignatureStoresNothing() (gas: 1500716)\n[PASS] test_everyAttestationFieldIsBoundBySignatureAndStoredHash() (gas: 2610090)\n[PASS] test_expiryAndClockToleranceAreInclusiveAtExactBoundary() (gas: 977218)\n[PASS] test_nonCanonicalAndTruncatedSignaturesCannotConsumePendingRequest() (gas: 829148)\n[PASS] test_pendingOwnerCannotAcceptConfigurationAndFormerOwnerLosesAccess() (gas: 434003)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 506.63ms (512.66ms 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, μ: 57274, ~: 44668)\nLogs:\n  Bound result 5\n  Bound result 325\n  Bound result 17\n  Bound result 12\n  Bound result 400\n  Bound result 553\n  Bound result 50000000000000000\n  Bound result 3200000000000000000\n\n[PASS] testFuzz_wethFeeSplitConservesPoolExactly(uint16,uint16,uint16,uint256,uint256,uint256,uint256) (runs: 512, μ: 3226212, ~: 3234529)\nLogs:\n  Bound result 33\n  Bound result 302\n  Bound result 45\n  Bound result 28385973333070826\n  Bound result 29993847217761692\n  Bound result 85443750249868938\n  Bound result 132183478397790462\n\n[PASS] test_agentIdIsAnUnverifiedLabel() (gas: 754968)\n[PASS] test_assetRotationAfterProposalStillFinalizesInRecordedToken() (gas: 2726205)\n[PASS] test_assetRotationToUnheldTokenCannotOpenMarketsOrTouchExistingCustody() (gas: 2278041)\n[PASS] test_constructorBoundaryCapsAndCheckOrder() (gas: 40338)\n[PASS] test_guardianCannotAlterSlots() (gas: 396460)\n[PASS] test_imdCollateralWithWethBountyKeepsLedgersInSwappedTokens() (gas: 2829800)\n[PASS] test_wethBetFailurePathsLeaveCustodyUntouched() (gas: 1013924)\n[PASS] test_wethCallbackDuringFinalizeCannotReenter() (gas: 4719873)\n[PASS] test_wethCapBoundaryAtLaunchCap() (gas: 1506967)\n[PASS] test_wethCapIsExactAtOneWei() (gas: 1162577)\n[PASS] test_wethClaimFailurePaths() (gas: 2297112)\n[PASS] test_wethCollateralWithWethBountyPaysCreatorOnce() (gas: 2338292)\n[PASS] test_wethMarketCreationNeedsIMDBounty() (gas: 319220)\n[PASS] test_wethPoolNeverSubsidisesSettlerRewards() (gas: 2582224)\n[PASS] test_wethRefundsWhilePausedReturnBothSides() (gas: 1333735)\n[PASS] test_wethStakeTaxedToZeroReverts() (gas: 675168)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 510.91ms (801.82ms CPU time)\n\nRan 7 tests for test/SettlerBountyBoundaries.t.sol:SettlerBountyBoundariesTest\n[PASS] testFuzz_exactMinimumAndOneWeiShortAcrossUint256(uint256,uint256) (runs: 1000, μ: 1463048, ~: 1466876)\nLogs:\n  Bound result 1\n  Bound result 1406529738692122\n\n[PASS] testFuzz_transferTaxAcceptsExactReceivedMinimumAndRejectsOneWeiLess(uint96,uint16) (runs: 1000, μ: 1332075, ~: 1333773)\nLogs:\n  Bound result 0\n  Bound result 2\n\n[PASS] testFuzz_unrepresentableMinimumRevertsBeforeTokenTransfer(uint256,uint256) (runs: 1000, μ: 359812, ~: 359784)\nLogs:\n  Bound result 1\n  Bound result 92633671389852956338856788006950326282615987732512451231566068612860242404071\n\n[PASS] test_entireUint256SupplyCanBeReturnedWithoutDust() (gas: 1179716)\n[PASS] test_maximumPriceWithRepresentableBountyAndZeroReward() (gas: 1371139)\n[PASS] test_maximumRepresentableRewardBudget() (gas: 1461557)\n[PASS] test_oneWeiPriceAndOneWeiReward() (gas: 1459603)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 511.15ms (1.04s CPU time)\n\nRan 7 tests for test/VerdictOutcomes.t.sol:VerdictOutcomesTest\n[PASS] testFuzz_uintBucketDefinition(uint256) (runs: 512, μ: 1408437, ~: 1408498)\n[PASS] test_addressListUsesFirstElementOnlyAndCanonicalAddressKey() (gas: 5143049)\n[PASS] test_booleanOutcomes() (gas: 2443911)\n[PASS] test_bytes32ListUsesFirstElementOnlyAndEmptyMeansNone() (gas: 6345836)\n[PASS] test_malformedEncodedAnswerCannotSetOutcome() (gas: 1362641)\n[PASS] test_numericBucketsIncludeLowerBoundaryExcludeUpper() (gas: 7622987)\n[PASS] test_twoToEightOutcomesAndSortedUniqueDefinitions() (gas: 1910074)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 516.14ms (526.26ms CPU time)\n\nRan 23 tests for test/MainnetDependencies.t.sol:MainnetDependenciesTest\n[PASS] testFuzz_mainnetFeeSplitsConserveEveryPool(uint256,uint256,uint256) (runs: 1000, μ: 4481084, ~: 4494077)\nLogs:\n  Bound result 73804747622571450289\n  Bound result 687582322308465480\n  Bound result 32\n\n[PASS] testFuzz_scheduleAcceptedIffWithinBounds(uint256,uint256,uint256,uint256,bool) (runs: 600, μ: 401162, ~: 144364)\nLogs:\n  Bound result 5032\n  Bound result 14464000\n  Bound result 13598\n  Bound result 17146296\n\n[PASS] test_allowlistStartsOnAndEmpty() (gas: 7523920)\n[PASS] test_configRotationFailurePathsAndRestartedClock() (gas: 746096)\n[PASS] test_constructorArgumentListsFitTheManifest() (gas: 5805)\n[PASS] test_constructorsRejectMisconfiguredMainnetArguments() (gas: 3550074)\n[PASS] test_guardianHandoverIsTwoStepAndRenounceIsGated() (gas: 415578)\n[PASS] test_imdSlotFeesAtTheCapAndCreatorPaidInOneTransfer() (gas: 2142078)\n[PASS] test_launchOrderAndWiringMatchTheBrief() (gas: 103408)\n[PASS] test_oracleDomainIsChainOneAndTheDeployedOracle() (gas: 14854)\n[PASS] test_oracleOwnershipIsTwoStep() (gas: 235507)\n[PASS] test_pauseStopsEntryOnlyAndIsIdempotentChecked() (gas: 2073662)\n[PASS] test_poolCapsAreExactAndPerMarket() (gas: 1964825)\n[PASS] test_requestsPaidBeforeRotationKeepTheLaunchSigner() (gas: 9465498)\n[PASS] test_scheduleBoundariesAcceptedAndTimeOutAtTheCaps() (gas: 3252317)\n[PASS] test_scheduleBoundsRejectBeforeCustodyInBothSlots() (gas: 1062624)\n[PASS] test_sepoliaVectorSignatureDoesNotReplayOnMainnet() (gas: 2274023)\n[PASS] test_settlerRewardCeilingAndBountyFloor() (gas: 2624919)\n[PASS] test_thirdCollateralSlotDoesNotExist() (gas: 85097)\n[PASS] test_unknownMarketAndClosedEntry() (gas: 971745)\n[PASS] test_voidPaysNoFeesToAnyone() (gas: 1382248)\n[PASS] test_wethBetNeedsAllowanceBalanceAndRejectsEther() (gas: 901646)\n[PASS] test_wethSlotFullFlowAgainstRealWeth9() (gas: 2511286)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 516.42ms (583.75ms CPU time)\n\nRan 7 tests for test/VerdictSettlementProperties.t.sol:VerdictSettlementPropertiesTest\n[PASS] testFuzz_feeSplitsAndRationalPayoutBoundsInEveryClaimOrder(uint256,uint16,uint16,uint16,uint8) (runs: 1000, μ: 3072262, ~: 3076920)\nLogs:\n  Bound result 403\n  Bound result 38\n  Bound result 24\n  Bound result 70403619735790217866\n  Bound result 70295831490924752077\n  Bound result 66173648062335731131\n  Bound result 100000000000000000000\n\n[PASS] testFuzz_numericOutcomeSatisfiesItsHalfOpenInterval(uint128,uint96,uint256,uint8) (runs: 1000, μ: 1456598, ~: 1445981)\nLogs:\n  Bound result 7\n  Bound result 2931903112821428\n  Bound result 3791657\n\n[PASS] test_malformedListsCannotChangeAnAuthenticatedMarketsOutcome() (gas: 3072574)\n[PASS] test_oneWeiLastWinnerReceivesTheRoundingRemainder() (gas: 2377518)\n[PASS] test_oneWeiWinnerMayRoundToZeroButLastClaimStillDrainsExactly() (gas: 2703344)\n[PASS] test_payoutUsesFullPrecisionWhenIntermediateStakeTimesPoolOverflows256Bits() (gas: 2635039)\n[PASS] test_settlementEventsDescribeWholePoolFeesAndUnspentBounty() (gas: 2083005)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 517.28ms (1.00s 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        | 865   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | ask            | 815   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | askEscalation  | 806   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | collect        | 858   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | deliverPrimary | 829   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | enter          | 767   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | proposePrimary | 805   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | replaceOutcome | 819   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | settle         | 851   | 0       | 0        |\n|----------------+----------------+-------+---------+----------|\n| VerdictHandler | togglePause    | 777   | 0       | 0        |\n╰----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 9078\n  Bound result 15199\n  Bound result 14\n  Bound result 1845\n  Bound result 15226\n  Bound result 21598\n  Bound result 3\n  Bound result 14577\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.21s (2.21s 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        | 706   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | ask            | 719   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | askEscalation  | 769   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | changePrice    | 723   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | collect        | 770   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | deliverPrimary | 713   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | enter          | 754   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | proposePrimary | 741   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | replaceOutcome | 758   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | settle         | 774   | 0       | 0        |\n|----------------------+----------------+-------+---------+----------|\n| SettlerRewardHandler | togglePause    | 765   | 0       | 0        |\n╰----------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4766\n  Bound result 1422\n  Bound result 10893\n  Bound result 4779\n  Bound result 202\n  Bound result 21597\n  Bound result 261\n  Bound result 2000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.44s (2.44s CPU time)\n\nRan 2 tests for test/MainnetInvariant.t.sol:MainnetInvariantTest\n[PASS] invariant_mainnetCustodyRecipientsAndRolesHold() (runs: 160, calls: 10240, reverts: 0)\n\n╭-------------------------+----------------+-------+---------+----------╮\n| Contract                | Selector       | Calls | Reverts | Discards |\n+=======================================================================+\n| MainnetLifecycleHandler | advance        | 704   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | ask            | 748   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | askEscalation  | 699   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | collect        | 762   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | deliverPrimary | 726   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | enter          | 1501  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | probeAdmin     | 755   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | probeSchedule  | 715   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | proposePrimary | 693   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | replaceOutcome | 758   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | rotatePrice    | 719   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | settle         | 719   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| MainnetLifecycleHandler | togglePause    | 741   | 0       | 0        |\n╰-------------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 766061700061877343\n  Bound result 6326\n  Bound result 33275021\n  Bound result 16393\n  Bound result 33832491\n  Bound result 1400000000000005035\n  Bound result 33269211\n  Bound result 21600\n  Bound result 7073\n  Bound result 10207\n  Bound result 3569\n  Bound result 999\n  Bound result 1400000000000007893\n  Bound result 1250000000000000000\n  Bound result 6149\n  Bound result 1400000000002592002\n\n[PASS] test_handlerReachesSettlementInBothSlots() (gas: 10623958)\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 1800\n  Bound result 31536001\n  Bound result 31536000\n  Bound result 21600\n  Bound result 700000000000000000\n  Bound result 1\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.35s (4.35s 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        | 706   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | ask            | 719   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | askEscalation  | 769   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | changePrice    | 723   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | collect        | 770   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | deliverPrimary | 713   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | enter          | 754   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | proposePrimary | 741   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | replaceOutcome | 758   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | settle         | 774   | 0       | 0        |\n|----------------------------+----------------+-------+---------+----------|\n| CollateralLifecycleHandler | togglePause    | 765   | 0       | 0        |\n╰----------------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4448\n  Bound result 4432\n  Bound result 11844\n  Bound result 527\n  Bound result 4595\n  Bound result 21597\n  Bound result 16242\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.74s (4.74s 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        | 1381  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | ask            | 1392  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | askEscalation  | 1376  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | collect        | 1335  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | deliverPrimary | 1367  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | enter          | 1338  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | open           | 1383  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | proposePrimary | 1374  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | replaceOutcome | 1338  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | rotate         | 1344  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | settle         | 1446  | 0       | 0        |\n|---------------------------+----------------+-------+---------+----------|\n| CollateralRotationHandler | togglePause    | 1310  | 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 49999999999999993\n  Bound result 999999999999999997\n  Bound result 5469\n  Bound result 21\n  Bound result 0\n  Bound result 531\n  Bound result 18469\n  Bound result 287\n  Bound result 14708\n  Bound result 25600\n  Bound result 227585\n  Bound result 19183\n  Bound result 9251\n  Bound result 1400000000000012905\n  Bound result 3154\n  Bound result 1400000000000000011\n  Bound result 438078827536048857\n  Bound result 34793316924050415\n  Bound result 586396227583364533\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 23310\n  Bound result 1400000004215360829\n  Bound result 7159\n  Bound result 1400000000000000011\n\n[PASS] test_handlerReachesAllFourTokenPairings() (gas: 21299514)\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.56s (6.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       | 1605  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | changePrice   | 1649  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | collect       | 1538  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | deliverAnswer | 1617  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | donate        | 1578  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | escalate      | 1555  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | openMarket    | 1540  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | pauseEntry    | 1531  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | probeRejected | 1510  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | propose       | 1552  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | resolve       | 1608  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | settle        | 1577  | 0       | 0        |\n|------------------------------+---------------+-------+---------+----------|\n| SettlerRewardSequenceHandler | wager         | 1620  | 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 359288229706537135117\n  Bound result 14220\n  Bound result 4214517420\n  Bound result 162008166305780065\n  Bound result 792953196995149825\n  Bound result 17016\n  Bound result 283019655932542976\n  Bound result 12443\n  Bound result 659918\n  Bound result 8484\n  Bound result 7500000000000000\n  Bound result 15330\n  Bound result 31673\n  Bound result 3067\n  Bound result 4055\n  Bound result 900000000000000000\n  Bound result 5667\n  Bound result 62\n  Bound result 1248\n  Bound result 100\n  Bound result 14537\n  Bound result 5119\n  Bound result 134103936791\n  Bound result 202\n  Bound result 995\n  Bound result 8354\n  Bound result 1967\n  Bound result 7\n  Bound result 120\n  Bound result 3999999999999999998\n  Bound result 703\n  Bound result 112080204509485770\n  Bound result 259201\n  Bound result 1558783011848144\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 11.03s (11.04s 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                | 1234  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askEscalation          | 1235  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | askPrimary             | 1288  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | collect                | 1265  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | deliverAnswer          | 1262  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | donate                 | 1288  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | openMarket             | 1233  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeBurn              | 1226  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeIndependentAnswer | 1256  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | probeTerminal          | 1279  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | settle                 | 1262  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | togglePause            | 1243  | 0       | 0        |\n|-------------------------+------------------------+-------+---------+----------|\n| VerdictLifecycleHandler | wager                  | 1313  | 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 12807443143876802\n  Bound result 13\n  Bound result 18\n  Bound result 259200\n  Bound result 10\n  Bound result 999999999999999903\n  Bound result 309873589891285890\n  Bound result 8138\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: 16922533)\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 36.05s (36.09s CPU time)\n\nRan 32 test suites in 36.05s (73.19s CPU time): 244 tests passed, 0 failed, 0 skipped (244 total tests)\n","passed":true},{"durationMs":101,"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\":237,\"DEPENDENCIES.md\":14,\"DESIGN.md\":95,\"LICENSE\":21,\"README.md\":175,\"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\":186,\"docs/BETTER_INTERFACE_LICENSE.txt\":220,\"docs/COLLATERAL_INDEPENDENT_REVIEW.md\":65,\"docs/DEPLOYMENT.md\":69,\"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\":34,\"foundry.toml\":23,\"remappings.txt\":2,\"script/MainnetParameters.sol\":53,\"src/OracleAttestation.sol\":221,\"src/VerdictBurnVault.sol\":5,\"src/VerdictMarkets.sol\":657,\"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\":110,\"test/IndependentReview.t.sol\":239,\"test/MainnetAdvisoryReview.t.sol\":266,\"test/MainnetDependencies.t.sol\":887,\"test/MainnetFixture.sol\":207,\"test/MainnetInvariant.t.sol\":430,\"test/MainnetLaunch.t.sol\":202,\"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\":69,\"test/SettlerIndependentReview.t.sol\":342,\"test/SettlerLifecycleProperties.t.sol\":118,\"test/SettlerRewardInvariant.t.sol\":249,\"test/SettlerRewardSequence.t.sol\":483,\"test/TESTING.md\":190,\"test/TestBase.sol\":178,\"test/VerdictAtomicity.t.sol\":214,\"test/VerdictCollateral.t.sol\":354,\"test/VerdictCollateralInvariant.t.sol\":323,\"test/VerdictImportedAudit.t.sol\":115,\"test/VerdictInvariant.t.sol\":213,\"test/VerdictLifecycleInvariant.t.sol\":580,\"test/VerdictMarketTiming.t.sol\":133,\"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/MainnetBytecode.sol\":29,\"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":"e409995888e3b3fef50eb94df0f72167db0e6c736f90b0cdecaf2cdac572b21b","verifiedTreeHash":"b4f82f67a8806e91effdab2ba605bd4817cf705d","verifierVersion":"0.1.0+fb8278c5"}]}